/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
"use strict";

const SyncHook = require("../SyncHook");

describe("Hook", () => {
	it("should allow to insert hooks before others and in stages", () => {
		const hook = new SyncHook();

		const calls = [];
		hook.tap("A", () => calls.push("A"));
		hook.tap({
			name: "B",
			before: "A"
		}, () => calls.push("B"));

		calls.length = 0;
		hook.call();
		expect(calls).toEqual(["B", "A"]);

		hook.tap({
			name: "C",
			before: ["A", "B"]
		}, () => calls.push("C"));

		calls.length = 0;
		hook.call();
		expect(calls).toEqual(["C", "B", "A"]);

		hook.tap({
			name: "D",
			before: "B"
		}, () => calls.push("D"));

		calls.length = 0;
		hook.call();
		expect(calls).toEqual(["C", "D", "B", "A"]);

		hook.tap({
			name: "E",
			stage: -5
		}, () => calls.push("E"));
		hook.tap({
			name: "F",
			stage: -3
		}, () => calls.push("F"));

		calls.length = 0;
		hook.call();
		expect(calls).toEqual(["E", "F", "C", "D", "B", "A"]);
	});
});
