// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

import { test, expect } from "@perspective-dev/test";
import perspective from "../perspective_client";

import * as common from "./common.js";

/**
 * Tests the correctness of each datetime computation function in various
 * environments and parameters - different types, nulls, undefined, etc.
 */
((perspective) => {
    test.describe("bucket() function", function () {
        test.describe("parses arguments separated by arbitrary whitespace", function () {
            for (const [title, expression] of [
                ["space before", `bucket( "a",'Y')`],
                ["space after", `bucket("a",'Y' )`],
                ["space between", `bucket("a", 'Y')`],
                ["two spaces before", `bucket(  "a",'Y')`],
                ["two spaces after", `bucket("a",'Y'  )`],
                ["two spaces between", `bucket("a",  'Y')`],
                ["space before between and after", `bucket( "a", 'Y' )`],
                [
                    "two spaces before between and after",
                    `bucket(  "a",  'Y'  )`,
                ],
            ]) {
                test(title, async function () {
                    const table = await perspective.table({
                        a: "datetime",
                    });

                    const view = await table.view({
                        expressions: [expression].reduce(
                            (x, y) => Object.assign(x, { [y]: y }),
                            {},
                        ),
                    });

                    await table.update({
                        a: [
                            new Date(2020, 0, 12),
                            new Date(2020, 0, 15),
                            new Date(2021, 11, 17),
                            new Date(2019, 2, 18),
                            new Date(2019, 2, 29),
                        ],
                    });

                    let result = await view.to_columns();
                    expect(
                        result[expression].map((x) => (x ? new Date(x) : null)),
                    ).toEqual(result.a.map((x) => common.year_bucket(x)));

                    view.delete();
                    table.delete();
                });
            }
        });
    });
})(perspective);
