TestPage.registerInitializer(function() {
    function loadFormattingTestAndExpectedResults(testURL) {
        let expectedURL = testURL.replace(/\.([^\.]+)$/, "-expected.$1");
        return Promise.all([
            NetworkAgent.loadResource(WI.networkManager.mainFrame.id, testURL),
            NetworkAgent.loadResource(WI.networkManager.mainFrame.id, expectedURL)
        ]).then(function(results) {
            return Promise.resolve({testText: results[0].content, expectedText: results[1].content });
        });
    }

    function runFormattingTest(mode, testName, testURL) {
        return loadFormattingTestAndExpectedResults(testURL).then(function(results) {
            let {testText, expectedText} = results;
            return new Promise(function(resolve, reject) {
                let workerProxy = WI.FormatterWorkerProxy.singleton();
                const indentString = "    ";

                function callback({formattedText, sourceMapData}) {
                    let pass = formattedText === expectedText;
                    InspectorTest.log(pass ? "PASS" : "FAIL");

                    if (!pass) {
                        InspectorTest.log("Input:");
                        InspectorTest.log("-----------");
                        InspectorTest.log(testText);
                        InspectorTest.log("-----------");
                        InspectorTest.log("Formatted Output: " + formattedText.length);
                        InspectorTest.log("-----------");
                        InspectorTest.log(formattedText);
                        InspectorTest.log("-----------");
                        InspectorTest.log("Expected Output: " + expectedText.length);
                        InspectorTest.log("-----------");
                        InspectorTest.log(expectedText);
                        InspectorTest.log("-----------");
                    }

                    resolve(pass);
                }

                switch (mode) {
                case "text/javascript": {
                    let isModule = /^module/.test(testName);
                    workerProxy.formatJavaScript(testText, isModule, indentString, callback);
                    break;
                }

                case "text/css":
                    workerProxy.formatCSS(testText, indentString, callback);
                    break;
                }
            });
        });
    }

    window.addFormattingTests = function(suite, mode, tests) {
        let testPageURL = WI.networkManager.mainFrame.mainResource.url;
        let testPageResourcesURL = testPageURL.substring(0, testPageURL.lastIndexOf("/"));

        for (let test of tests) {
            let testName = test.substring(test.lastIndexOf("/") + 1);
            let testURL = testPageResourcesURL + "/" + test;
            suite.addTestCase({
                name: suite.name + "." + testName,
                test(resolve, reject) {
                    runFormattingTest(mode, testName, testURL).then(resolve).catch(reject);
                },
                timeout: -1,
            });
        }
    };
});
