2025-07-15 00:49:34 +08:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const { sortWithSourceOrder } = require("../lib/util/comparators");
|
|
|
|
|
|
|
|
describe("sortWithSourceOrder", () => {
|
|
|
|
let dependencySourceOrderMap;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
dependencySourceOrderMap = new WeakMap();
|
|
|
|
});
|
|
|
|
|
|
|
|
it("dependency without the sourceOrder attribute must keep their original index in the array", () => {
|
|
|
|
const deps = [
|
|
|
|
// HarmonyImportSpecifierDependency
|
|
|
|
{ name: "b", sourceOrder: 10 },
|
|
|
|
// CommonJSRequireDependency
|
|
|
|
{ name: "a" },
|
|
|
|
// CommonJSRequireDependency
|
|
|
|
{ name: "d" },
|
|
|
|
// HarmonyImportSpecifierDependency
|
|
|
|
{ name: "c", sourceOrder: 5 }
|
|
|
|
];
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["c", "a", "d", "b"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should sort dependencies by main order when both in map", () => {
|
|
|
|
const deps = [
|
|
|
|
{ name: "b", sourceOrder: 5 },
|
|
|
|
{ name: "a", sourceOrder: 10 },
|
|
|
|
{ name: "c", sourceOrder: 3 }
|
|
|
|
];
|
|
|
|
|
|
|
|
// Add to map with main and sub orders
|
|
|
|
dependencySourceOrderMap.set(deps[0], { main: 5, sub: 0 });
|
|
|
|
dependencySourceOrderMap.set(deps[1], { main: 10, sub: 0 });
|
|
|
|
dependencySourceOrderMap.set(deps[2], { main: 3, sub: 0 });
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["c", "b", "a"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should sort by sub order when main order is same", () => {
|
|
|
|
const deps = [
|
|
|
|
{ name: "b", sourceOrder: 5 },
|
|
|
|
{ name: "a", sourceOrder: 5 },
|
|
|
|
{ name: "c", sourceOrder: 5 }
|
|
|
|
];
|
|
|
|
|
|
|
|
// Add to map with same main but different sub orders
|
|
|
|
dependencySourceOrderMap.set(deps[0], { main: 5, sub: 3 });
|
|
|
|
dependencySourceOrderMap.set(deps[1], { main: 5, sub: 1 });
|
|
|
|
dependencySourceOrderMap.set(deps[2], { main: 5, sub: 2 });
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["a", "c", "b"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should sort mixed dependencies - some in map, some not", () => {
|
|
|
|
const deps = [
|
|
|
|
{ name: "b", sourceOrder: 10 },
|
|
|
|
{ name: "a", sourceOrder: 5 },
|
|
|
|
{ name: "c", sourceOrder: 15 }
|
|
|
|
];
|
|
|
|
|
|
|
|
// Only add one to map
|
|
|
|
dependencySourceOrderMap.set(deps[0], { main: 10, sub: 0 });
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["a", "b", "c"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should sort by sourceOrder when none in map", () => {
|
|
|
|
const deps = [
|
|
|
|
{ name: "b", sourceOrder: 10 },
|
|
|
|
{ name: "a", sourceOrder: 5 },
|
|
|
|
{ name: "c", sourceOrder: 15 }
|
|
|
|
];
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["a", "b", "c"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should sort complex scenario with negative and decimal values", () => {
|
|
|
|
const deps = [
|
|
|
|
{ name: "f", sourceOrder: 10 },
|
|
|
|
{ name: "e", sourceOrder: 5 },
|
|
|
|
{ name: "d", sourceOrder: 20 },
|
|
|
|
{ name: "c", sourceOrder: 10 },
|
|
|
|
{ name: "b", sourceOrder: 5 },
|
|
|
|
{ name: "a", sourceOrder: 3 }
|
|
|
|
];
|
|
|
|
|
|
|
|
dependencySourceOrderMap.set(deps[0], { main: 10, sub: 0.5 });
|
|
|
|
dependencySourceOrderMap.set(deps[1], { main: 5, sub: 0.5 });
|
|
|
|
dependencySourceOrderMap.set(deps[2], { main: 20, sub: 0 });
|
|
|
|
dependencySourceOrderMap.set(deps[3], { main: 10, sub: 0.25 });
|
|
|
|
dependencySourceOrderMap.set(deps[4], { main: 5, sub: 0.25 });
|
|
|
|
dependencySourceOrderMap.set(deps[5], { main: 3, sub: 0 });
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["a", "b", "e", "c", "f", "d"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should maintain stable sort for equal values", () => {
|
|
|
|
const deps = [
|
|
|
|
{ name: "b", sourceOrder: 5 },
|
|
|
|
{ name: "a", sourceOrder: 5 },
|
|
|
|
{ name: "c", sourceOrder: 5 }
|
|
|
|
];
|
|
|
|
|
|
|
|
sortWithSourceOrder(deps, dependencySourceOrderMap);
|
|
|
|
|
2025-07-17 00:13:14 +08:00
|
|
|
expect(deps.map((d) => d.name)).toEqual(["b", "a", "c"]);
|
2025-07-15 00:49:34 +08:00
|
|
|
});
|
|
|
|
});
|