"use strict";

var TestDiscovery = require("./helper/test-discovery");
var path = require("path");
var argv = require("yargs").argv;
var child_process = require("child_process");

var testSuite;
if (argv.language) {
	testSuite = TestDiscovery.loadSomeTests(__dirname + "/languages", argv.language);
} else {
	// load complete test suite
	testSuite = TestDiscovery.loadAllTests(__dirname + "/languages");
}

// define tests for all tests in all languages in the test suite
for (var language in testSuite) {
	if (!testSuite.hasOwnProperty(language)) {
		continue;
	}

	(function (language, testFiles) {
		describe("Testing language '" + language + "'", function () {
			this.timeout(10000);

			// Each set of tests runs in its own child process
			var child;
			before(function () {
				child = child_process.fork(__dirname + "/run-child.js", ['--language=' + language], {
					stdio: 'inherit'
				});
			});

			after(function () {
				child.kill();
			});

			testFiles.forEach(
				function (filePath) {
			        var fileName = path.basename(filePath, path.extname(filePath));

			        it("– should pass test case '" + fileName + "'",
			            function (done) {

				            child.removeAllListeners('message');
			                child.on('message', function (o) {
				                // We have to delay the call,
				                // otherwise the first message is received
				                // over and over again.
				                setTimeout(function() {
					                if (o.error) {
						                throw o.error;
					                } else if (o.success) {
						                done();
					                }
				                }, 1);
			                });
				            child.send({
					            filePath: filePath
				            });
			            }
			        );
				}
			);
		});
	})(language, testSuite[language]);
}