From ca787bc3e052d8cb35debbeb321c0a59f8ecbbc0 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Thu, 6 Nov 2025 20:42:50 +0100 Subject: [PATCH] tests: add error tests for builtins.genericClosure Covers error conditions for: - Invalid argument types (not an attrset) - Missing required attributes (startSet, operator) - Type mismatches (startSet/operator not correct type) - Element validation (elements not attrsets, missing key attribute) - Key comparison errors (incompatible types, uncomparable types) - Operator return value validation (not a list) --- ...val-fail-genericClosure-element-missing-key.err.exp | 10 ++++++++++ .../eval-fail-genericClosure-element-missing-key.nix | 4 ++++ ...val-fail-genericClosure-element-not-attrset.err.exp | 10 ++++++++++ .../eval-fail-genericClosure-element-not-attrset.nix | 4 ++++ ...fail-genericClosure-keys-incompatible-types.err.exp | 10 ++++++++++ ...val-fail-genericClosure-keys-incompatible-types.nix | 7 +++++++ .../eval-fail-genericClosure-keys-uncomparable.err.exp | 10 ++++++++++ .../eval-fail-genericClosure-keys-uncomparable.nix | 7 +++++++ .../eval-fail-genericClosure-missing-operator.err.exp | 10 ++++++++++ .../lang/eval-fail-genericClosure-missing-operator.nix | 3 +++ .../eval-fail-genericClosure-missing-startSet.err.exp | 10 ++++++++++ .../lang/eval-fail-genericClosure-missing-startSet.nix | 3 +++ .../lang/eval-fail-genericClosure-not-attrset.err.exp | 10 ++++++++++ .../lang/eval-fail-genericClosure-not-attrset.nix | 1 + ...l-fail-genericClosure-operator-not-function.err.exp | 10 ++++++++++ .../eval-fail-genericClosure-operator-not-function.nix | 4 ++++ .../eval-fail-genericClosure-operator-not-list.err.exp | 10 ++++++++++ .../eval-fail-genericClosure-operator-not-list.nix | 4 ++++ .../eval-fail-genericClosure-startSet-not-list.err.exp | 10 ++++++++++ .../eval-fail-genericClosure-startSet-not-list.nix | 4 ++++ 20 files changed, 141 insertions(+) create mode 100644 tests/functional/lang/eval-fail-genericClosure-element-missing-key.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-element-missing-key.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-element-not-attrset.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-element-not-attrset.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-missing-operator.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-missing-operator.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-missing-startSet.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-missing-startSet.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-not-attrset.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-not-attrset.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-operator-not-function.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-operator-not-function.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-operator-not-list.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-operator-not-list.nix create mode 100644 tests/functional/lang/eval-fail-genericClosure-startSet-not-list.err.exp create mode 100644 tests/functional/lang/eval-fail-genericClosure-startSet-not-list.nix diff --git a/tests/functional/lang/eval-fail-genericClosure-element-missing-key.err.exp b/tests/functional/lang/eval-fail-genericClosure-element-missing-key.err.exp new file mode 100644 index 000000000..f1a9e386c --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-element-missing-key.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-element-missing-key.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ { nokey = 1; } ]; + + … in one of the attrsets generated by (or initially passed to) builtins.genericClosure + + error: attribute 'key' missing diff --git a/tests/functional/lang/eval-fail-genericClosure-element-missing-key.nix b/tests/functional/lang/eval-fail-genericClosure-element-missing-key.nix new file mode 100644 index 000000000..e39e4043b --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-element-missing-key.nix @@ -0,0 +1,4 @@ +builtins.genericClosure { + startSet = [ { nokey = 1; } ]; + operator = x: [ ]; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-element-not-attrset.err.exp b/tests/functional/lang/eval-fail-genericClosure-element-not-attrset.err.exp new file mode 100644 index 000000000..24a3e434b --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-element-not-attrset.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-element-not-attrset.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ "not an attrset" ]; + + … while evaluating one of the elements generated by (or initially passed to) builtins.genericClosure + + error: expected a set but found a string: "not an attrset" diff --git a/tests/functional/lang/eval-fail-genericClosure-element-not-attrset.nix b/tests/functional/lang/eval-fail-genericClosure-element-not-attrset.nix new file mode 100644 index 000000000..6850be1c2 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-element-not-attrset.nix @@ -0,0 +1,4 @@ +builtins.genericClosure { + startSet = [ "not an attrset" ]; + operator = x: [ ]; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.err.exp b/tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.err.exp new file mode 100644 index 000000000..677e6a156 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-keys-incompatible-types.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ + + … while comparing the `key` attributes of two genericClosure elements + + error: cannot compare a string with an integer diff --git a/tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.nix b/tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.nix new file mode 100644 index 000000000..3335416fd --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-keys-incompatible-types.nix @@ -0,0 +1,7 @@ +builtins.genericClosure { + startSet = [ + { key = 1; } + { key = "string"; } + ]; + operator = x: [ ]; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.err.exp b/tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.err.exp new file mode 100644 index 000000000..d216f77ea --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-keys-uncomparable.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ + + … while comparing the `key` attributes of two genericClosure elements + + error: cannot compare a set with a set; values of that type are incomparable diff --git a/tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.nix b/tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.nix new file mode 100644 index 000000000..6a1915b6a --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-keys-uncomparable.nix @@ -0,0 +1,7 @@ +builtins.genericClosure { + startSet = [ + { key = { }; } + { key = { }; } + ]; + operator = x: [ ]; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-missing-operator.err.exp b/tests/functional/lang/eval-fail-genericClosure-missing-operator.err.exp new file mode 100644 index 000000000..0dce0ffd9 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-missing-operator.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-missing-operator.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ { key = 1; } ]; + + … in the attrset passed as argument to builtins.genericClosure + + error: attribute 'operator' missing diff --git a/tests/functional/lang/eval-fail-genericClosure-missing-operator.nix b/tests/functional/lang/eval-fail-genericClosure-missing-operator.nix new file mode 100644 index 000000000..0b7c63f6d --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-missing-operator.nix @@ -0,0 +1,3 @@ +builtins.genericClosure { + startSet = [ { key = 1; } ]; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-missing-startSet.err.exp b/tests/functional/lang/eval-fail-genericClosure-missing-startSet.err.exp new file mode 100644 index 000000000..b68c6542a --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-missing-startSet.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-missing-startSet.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| operator = x: [ ]; + + … in the attrset passed as argument to builtins.genericClosure + + error: attribute 'startSet' missing diff --git a/tests/functional/lang/eval-fail-genericClosure-missing-startSet.nix b/tests/functional/lang/eval-fail-genericClosure-missing-startSet.nix new file mode 100644 index 000000000..b62802986 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-missing-startSet.nix @@ -0,0 +1,3 @@ +builtins.genericClosure { + operator = x: [ ]; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-not-attrset.err.exp b/tests/functional/lang/eval-fail-genericClosure-not-attrset.err.exp new file mode 100644 index 000000000..fd3360310 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-not-attrset.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-not-attrset.nix:1:1: + 1| builtins.genericClosure "not an attrset" + | ^ + 2| + + … while evaluating the first argument passed to builtins.genericClosure + + error: expected a set but found a string: "not an attrset" diff --git a/tests/functional/lang/eval-fail-genericClosure-not-attrset.nix b/tests/functional/lang/eval-fail-genericClosure-not-attrset.nix new file mode 100644 index 000000000..3998c3432 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-not-attrset.nix @@ -0,0 +1 @@ +builtins.genericClosure "not an attrset" diff --git a/tests/functional/lang/eval-fail-genericClosure-operator-not-function.err.exp b/tests/functional/lang/eval-fail-genericClosure-operator-not-function.err.exp new file mode 100644 index 000000000..d3c5a627a --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-operator-not-function.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-operator-not-function.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ { key = 1; } ]; + + … while evaluating the 'operator' attribute passed as argument to builtins.genericClosure + + error: expected a function but found a string: "not a function" diff --git a/tests/functional/lang/eval-fail-genericClosure-operator-not-function.nix b/tests/functional/lang/eval-fail-genericClosure-operator-not-function.nix new file mode 100644 index 000000000..425cd427d --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-operator-not-function.nix @@ -0,0 +1,4 @@ +builtins.genericClosure { + startSet = [ { key = 1; } ]; + operator = "not a function"; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-operator-not-list.err.exp b/tests/functional/lang/eval-fail-genericClosure-operator-not-list.err.exp new file mode 100644 index 000000000..c48c27bfe --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-operator-not-list.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-operator-not-list.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = [ { key = 1; } ]; + + … while evaluating the return value of the `operator` passed to builtins.genericClosure + + error: expected a list but found a string: "not a list" diff --git a/tests/functional/lang/eval-fail-genericClosure-operator-not-list.nix b/tests/functional/lang/eval-fail-genericClosure-operator-not-list.nix new file mode 100644 index 000000000..26f97c51c --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-operator-not-list.nix @@ -0,0 +1,4 @@ +builtins.genericClosure { + startSet = [ { key = 1; } ]; + operator = x: "not a list"; +} diff --git a/tests/functional/lang/eval-fail-genericClosure-startSet-not-list.err.exp b/tests/functional/lang/eval-fail-genericClosure-startSet-not-list.err.exp new file mode 100644 index 000000000..e711a23f5 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-startSet-not-list.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'genericClosure' builtin + at /pwd/lang/eval-fail-genericClosure-startSet-not-list.nix:1:1: + 1| builtins.genericClosure { + | ^ + 2| startSet = "not a list"; + + … while evaluating the 'startSet' attribute passed as argument to builtins.genericClosure + + error: expected a list but found a string: "not a list" diff --git a/tests/functional/lang/eval-fail-genericClosure-startSet-not-list.nix b/tests/functional/lang/eval-fail-genericClosure-startSet-not-list.nix new file mode 100644 index 000000000..834c82f65 --- /dev/null +++ b/tests/functional/lang/eval-fail-genericClosure-startSet-not-list.nix @@ -0,0 +1,4 @@ +builtins.genericClosure { + startSet = "not a list"; + operator = x: [ ]; +}