nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{ lib }:
2let
3 p = import ../../stdenv/generic/problems.nix { inherit lib; };
4
5 genHandlerTest =
6 let
7 slowReference =
8 config: package: name: kind:
9 # Try to find an explicit handler
10 (config.problems.handlers.${package} or { }).${name}
11 # Fall back, iterating through the matchers
12 or (lib.pipe config.problems.matchers [
13 # Find matches
14 (lib.filter (
15 matcher:
16 (matcher.name != null -> name == matcher.name)
17 && (matcher.kind != null -> kind == matcher.kind)
18 && (matcher.package != null -> package == matcher.package)
19 ))
20 # Extract handler level
21 (map (matcher: matcher.handler))
22 # Take the strongest matched handler level
23 (lib.foldl' p.handlers.max "ignore")
24 ]);
25
26 genValue =
27 f:
28 map
29 (
30 package:
31 map
32 (
33 name:
34 map (kind: f package name kind) [
35 "k1"
36 "k2"
37 "k3"
38 ]
39 )
40 [
41 "n1"
42 "n2"
43 "n3"
44 ]
45 )
46 [
47 "p1"
48 "p2"
49 "p3"
50 ];
51
52 in
53 v: {
54 expr = genValue (p.genHandlerSwitch { problems = v; }).handlerForProblem;
55 expected = genValue (slowReference {
56 problems = v;
57 });
58 };
59in
60lib.runTests {
61 testHandlersLessThan =
62 let
63 levels = p.handlers.levels;
64 slowReference =
65 a: b:
66 lib.lists.findFirstIndex (v: v == a) (abort "Shouldn't happen") levels
67 < lib.lists.findFirstIndex (v: v == b) (abort "Shouldn't happen") levels;
68
69 genValue =
70 f:
71 lib.genList (
72 i: lib.genList (j: f (lib.elemAt levels i) (lib.elemAt levels j)) (lib.length levels)
73 ) (lib.length levels);
74 in
75 {
76 expr = genValue p.handlers.lessThan;
77 expected = genValue slowReference;
78 };
79
80 testHandlerEmpty = genHandlerTest {
81 matchers = [ ];
82 handlers = { };
83 };
84
85 testHandlerNameSpecificHandlers = genHandlerTest {
86 matchers = [ ];
87 handlers.p1.n1 = "error";
88 handlers.p1.n2 = "warn";
89 handlers.p1.n3 = "ignore";
90 };
91
92 testHandlerPackageSpecificHandlers = genHandlerTest {
93 matchers = [ ];
94 handlers.p1.n1 = "error";
95 handlers.p2.n1 = "warn";
96 handlers.p3.n1 = "ignore";
97 };
98
99 testHandlersOverrideMatchers = genHandlerTest {
100 matchers = [
101 {
102 package = "p1";
103 name = "n1";
104 kind = null;
105 handler = "error";
106 }
107 ];
108 handlers.p1.n1 = "warn";
109 };
110
111 testMatchersDefault = genHandlerTest {
112 matchers = [
113 # Everything should warn by default
114 {
115 package = null;
116 name = null;
117 kind = null;
118 handler = "warn";
119 }
120 ];
121 handlers = { };
122 };
123
124 testMatchersComplicated = genHandlerTest {
125 matchers = [
126 {
127 package = "p1";
128 name = null;
129 kind = null;
130 handler = "warn";
131 }
132 {
133 package = "p1";
134 name = "n1";
135 kind = null;
136 handler = "error";
137 }
138 {
139 package = "p1";
140 name = null;
141 kind = "k1";
142 handler = "error";
143 }
144 {
145 package = "p1";
146 name = "n2";
147 kind = "k2";
148 handler = "error";
149 }
150 ];
151 handlers = { };
152 };
153}