import { SIt, AIt } from "../test-utils";
import "./group-by";
import "./select";
import "./array";

SIt(
  "Groups simple numbers",
  (s) =>
    s
      .group_by((i) => i)
      .select((i) => [i[0], i[1].array()])
      .array(),
  [
    [1, [1]],
    [2, [2]],
    [3, [3]],
  ]
);
AIt(
  "Groups simple numbers",
  (s) =>
    s
      .group_by((i) => i)
      .select(async (i) => [i[0], await i[1].array()])
      .array(),
  [
    [1, [1]],
    [2, [2]],
    [3, [3]],
  ]
);

SIt(
  "Groups on a custom comparitor",
  (s) =>
    s
      .group_by(
        (i) => i,
        (a, b) => a.test === b.test
      )
      .select((i) => [i[0], i[1].array()])
      .array(),
  [
    [
      { test: 1, part: 1 },
      [
        { test: 1, part: 1 },
        { test: 1, part: 3 },
      ],
    ],
    [
      { test: 2, part: 2 },
      [
        { test: 2, part: 2 },
        { test: 2, part: 4 },
      ],
    ],
  ],
  [
    { test: 1, part: 1 },
    { test: 2, part: 2 },
    { test: 1, part: 3 },
    { test: 2, part: 4 },
  ]
);
AIt(
  "Groups on a custom comparitor",
  (s) =>
    s
      .group_by(
        (i) => i,
        (a, b) => a.test === b.test
      )
      .select(async (i) => [i[0], await i[1].array()])
      .array(),
  [
    [
      { test: 1, part: 1 },
      [
        { test: 1, part: 1 },
        { test: 1, part: 3 },
      ],
    ],
    [
      { test: 2, part: 2 },
      [
        { test: 2, part: 2 },
        { test: 2, part: 4 },
      ],
    ],
  ],
  [
    { test: 1, part: 1 },
    { test: 2, part: 2 },
    { test: 1, part: 3 },
    { test: 2, part: 4 },
  ]
);

SIt(
  "Groups on a custom key",
  (s) =>
    s
      .group_by((i) => i.test)
      .select((i) => [i[0], i[1].array()])
      .array(),
  [
    [
      1,
      [
        { test: 1, part: 1 },
        { test: 1, part: 3 },
      ],
    ],
    [
      2,
      [
        { test: 2, part: 2 },
        { test: 2, part: 4 },
      ],
    ],
  ],
  [
    { test: 1, part: 1 },
    { test: 2, part: 2 },
    { test: 1, part: 3 },
    { test: 2, part: 4 },
  ]
);
AIt(
  "Groups on a custom key",
  (s) =>
    s
      .group_by((i) => i.test)
      .select(async (i) => [i[0], await i[1].array()])
      .array(),
  [
    [
      1,
      [
        { test: 1, part: 1 },
        { test: 1, part: 3 },
      ],
    ],
    [
      2,
      [
        { test: 2, part: 2 },
        { test: 2, part: 4 },
      ],
    ],
  ],
  [
    { test: 1, part: 1 },
    { test: 2, part: 2 },
    { test: 1, part: 3 },
    { test: 2, part: 4 },
  ]
);

SIt(
  "Builds a custom element",
  (s) =>
    s
      .group_by({ key: (i) => i.test, element: (i) => i.part })
      .select((i) => [i[0], i[1].array()])
      .array(),
  [
    [1, [1, 3]],
    [2, [2, 4]],
  ],
  [
    { test: 1, part: 1 },
    { test: 2, part: 2 },
    { test: 1, part: 3 },
    { test: 2, part: 4 },
  ]
);
AIt(
  "Groups on a custom key",
  (s) =>
    s
      .group_by({ key: (i) => i.test, element: (i) => i.part })
      .select(async (i) => [i[0], await i[1].array()])
      .array(),
  [
    [1, [1, 3]],
    [2, [2, 4]],
  ],
  [
    { test: 1, part: 1 },
    { test: 2, part: 2 },
    { test: 1, part: 3 },
    { test: 2, part: 4 },
  ]
);
