/* tslint:disable:no-implicit-dependencies no-any */
/**
 * ScanSettings tests
 */
import test from "ava";
import { Barcode, ScanSettings, SearchArea, SymbologySettings } from "..";

const baseJSONScanSettings: {
  symbologies: {};
  codeDuplicateFilter: number;
  maxNumberOfCodesPerFrame: number;
  searchArea: SearchArea;
  gpuAcceleration: boolean;
  blurryRecognition: boolean;
  properties: {};
} = {
  symbologies: {},
  codeDuplicateFilter: 0,
  maxNumberOfCodesPerFrame: 1,
  searchArea: new ScanSettings().getSearchArea(),
  gpuAcceleration: true,
  blurryRecognition: true,
  properties: {}
};

test("constructor", t => {
  let ss: ScanSettings = new ScanSettings();
  t.deepEqual((<any>ss).symbologySettings, new Map());
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: [Barcode.Symbology.QR] });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: new Set([Barcode.Symbology.QR]) });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR, codeDuplicateFilter: 10 });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 10);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR, maxNumberOfCodesPerFrame: 10 });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 10);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10
  });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 10);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 10);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10,
    searchArea: { x: 0.5, y: 0.5, width: 0.5, height: 0.1 }
  });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 10);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 10);
  t.deepEqual(ss.getSearchArea(), { height: 0.1, width: 0.5, x: 0.5, y: 0.5 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10,
    searchArea: { x: 0.5, y: 0.5, width: 0.5, height: 0.1 },
    gpuAcceleration: false
  });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 10);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 10);
  t.deepEqual(ss.getSearchArea(), { height: 0.1, width: 0.5, x: 0.5, y: 0.5 });
  t.deepEqual((<any>ss).gpuAcceleration, false);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10,
    searchArea: { x: 0.5, y: 0.5, width: 0.5, height: 0.1 },
    gpuAcceleration: false,
    blurryRecognition: false
  });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 10);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 10);
  t.deepEqual(ss.getSearchArea(), { height: 0.1, width: 0.5, x: 0.5, y: 0.5 });
  t.deepEqual((<any>ss).gpuAcceleration, false);
  t.deepEqual((<any>ss).blurryRecognition, false);
});

test("constructor (strings)", t => {
  let ss: ScanSettings = new ScanSettings();
  t.deepEqual((<any>ss).symbologySettings, new Map());
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: <Barcode.Symbology>"qr" });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: <Barcode.Symbology[]>["qr"] });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);
  ss = new ScanSettings({ enabledSymbologies: <Set<Barcode.Symbology>>new Set(["qr"]) });
  t.deepEqual((<any>ss).symbologySettings, new Map([[Barcode.Symbology.QR, new SymbologySettings({ enabled: true })]]));
  t.deepEqual((<any>ss).codeDuplicateFilter, 0);
  t.deepEqual((<any>ss).maxNumberOfCodesPerFrame, 1);
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual((<any>ss).gpuAcceleration, true);
  t.deepEqual((<any>ss).blurryRecognition, true);

  t.throws(
    () => {
      return new ScanSettings({ enabledSymbologies: <Barcode.Symbology>(<unknown>"i_dont_exist") });
    },
    TypeError,
    "i_dont_exist"
  );
  t.throws(
    () => {
      return new ScanSettings({ enabledSymbologies: <Barcode.Symbology[]>(<unknown>Array.from(["i_dont_exist"])) });
    },
    TypeError,
    "i_dont_exist"
  );
  t.throws(
    () => {
      return new ScanSettings({ enabledSymbologies: <Set<Barcode.Symbology>>(<unknown>new Set(["i_dont_exist"])) });
    },
    TypeError,
    "i_dont_exist"
  );
});

test("getSymbologySettings", t => {
  let ss: ScanSettings = new ScanSettings();
  t.deepEqual(ss.getSymbologySettings(Barcode.Symbology.QR), new SymbologySettings());
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR });
  t.deepEqual(ss.getSymbologySettings(Barcode.Symbology.QR), new SymbologySettings({ enabled: true }));
  ss = new ScanSettings();
  ss.getSymbologySettings(Barcode.Symbology.QR).setColorInvertedEnabled(true);
  t.deepEqual(ss.getSymbologySettings(Barcode.Symbology.QR), new SymbologySettings({ colorInvertedEnabled: true }));
});

