"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var log4js = require("log4js");
var mock = require("mock-require");
var os = require("os");
var test = require("tape");
var readFileCallback = [undefined, new Buffer("")];
mock("fs", {
    readFile: function (filename, callback) {
        filename = filename;
        return callback(undefined, readFileCallback[1]);
    }
});
var configuration_1 = require("../../shared/configuration");
var project_1 = require("../../shared/project");
var bundle_item_1 = require("../bundle-item");
var transformer_1 = require("../transformer");
var source_reader_1 = require("./source-reader");
var configuration = new configuration_1.Configuration({});
var project = new project_1.Project(configuration, log4js.getLogger("project"));
var transformer = new transformer_1.Transformer(configuration, project);
var sourceReader = new source_reader_1.SourceReader(configuration, log4js.getLogger("sourceReader"), transformer);
var karmaTypescriptConfig = {
    bundlerOptions: {
        ignore: ["ignored"],
        noParse: ["noparse"]
    }
};
var karma = {};
karma.karmaTypescriptConfig = karmaTypescriptConfig;
configuration.initialize(karma);
test("source-reader should return an empty object literal for ignored modules", function (t) {
    t.plan(1);
    var bundleItem = new bundle_item_1.BundleItem("ignored", "ignored.js");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, "module.exports={};");
    });
});
test("source-reader should read source for module", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer("var x;")];
    var bundleItem = new bundle_item_1.BundleItem("dummy", "dummy.js");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, "var x;");
    });
});
test("source-reader should create an AST", function (t) {
    t.plan(1);
    var bundleItem = new bundle_item_1.BundleItem("dummy", "dummy.js");
    sourceReader.read(bundleItem, function () {
        t.notEqual(bundleItem.ast, undefined);
    });
});
test("source-reader should create an empty dummy AST for non-script files (css, JSON...)", function (t) {
    t.plan(1);
    var bundleItem = new bundle_item_1.BundleItem("style", "style.css");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.ast, undefined);
    });
});
test("source-reader should create an empty dummy AST for modules specified in the bundler option 'noParse'", function (t) {
    t.plan(1);
    var bundleItem = new bundle_item_1.BundleItem("noparse", "noparse.js");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.ast, undefined);
    });
});
test("source-reader should prepend JSON source with 'module.exports ='", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer(JSON.stringify([1, 2, 3, "a", "b", "c"]))];
    var bundleItem = new bundle_item_1.BundleItem("json", "json.json");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, os.EOL + "module.exports = [1,2,3,\"a\",\"b\",\"c\"];");
    });
});
test("source-reader should prepend stylesheet source (original CSS) with 'module.exports ='", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer(".color { color: red; }")];
    var bundleItem = new bundle_item_1.BundleItem("style", "style.css");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, os.EOL + "module.exports = \".color { color: red; }\";");
    });
});
test("source-reader should prepend transformed stylesheet source (now JSON) with 'module.exports ='", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer(JSON.stringify({ color: "_color_xkpkl_5" }))];
    var bundleItem = new bundle_item_1.BundleItem("transformed", "transformed.css");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, os.EOL + "module.exports = {\"color\":\"_color_xkpkl_5\"};");
    });
});
test("source-reader should not prepend redundant 'module.exports ='", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer("module.exports = '';")];
    var bundleItem = new bundle_item_1.BundleItem("redundant", "redundant.css");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, "module.exports = '';");
    });
});
test("source-reader should prepend 'module.exports =' to valid javascript with non-script extension, css", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer("{ color: '_color_xkpkl_5'; }")];
    var bundleItem = new bundle_item_1.BundleItem("valid-js", "valid-js.css");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, os.EOL + "module.exports = \"{ color: \'_color_xkpkl_5\'; }\";");
    });
});
test("source-reader should prepend 'module.exports =' to valid javascript with non-script extension, txt", function (t) {
    t.plan(1);
    readFileCallback = [undefined, new Buffer("(function() {return {foo: 'baz',bork: true}})();")];
    var bundleItem = new bundle_item_1.BundleItem("valid-js", "valid-js.txt");
    sourceReader.read(bundleItem, function () {
        t.equal(bundleItem.source, os.EOL + "module.exports = \"(function() {return {foo: \'baz\',bork: true}})();\";");
    });
});
//# sourceMappingURL=source-reader.spec.js.map