nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at haskell-updates 153 lines 3.5 kB view raw
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}