load("//tools:defaults.bzl", "rollup_bundle", "ts_library")
load("@npm//@bazel/concatjs:index.bzl", "karma_web_test_suite")

def karma_test_prepare(name, env_srcs, env_deps, env_entry_point, test_srcs, test_deps, test_entry_point):
    ts_library(
        name = name + "_env",
        testonly = True,
        srcs = env_srcs,
        deps = env_deps,
    )
    rollup_bundle(
        name = name + "_env_rollup",
        testonly = True,
        sourcemap = "false",
        entry_point = env_entry_point,
        silent = True,
        deps = [
            ":" + name + "_env",
            "@npm//rollup-plugin-commonjs",
            "@npm//rollup-plugin-node-resolve",
        ],
    )
    ts_library(
        name = name + "_test",
        testonly = True,
        srcs = test_srcs,
        deps = test_deps,
    )
    rollup_bundle(
        name = name + "_rollup",
        testonly = True,
        silent = True,
        sourcemap = "false",
        entry_point = test_entry_point,
        config_file = "//packages/zone.js:rollup.config.js",
        deps = [
            ":" + name + "_test",
            "@npm//rollup-plugin-commonjs",
            "@npm//rollup-plugin-node-resolve",
        ],
    )

def karma_test(name, env_srcs, env_deps, env_entry_point, test_srcs, test_deps, test_entry_point, bootstraps, ci):
    first = True
    for subname in bootstraps:
        bootstrap = bootstraps[subname]
        firstFlag = first
        if first:
            first = False
            karma_test_prepare(name, env_srcs, env_deps, env_entry_point, test_srcs, test_deps, test_entry_point)
        _karma_test_required_dist_files = [
            "//packages/zone.js/bundles:task-tracking.umd.js",
            "//packages/zone.js/bundles:wtf.umd.js",
            "//packages/zone.js/bundles:webapis-notification.umd.js",
            "//packages/zone.js/bundles:webapis-media-query.umd.js",
            "//packages/zone.js/bundles:zone-patch-canvas.umd.js",
            "//packages/zone.js/bundles:zone-patch-fetch.umd.js",
            "//packages/zone.js/bundles:zone-patch-resize-observer.umd.js",
            "//packages/zone.js/bundles:zone-patch-message-port.umd.js",
            "//packages/zone.js/bundles:zone-patch-user-media.umd.js",
            ":" + name + "_rollup.umd",
        ]

        karma_web_test_suite(
            name = subname + "_karma_jasmine_test",
            srcs = [
                "fake_entry.js",
            ],
            bootstrap = [
                            ":" + name + "_env_rollup.umd",
                        ] + bootstrap +
                        _karma_test_required_dist_files,
            browsers = ["//dev-infra/bazel/browsers/chromium:chromium"],
            static_files = [
                ":assets/sample.json",
                ":assets/worker.js",
                ":assets/import.html",
            ],
            tags = ["zone_karma_test"],
            runtime_deps = [
                "@npm//karma-browserstack-launcher",
                "@npm//karma-sauce-launcher",
            ],
        )

        if ci and firstFlag:
            karma_web_test_suite(
                name = "karma_jasmine_test_ci",
                srcs = [
                    "fake_entry.js",
                ],
                bootstrap = [
                    ":saucelabs.js",
                    ":" + name + "_env_rollup.umd",
                    "//packages/zone.js/bundles:zone-testing-bundle.umd.min.js",
                ] + _karma_test_required_dist_files,
                browsers = ["//dev-infra/bazel/browsers/chromium:chromium"],
                config_file = "//:karma-js.conf.js",
                configuration_env_vars = ["KARMA_WEB_TEST_MODE"],
                data = [
                    "//:browser-providers.conf.js",
                    "//tools:jasmine-seed-generator.js",
                ],
                static_files = [
                    ":assets/sample.json",
                    ":assets/worker.js",
                    ":assets/import.html",
                ],
                tags = ["zone_karma_test"],
                # Visible to //:saucelabs_unit_tests_poc target
                visibility = ["//:__pkg__"],
                runtime_deps = [
                    "@npm//karma-browserstack-launcher",
                    "@npm//karma-sauce-launcher",
                ],
            )