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

const people = [
  { name: "Hedlund, Magnus" },
  { name: "Adams, Terry" },
  { name: "Weiss, Charlotte" },
];

SIt(
  "Performs a basic join",
  (s) =>
    s
      .group_join(
        [
          { name: "Barley", owner: people[1] },
          { name: "Boots", owner: people[1] },
          { name: "Whiskers", owner: people[2] },
          { name: "Daisy", owner: people[0] },
        ].geninq(),
        (person) => person.name,
        (pet) => pet.owner.name,
        (a, b) => ({
          owner: a.name,
          pets: b.select((p) => p.name).array(),
        })
      )
      .array(),
  [
    {
      owner: "Hedlund, Magnus",
      pets: ["Daisy"],
    },
    {
      owner: "Adams, Terry",
      pets: ["Barley", "Boots"],
    },
    {
      owner: "Weiss, Charlotte",
      pets: ["Whiskers"],
    },
  ],
  people
);
AIt(
  "Performs a basic join",
  (s) =>
    s
      .group_join(
        [
          { name: "Barley", owner: people[1] },
          { name: "Boots", owner: people[1] },
          { name: "Whiskers", owner: people[2] },
          { name: "Daisy", owner: people[0] },
        ]
          .geninq()
          .async(),
        (person) => person.name,
        (pet) => pet.owner.name,
        async (a, b) => ({
          owner: a.name,
          pets: await b.select((p) => p.name).array(),
        })
      )
      .array(),
  [
    {
      owner: "Hedlund, Magnus",
      pets: ["Daisy"],
    },
    {
      owner: "Adams, Terry",
      pets: ["Barley", "Boots"],
    },
    {
      owner: "Weiss, Charlotte",
      pets: ["Whiskers"],
    },
  ],
  people
);

SIt(
  "Performs a custom comparitor",
  (s) =>
    s
      .group_join(
        [
          { name: "Barley", owner: people[1] },
          { name: "Boots", owner: people[1] },
          { name: "Whiskers", owner: people[2] },
          { name: "Daisy", owner: people[0] },
        ].geninq(),
        (person) => person,
        (pet) => pet.owner,
        (a, b) => ({
          owner: a.name,
          pets: b.select((p) => p.name).array(),
        }),
        (a, b) => a.name === b.name
      )
      .array(),
  [
    {
      owner: "Hedlund, Magnus",
      pets: ["Daisy"],
    },
    {
      owner: "Adams, Terry",
      pets: ["Barley", "Boots"],
    },
    {
      owner: "Weiss, Charlotte",
      pets: ["Whiskers"],
    },
  ],
  people
);
AIt(
  "Performs a basic join",
  (s) =>
    s
      .group_join(
        [
          { name: "Barley", owner: people[1] },
          { name: "Boots", owner: people[1] },
          { name: "Whiskers", owner: people[2] },
          { name: "Daisy", owner: people[0] },
        ]
          .geninq()
          .async(),
        (person) => person,
        (pet) => pet.owner,
        async (a, b) => ({
          owner: a.name,
          pets: await b.select((p) => p.name).array(),
        }),
        (a, b) => a.name === b.name
      )
      .array(),
  [
    {
      owner: "Hedlund, Magnus",
      pets: ["Daisy"],
    },
    {
      owner: "Adams, Terry",
      pets: ["Barley", "Boots"],
    },
    {
      owner: "Weiss, Charlotte",
      pets: ["Whiskers"],
    },
  ],
  people
);

SIt(
  "Performs a basic join on an array",
  (s) =>
    s
      .group_join(
        [
          { name: "Barley", owner: people[1] },
          { name: "Boots", owner: people[1] },
          { name: "Whiskers", owner: people[2] },
          { name: "Daisy", owner: people[0] },
        ],
        (person) => person.name,
        (pet) => pet.owner.name,
        (a, b) => ({
          owner: a.name,
          pets: b.select((p) => p.name).array(),
        })
      )
      .array(),
  [
    {
      owner: "Hedlund, Magnus",
      pets: ["Daisy"],
    },
    {
      owner: "Adams, Terry",
      pets: ["Barley", "Boots"],
    },
    {
      owner: "Weiss, Charlotte",
      pets: ["Whiskers"],
    },
  ],
  people
);
AIt(
  "Performs a basic join on an array",
  (s) =>
    s
      .group_join(
        [
          { name: "Barley", owner: people[1] },
          { name: "Boots", owner: people[1] },
          { name: "Whiskers", owner: people[2] },
          { name: "Daisy", owner: people[0] },
        ],
        (person) => person.name,
        (pet) => pet.owner.name,
        async (a, b) => ({
          owner: a.name,
          pets: await b.select((p) => p.name).array(),
        })
      )
      .array(),
  [
    {
      owner: "Hedlund, Magnus",
      pets: ["Daisy"],
    },
    {
      owner: "Adams, Terry",
      pets: ["Barley", "Boots"],
    },
    {
      owner: "Weiss, Charlotte",
      pets: ["Whiskers"],
    },
  ],
  people
);
