53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
import { describe, expect, test } from "@fabric/testing";
|
|
import { CircularDependencyError } from "../errors/circular-dependency-error.ts";
|
|
import { sortByDependencies } from "./sort-by-dependencies.ts";
|
|
|
|
describe("sortByDependencies", () => {
|
|
test("should sort an array of objects by their dependencies", () => {
|
|
const array = [
|
|
{ id: 1, name: "A", dependencies: ["C", "D"] },
|
|
{ id: 2, name: "B", dependencies: ["A", "D"] },
|
|
{ id: 3, name: "C", dependencies: [] },
|
|
{ id: 4, name: "D", dependencies: [] },
|
|
];
|
|
|
|
const result = sortByDependencies(array, {
|
|
keyGetter: (element) => element.name,
|
|
depGetter: (element) => element.dependencies,
|
|
}).unwrapOrThrow();
|
|
|
|
expect(result).toEqual([
|
|
{ id: 3, name: "C", dependencies: [] },
|
|
{ id: 4, name: "D", dependencies: [] },
|
|
{ id: 1, name: "A", dependencies: ["C", "D"] },
|
|
{ id: 2, name: "B", dependencies: ["A", "D"] },
|
|
]);
|
|
});
|
|
|
|
test("should throw a CircularDependencyError when circular dependencies are detected", () => {
|
|
const array = [
|
|
{ id: 1, name: "A", dependencies: ["B"] },
|
|
{ id: 2, name: "B", dependencies: ["A"] },
|
|
];
|
|
|
|
expect(
|
|
sortByDependencies(array, {
|
|
keyGetter: (element) => element.name,
|
|
depGetter: (element) => element.dependencies,
|
|
}).unwrapErrorOrThrow(),
|
|
).toBeInstanceOf(CircularDependencyError);
|
|
});
|
|
|
|
test("should return an empty array when the input array is empty", () => {
|
|
// deno-lint-ignore no-explicit-any
|
|
const array: any[] = [];
|
|
|
|
const result = sortByDependencies(array, {
|
|
keyGetter: (element) => element.name,
|
|
depGetter: (element) => element.dependencies,
|
|
}).unwrapOrThrow();
|
|
|
|
expect(result).toEqual([]);
|
|
});
|
|
});
|