/*
 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

// -- Testing with Mocha under Node

task installDependenciesMochaNode(type: NpmTask, dependsOn: [npmInstall]) {
    args = ['install',
            "mocha@$mocha_version",
            "source-map-support@$source_map_support_version",
            '--no-save']
    if (project.hasProperty("teamcity")) args.addAll(["mocha-teamcity-reporter@$mocha_teamcity_reporter_version"])
}

def compileJsLegacy = tasks.hasProperty("compileKotlinJsLegacy")
        ? compileKotlinJsLegacy
        : compileKotlinJs

def compileTestJsLegacy = tasks.hasProperty("compileTestKotlinJsLegacy")
        ? compileTestKotlinJsLegacy
        : compileTestKotlinJs

// todo: use atomicfu-transformed test files here (not critical)
task testMochaNode(type: NodeTask, dependsOn: [compileTestJsLegacy, installDependenciesMochaNode]) {
    script = file("${node.nodeProjectDir.getAsFile().get()}/node_modules/mocha/bin/mocha")
    args = [compileTestJsLegacy.outputFile.path, '--require', 'source-map-support/register']
    if (project.hasProperty("teamcity")) args.addAll(['--reporter', 'mocha-teamcity-reporter'])
}

def jsLegacyTestTask = project.tasks.findByName('jsLegacyTest') ? jsLegacyTest : jsTest

jsLegacyTestTask.dependsOn testMochaNode

// -- Testing with Mocha under headless Chrome

task installDependenciesMochaChrome(type: NpmTask, dependsOn: [npmInstall]) {
    args = ['install',
            "mocha@$mocha_version",
            "mocha-headless-chrome@$mocha_headless_chrome_version",
            "kotlin@$kotlin_version",
            "kotlin-test@$kotlin_version",
            '--no-save']
    if (project.hasProperty("teamcity")) args.addAll([
            "mocha-teamcity-reporter@$mocha_teamcity_reporter_version"])
}

def mochaChromeTestPage = file("$buildDir/test-page.html")

task prepareMochaChrome(dependsOn: [compileTestJsLegacy, installDependenciesMochaChrome]) {
    outputs.file(mochaChromeTestPage)
}

prepareMochaChrome.doLast {
    def nodeProjDir = node.nodeProjectDir.getAsFile().get()
    mochaChromeTestPage.text = """<!DOCTYPE html>
        <html>
        <head>
            <title>Mocha Tests</title>
            <meta charset="utf-8">
            <link rel="stylesheet" href="$nodeProjDir/node_modules/mocha/mocha.css">
        </head>
        <body>
        <div id="mocha"></div>
        <script src="$nodeProjDir/node_modules/mocha/mocha.js"></script>
        <script>mocha.setup('bdd');</script>
        <script src="$nodeProjDir/node_modules/kotlin/kotlin.js"></script>
        <script src="$nodeProjDir/node_modules/kotlin-test/kotlin-test.js"></script>
        <script src="$compileJsLegacy.outputFile"></script>
        <script src="$compileTestJsLegacy.outputFile"></script>
        <script>mocha.run();</script>
        </body>
        </html>
    """
}

task testMochaChrome(type: NodeTask, dependsOn: prepareMochaChrome) {
    script = file("${node.nodeProjectDir.getAsFile().get()}/node_modules/mocha-headless-chrome/bin/start")
    args = [compileTestJsLegacy.outputFile.path, '--file', mochaChromeTestPage]
    if (project.hasProperty("teamcity")) args.addAll(['--reporter', 'mocha-teamcity-reporter'])
}

// todo: Commented out because mocha-headless-chrome does not work on TeamCity
//jsTest.dependsOn testMochaChrome

// -- Testing with Mocha under jsdom

task installDependenciesMochaJsdom(type: NpmTask, dependsOn: [npmInstall]) {
    args = ['install',
            "mocha@$mocha_version",
            "jsdom@$jsdom_version",
            "jsdom-global@$jsdom_global_version",
            "source-map-support@$source_map_support_version",
            '--no-save']
    if (project.hasProperty("teamcity")) args.addAll(["mocha-teamcity-reporter@$mocha_teamcity_reporter_version"])
}

task testMochaJsdom(type: NodeTask, dependsOn: [compileTestJsLegacy, installDependenciesMochaJsdom]) {
    script = file("${node.nodeProjectDir.getAsFile().get()}/node_modules/mocha/bin/mocha")
    args = [compileTestJsLegacy.outputFile.path, '--require', 'source-map-support/register', '--require', 'jsdom-global/register']
    if (project.hasProperty("teamcity")) args.addAll(['--reporter', 'mocha-teamcity-reporter'])
}

jsLegacyTestTask.dependsOn testMochaJsdom