test("getSymbologySettings (strings)", t => {
  let ss: ScanSettings = new ScanSettings();
  t.throws(
    () => {
      ss.getSymbologySettings(<Barcode.Symbology>"i_dont_exist");
    },
    TypeError,
    "i_dont_exist"
  );
  t.deepEqual(ss.getSymbologySettings(<Barcode.Symbology>"qr"), new SymbologySettings());
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR });
  t.deepEqual(ss.getSymbologySettings(<Barcode.Symbology>"qr"), new SymbologySettings({ enabled: true }));
  ss = new ScanSettings();
  ss.getSymbologySettings(Barcode.Symbology.QR).setColorInvertedEnabled(true);
  t.deepEqual(ss.getSymbologySettings(<Barcode.Symbology>"qr"), new SymbologySettings({ colorInvertedEnabled: true }));
});

test("isSymbologyEnabled & enableSymbologies & disableSymbologies", t => {
  let ss: ScanSettings = new ScanSettings();
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR });
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));

  // Set
  ss = new ScanSettings();
  ss.enableSymbologies(new Set([Barcode.Symbology.QR]));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.enableSymbologies(new Set([Barcode.Symbology.CODE128, Barcode.Symbology.EAN13]));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(new Set([Barcode.Symbology.QR]));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(new Set([Barcode.Symbology.CODE128, Barcode.Symbology.EAN13]));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));

  // Array
  ss = new ScanSettings();
  ss.enableSymbologies([Barcode.Symbology.QR]);
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.enableSymbologies([Barcode.Symbology.CODE128, Barcode.Symbology.EAN13]);
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies([Barcode.Symbology.QR]);
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies([Barcode.Symbology.CODE128, Barcode.Symbology.EAN13]);
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));

  // Single
  ss = new ScanSettings();
  ss.enableSymbologies(Barcode.Symbology.QR);
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.enableSymbologies(Barcode.Symbology.CODE128);
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(Barcode.Symbology.QR);
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(Barcode.Symbology.CODE128);
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
});

test("isSymbologyEnabled & enableSymbologies & disableSymbologies (strings)", t => {
  let ss: ScanSettings = new ScanSettings();
  t.false(ss.isSymbologyEnabled(<Barcode.Symbology>"qr"));
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR });
  t.true(ss.isSymbologyEnabled(<Barcode.Symbology>"qr"));

  ss = new ScanSettings();
  t.throws(
    () => {
      ss.enableSymbologies(<Barcode.Symbology>"i_dont_exist");
    },
    TypeError,
    "i_dont_exist"
  );
  t.deepEqual((<any>ss).symbologySettings, new Map());
  t.throws(
    () => {
      ss.enableSymbologies(<Barcode.Symbology[]>(<unknown>Array.from(["i_dont_exist"])));
    },
    TypeError,
    "i_dont_exist"
  );
  t.deepEqual((<any>ss).symbologySettings, new Map());
  t.throws(
    () => {
      ss.enableSymbologies(<Set<Barcode.Symbology>>(<unknown>new Set(["i_dont_exist"])));
    },
    TypeError,
    "i_dont_exist"
  );
  t.deepEqual((<any>ss).symbologySettings, new Map());

  // Set
  ss = new ScanSettings();
  ss.enableSymbologies(<Set<Barcode.Symbology>>new Set(["qr"]));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.enableSymbologies(<Set<Barcode.Symbology>>new Set(["code128", "ean13"]));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(<Set<Barcode.Symbology>>new Set(["qr"]));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(<Set<Barcode.Symbology>>new Set(["code128", "ean13"]));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));

  // Array
  ss = new ScanSettings();
  ss.enableSymbologies(<Barcode.Symbology[]>["qr"]);
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.enableSymbologies(<Barcode.Symbology[]>["code128", "ean13"]);
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(<Barcode.Symbology[]>["qr"]);
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(<Barcode.Symbology[]>["code128", "ean13"]);
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.EAN13));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));

  // Single
  ss = new ScanSettings();
  ss.enableSymbologies(<Barcode.Symbology>"qr");
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.enableSymbologies(<Barcode.Symbology>"code128");
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(<Barcode.Symbology>"qr");
  t.true(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
  ss.disableSymbologies(<Barcode.Symbology>"code128");
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.CODE128));
  t.false(ss.isSymbologyEnabled(Barcode.Symbology.QR));
});

