mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			146 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/* globals describe it before */
 | 
						|
"use strict";
 | 
						|
 | 
						|
const should = require("should");
 | 
						|
const path = require("path");
 | 
						|
const fs = require("fs");
 | 
						|
const spawn = require("child_process").spawn;
 | 
						|
 | 
						|
function loadOptsFile(optsPath) {
 | 
						|
	// Options file parser from Mocha
 | 
						|
	// https://github.com/mochajs/mocha/blob/2bb2b9fa35818db7a02e5068364b0c417436b1af/bin/options.js#L25-L31
 | 
						|
	return fs.readFileSync(optsPath, "utf8")
 | 
						|
		.replace(/\\\s/g, "%20")
 | 
						|
		.split(/\s/)
 | 
						|
		.filter(Boolean)
 | 
						|
		.map(function(value) {
 | 
						|
			return value.replace(/%20/g, " ");
 | 
						|
		});
 | 
						|
}
 | 
						|
 | 
						|
function getTestSpecificArguments(testDirectory) {
 | 
						|
	try {
 | 
						|
		return loadOptsFile(path.join(testDirectory, "test.opts"));
 | 
						|
	} catch(e) {
 | 
						|
		return [];
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function convertToArrayOfLines(outputArray) {
 | 
						|
	if(outputArray.length === 0) return outputArray;
 | 
						|
	return outputArray.join("").split("\n");
 | 
						|
}
 | 
						|
 | 
						|
const casesPath = path.join(__dirname, "binCases");
 | 
						|
const defaultArgs = loadOptsFile(path.join(casesPath, "test.opts"));
 | 
						|
 | 
						|
describe("BinTestCases", function() {
 | 
						|
	const categoryDirectories = fs.readdirSync(casesPath).filter((folder) => {
 | 
						|
		return fs.statSync(path.join(casesPath, folder)).isDirectory();
 | 
						|
	});
 | 
						|
 | 
						|
	const categories = categoryDirectories.map(function(categoryDirectory) {
 | 
						|
		return {
 | 
						|
			name: categoryDirectory,
 | 
						|
			tests: fs.readdirSync(path.join(casesPath, categoryDirectory))
 | 
						|
		};
 | 
						|
	});
 | 
						|
 | 
						|
	categories.forEach(function(category) {
 | 
						|
		describe(category.name, function() {
 | 
						|
 | 
						|
			category.tests.forEach(function(testName) {
 | 
						|
				const testDirectory = path.join(casesPath, category.name, testName);
 | 
						|
				const testArgs = defaultArgs.concat(getTestSpecificArguments(testDirectory));
 | 
						|
				const testAssertions = require(path.join(testDirectory, "test.js"));
 | 
						|
				const outputPath = path.join(path.resolve(casesPath, "../js/bin"), category.name, testName);
 | 
						|
 | 
						|
				const cmd = `${path.resolve(process.cwd(), "bin/webpack.js")}`;
 | 
						|
				const args = testArgs.concat(["--output-path", `${outputPath}`]);
 | 
						|
				const opts = {
 | 
						|
					cwd: path.resolve("./", testDirectory)
 | 
						|
				};
 | 
						|
 | 
						|
				const asyncExists = fs.existsSync(path.join(testDirectory, "async"));
 | 
						|
 | 
						|
				const env = {
 | 
						|
					stdout: [],
 | 
						|
					stderr: [],
 | 
						|
					error: []
 | 
						|
				};
 | 
						|
 | 
						|
				if(asyncExists) {
 | 
						|
					describe(testName, function() {
 | 
						|
						it("should run successfully", function(done) {
 | 
						|
							this.timeout(10000);
 | 
						|
							const child = spawn(process.execPath, [cmd].concat(args), opts);
 | 
						|
 | 
						|
							child.on("close", function(code) {
 | 
						|
								env.code = code;
 | 
						|
							});
 | 
						|
 | 
						|
							child.on("error", function(error) {
 | 
						|
								env.error.push(error);
 | 
						|
							});
 | 
						|
 | 
						|
							child.stdout.on("data", (data) => {
 | 
						|
								env.stdout.push(data);
 | 
						|
							});
 | 
						|
 | 
						|
							child.stderr.on("data", (data) => {
 | 
						|
								env.stderr.push(data);
 | 
						|
							});
 | 
						|
 | 
						|
							setTimeout(() => {
 | 
						|
								if(env.code) {
 | 
						|
									done(`Watch didn't run ${env.error}`);
 | 
						|
								}
 | 
						|
 | 
						|
								const stdout = convertToArrayOfLines(env.stdout);
 | 
						|
								const stderr = convertToArrayOfLines(env.stderr);
 | 
						|
								testAssertions(stdout, stderr, done);
 | 
						|
								child.kill();
 | 
						|
							}, 3000); // wait a little to get an output
 | 
						|
						});
 | 
						|
					});
 | 
						|
				} else {
 | 
						|
					describe(testName, function() {
 | 
						|
						before(function(done) {
 | 
						|
							this.timeout(20000);
 | 
						|
 | 
						|
							const child = spawn(process.execPath, [cmd].concat(args), opts);
 | 
						|
 | 
						|
							child.on("close", function(code) {
 | 
						|
								env.code = code;
 | 
						|
								done();
 | 
						|
							});
 | 
						|
 | 
						|
							child.on("error", function(error) {
 | 
						|
								env.error.push(error);
 | 
						|
							});
 | 
						|
 | 
						|
							child.stdout.on("data", (data) => {
 | 
						|
								env.stdout.push(data);
 | 
						|
							});
 | 
						|
 | 
						|
							child.stderr.on("data", (data) => {
 | 
						|
								env.stderr.push(data);
 | 
						|
							});
 | 
						|
						});
 | 
						|
 | 
						|
						it("should not cause any errors", function() {
 | 
						|
							should(env.error).be.empty();
 | 
						|
						});
 | 
						|
 | 
						|
						it("should run successfully", function() {
 | 
						|
							const stdout = convertToArrayOfLines(env.stdout);
 | 
						|
							const stderr = convertToArrayOfLines(env.stderr);
 | 
						|
							testAssertions(env.code, stdout, stderr);
 | 
						|
						});
 | 
						|
					});
 | 
						|
				}
 | 
						|
			});
 | 
						|
		});
 | 
						|
	});
 | 
						|
});
 |