From 5e938ebb20446dc2b38349388d16b2590f778223 Mon Sep 17 00:00:00 2001 From: DavHau Date: Tue, 10 Oct 2023 18:54:51 +0200 Subject: [PATCH] findCycles: add some unit tests --- .../dream2nix-repo-single-package/flake.nix | 28 ++ tests/nix-unit/test_findCycles/default.nix | 272 ++++++++++++++++++ 2 files changed, 300 insertions(+) create mode 100644 examples/dream2nix-repo-single-package/flake.nix create mode 100644 tests/nix-unit/test_findCycles/default.nix diff --git a/examples/dream2nix-repo-single-package/flake.nix b/examples/dream2nix-repo-single-package/flake.nix new file mode 100644 index 0000000000..1e46fd973b --- /dev/null +++ b/examples/dream2nix-repo-single-package/flake.nix @@ -0,0 +1,28 @@ +{ + description = "My flake with dream2nix packages"; + + inputs = { + dream2nix.url = "github:nix-community/dream2nix"; + nixpkgs.follows = "dream2nix/nixpkgs"; + }; + + outputs = inputs @ { + self, + dream2nix, + nixpkgs, + ... + }: let + system = "x86_64-linux"; + in { + # all packages defined inside ./packages/ + packages.${system}.default = nixpkgs.lib.evalModules { + modules = []; + + projectRoot = ./.; + # can be changed to ".git" or "flake.nix" to get rid of .project-root + projectRootFile = "flake.nix"; + packagesDir = ./packages; + packageSets.nixpkgs = nixpkgs.legacyPackages.${system}; + }; + }; +} diff --git a/tests/nix-unit/test_findCycles/default.nix b/tests/nix-unit/test_findCycles/default.nix new file mode 100644 index 0000000000..f0f98399a6 --- /dev/null +++ b/tests/nix-unit/test_findCycles/default.nix @@ -0,0 +1,272 @@ +{ + pkgs ? import {}, + lib ? import , + ... +}: let + findCycles = import ../../../lib/internal/findCycles.nix {inherit lib;}; +in { + test_simple = { + expr = findCycles { + 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 = { + expr = findCycles { + 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 = { + expr = findCycles { + 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 = { + expr = findCycles { + 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 = { + expr = findCycles { + 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 = { + 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"; + }; + }; + 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";} + # ]; + # }; + # }; +}