test("getCodeDuplicateFilter & setCodeDuplicateFilter", t => {
  const ss: ScanSettings = new ScanSettings();
  t.deepEqual(ss.getCodeDuplicateFilter(), 0);
  ss.setCodeDuplicateFilter(100);
  t.deepEqual(ss.getCodeDuplicateFilter(), 100);
});

test("getMaxNumberOfCodesPerFrame & setMaxNumberOfCodesPerFrame", t => {
  const ss: ScanSettings = new ScanSettings();
  t.deepEqual(ss.getMaxNumberOfCodesPerFrame(), 1);
  ss.setMaxNumberOfCodesPerFrame(10);
  t.deepEqual(ss.getMaxNumberOfCodesPerFrame(), 10);
});

test("getSearchArea & setSearchArea", t => {
  const ss: ScanSettings = new ScanSettings();
  t.deepEqual(ss.getSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  ss.setSearchArea({ x: 0.5, y: 0.5, width: 0.5, height: 0.1 });
  t.deepEqual(ss.getSearchArea(), { height: 0.1, width: 0.5, x: 0.5, y: 0.5 });
});

test("isGpuAccelerationEnabled & setGpuAccelerationEnabled", t => {
  const ss: ScanSettings = new ScanSettings();
  t.deepEqual(ss.isGpuAccelerationEnabled(), true);
  ss.setGpuAccelerationEnabled(false);
  t.deepEqual(ss.isGpuAccelerationEnabled(), false);
  ss.setGpuAccelerationEnabled(true);
  t.deepEqual(ss.isGpuAccelerationEnabled(), true);
});

test("isBlurryRecognitionEnabled & setBlurryRecognitionEnabled", t => {
  const ss: ScanSettings = new ScanSettings();
  t.deepEqual(ss.isBlurryRecognitionEnabled(), true);
  ss.setBlurryRecognitionEnabled(false);
  t.deepEqual(ss.isBlurryRecognitionEnabled(), false);
  ss.setBlurryRecognitionEnabled(true);
  t.deepEqual(ss.isBlurryRecognitionEnabled(), true);
});

// tslint:disable-next-line:max-func-body-length
test("toJSONString", t => {
  let ss: ScanSettings = new ScanSettings();
  t.deepEqual(JSON.parse(ss.toJSONString()), JSON.parse(JSON.stringify(baseJSONScanSettings)));
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) }
      })
    )
  );
  ss = new ScanSettings({ enabledSymbologies: [Barcode.Symbology.QR] });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) }
      })
    )
  );
  ss = new ScanSettings({ enabledSymbologies: new Set([Barcode.Symbology.QR]) });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) }
      })
    )
  );
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR, codeDuplicateFilter: 10 });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 10
      })
    )
  );
  ss = new ScanSettings({ enabledSymbologies: Barcode.Symbology.QR, maxNumberOfCodesPerFrame: 10 });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) },
        maxNumberOfCodesPerFrame: 10
      })
    )
  );
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10
  });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 10,
        maxNumberOfCodesPerFrame: 10
      })
    )
  );
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10,
    gpuAcceleration: false,
    blurryRecognition: true
  });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 10,
        maxNumberOfCodesPerFrame: 10,
        gpuAcceleration: false,
        blurryRecognition: true
      })
    )
  );
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10,
    gpuAcceleration: false,
    blurryRecognition: false
  });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 10,
        maxNumberOfCodesPerFrame: 10,
        gpuAcceleration: false,
        blurryRecognition: false
      })
    )
  );
  ss = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.QR,
    codeDuplicateFilter: 10,
    maxNumberOfCodesPerFrame: 10,
    searchArea: { x: 0.5, y: 0.5, width: 0.5, height: 0.1 },
    gpuAcceleration: false,
    blurryRecognition: false
  });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.QR]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 10,
        maxNumberOfCodesPerFrame: 10,
        searchArea: ss.getSearchArea(),
        codeLocation1d: {
          area: {
            x: ss.getSearchArea().x,
            y: ss.getSearchArea().y + (ss.getSearchArea().height * 0.75) / 2,
            width: ss.getSearchArea().width,
            height: ss.getSearchArea().height * 0.25
          }
        },
        codeLocation2d: { area: ss.getSearchArea() },
        gpuAcceleration: false,
        blurryRecognition: false
      })
    )
  );
});

