///
///
import topsort = require("../lib/topsort");
describe("Topological sort tests", function () {
it("Simple 1, 2, 3", function () {
var edges:number[][] = [
[1, 2],
[2, 3]
];
var expected:number[] = [1, 2, 3];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("Simple 3, 2, 1", function () {
var edges:number[][] = [
[2, 1],
[3, 2]
];
var expected:number[] = [3, 2, 1];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("Extra 3, 2, 1, 1", function () {
var edges:number[][] = [
[2, 1],
[3, 2],
[1]
];
var expected:number[] = [3, 2, 1];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("Extra 3, 2, 1, 1, 2, 3", function () {
var edges:number[][] = [
[2, 1],
[3, 2],
[1],
[2],
[3]
];
var expected:number[] = [3, 2, 1];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("1,2,3 plus non-dependent 0", function () {
var edges:number[][] = [
[2, 3],
[1, 2],
[0]
];
var expected:number[] = [0, 1, 2, 3];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("non-dependent 0 then 1,2,3", function () {
var edges:number[][] = [
[0],
[2, 3],
[1, 2],
[0]
];
var expected:number[] = [0, 1, 2, 3];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("0, 3-2, 3-2, 3-1, 2-1, 0, 3, 2, 1", function () {
var edges:number[][] = [
[0],
[3, 2],
[3, 2],
[3, 1],
[2, 1],
[0],
[3],
[2],
[1]
];
var expected:number[] = [0, 3, 2, 1];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("0, 3-2, 3-2-1, 3-1, 2-1, 0, 3, 2, 1", function () {
var edges:number[][] = [
[0],
[3, 2],
[3, 2, 1],
[3, 1],
[2, 1, 1, 1],
[0],
[3],
[2],
[1]
];
var expected:number[] = [0, 3, 2, 1];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("Simple circular reference error", function() {
var edges:number[][] = [
[1, 2],
[2, 1]
];
var doIt = function() {
topsort(edges);
};
expect(doIt).toThrow();
});
it("Complex circular reference error", function() {
var edges:number[][] = [
[1, 2],
[2, 3],
[3, 1]
];
var doIt = function() {
topsort(edges);
};
expect(doIt).toThrow();
});
it("Ignore simple circular reference error", function() {
var edges:number[][] = [
[1, 2],
[2, 1]
];
var actual:number[] = topsort(edges, {continueOnCircularDependency: true});
// order is not specified or guaranteed in any way when circular dependencies exist
// only guarantee is that all items will be returned once each
// confirm 2 items returned..
expect(actual.length).toBe(2);
expect(actual).toContain(1);
expect(actual).toContain(2);
});
it("Ignore complex circular reference error", function() {
var edges:number[][] = [
[1, 2],
[2, 3],
[3, 1]
];
var actual:number[] = topsort(edges, {continueOnCircularDependency: true});
// order is not specified or guaranteed in any way when circular dependencies exist
// only guarantee is that all items will be returned once each
// confirm 3 items returned..
expect(actual.length).toBe(3);
expect(actual).toContain(1);
expect(actual).toContain(2);
expect(actual).toContain(3);
});
it("one, two, three, four, five, six, seven, eight, nine", function() {
var edges:string[][] =
[
['two', 'three'],
['four', 'six'],
['one', 'three'],
['two', 'four'],
['six', 'nine'],
['five', 'seven'],
['five', 'eight'],
['five', 'nine'],
['seven', 'eight'],
['eight', 'nine'],
['one', 'two'],
['four', 'five'],
['four', 'six'],
['three', 'six'],
['six', 'seven'],
['three', 'four']
];
var expected:string[] = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
var actual:string[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("6,5,4, 10,11,12, 22,21,20", function () {
var edges:number[][] = [
[6, 5],
[5, 4],
[4, 11],
[4, 10],
[4, 12],
[12, 20],
[11, 20],
[10, 20],
[10, 22],
[11, 22],
[12, 22],
[22, 21],
[21, 20]
];
var expected:number[] = [6, 5, 4, 10, 11, 12, 22, 21, 20];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
it("6,5,4, 10,11,12, 22,21,20, again..", function () {
var edges:number[][] = [
[6, 5],
[5, 4],
[22, 21],
[21, 20],
[4, 22],
[10],
[11],
[12]
];
var expected:number[] = [10, 11, 12, 6, 5, 4, 22, 21, 20];
var actual:number[] = topsort(edges);
expect(actual).toEqual(expected);
});
});