rc-js-util
Version:
A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.
128 lines (113 loc) • 4.7 kB
text/typescript
import { itShouldCallAssert, itShouldNotRunDebugWhenDebugIsFalse } from "../../test-util/test-utils.js";
import { arrayBinaryIndexOf } from "./array-binary-index-of.js";
import { arrayBinaryLastIndexOf } from "./array-binary-last-index-of.js";
import { Test_setDefaultFlags } from "../../test-util/test_set-default-flags.js";
describe("=> binary index of", () =>
{
beforeEach(() =>
{
Test_setDefaultFlags();
});
describe("=> common behaviour", () =>
{
[
[arrayBinaryLastIndexOf, "arrayBinaryLastIndexOf"] as const,
[arrayBinaryIndexOf, "arrayBinaryIndexOf"] as const,
].forEach(([binaryIndexOf, name]) =>
{
describe(`=> ${name}`, () =>
{
describe("=> in debug mode", () =>
{
itShouldCallAssert(12, () =>
{
binaryIndexOf([1, 2, 3], 2, (a, i) => a[i], 3);
});
it("| errors if data isn't sorted", () =>
{
expect(() => binaryIndexOf([3, 2, 3], 2, (a, i) => a[i], 3)).toThrow();
});
it("| errors if the comparison value to search for is NaN", () =>
{
expect(() => binaryIndexOf([1, 2, 3], NaN, (a, i) => a[i], 3)).toThrow();
});
it("| errors if generated comparison value is NaN", () =>
{
expect(() => binaryIndexOf([1, NaN, 3], 2, (a, i) => a[i], 3)).toThrow();
});
});
itShouldNotRunDebugWhenDebugIsFalse(() =>
{
binaryIndexOf([1, 2, 3], 2, (a, i) => a[i], 3);
});
describe("=> where the value doesn't exist", () =>
{
it("| returns -1", () =>
{
expect(binaryIndexOf([1, 2, 2, 3], 2.5, (a, i) => a[i], 4)).toBe(-1);
});
});
});
describe("=> where the value exists", () =>
{
it("| returns first element index", () =>
{
expect(binaryIndexOf([1, 2, 2, 3], 1, (a, i) => a[i], 4)).toBe(0);
expect(binaryIndexOf([1], 1, (a, i) => a[i], 1)).toBe(0);
});
it("| returns last element index", () =>
{
expect(binaryIndexOf([1, 2, 2, 3], 3, (a, i) => a[i], 4)).toBe(3);
});
describe("=> where min max specified", () =>
{
it("| is respected", () =>
{
expect(binaryIndexOf([1, 2, 2, 3, 3], 1, (a, i) => a[i], 4, 1)).toBe(-1);
expect(binaryIndexOf([1, 2, 2, 3, 3], 3, (a, i) => a[i], 3)).toBe(-1);
});
});
});
});
});
describe("=> binaryIndexOf", () =>
{
describe("=> where multiple values exist", () =>
{
it("| returns first index", () =>
{
expect(arrayBinaryIndexOf([1, 2, 2, 3], 2, (a, i) => a[i], 4)).toBe(1);
expect(arrayBinaryIndexOf([1, 1, 2, 2, 3], 1, (a, i) => a[i], 5)).toBe(0);
expect(arrayBinaryIndexOf([1, 2, 2, 3, 3], 3, (a, i) => a[i], 5)).toBe(3);
});
});
describe("=> where min max specified", () =>
{
it("| is respected", () =>
{
expect(arrayBinaryIndexOf([1, 2, 3, 4], 2, (a, i) => a[i], 3, 1)).toBe(1);
expect(arrayBinaryIndexOf([1, 2, 3, 4], 3, (a, i) => a[i], 3,)).toBe(2);
});
});
});
describe("=> binaryLastIndexOf", () =>
{
describe("=> where multiple values exist", () =>
{
it("| returns last index", () =>
{
expect(arrayBinaryLastIndexOf([1, 2, 2, 3], 2, (a, i) => a[i], 4)).toBe(2);
expect(arrayBinaryLastIndexOf([1, 1, 2, 2, 3], 1, (a, i) => a[i], 5)).toBe(1);
expect(arrayBinaryLastIndexOf([1, 2, 2, 3, 3], 3, (a, i) => a[i], 5)).toBe(4);
});
});
describe("=> where min max specified", () =>
{
it("| is respected", () =>
{
expect(arrayBinaryLastIndexOf([1, 2, 3, 4], 2, (a, i) => a[i], 3, 1)).toBe(1);
expect(arrayBinaryLastIndexOf([1, 2, 3, 4], 3, (a, i) => a[i], 3,)).toBe(2);
});
});
});
});