From 6fb5276e7bc7f2a0d81a5194ebac4ce95b6f87d6 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Sun, 7 Dec 2025 14:43:46 +0100 Subject: [PATCH] test: add tests for function equality behavior Add tests for function equality covering both direct comparisons and comparisons within composite types (lists and attribute sets). Tests verify: - Direct function comparisons always return false - Value identity optimization in composite types allows identical functions to compare as equal when both references point to the same function value --- ...al-okay-equal-function-attrset-distinct-similar.exp | 1 + ...al-okay-equal-function-attrset-distinct-similar.nix | 3 +++ .../eval-okay-equal-function-attrset-identical.exp | 1 + .../eval-okay-equal-function-attrset-identical.nix | 10 ++++++++++ ...val-okay-equal-function-direct-distinct-similar.exp | 1 + ...val-okay-equal-function-direct-distinct-similar.nix | 3 +++ .../lang/eval-okay-equal-function-direct-identical.exp | 1 + .../lang/eval-okay-equal-function-direct-identical.nix | 6 ++++++ .../eval-okay-equal-function-list-distinct-similar.exp | 1 + .../eval-okay-equal-function-list-distinct-similar.nix | 3 +++ .../lang/eval-okay-equal-function-list-identical.exp | 1 + .../lang/eval-okay-equal-function-list-identical.nix | 6 ++++++ 12 files changed, 37 insertions(+) create mode 100644 tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.exp create mode 100644 tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.nix create mode 100644 tests/functional/lang/eval-okay-equal-function-attrset-identical.exp create mode 100644 tests/functional/lang/eval-okay-equal-function-attrset-identical.nix create mode 100644 tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.exp create mode 100644 tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.nix create mode 100644 tests/functional/lang/eval-okay-equal-function-direct-identical.exp create mode 100644 tests/functional/lang/eval-okay-equal-function-direct-identical.nix create mode 100644 tests/functional/lang/eval-okay-equal-function-list-distinct-similar.exp create mode 100644 tests/functional/lang/eval-okay-equal-function-list-distinct-similar.nix create mode 100644 tests/functional/lang/eval-okay-equal-function-list-identical.exp create mode 100644 tests/functional/lang/eval-okay-equal-function-list-identical.nix diff --git a/tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.exp b/tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.exp new file mode 100644 index 000000000..c508d5366 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.exp @@ -0,0 +1 @@ +false diff --git a/tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.nix b/tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.nix new file mode 100644 index 000000000..13c30d9f7 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-attrset-distinct-similar.nix @@ -0,0 +1,3 @@ +# Distinct but not identical functions in attribute set compare as unequal +# See https://nix.dev/manual/nix/latest/language/operators#equality +{ a = (x: x); } == { a = (x: x); } diff --git a/tests/functional/lang/eval-okay-equal-function-attrset-identical.exp b/tests/functional/lang/eval-okay-equal-function-attrset-identical.exp new file mode 100644 index 000000000..27ba77dda --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-attrset-identical.exp @@ -0,0 +1 @@ +true diff --git a/tests/functional/lang/eval-okay-equal-function-attrset-identical.nix b/tests/functional/lang/eval-okay-equal-function-attrset-identical.nix new file mode 100644 index 000000000..830267c82 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-attrset-identical.nix @@ -0,0 +1,10 @@ +# Function comparison in attribute set uses value identity optimization +# See https://nix.dev/manual/nix/latest/language/operators#value-identity-optimization +let + f = x: x; +in +{ + a = f; +} == { + a = f; +} diff --git a/tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.exp b/tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.exp new file mode 100644 index 000000000..c508d5366 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.exp @@ -0,0 +1 @@ +false diff --git a/tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.nix b/tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.nix new file mode 100644 index 000000000..f3a931c6b --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-direct-distinct-similar.nix @@ -0,0 +1,3 @@ +# Direct comparison of distinct but not identical functions returns false +# See https://nix.dev/manual/nix/latest/language/operators#equality +(x: x) == (x: x) diff --git a/tests/functional/lang/eval-okay-equal-function-direct-identical.exp b/tests/functional/lang/eval-okay-equal-function-direct-identical.exp new file mode 100644 index 000000000..c508d5366 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-direct-identical.exp @@ -0,0 +1 @@ +false diff --git a/tests/functional/lang/eval-okay-equal-function-direct-identical.nix b/tests/functional/lang/eval-okay-equal-function-direct-identical.nix new file mode 100644 index 000000000..f91a39fb8 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-direct-identical.nix @@ -0,0 +1,6 @@ +# Direct comparison of identical function returns false +# See https://nix.dev/manual/nix/latest/language/operators#equality +let + f = x: x; +in +f == f diff --git a/tests/functional/lang/eval-okay-equal-function-list-distinct-similar.exp b/tests/functional/lang/eval-okay-equal-function-list-distinct-similar.exp new file mode 100644 index 000000000..c508d5366 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-list-distinct-similar.exp @@ -0,0 +1 @@ +false diff --git a/tests/functional/lang/eval-okay-equal-function-list-distinct-similar.nix b/tests/functional/lang/eval-okay-equal-function-list-distinct-similar.nix new file mode 100644 index 000000000..cd6182770 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-list-distinct-similar.nix @@ -0,0 +1,3 @@ +# Distinct but not identical functions in list compare as unequal +# See https://nix.dev/manual/nix/latest/language/operators#equality +[ (x: x) ] == [ (x: x) ] diff --git a/tests/functional/lang/eval-okay-equal-function-list-identical.exp b/tests/functional/lang/eval-okay-equal-function-list-identical.exp new file mode 100644 index 000000000..27ba77dda --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-list-identical.exp @@ -0,0 +1 @@ +true diff --git a/tests/functional/lang/eval-okay-equal-function-list-identical.nix b/tests/functional/lang/eval-okay-equal-function-list-identical.nix new file mode 100644 index 000000000..5156ffc47 --- /dev/null +++ b/tests/functional/lang/eval-okay-equal-function-list-identical.nix @@ -0,0 +1,6 @@ +# Function comparison in list uses value identity optimization +# See https://nix.dev/manual/nix/latest/language/operators#value-identity-optimization +let + f = x: x; +in +[ f ] == [ f ]