test("getBaseSearchArea & setBaseSearchArea", t => {
  const ss: ScanSettings = new ScanSettings({
    enabledSymbologies: Barcode.Symbology.AZTEC,
    codeDuplicateFilter: 5,
    maxNumberOfCodesPerFrame: 5,
    searchArea: { x: 0.5, y: 0.5, width: 0.5, height: 0.1 }
  });
  t.deepEqual(ss.getBaseSearchArea(), { height: 1, width: 1, x: 0, y: 0 });
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.AZTEC]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 5,
        maxNumberOfCodesPerFrame: 5,
        searchArea: ss.getSearchArea(),
        codeLocation1d: {
          area: {
            x: ss.getSearchArea().x,
            y: ss.getSearchArea().y + (ss.getSearchArea().height * 0.75) / 2,
            width: ss.getSearchArea().width,
            height: ss.getSearchArea().height * 0.25
          }
        },
        codeLocation2d: { area: ss.getSearchArea() }
      })
    )
  );
  ss.setBaseSearchArea({ x: 0.5, y: 0.5, width: 0.5, height: 0.1 });
  const baseSearchArea: SearchArea = ss.getBaseSearchArea();
  const searchArea: SearchArea = ss.getSearchArea();
  t.deepEqual(baseSearchArea, { x: 0.5, y: 0.5, width: 0.5, height: 0.1 });
  const combinedSearchArea: SearchArea = {
    x: baseSearchArea.x + searchArea.x * baseSearchArea.width,
    y: baseSearchArea.y + searchArea.y * baseSearchArea.height,
    width: baseSearchArea.width * searchArea.width,
    height: baseSearchArea.height * searchArea.height
  };
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        symbologies: { [Barcode.Symbology.AZTEC]: new SymbologySettings({ enabled: true }) },
        codeDuplicateFilter: 5,
        maxNumberOfCodesPerFrame: 5,
        searchArea: combinedSearchArea,
        codeLocation1d: {
          area: {
            x: combinedSearchArea.x,
            y: combinedSearchArea.y + (combinedSearchArea.height * 0.75) / 2,
            width: combinedSearchArea.width,
            height: combinedSearchArea.height * 0.25
          }
        },
        codeLocation2d: { area: combinedSearchArea }
      })
    )
  );
});

test("getProperty & setProperty", t => {
  const ss: ScanSettings = new ScanSettings();
  t.deepEqual(JSON.parse(ss.toJSONString()), JSON.parse(JSON.stringify(baseJSONScanSettings)));
  t.deepEqual(ss.getProperty("2d_enabled"), -1);
  ss.setProperty("2d_enabled", 0);
  t.deepEqual(ss.getProperty("2d_enabled"), 0);
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        properties: { "2d_enabled": 0 }
      })
    )
  );
  ss.setProperty("force_2d_recognition", 1);
  t.deepEqual(ss.getProperty("force_2d_recognition"), 1);
  t.deepEqual(
    JSON.parse(ss.toJSONString()),
    JSON.parse(
      JSON.stringify({
        ...baseJSONScanSettings,
        properties: { "2d_enabled": 0, force_2d_recognition: 1 }
      })
    )
  );
});
