import * as assert from "assert";
import type { Context } from ".";
import { substituteVariablesInEnv } from "../../src/config";

export async function getTests(ctx: Context) {
    await ctx.suite("Server Env Settings", (suite) => {
        suite.addTest("Replacing Env Variables", async () => {
            const envJson = {
                USING_MY_VAR: "${env:MY_VAR} test ${env:MY_VAR}",
                MY_VAR: "test",
            };
            const expectedEnv = {
                USING_MY_VAR: "test test test",
                MY_VAR: "test",
            };
            const actualEnv = await substituteVariablesInEnv(envJson);
            assert.deepStrictEqual(actualEnv, expectedEnv);
        });

        suite.addTest("Circular dependencies remain as is", async () => {
            const envJson = {
                A_USES_B: "${env:B_USES_A}",
                B_USES_A: "${env:A_USES_B}",
                C_USES_ITSELF: "${env:C_USES_ITSELF}",
                D_USES_C: "${env:C_USES_ITSELF}",
                E_IS_ISOLATED: "test",
                F_USES_E: "${env:E_IS_ISOLATED}",
            };
            const expectedEnv = {
                A_USES_B: "${env:B_USES_A}",
                B_USES_A: "${env:A_USES_B}",
                C_USES_ITSELF: "${env:C_USES_ITSELF}",
                D_USES_C: "${env:C_USES_ITSELF}",
                E_IS_ISOLATED: "test",
                F_USES_E: "test",
            };
            const actualEnv = await substituteVariablesInEnv(envJson);
            assert.deepStrictEqual(actualEnv, expectedEnv);
        });

        suite.addTest("Should support external variables", async () => {
            process.env["TEST_VARIABLE"] = "test";
            const envJson = {
                USING_EXTERNAL_VAR: "${env:TEST_VARIABLE} test ${env:TEST_VARIABLE}",
            };
            const expectedEnv = {
                USING_EXTERNAL_VAR: "test test test",
            };

            const actualEnv = await substituteVariablesInEnv(envJson);
            assert.deepStrictEqual(actualEnv, expectedEnv);
            delete process.env["TEST_VARIABLE"];
        });

        suite.addTest("should support VSCode variables", async () => {
            const envJson = {
                USING_VSCODE_VAR: "${workspaceFolderBasename}",
            };
            const actualEnv = await substituteVariablesInEnv(envJson);
            assert.deepStrictEqual(actualEnv["USING_VSCODE_VAR"], "code");
        });
    });
}