2023-10-17 23:39:45 +03:00
|
|
|
{
|
|
|
|
pkgs ? import <nixpkgs> {},
|
|
|
|
lib ? import <nixpkgs/lib>,
|
|
|
|
...
|
|
|
|
}: let
|
2023-10-25 02:12:42 +03:00
|
|
|
findCycles = import ../../../modules/flake-parts/lib/internal/findCycles.nix {inherit lib;};
|
2023-10-10 19:54:51 +03:00
|
|
|
in {
|
|
|
|
test_simple = {
|
2023-10-17 23:39:45 +03:00
|
|
|
expr = findCycles {
|
2023-10-10 19:54:51 +03:00
|
|
|
dependencyGraph = {
|
|
|
|
a.v1 = [
|
|
|
|
{
|
|
|
|
name = "b";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
roots = {
|
|
|
|
a = "v1";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
expected = {
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
test_cycle_length_3 = {
|
2023-10-17 23:39:45 +03:00
|
|
|
expr = findCycles {
|
2023-10-10 19:54:51 +03:00
|
|
|
dependencyGraph = {
|
|
|
|
a.v1 = [
|
|
|
|
{
|
|
|
|
name = "b";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
c.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
roots = {
|
|
|
|
a = "v1";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
expected = {
|
|
|
|
c.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
test_two_roots_both_chosen = {
|
2023-10-17 23:39:45 +03:00
|
|
|
expr = findCycles {
|
2023-10-10 19:54:51 +03:00
|
|
|
dependencyGraph = {
|
|
|
|
a.v1 = [
|
|
|
|
{
|
|
|
|
name = "b";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
c.v1 = [
|
|
|
|
{
|
|
|
|
name = "d";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
d.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
roots = {
|
|
|
|
a = "v1";
|
|
|
|
c = "v1";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
expected = {
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
d.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
test_two_roots_one_chosen = {
|
2023-10-17 23:39:45 +03:00
|
|
|
expr = findCycles {
|
2023-10-10 19:54:51 +03:00
|
|
|
dependencyGraph = {
|
|
|
|
a.v1 = [
|
|
|
|
{
|
|
|
|
name = "b";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
c.v1 = [
|
|
|
|
{
|
|
|
|
name = "d";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
d.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
roots = {
|
|
|
|
a = "v1";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
expected = {
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
test_c_visited_twice_no_cycle = {
|
2023-10-17 23:39:45 +03:00
|
|
|
expr = findCycles {
|
2023-10-10 19:54:51 +03:00
|
|
|
dependencyGraph = {
|
|
|
|
a.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
c.v1 = [];
|
|
|
|
};
|
|
|
|
roots = {
|
|
|
|
a = "v1";
|
|
|
|
b = "v1";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
expected = {};
|
|
|
|
};
|
|
|
|
|
|
|
|
test_two_cycles_one_root = {
|
2023-10-17 23:39:45 +03:00
|
|
|
expr = findCycles {
|
2023-10-10 19:54:51 +03:00
|
|
|
dependencyGraph = {
|
|
|
|
a.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
c.v1 = [
|
|
|
|
{
|
|
|
|
name = "d";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
d.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
{
|
|
|
|
name = "b";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
roots = {
|
|
|
|
a = "v1";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
expected = {
|
|
|
|
d.v1 = [
|
|
|
|
{
|
|
|
|
name = "a";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
b.v1 = [
|
|
|
|
{
|
|
|
|
name = "c";
|
|
|
|
version = "v1";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
# TODO: fix the implementation to remove furthest edges from the root only
|
|
|
|
# test_two_cycles_two_roots = {
|
|
|
|
# expr = findCycles {
|
|
|
|
# dependencyGraph = {
|
|
|
|
# a.v1 = [
|
|
|
|
# {name = "c"; version = "v1";}
|
|
|
|
# ];
|
|
|
|
# b.v1 = [
|
|
|
|
# {name = "c"; version = "v1";}
|
|
|
|
# ];
|
|
|
|
# c.v1 = [
|
|
|
|
# {name = "d"; version = "v1";}
|
|
|
|
# ];
|
|
|
|
# d.v1 = [
|
|
|
|
# {name = "a"; version = "v1";}
|
|
|
|
# {name = "b"; version = "v1";}
|
|
|
|
# ];
|
|
|
|
# };
|
|
|
|
# roots = {
|
|
|
|
# a = "v1";
|
|
|
|
# b = "v1";
|
|
|
|
# };
|
|
|
|
# };
|
|
|
|
# expected = {
|
|
|
|
# d.v1 = [
|
|
|
|
# {name = "a"; version = "v1";}
|
|
|
|
# {name = "b"; version = "v1";}
|
|
|
|
# ];
|
|
|
|
# };
|
|
|
|
# };
|
|
|
|
}
|