code: def test_fetdriftonline(alternative, n_feat, seed):
      # Reference data
      p_h0 = 0.5
      with fixed_seed(seed):
          # squeeze to test vector input in 1D case
          x_ref = np.random.choice(
              (0, 1), (n, n_feat), p=[1 - p_h0, p_h0]
          ).squeeze()
          x_h0 = partial(
              np.random.choice, (0, 1), size=n_feat, p=[1 - p_h0, p_h0]
          )
  
      detection_times_h0 = []
      detection_times_h1 = []
      for _ in range(n_inits):
          # Instantiate detector
          with fixed_seed(seed + 1):
              cd = FETDriftOnline(
                  x_ref=x_ref,
                  ert=ert,
                  window_sizes=window_sizes,
                  n_bootstraps=n_bootstraps,
                  alternative=alternative,
              )
  
          # Reference data
          count = 0
          while len(detection_times_h0) < n_reps and count < int(1e6):
              count += 1
              x_t = (
                  int(x_h0()) if n_feat == 1 else x_h0()
              )  # x_t is int in 1D case, otherwise ndarray with shape (n_feat)
              t0 = cd.t
              pred_t = cd.predict(x_t)
              assert (
                  cd.t - t0 == 1
              )  # This checks state updated (self.t at least)
              if pred_t["data"]["is_drift"]:
                  detection_times_h0.append(pred_t["data"]["time"])
                  cd.reset_state()
  
          # Drifted data
          if alternative == "less":
              p_h1 = 0.1
              x_h1 = partial(
                  np.random.choice,
                  (0, 1),
                  size=n_feat,
                  p=[1 - p_h1, p_h1],
              )
          else:
              p_h1 = 0.9
              x_h1 = partial(
                  np.random.choice,
                  (0, 1),
                  size=n_feat,
                  p=[1 - p_h1, p_h1],
              )
  
          cd.reset_state()
          count = 0
          while len(detection_times_h1) < n_reps and count < int(1e6):
              count += 1
              x_t = (
                  x_h1().reshape(1, 1) if n_feat == 1 else x_h1()
              )  # test shape (1,1) in 1D case here
              pred_t = cd.predict(x_t)
              if pred_t["data"]["is_drift"]:
                  detection_times_h1.append(pred_t["data"]["time"])
                  cd.reset_state()
  
      art = (
          np.array(detection_times_h0).mean() - np.min(window_sizes) + 1
      )
      add = np.array(detection_times_h1).mean() - np.min(window_sizes)
  
      assert ert / 3 < art < 3 * ert
      assert add + 1 < ert / 2
  
imports: import numpy
  import pytest
  from functools import partial
  from alibi_detect.cd import FETDriftOnline
  from alibi_detect.utils._random import fixed_seed
label_desc: Use image node_id 1 for calling a global function with example usage: test_fetdriftonline(alternative, n_feat, seed) without return types