text: import Emitter from "../emitter";
  import createStore from "../store";
  import * as Actions from "../actionCreators";
  import * as Selectors from "../selectors";
  
  // Actually tests action creators too
  const media = {
    addEventListener: jest.fn(),
    setVolume: jest.fn(),
    setBalance: jest.fn(),
    setPreamp: jest.fn(),
    getAnalyser: () => null,
    on: jest.fn()
  };
  
  test("The first tack is picked at random", () => {
    const store = createStore(media, new Emitter());
    const mockPreset = [
      { type: "RESOLVED", name: "First", preset: {} },
      { type: "RESOLVED", name: "Second", preset: {} },
      { type: "RESOLVED", name: "Third", preset: {} },
      { type: "RESOLVED", name: "Fourth", preset: {} }
    ];
    Math.random = () => 0.5;
    // Just confirm that the default setting is correct
    expect(Selectors.getRandomizePresets(store.getState())).toBe(true);
    store.dispatch(Actions.loadPresets(mockPreset));
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(2);
  });
  
  test("handles history (prev/next) correctly", () => {
    const store = createStore(media, new Emitter());
    const mockPreset = [
      { type: "RESOLVED", name: "First", preset: {} },
      { type: "RESOLVED", name: "Second", preset: {} }
    ];
    expect(Selectors.getRandomizePresets(store.getState())).toBe(true);
    store.dispatch(Actions.toggleRandomizePresets());
    expect(Selectors.getRandomizePresets(store.getState())).toBe(false);
  
    // Check initial state
    expect(store.getState().milkdrop.presetHistory).toEqual([]);
    expect(Selectors.getCurrentPreset(store.getState())).toBe(null);
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(null);
  
    // Load some presets
    store.dispatch(Actions.loadPresets(mockPreset));
    expect(store.getState().milkdrop.presetHistory).toEqual([0]);
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);
  
    // Select next
    store.dispatch(Actions.selectNextPreset());
    expect(store.getState().milkdrop.presetHistory).toEqual([0, 1]);
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(1);
  
    // Select previous
    store.dispatch(Actions.selectPreviousPreset());
    expect(store.getState().milkdrop.presetHistory).toEqual([0]);
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);
  
    // Next again
    store.dispatch(Actions.selectNextPreset());
    expect(store.getState().milkdrop.presetHistory).toEqual([0, 1]);
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(1);
  
    // Previous again
    store.dispatch(Actions.selectPreviousPreset());
    expect(store.getState().milkdrop.presetHistory).toEqual([0]);
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);
  });
  
  test("selectes the first preset in a new set when added", async () => {
    const store = createStore(media, new Emitter());
    const mockPreset = [
      { type: "RESOLVED", name: "First", preset: {} },
      { type: "RESOLVED", name: "Second", preset: {} }
    ];
    store.dispatch(Actions.toggleRandomizePresets());
  
    // Load some presets
    store.dispatch(Actions.loadPresets(mockPreset));
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);
  
    const presetPromise = Promise.resolve({});
    // Load some more presets
    const newMockPresets = [
      { type: "UNRESOLVED", name: "First", getPreset: () => presetPromise }
    ];
    store.dispatch(Actions.loadPresets(newMockPresets));
    // The new presets are not selected right away
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);
    await presetPromise;
    // Once the first preset is loaded, it gets selected
    expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(2);
  });
  