From aee46b0b49093b089a665c23684a498044a09b07 Mon Sep 17 00:00:00 2001 From: imxyy_soope_ Date: Fri, 30 Jan 2026 11:18:25 +0800 Subject: [PATCH] feat: use CppNix's test suite --- nix-js/src/value.rs | 23 +- nix-js/tests/lang.rs | 273 ++++++++++++++++++ nix-js/tests/lang/dir1/a.nix | 1 + nix-js/tests/lang/dir2/a.nix | 1 + nix-js/tests/lang/dir2/b.nix | 1 + nix-js/tests/lang/dir3/a.nix | 1 + nix-js/tests/lang/dir3/b.nix | 1 + nix-js/tests/lang/dir3/c.nix | 1 + nix-js/tests/lang/dir4/a.nix | 1 + nix-js/tests/lang/dir4/c.nix | 1 + nix-js/tests/lang/eval-fail-abort.err.exp | 8 + nix-js/tests/lang/eval-fail-abort.nix | 1 + ...rvOutputDependencies-empty-context.err.exp | 8 + ...addDrvOutputDependencies-empty-context.nix | 1 + ...putDependencies-multi-elem-context.err.exp | 9 + ...vOutputDependencies-multi-elem-context.nix | 25 ++ ...putDependencies-wrong-element-kind.err.exp | 9 + ...vOutputDependencies-wrong-element-kind.nix | 13 + .../eval-fail-addErrorContext-example.err.exp | 24 ++ .../eval-fail-addErrorContext-example.nix | 9 + ...al-fail-assert-equal-attrs-names-2.err.exp | 8 + .../eval-fail-assert-equal-attrs-names-2.nix | 8 + ...eval-fail-assert-equal-attrs-names.err.exp | 8 + .../eval-fail-assert-equal-attrs-names.nix | 8 + ...ail-assert-equal-derivations-extra.err.exp | 26 ++ ...al-fail-assert-equal-derivations-extra.nix | 14 + ...eval-fail-assert-equal-derivations.err.exp | 26 ++ .../eval-fail-assert-equal-derivations.nix | 15 + .../eval-fail-assert-equal-floats.err.exp | 22 ++ .../lang/eval-fail-assert-equal-floats.nix | 2 + ...-fail-assert-equal-function-direct.err.exp | 9 + ...eval-fail-assert-equal-function-direct.nix | 4 + .../eval-fail-assert-equal-int-float.err.exp | 8 + .../lang/eval-fail-assert-equal-int-float.nix | 2 + .../lang/eval-fail-assert-equal-ints.err.exp | 22 ++ .../lang/eval-fail-assert-equal-ints.nix | 2 + ...eval-fail-assert-equal-list-length.err.exp | 8 + .../eval-fail-assert-equal-list-length.nix | 6 + .../lang/eval-fail-assert-equal-paths.err.exp | 8 + .../lang/eval-fail-assert-equal-paths.nix | 2 + ...eval-fail-assert-equal-type-nested.err.exp | 22 ++ .../eval-fail-assert-equal-type-nested.nix | 2 + .../lang/eval-fail-assert-equal-type.err.exp | 8 + .../lang/eval-fail-assert-equal-type.nix | 2 + .../lang/eval-fail-assert-nested-bool.err.exp | 66 +++++ .../lang/eval-fail-assert-nested-bool.nix | 3 + nix-js/tests/lang/eval-fail-assert.err.exp | 30 ++ nix-js/tests/lang/eval-fail-assert.nix | 8 + .../lang/eval-fail-attr-name-type.err.exp | 21 ++ .../tests/lang/eval-fail-attr-name-type.nix | 7 + ...fail-attrset-merge-drops-later-rec.err.exp | 6 + ...val-fail-attrset-merge-drops-later-rec.nix | 8 + ...al-fail-bad-string-interpolation-1.err.exp | 8 + .../eval-fail-bad-string-interpolation-1.nix | 1 + ...al-fail-bad-string-interpolation-2.err.exp | 1 + .../eval-fail-bad-string-interpolation-2.nix | 1 + ...al-fail-bad-string-interpolation-3.err.exp | 8 + .../eval-fail-bad-string-interpolation-3.nix | 1 + ...al-fail-bad-string-interpolation-4.err.exp | 9 + .../eval-fail-bad-string-interpolation-4.nix | 19 ++ nix-js/tests/lang/eval-fail-blackhole.err.exp | 14 + nix-js/tests/lang/eval-fail-blackhole.nix | 5 + .../tests/lang/eval-fail-call-primop.err.exp | 10 + nix-js/tests/lang/eval-fail-call-primop.nix | 1 + nix-js/tests/lang/eval-fail-deepseq.err.exp | 20 ++ nix-js/tests/lang/eval-fail-deepseq.nix | 1 + .../lang/eval-fail-derivation-name.err.exp | 26 ++ .../tests/lang/eval-fail-derivation-name.nix | 5 + .../lang/eval-fail-dup-dynamic-attrs.err.exp | 14 + .../lang/eval-fail-dup-dynamic-attrs.nix | 8 + .../lang/eval-fail-duplicate-traces.err.exp | 51 ++++ .../tests/lang/eval-fail-duplicate-traces.nix | 6 + nix-js/tests/lang/eval-fail-eol-1.err.exp | 6 + nix-js/tests/lang/eval-fail-eol-1.nix | 3 + nix-js/tests/lang/eval-fail-eol-2.err.exp | 6 + nix-js/tests/lang/eval-fail-eol-2.nix | 2 + nix-js/tests/lang/eval-fail-eol-3.err.exp | 6 + nix-js/tests/lang/eval-fail-eol-3.nix | 3 + .../lang/eval-fail-fetchTree-negative.err.exp | 8 + .../lang/eval-fail-fetchTree-negative.nix | 5 + ...-fail-fetchurl-baseName-attrs-name.err.exp | 8 + ...eval-fail-fetchurl-baseName-attrs-name.nix | 4 + .../eval-fail-fetchurl-baseName-attrs.err.exp | 8 + .../eval-fail-fetchurl-baseName-attrs.nix | 1 + .../lang/eval-fail-fetchurl-baseName.err.exp | 8 + .../lang/eval-fail-fetchurl-baseName.nix | 1 + ...ake-ref-to-string-negative-integer.err.exp | 16 + ...l-flake-ref-to-string-negative-integer.nix | 12 + ...-foldlStrict-strict-op-application.err.exp | 37 +++ ...fail-foldlStrict-strict-op-application.nix | 5 + ...eval-fail-fromJSON-keyWithNullByte.err.exp | 8 + .../eval-fail-fromJSON-keyWithNullByte.nix | 1 + .../eval-fail-fromJSON-overflowing.err.exp | 8 + .../lang/eval-fail-fromJSON-overflowing.nix | 1 + ...al-fail-fromJSON-valueWithNullByte.err.exp | 8 + .../eval-fail-fromJSON-valueWithNullByte.nix | 1 + ...eval-fail-fromTOML-keyWithNullByte.err.exp | 8 + .../eval-fail-fromTOML-keyWithNullByte.nix | 1 + .../eval-fail-fromTOML-timestamps.err.exp | 8 + .../lang/eval-fail-fromTOML-timestamps.nix | 130 +++++++++ ...al-fail-fromTOML-valueWithNullByte.err.exp | 8 + .../eval-fail-fromTOML-valueWithNullByte.nix | 1 + .../lang/eval-fail-hashfile-missing.err.exp | 13 + .../tests/lang/eval-fail-hashfile-missing.nix | 16 + ...val-fail-infinite-recursion-lambda.err.exp | 38 +++ .../eval-fail-infinite-recursion-lambda.nix | 1 + nix-js/tests/lang/eval-fail-list.err.exp | 8 + nix-js/tests/lang/eval-fail-list.nix | 1 + .../tests/lang/eval-fail-missing-arg.err.exp | 13 + nix-js/tests/lang/eval-fail-missing-arg.nix | 12 + .../lang/eval-fail-mutual-recursion.err.exp | 64 ++++ .../tests/lang/eval-fail-mutual-recursion.nix | 40 +++ .../lang/eval-fail-nested-list-items.err.exp | 9 + .../lang/eval-fail-nested-list-items.nix | 34 +++ .../lang/eval-fail-nonexist-path.err.exp | 1 + nix-js/tests/lang/eval-fail-nonexist-path.nix | 4 + .../tests/lang/eval-fail-not-throws.err.exp | 14 + nix-js/tests/lang/eval-fail-not-throws.nix | 1 + .../lang/eval-fail-overflowing-add.err.exp | 6 + .../tests/lang/eval-fail-overflowing-add.nix | 5 + .../lang/eval-fail-overflowing-div.err.exp | 23 ++ .../tests/lang/eval-fail-overflowing-div.nix | 8 + .../lang/eval-fail-overflowing-mul.err.exp | 16 + .../tests/lang/eval-fail-overflowing-mul.nix | 4 + .../lang/eval-fail-overflowing-sub.err.exp | 9 + .../tests/lang/eval-fail-overflowing-sub.nix | 5 + .../tests/lang/eval-fail-path-slash.err.exp | 6 + nix-js/tests/lang/eval-fail-path-slash.nix | 6 + .../lang/eval-fail-pipe-operators.err.exp | 5 + .../tests/lang/eval-fail-pipe-operators.nix | 1 + nix-js/tests/lang/eval-fail-recursion.err.exp | 14 + nix-js/tests/lang/eval-fail-recursion.nix | 4 + nix-js/tests/lang/eval-fail-remove.err.exp | 15 + nix-js/tests/lang/eval-fail-remove.nix | 8 + nix-js/tests/lang/eval-fail-scope-5.err.exp | 28 ++ nix-js/tests/lang/eval-fail-scope-5.nix | 15 + nix-js/tests/lang/eval-fail-seq.err.exp | 14 + nix-js/tests/lang/eval-fail-seq.nix | 1 + .../tests/lang/eval-fail-set-override.err.exp | 4 + nix-js/tests/lang/eval-fail-set-override.nix | 1 + nix-js/tests/lang/eval-fail-set.err.exp | 5 + nix-js/tests/lang/eval-fail-set.nix | 1 + .../tests/lang/eval-fail-string-nul-1.err.exp | Bin 0 -> 209 bytes nix-js/tests/lang/eval-fail-string-nul-1.nix | Bin 0 -> 10 bytes .../tests/lang/eval-fail-string-nul-2.err.exp | Bin 0 -> 256 bytes nix-js/tests/lang/eval-fail-string-nul-2.nix | Bin 0 -> 22 bytes nix-js/tests/lang/eval-fail-substring.err.exp | 8 + nix-js/tests/lang/eval-fail-substring.nix | 1 + nix-js/tests/lang/eval-fail-to-path.err.exp | 10 + nix-js/tests/lang/eval-fail-to-path.nix | 1 + .../lang/eval-fail-toJSON-non-utf-8.err.exp | 8 + .../tests/lang/eval-fail-toJSON-non-utf-8.nix | 1 + nix-js/tests/lang/eval-fail-toJSON.err.exp | 50 ++++ nix-js/tests/lang/eval-fail-toJSON.nix | 10 + .../lang/eval-fail-undeclared-arg.err.exp | 13 + .../tests/lang/eval-fail-undeclared-arg.nix | 5 + .../eval-fail-using-set-as-attr-name.err.exp | 14 + .../lang/eval-fail-using-set-as-attr-name.nix | 7 + nix-js/tests/lang/eval-okay-any-all.exp | 1 + nix-js/tests/lang/eval-okay-any-all.nix | 34 +++ nix-js/tests/lang/eval-okay-arithmetic.exp | 1 + nix-js/tests/lang/eval-okay-arithmetic.nix | 60 ++++ nix-js/tests/lang/eval-okay-attrnames.exp | 1 + nix-js/tests/lang/eval-okay-attrnames.nix | 22 ++ nix-js/tests/lang/eval-okay-attrs.exp | 1 + nix-js/tests/lang/eval-okay-attrs.nix | 20 ++ nix-js/tests/lang/eval-okay-attrs2.exp | 1 + nix-js/tests/lang/eval-okay-attrs2.nix | 23 ++ nix-js/tests/lang/eval-okay-attrs3.exp | 1 + nix-js/tests/lang/eval-okay-attrs3.nix | 22 ++ nix-js/tests/lang/eval-okay-attrs4.exp | 1 + nix-js/tests/lang/eval-okay-attrs4.nix | 20 ++ nix-js/tests/lang/eval-okay-attrs5.exp | 1 + nix-js/tests/lang/eval-okay-attrs5.nix | 21 ++ nix-js/tests/lang/eval-okay-attrs6.exp | 1 + nix-js/tests/lang/eval-okay-attrs6.nix | 6 + nix-js/tests/lang/eval-okay-autoargs.exp | 1 + nix-js/tests/lang/eval-okay-autoargs.nix | 20 ++ .../lang/eval-okay-backslash-newline-1.exp | 1 + .../lang/eval-okay-backslash-newline-1.nix | 2 + .../lang/eval-okay-backslash-newline-2.exp | 1 + .../lang/eval-okay-backslash-newline-2.nix | 2 + nix-js/tests/lang/eval-okay-baseNameOf.exp | 1 + nix-js/tests/lang/eval-okay-baseNameOf.nix | 32 ++ nix-js/tests/lang/eval-okay-builtins-add.exp | 1 + nix-js/tests/lang/eval-okay-builtins-add.nix | 8 + nix-js/tests/lang/eval-okay-builtins.exp | 1 + nix-js/tests/lang/eval-okay-builtins.nix | 12 + .../tests/lang/eval-okay-callable-attrs.exp | 1 + .../tests/lang/eval-okay-callable-attrs.nix | 10 + nix-js/tests/lang/eval-okay-catattrs.exp | 1 + nix-js/tests/lang/eval-okay-catattrs.nix | 5 + nix-js/tests/lang/eval-okay-closure.exp | 1 + nix-js/tests/lang/eval-okay-closure.nix | 25 ++ nix-js/tests/lang/eval-okay-comments.exp | 1 + nix-js/tests/lang/eval-okay-comments.nix | 59 ++++ nix-js/tests/lang/eval-okay-concat.exp | 1 + nix-js/tests/lang/eval-okay-concat.nix | 15 + nix-js/tests/lang/eval-okay-concatmap.exp | 1 + nix-js/tests/lang/eval-okay-concatmap.nix | 9 + .../tests/lang/eval-okay-concatstringssep.exp | 1 + .../tests/lang/eval-okay-concatstringssep.nix | 17 ++ .../lang/eval-okay-context-introspection.exp | 1 + .../lang/eval-okay-context-introspection.nix | 64 ++++ nix-js/tests/lang/eval-okay-context.exp | 1 + nix-js/tests/lang/eval-okay-context.nix | 7 + .../tests/lang/eval-okay-convertHash.err.exp | 108 +++++++ nix-js/tests/lang/eval-okay-convertHash.exp | 1 + nix-js/tests/lang/eval-okay-convertHash.nix | 131 +++++++++ nix-js/tests/lang/eval-okay-curpos.exp | 1 + nix-js/tests/lang/eval-okay-curpos.nix | 5 + nix-js/tests/lang/eval-okay-deepseq.exp | 1 + nix-js/tests/lang/eval-okay-deepseq.nix | 9 + .../lang/eval-okay-delayed-with-inherit.exp | 1 + .../lang/eval-okay-delayed-with-inherit.nix | 31 ++ nix-js/tests/lang/eval-okay-delayed-with.exp | 1 + nix-js/tests/lang/eval-okay-delayed-with.nix | 37 +++ .../eval-okay-deprecate-cursed-or.err.exp | 12 + .../lang/eval-okay-deprecate-cursed-or.exp | 1 + .../lang/eval-okay-deprecate-cursed-or.nix | 11 + .../lang/eval-okay-derivation-legacy.err.exp | 6 + .../lang/eval-okay-derivation-legacy.exp | 1 + .../lang/eval-okay-derivation-legacy.nix | 12 + .../tests/lang/eval-okay-dynamic-attrs-2.exp | 1 + .../tests/lang/eval-okay-dynamic-attrs-2.nix | 5 + .../lang/eval-okay-dynamic-attrs-bare.exp | 1 + .../lang/eval-okay-dynamic-attrs-bare.nix | 28 ++ nix-js/tests/lang/eval-okay-dynamic-attrs.exp | 1 + nix-js/tests/lang/eval-okay-dynamic-attrs.nix | 28 ++ nix-js/tests/lang/eval-okay-elem.exp | 1 + nix-js/tests/lang/eval-okay-elem.nix | 11 + nix-js/tests/lang/eval-okay-empty-args.exp | 1 + nix-js/tests/lang/eval-okay-empty-args.nix | 4 + .../tests/lang/eval-okay-eq-derivations.exp | 1 + .../tests/lang/eval-okay-eq-derivations.nix | 40 +++ nix-js/tests/lang/eval-okay-eq.exp | 1 + nix-js/tests/lang/eval-okay-eq.nix | 13 + nix-js/tests/lang/eval-okay-filter.exp | 1 + nix-js/tests/lang/eval-okay-filter.nix | 8 + .../lang/eval-okay-flake-ref-to-string.exp | 1 + .../lang/eval-okay-flake-ref-to-string.nix | 7 + nix-js/tests/lang/eval-okay-flatten.exp | 1 + nix-js/tests/lang/eval-okay-flatten.nix | 20 ++ nix-js/tests/lang/eval-okay-float.exp | 1 + nix-js/tests/lang/eval-okay-float.nix | 6 + nix-js/tests/lang/eval-okay-floor-ceil.exp | 1 + nix-js/tests/lang/eval-okay-floor-ceil.nix | 16 + .../eval-okay-foldlStrict-lazy-elements.exp | 1 + .../eval-okay-foldlStrict-lazy-elements.nix | 6 + ...y-foldlStrict-lazy-initial-accumulator.exp | 1 + ...y-foldlStrict-lazy-initial-accumulator.nix | 6 + nix-js/tests/lang/eval-okay-foldlStrict.exp | 1 + nix-js/tests/lang/eval-okay-foldlStrict.nix | 3 + .../lang/eval-okay-fromTOML-timestamps.exp | 1 + .../lang/eval-okay-fromTOML-timestamps.nix | 130 +++++++++ nix-js/tests/lang/eval-okay-fromTOML.exp | 1 + nix-js/tests/lang/eval-okay-fromTOML.nix | 208 +++++++++++++ .../tests/lang/eval-okay-fromjson-escapes.exp | 1 + .../tests/lang/eval-okay-fromjson-escapes.nix | 4 + nix-js/tests/lang/eval-okay-fromjson.exp | 1 + nix-js/tests/lang/eval-okay-fromjson.nix | 55 ++++ nix-js/tests/lang/eval-okay-functionargs.exp | 1 + nix-js/tests/lang/eval-okay-functionargs.nix | 150 ++++++++++ .../eval-okay-getattrpos-functionargs.exp | 1 + .../eval-okay-getattrpos-functionargs.nix | 8 + .../lang/eval-okay-getattrpos-undefined.exp | 1 + .../lang/eval-okay-getattrpos-undefined.nix | 1 + nix-js/tests/lang/eval-okay-getattrpos.exp | 1 + nix-js/tests/lang/eval-okay-getattrpos.nix | 10 + nix-js/tests/lang/eval-okay-getenv.exp | 1 + nix-js/tests/lang/eval-okay-getenv.nix | 1 + nix-js/tests/lang/eval-okay-groupBy.exp | 1 + nix-js/tests/lang/eval-okay-groupBy.nix | 5 + nix-js/tests/lang/eval-okay-hash.exp | 0 nix-js/tests/lang/eval-okay-hashfile.exp | 1 + nix-js/tests/lang/eval-okay-hashfile.nix | 14 + nix-js/tests/lang/eval-okay-hashstring.exp | 1 + nix-js/tests/lang/eval-okay-hashstring.nix | 15 + nix-js/tests/lang/eval-okay-if.exp | 1 + nix-js/tests/lang/eval-okay-if.nix | 6 + nix-js/tests/lang/eval-okay-import.exp | 1 + nix-js/tests/lang/eval-okay-import.nix | 12 + nix-js/tests/lang/eval-okay-ind-string.exp | 1 + nix-js/tests/lang/eval-okay-ind-string.nix | 128 ++++++++ .../tests/lang/eval-okay-inherit-attr-pos.exp | 1 + .../tests/lang/eval-okay-inherit-attr-pos.nix | 12 + .../tests/lang/eval-okay-inherit-from.err.exp | 1 + nix-js/tests/lang/eval-okay-inherit-from.exp | 1 + nix-js/tests/lang/eval-okay-inherit-from.nix | 33 +++ .../tests/lang/eval-okay-intersectAttrs.exp | 1 + .../tests/lang/eval-okay-intersectAttrs.nix | 73 +++++ nix-js/tests/lang/eval-okay-let.exp | 1 + nix-js/tests/lang/eval-okay-let.nix | 5 + nix-js/tests/lang/eval-okay-list.exp | 1 + nix-js/tests/lang/eval-okay-list.nix | 12 + nix-js/tests/lang/eval-okay-listtoattrs.exp | 1 + nix-js/tests/lang/eval-okay-listtoattrs.nix | 24 ++ nix-js/tests/lang/eval-okay-logic.exp | 1 + nix-js/tests/lang/eval-okay-logic.nix | 2 + nix-js/tests/lang/eval-okay-map.exp | 1 + nix-js/tests/lang/eval-okay-map.nix | 9 + nix-js/tests/lang/eval-okay-mapattrs.exp | 1 + nix-js/tests/lang/eval-okay-mapattrs.nix | 6 + .../lang/eval-okay-merge-dynamic-attrs.exp | 1 + .../lang/eval-okay-merge-dynamic-attrs.nix | 21 ++ nix-js/tests/lang/eval-okay-nested-with.exp | 1 + nix-js/tests/lang/eval-okay-nested-with.nix | 1 + nix-js/tests/lang/eval-okay-new-let.exp | 1 + nix-js/tests/lang/eval-okay-new-let.nix | 16 + .../lang/eval-okay-null-dynamic-attrs.exp | 1 + .../lang/eval-okay-null-dynamic-attrs.nix | 1 + nix-js/tests/lang/eval-okay-overrides.exp | 1 + nix-js/tests/lang/eval-okay-overrides.nix | 13 + .../tests/lang/eval-okay-parse-flake-ref.exp | 1 + .../tests/lang/eval-okay-parse-flake-ref.nix | 1 + nix-js/tests/lang/eval-okay-partition.exp | 1 + nix-js/tests/lang/eval-okay-partition.nix | 8 + .../eval-okay-path-string-interpolation.exp | 1 + .../eval-okay-path-string-interpolation.nix | 12 + nix-js/tests/lang/eval-okay-path.exp | 1 + nix-js/tests/lang/eval-okay-path.nix | 15 + nix-js/tests/lang/eval-okay-pathexists.exp | 1 + nix-js/tests/lang/eval-okay-pathexists.nix | 34 +++ nix-js/tests/lang/eval-okay-patterns.exp | 1 + nix-js/tests/lang/eval-okay-patterns.nix | 59 ++++ nix-js/tests/lang/eval-okay-print.err.exp | 1 + nix-js/tests/lang/eval-okay-print.exp | 1 + nix-js/tests/lang/eval-okay-print.nix | 15 + nix-js/tests/lang/eval-okay-readDir.exp | 1 + nix-js/tests/lang/eval-okay-readDir.nix | 1 + nix-js/tests/lang/eval-okay-readFileType.exp | 1 + nix-js/tests/lang/eval-okay-readFileType.nix | 6 + nix-js/tests/lang/eval-okay-readfile.exp | 1 + nix-js/tests/lang/eval-okay-readfile.nix | 1 + .../tests/lang/eval-okay-redefine-builtin.exp | 1 + .../tests/lang/eval-okay-redefine-builtin.nix | 4 + nix-js/tests/lang/eval-okay-regex-match.exp | 1 + nix-js/tests/lang/eval-okay-regex-match.nix | 41 +++ nix-js/tests/lang/eval-okay-regex-split.exp | 1 + nix-js/tests/lang/eval-okay-regex-split.nix | 197 +++++++++++++ .../lang/eval-okay-regression-20220122.exp | 1 + .../lang/eval-okay-regression-20220122.nix | 1 + .../lang/eval-okay-regression-20220125.exp | 1 + .../lang/eval-okay-regression-20220125.nix | 1 + ...val-okay-regrettable-rec-attrset-merge.exp | 1 + ...val-okay-regrettable-rec-attrset-merge.nix | 10 + nix-js/tests/lang/eval-okay-remove.exp | 1 + nix-js/tests/lang/eval-okay-remove.nix | 8 + .../lang/eval-okay-repeated-empty-attrs.exp | 1 + .../lang/eval-okay-repeated-empty-attrs.nix | 5 + .../lang/eval-okay-repeated-empty-list.exp | 1 + .../lang/eval-okay-repeated-empty-list.nix | 4 + .../tests/lang/eval-okay-replacestrings.exp | 1 + .../tests/lang/eval-okay-replacestrings.nix | 13 + nix-js/tests/lang/eval-okay-scope-1.exp | 1 + nix-js/tests/lang/eval-okay-scope-1.nix | 13 + nix-js/tests/lang/eval-okay-scope-2.exp | 1 + nix-js/tests/lang/eval-okay-scope-2.nix | 12 + nix-js/tests/lang/eval-okay-scope-3.exp | 1 + nix-js/tests/lang/eval-okay-scope-3.nix | 13 + nix-js/tests/lang/eval-okay-scope-4.exp | 1 + nix-js/tests/lang/eval-okay-scope-4.nix | 15 + nix-js/tests/lang/eval-okay-scope-6.exp | 1 + nix-js/tests/lang/eval-okay-scope-6.nix | 12 + nix-js/tests/lang/eval-okay-scope-7.exp | 1 + nix-js/tests/lang/eval-okay-scope-7.nix | 7 + nix-js/tests/lang/eval-okay-search-path.exp | 1 + nix-js/tests/lang/eval-okay-search-path.nix | 21 ++ nix-js/tests/lang/eval-okay-seq.exp | 1 + nix-js/tests/lang/eval-okay-seq.nix | 1 + nix-js/tests/lang/eval-okay-sort.exp | 1 + nix-js/tests/lang/eval-okay-sort.nix | 64 ++++ nix-js/tests/lang/eval-okay-splitversion.exp | 1 + nix-js/tests/lang/eval-okay-splitversion.nix | 1 + nix-js/tests/lang/eval-okay-string.exp | 1 + nix-js/tests/lang/eval-okay-string.nix | 13 + .../lang/eval-okay-strings-as-attrs-names.exp | 1 + .../lang/eval-okay-strings-as-attrs-names.nix | 18 ++ .../lang/eval-okay-substring-context.exp | 1 + .../lang/eval-okay-substring-context.nix | 16 + nix-js/tests/lang/eval-okay-substring.exp | 1 + nix-js/tests/lang/eval-okay-substring.nix | 23 ++ .../lang/eval-okay-symlink-resolution.exp | 1 + .../lang/eval-okay-symlink-resolution.nix | 1 + nix-js/tests/lang/eval-okay-tail-call-1.nix | 4 + nix-js/tests/lang/eval-okay-tojson.exp | 1 + nix-js/tests/lang/eval-okay-tojson.nix | 26 ++ nix-js/tests/lang/eval-okay-toxml.exp | 1 + nix-js/tests/lang/eval-okay-toxml.nix | 3 + nix-js/tests/lang/eval-okay-toxml2.exp | 1 + nix-js/tests/lang/eval-okay-toxml2.nix | 8 + nix-js/tests/lang/eval-okay-tryeval.exp | 1 + nix-js/tests/lang/eval-okay-tryeval.nix | 8 + nix-js/tests/lang/eval-okay-types.exp | 1 + nix-js/tests/lang/eval-okay-types.nix | 42 +++ nix-js/tests/lang/eval-okay-versions.exp | 1 + nix-js/tests/lang/eval-okay-versions.nix | 47 +++ nix-js/tests/lang/eval-okay-with.exp | 1 + nix-js/tests/lang/eval-okay-with.nix | 19 ++ nix-js/tests/lang/eval-okay-xml.exp | 52 ++++ nix-js/tests/lang/eval-okay-xml.nix | 40 +++ nix-js/tests/lang/eval-okay-zipAttrsWith.exp | 1 + nix-js/tests/lang/eval-okay-zipAttrsWith.nix | 8 + nix-js/tests/lang/imported.nix | 3 + nix-js/tests/lang/imported2.nix | 1 + nix-js/tests/lang/lib.nix | 77 +++++ nix-js/tests/lang/readDir/bar | 0 .../lang/readDir/foo/git-hates-directories | 0 nix-js/tests/lang/readDir/ldir | 1 + nix-js/tests/lang/readDir/linked | 1 + nix-js/tests/lang/symlink-resolution/broken | 1 + .../symlink-resolution/foo/lib/default.nix | 1 + .../lang/symlink-resolution/foo/overlays | 1 + .../symlink-resolution/overlays/overlay.nix | 1 + 414 files changed, 5109 insertions(+), 8 deletions(-) create mode 100644 nix-js/tests/lang.rs create mode 100644 nix-js/tests/lang/dir1/a.nix create mode 100644 nix-js/tests/lang/dir2/a.nix create mode 100644 nix-js/tests/lang/dir2/b.nix create mode 100644 nix-js/tests/lang/dir3/a.nix create mode 100644 nix-js/tests/lang/dir3/b.nix create mode 100644 nix-js/tests/lang/dir3/c.nix create mode 100644 nix-js/tests/lang/dir4/a.nix create mode 100644 nix-js/tests/lang/dir4/c.nix create mode 100644 nix-js/tests/lang/eval-fail-abort.err.exp create mode 100644 nix-js/tests/lang/eval-fail-abort.nix create mode 100644 nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.err.exp create mode 100644 nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.nix create mode 100644 nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.err.exp create mode 100644 nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.nix create mode 100644 nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.err.exp create mode 100644 nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.nix create mode 100644 nix-js/tests/lang/eval-fail-addErrorContext-example.err.exp create mode 100644 nix-js/tests/lang/eval-fail-addErrorContext-example.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-attrs-names.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-attrs-names.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-derivations.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-derivations.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-floats.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-floats.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-function-direct.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-function-direct.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-int-float.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-int-float.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-ints.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-ints.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-list-length.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-list-length.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-paths.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-paths.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-type-nested.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-type-nested.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-type.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-equal-type.nix create mode 100644 nix-js/tests/lang/eval-fail-assert-nested-bool.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert-nested-bool.nix create mode 100644 nix-js/tests/lang/eval-fail-assert.err.exp create mode 100644 nix-js/tests/lang/eval-fail-assert.nix create mode 100644 nix-js/tests/lang/eval-fail-attr-name-type.err.exp create mode 100644 nix-js/tests/lang/eval-fail-attr-name-type.nix create mode 100644 nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.err.exp create mode 100644 nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.nix create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-1.err.exp create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-1.nix create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-2.err.exp create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-2.nix create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-3.err.exp create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-3.nix create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-4.err.exp create mode 100644 nix-js/tests/lang/eval-fail-bad-string-interpolation-4.nix create mode 100644 nix-js/tests/lang/eval-fail-blackhole.err.exp create mode 100644 nix-js/tests/lang/eval-fail-blackhole.nix create mode 100644 nix-js/tests/lang/eval-fail-call-primop.err.exp create mode 100644 nix-js/tests/lang/eval-fail-call-primop.nix create mode 100644 nix-js/tests/lang/eval-fail-deepseq.err.exp create mode 100644 nix-js/tests/lang/eval-fail-deepseq.nix create mode 100644 nix-js/tests/lang/eval-fail-derivation-name.err.exp create mode 100644 nix-js/tests/lang/eval-fail-derivation-name.nix create mode 100644 nix-js/tests/lang/eval-fail-dup-dynamic-attrs.err.exp create mode 100644 nix-js/tests/lang/eval-fail-dup-dynamic-attrs.nix create mode 100644 nix-js/tests/lang/eval-fail-duplicate-traces.err.exp create mode 100644 nix-js/tests/lang/eval-fail-duplicate-traces.nix create mode 100644 nix-js/tests/lang/eval-fail-eol-1.err.exp create mode 100644 nix-js/tests/lang/eval-fail-eol-1.nix create mode 100644 nix-js/tests/lang/eval-fail-eol-2.err.exp create mode 100644 nix-js/tests/lang/eval-fail-eol-2.nix create mode 100644 nix-js/tests/lang/eval-fail-eol-3.err.exp create mode 100644 nix-js/tests/lang/eval-fail-eol-3.nix create mode 100644 nix-js/tests/lang/eval-fail-fetchTree-negative.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fetchTree-negative.nix create mode 100644 nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.nix create mode 100644 nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.nix create mode 100644 nix-js/tests/lang/eval-fail-fetchurl-baseName.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fetchurl-baseName.nix create mode 100644 nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.err.exp create mode 100644 nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.nix create mode 100644 nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.err.exp create mode 100644 nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.nix create mode 100644 nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.nix create mode 100644 nix-js/tests/lang/eval-fail-fromJSON-overflowing.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fromJSON-overflowing.nix create mode 100644 nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.nix create mode 100644 nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.nix create mode 100644 nix-js/tests/lang/eval-fail-fromTOML-timestamps.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fromTOML-timestamps.nix create mode 100644 nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.err.exp create mode 100644 nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.nix create mode 100644 nix-js/tests/lang/eval-fail-hashfile-missing.err.exp create mode 100644 nix-js/tests/lang/eval-fail-hashfile-missing.nix create mode 100644 nix-js/tests/lang/eval-fail-infinite-recursion-lambda.err.exp create mode 100644 nix-js/tests/lang/eval-fail-infinite-recursion-lambda.nix create mode 100644 nix-js/tests/lang/eval-fail-list.err.exp create mode 100644 nix-js/tests/lang/eval-fail-list.nix create mode 100644 nix-js/tests/lang/eval-fail-missing-arg.err.exp create mode 100644 nix-js/tests/lang/eval-fail-missing-arg.nix create mode 100644 nix-js/tests/lang/eval-fail-mutual-recursion.err.exp create mode 100644 nix-js/tests/lang/eval-fail-mutual-recursion.nix create mode 100644 nix-js/tests/lang/eval-fail-nested-list-items.err.exp create mode 100644 nix-js/tests/lang/eval-fail-nested-list-items.nix create mode 100644 nix-js/tests/lang/eval-fail-nonexist-path.err.exp create mode 100644 nix-js/tests/lang/eval-fail-nonexist-path.nix create mode 100644 nix-js/tests/lang/eval-fail-not-throws.err.exp create mode 100644 nix-js/tests/lang/eval-fail-not-throws.nix create mode 100644 nix-js/tests/lang/eval-fail-overflowing-add.err.exp create mode 100644 nix-js/tests/lang/eval-fail-overflowing-add.nix create mode 100644 nix-js/tests/lang/eval-fail-overflowing-div.err.exp create mode 100644 nix-js/tests/lang/eval-fail-overflowing-div.nix create mode 100644 nix-js/tests/lang/eval-fail-overflowing-mul.err.exp create mode 100644 nix-js/tests/lang/eval-fail-overflowing-mul.nix create mode 100644 nix-js/tests/lang/eval-fail-overflowing-sub.err.exp create mode 100644 nix-js/tests/lang/eval-fail-overflowing-sub.nix create mode 100644 nix-js/tests/lang/eval-fail-path-slash.err.exp create mode 100644 nix-js/tests/lang/eval-fail-path-slash.nix create mode 100644 nix-js/tests/lang/eval-fail-pipe-operators.err.exp create mode 100644 nix-js/tests/lang/eval-fail-pipe-operators.nix create mode 100644 nix-js/tests/lang/eval-fail-recursion.err.exp create mode 100644 nix-js/tests/lang/eval-fail-recursion.nix create mode 100644 nix-js/tests/lang/eval-fail-remove.err.exp create mode 100644 nix-js/tests/lang/eval-fail-remove.nix create mode 100644 nix-js/tests/lang/eval-fail-scope-5.err.exp create mode 100644 nix-js/tests/lang/eval-fail-scope-5.nix create mode 100644 nix-js/tests/lang/eval-fail-seq.err.exp create mode 100644 nix-js/tests/lang/eval-fail-seq.nix create mode 100644 nix-js/tests/lang/eval-fail-set-override.err.exp create mode 100644 nix-js/tests/lang/eval-fail-set-override.nix create mode 100644 nix-js/tests/lang/eval-fail-set.err.exp create mode 100644 nix-js/tests/lang/eval-fail-set.nix create mode 100644 nix-js/tests/lang/eval-fail-string-nul-1.err.exp create mode 100644 nix-js/tests/lang/eval-fail-string-nul-1.nix create mode 100644 nix-js/tests/lang/eval-fail-string-nul-2.err.exp create mode 100644 nix-js/tests/lang/eval-fail-string-nul-2.nix create mode 100644 nix-js/tests/lang/eval-fail-substring.err.exp create mode 100644 nix-js/tests/lang/eval-fail-substring.nix create mode 100644 nix-js/tests/lang/eval-fail-to-path.err.exp create mode 100644 nix-js/tests/lang/eval-fail-to-path.nix create mode 100644 nix-js/tests/lang/eval-fail-toJSON-non-utf-8.err.exp create mode 100644 nix-js/tests/lang/eval-fail-toJSON-non-utf-8.nix create mode 100644 nix-js/tests/lang/eval-fail-toJSON.err.exp create mode 100644 nix-js/tests/lang/eval-fail-toJSON.nix create mode 100644 nix-js/tests/lang/eval-fail-undeclared-arg.err.exp create mode 100644 nix-js/tests/lang/eval-fail-undeclared-arg.nix create mode 100644 nix-js/tests/lang/eval-fail-using-set-as-attr-name.err.exp create mode 100644 nix-js/tests/lang/eval-fail-using-set-as-attr-name.nix create mode 100644 nix-js/tests/lang/eval-okay-any-all.exp create mode 100644 nix-js/tests/lang/eval-okay-any-all.nix create mode 100644 nix-js/tests/lang/eval-okay-arithmetic.exp create mode 100644 nix-js/tests/lang/eval-okay-arithmetic.nix create mode 100644 nix-js/tests/lang/eval-okay-attrnames.exp create mode 100644 nix-js/tests/lang/eval-okay-attrnames.nix create mode 100644 nix-js/tests/lang/eval-okay-attrs.exp create mode 100644 nix-js/tests/lang/eval-okay-attrs.nix create mode 100644 nix-js/tests/lang/eval-okay-attrs2.exp create mode 100644 nix-js/tests/lang/eval-okay-attrs2.nix create mode 100644 nix-js/tests/lang/eval-okay-attrs3.exp create mode 100644 nix-js/tests/lang/eval-okay-attrs3.nix create mode 100644 nix-js/tests/lang/eval-okay-attrs4.exp create mode 100644 nix-js/tests/lang/eval-okay-attrs4.nix create mode 100644 nix-js/tests/lang/eval-okay-attrs5.exp create mode 100644 nix-js/tests/lang/eval-okay-attrs5.nix create mode 100644 nix-js/tests/lang/eval-okay-attrs6.exp create mode 100644 nix-js/tests/lang/eval-okay-attrs6.nix create mode 100644 nix-js/tests/lang/eval-okay-autoargs.exp create mode 100644 nix-js/tests/lang/eval-okay-autoargs.nix create mode 100644 nix-js/tests/lang/eval-okay-backslash-newline-1.exp create mode 100644 nix-js/tests/lang/eval-okay-backslash-newline-1.nix create mode 100644 nix-js/tests/lang/eval-okay-backslash-newline-2.exp create mode 100644 nix-js/tests/lang/eval-okay-backslash-newline-2.nix create mode 100644 nix-js/tests/lang/eval-okay-baseNameOf.exp create mode 100644 nix-js/tests/lang/eval-okay-baseNameOf.nix create mode 100644 nix-js/tests/lang/eval-okay-builtins-add.exp create mode 100644 nix-js/tests/lang/eval-okay-builtins-add.nix create mode 100644 nix-js/tests/lang/eval-okay-builtins.exp create mode 100644 nix-js/tests/lang/eval-okay-builtins.nix create mode 100644 nix-js/tests/lang/eval-okay-callable-attrs.exp create mode 100644 nix-js/tests/lang/eval-okay-callable-attrs.nix create mode 100644 nix-js/tests/lang/eval-okay-catattrs.exp create mode 100644 nix-js/tests/lang/eval-okay-catattrs.nix create mode 100644 nix-js/tests/lang/eval-okay-closure.exp create mode 100644 nix-js/tests/lang/eval-okay-closure.nix create mode 100644 nix-js/tests/lang/eval-okay-comments.exp create mode 100644 nix-js/tests/lang/eval-okay-comments.nix create mode 100644 nix-js/tests/lang/eval-okay-concat.exp create mode 100644 nix-js/tests/lang/eval-okay-concat.nix create mode 100644 nix-js/tests/lang/eval-okay-concatmap.exp create mode 100644 nix-js/tests/lang/eval-okay-concatmap.nix create mode 100644 nix-js/tests/lang/eval-okay-concatstringssep.exp create mode 100644 nix-js/tests/lang/eval-okay-concatstringssep.nix create mode 100644 nix-js/tests/lang/eval-okay-context-introspection.exp create mode 100644 nix-js/tests/lang/eval-okay-context-introspection.nix create mode 100644 nix-js/tests/lang/eval-okay-context.exp create mode 100644 nix-js/tests/lang/eval-okay-context.nix create mode 100644 nix-js/tests/lang/eval-okay-convertHash.err.exp create mode 100644 nix-js/tests/lang/eval-okay-convertHash.exp create mode 100644 nix-js/tests/lang/eval-okay-convertHash.nix create mode 100644 nix-js/tests/lang/eval-okay-curpos.exp create mode 100644 nix-js/tests/lang/eval-okay-curpos.nix create mode 100644 nix-js/tests/lang/eval-okay-deepseq.exp create mode 100644 nix-js/tests/lang/eval-okay-deepseq.nix create mode 100644 nix-js/tests/lang/eval-okay-delayed-with-inherit.exp create mode 100644 nix-js/tests/lang/eval-okay-delayed-with-inherit.nix create mode 100644 nix-js/tests/lang/eval-okay-delayed-with.exp create mode 100644 nix-js/tests/lang/eval-okay-delayed-with.nix create mode 100644 nix-js/tests/lang/eval-okay-deprecate-cursed-or.err.exp create mode 100644 nix-js/tests/lang/eval-okay-deprecate-cursed-or.exp create mode 100644 nix-js/tests/lang/eval-okay-deprecate-cursed-or.nix create mode 100644 nix-js/tests/lang/eval-okay-derivation-legacy.err.exp create mode 100644 nix-js/tests/lang/eval-okay-derivation-legacy.exp create mode 100644 nix-js/tests/lang/eval-okay-derivation-legacy.nix create mode 100644 nix-js/tests/lang/eval-okay-dynamic-attrs-2.exp create mode 100644 nix-js/tests/lang/eval-okay-dynamic-attrs-2.nix create mode 100644 nix-js/tests/lang/eval-okay-dynamic-attrs-bare.exp create mode 100644 nix-js/tests/lang/eval-okay-dynamic-attrs-bare.nix create mode 100644 nix-js/tests/lang/eval-okay-dynamic-attrs.exp create mode 100644 nix-js/tests/lang/eval-okay-dynamic-attrs.nix create mode 100644 nix-js/tests/lang/eval-okay-elem.exp create mode 100644 nix-js/tests/lang/eval-okay-elem.nix create mode 100644 nix-js/tests/lang/eval-okay-empty-args.exp create mode 100644 nix-js/tests/lang/eval-okay-empty-args.nix create mode 100644 nix-js/tests/lang/eval-okay-eq-derivations.exp create mode 100644 nix-js/tests/lang/eval-okay-eq-derivations.nix create mode 100644 nix-js/tests/lang/eval-okay-eq.exp create mode 100644 nix-js/tests/lang/eval-okay-eq.nix create mode 100644 nix-js/tests/lang/eval-okay-filter.exp create mode 100644 nix-js/tests/lang/eval-okay-filter.nix create mode 100644 nix-js/tests/lang/eval-okay-flake-ref-to-string.exp create mode 100644 nix-js/tests/lang/eval-okay-flake-ref-to-string.nix create mode 100644 nix-js/tests/lang/eval-okay-flatten.exp create mode 100644 nix-js/tests/lang/eval-okay-flatten.nix create mode 100644 nix-js/tests/lang/eval-okay-float.exp create mode 100644 nix-js/tests/lang/eval-okay-float.nix create mode 100644 nix-js/tests/lang/eval-okay-floor-ceil.exp create mode 100644 nix-js/tests/lang/eval-okay-floor-ceil.nix create mode 100644 nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.exp create mode 100644 nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.nix create mode 100644 nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.exp create mode 100644 nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.nix create mode 100644 nix-js/tests/lang/eval-okay-foldlStrict.exp create mode 100644 nix-js/tests/lang/eval-okay-foldlStrict.nix create mode 100644 nix-js/tests/lang/eval-okay-fromTOML-timestamps.exp create mode 100644 nix-js/tests/lang/eval-okay-fromTOML-timestamps.nix create mode 100644 nix-js/tests/lang/eval-okay-fromTOML.exp create mode 100644 nix-js/tests/lang/eval-okay-fromTOML.nix create mode 100644 nix-js/tests/lang/eval-okay-fromjson-escapes.exp create mode 100644 nix-js/tests/lang/eval-okay-fromjson-escapes.nix create mode 100644 nix-js/tests/lang/eval-okay-fromjson.exp create mode 100644 nix-js/tests/lang/eval-okay-fromjson.nix create mode 100644 nix-js/tests/lang/eval-okay-functionargs.exp create mode 100644 nix-js/tests/lang/eval-okay-functionargs.nix create mode 100644 nix-js/tests/lang/eval-okay-getattrpos-functionargs.exp create mode 100644 nix-js/tests/lang/eval-okay-getattrpos-functionargs.nix create mode 100644 nix-js/tests/lang/eval-okay-getattrpos-undefined.exp create mode 100644 nix-js/tests/lang/eval-okay-getattrpos-undefined.nix create mode 100644 nix-js/tests/lang/eval-okay-getattrpos.exp create mode 100644 nix-js/tests/lang/eval-okay-getattrpos.nix create mode 100644 nix-js/tests/lang/eval-okay-getenv.exp create mode 100644 nix-js/tests/lang/eval-okay-getenv.nix create mode 100644 nix-js/tests/lang/eval-okay-groupBy.exp create mode 100644 nix-js/tests/lang/eval-okay-groupBy.nix create mode 100644 nix-js/tests/lang/eval-okay-hash.exp create mode 100644 nix-js/tests/lang/eval-okay-hashfile.exp create mode 100644 nix-js/tests/lang/eval-okay-hashfile.nix create mode 100644 nix-js/tests/lang/eval-okay-hashstring.exp create mode 100644 nix-js/tests/lang/eval-okay-hashstring.nix create mode 100644 nix-js/tests/lang/eval-okay-if.exp create mode 100644 nix-js/tests/lang/eval-okay-if.nix create mode 100644 nix-js/tests/lang/eval-okay-import.exp create mode 100644 nix-js/tests/lang/eval-okay-import.nix create mode 100644 nix-js/tests/lang/eval-okay-ind-string.exp create mode 100644 nix-js/tests/lang/eval-okay-ind-string.nix create mode 100644 nix-js/tests/lang/eval-okay-inherit-attr-pos.exp create mode 100644 nix-js/tests/lang/eval-okay-inherit-attr-pos.nix create mode 100644 nix-js/tests/lang/eval-okay-inherit-from.err.exp create mode 100644 nix-js/tests/lang/eval-okay-inherit-from.exp create mode 100644 nix-js/tests/lang/eval-okay-inherit-from.nix create mode 100644 nix-js/tests/lang/eval-okay-intersectAttrs.exp create mode 100644 nix-js/tests/lang/eval-okay-intersectAttrs.nix create mode 100644 nix-js/tests/lang/eval-okay-let.exp create mode 100644 nix-js/tests/lang/eval-okay-let.nix create mode 100644 nix-js/tests/lang/eval-okay-list.exp create mode 100644 nix-js/tests/lang/eval-okay-list.nix create mode 100644 nix-js/tests/lang/eval-okay-listtoattrs.exp create mode 100644 nix-js/tests/lang/eval-okay-listtoattrs.nix create mode 100644 nix-js/tests/lang/eval-okay-logic.exp create mode 100644 nix-js/tests/lang/eval-okay-logic.nix create mode 100644 nix-js/tests/lang/eval-okay-map.exp create mode 100644 nix-js/tests/lang/eval-okay-map.nix create mode 100644 nix-js/tests/lang/eval-okay-mapattrs.exp create mode 100644 nix-js/tests/lang/eval-okay-mapattrs.nix create mode 100644 nix-js/tests/lang/eval-okay-merge-dynamic-attrs.exp create mode 100644 nix-js/tests/lang/eval-okay-merge-dynamic-attrs.nix create mode 100644 nix-js/tests/lang/eval-okay-nested-with.exp create mode 100644 nix-js/tests/lang/eval-okay-nested-with.nix create mode 100644 nix-js/tests/lang/eval-okay-new-let.exp create mode 100644 nix-js/tests/lang/eval-okay-new-let.nix create mode 100644 nix-js/tests/lang/eval-okay-null-dynamic-attrs.exp create mode 100644 nix-js/tests/lang/eval-okay-null-dynamic-attrs.nix create mode 100644 nix-js/tests/lang/eval-okay-overrides.exp create mode 100644 nix-js/tests/lang/eval-okay-overrides.nix create mode 100644 nix-js/tests/lang/eval-okay-parse-flake-ref.exp create mode 100644 nix-js/tests/lang/eval-okay-parse-flake-ref.nix create mode 100644 nix-js/tests/lang/eval-okay-partition.exp create mode 100644 nix-js/tests/lang/eval-okay-partition.nix create mode 100644 nix-js/tests/lang/eval-okay-path-string-interpolation.exp create mode 100644 nix-js/tests/lang/eval-okay-path-string-interpolation.nix create mode 100644 nix-js/tests/lang/eval-okay-path.exp create mode 100644 nix-js/tests/lang/eval-okay-path.nix create mode 100644 nix-js/tests/lang/eval-okay-pathexists.exp create mode 100644 nix-js/tests/lang/eval-okay-pathexists.nix create mode 100644 nix-js/tests/lang/eval-okay-patterns.exp create mode 100644 nix-js/tests/lang/eval-okay-patterns.nix create mode 100644 nix-js/tests/lang/eval-okay-print.err.exp create mode 100644 nix-js/tests/lang/eval-okay-print.exp create mode 100644 nix-js/tests/lang/eval-okay-print.nix create mode 100644 nix-js/tests/lang/eval-okay-readDir.exp create mode 100644 nix-js/tests/lang/eval-okay-readDir.nix create mode 100644 nix-js/tests/lang/eval-okay-readFileType.exp create mode 100644 nix-js/tests/lang/eval-okay-readFileType.nix create mode 100644 nix-js/tests/lang/eval-okay-readfile.exp create mode 100644 nix-js/tests/lang/eval-okay-readfile.nix create mode 100644 nix-js/tests/lang/eval-okay-redefine-builtin.exp create mode 100644 nix-js/tests/lang/eval-okay-redefine-builtin.nix create mode 100644 nix-js/tests/lang/eval-okay-regex-match.exp create mode 100644 nix-js/tests/lang/eval-okay-regex-match.nix create mode 100644 nix-js/tests/lang/eval-okay-regex-split.exp create mode 100644 nix-js/tests/lang/eval-okay-regex-split.nix create mode 100644 nix-js/tests/lang/eval-okay-regression-20220122.exp create mode 100644 nix-js/tests/lang/eval-okay-regression-20220122.nix create mode 100644 nix-js/tests/lang/eval-okay-regression-20220125.exp create mode 100644 nix-js/tests/lang/eval-okay-regression-20220125.nix create mode 100644 nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.exp create mode 100644 nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.nix create mode 100644 nix-js/tests/lang/eval-okay-remove.exp create mode 100644 nix-js/tests/lang/eval-okay-remove.nix create mode 100644 nix-js/tests/lang/eval-okay-repeated-empty-attrs.exp create mode 100644 nix-js/tests/lang/eval-okay-repeated-empty-attrs.nix create mode 100644 nix-js/tests/lang/eval-okay-repeated-empty-list.exp create mode 100644 nix-js/tests/lang/eval-okay-repeated-empty-list.nix create mode 100644 nix-js/tests/lang/eval-okay-replacestrings.exp create mode 100644 nix-js/tests/lang/eval-okay-replacestrings.nix create mode 100644 nix-js/tests/lang/eval-okay-scope-1.exp create mode 100644 nix-js/tests/lang/eval-okay-scope-1.nix create mode 100644 nix-js/tests/lang/eval-okay-scope-2.exp create mode 100644 nix-js/tests/lang/eval-okay-scope-2.nix create mode 100644 nix-js/tests/lang/eval-okay-scope-3.exp create mode 100644 nix-js/tests/lang/eval-okay-scope-3.nix create mode 100644 nix-js/tests/lang/eval-okay-scope-4.exp create mode 100644 nix-js/tests/lang/eval-okay-scope-4.nix create mode 100644 nix-js/tests/lang/eval-okay-scope-6.exp create mode 100644 nix-js/tests/lang/eval-okay-scope-6.nix create mode 100644 nix-js/tests/lang/eval-okay-scope-7.exp create mode 100644 nix-js/tests/lang/eval-okay-scope-7.nix create mode 100644 nix-js/tests/lang/eval-okay-search-path.exp create mode 100644 nix-js/tests/lang/eval-okay-search-path.nix create mode 100644 nix-js/tests/lang/eval-okay-seq.exp create mode 100644 nix-js/tests/lang/eval-okay-seq.nix create mode 100644 nix-js/tests/lang/eval-okay-sort.exp create mode 100644 nix-js/tests/lang/eval-okay-sort.nix create mode 100644 nix-js/tests/lang/eval-okay-splitversion.exp create mode 100644 nix-js/tests/lang/eval-okay-splitversion.nix create mode 100644 nix-js/tests/lang/eval-okay-string.exp create mode 100644 nix-js/tests/lang/eval-okay-string.nix create mode 100644 nix-js/tests/lang/eval-okay-strings-as-attrs-names.exp create mode 100644 nix-js/tests/lang/eval-okay-strings-as-attrs-names.nix create mode 100644 nix-js/tests/lang/eval-okay-substring-context.exp create mode 100644 nix-js/tests/lang/eval-okay-substring-context.nix create mode 100644 nix-js/tests/lang/eval-okay-substring.exp create mode 100644 nix-js/tests/lang/eval-okay-substring.nix create mode 100644 nix-js/tests/lang/eval-okay-symlink-resolution.exp create mode 100644 nix-js/tests/lang/eval-okay-symlink-resolution.nix create mode 100644 nix-js/tests/lang/eval-okay-tail-call-1.nix create mode 100644 nix-js/tests/lang/eval-okay-tojson.exp create mode 100644 nix-js/tests/lang/eval-okay-tojson.nix create mode 100644 nix-js/tests/lang/eval-okay-toxml.exp create mode 100644 nix-js/tests/lang/eval-okay-toxml.nix create mode 100644 nix-js/tests/lang/eval-okay-toxml2.exp create mode 100644 nix-js/tests/lang/eval-okay-toxml2.nix create mode 100644 nix-js/tests/lang/eval-okay-tryeval.exp create mode 100644 nix-js/tests/lang/eval-okay-tryeval.nix create mode 100644 nix-js/tests/lang/eval-okay-types.exp create mode 100644 nix-js/tests/lang/eval-okay-types.nix create mode 100644 nix-js/tests/lang/eval-okay-versions.exp create mode 100644 nix-js/tests/lang/eval-okay-versions.nix create mode 100644 nix-js/tests/lang/eval-okay-with.exp create mode 100644 nix-js/tests/lang/eval-okay-with.nix create mode 100644 nix-js/tests/lang/eval-okay-xml.exp create mode 100644 nix-js/tests/lang/eval-okay-xml.nix create mode 100644 nix-js/tests/lang/eval-okay-zipAttrsWith.exp create mode 100644 nix-js/tests/lang/eval-okay-zipAttrsWith.nix create mode 100644 nix-js/tests/lang/imported.nix create mode 100644 nix-js/tests/lang/imported2.nix create mode 100644 nix-js/tests/lang/lib.nix create mode 100644 nix-js/tests/lang/readDir/bar create mode 100644 nix-js/tests/lang/readDir/foo/git-hates-directories create mode 120000 nix-js/tests/lang/readDir/ldir create mode 120000 nix-js/tests/lang/readDir/linked create mode 120000 nix-js/tests/lang/symlink-resolution/broken create mode 100644 nix-js/tests/lang/symlink-resolution/foo/lib/default.nix create mode 120000 nix-js/tests/lang/symlink-resolution/foo/overlays create mode 100644 nix-js/tests/lang/symlink-resolution/overlays/overlay.nix diff --git a/nix-js/src/value.rs b/nix-js/src/value.rs index 8fc7e1d..30b8622 100644 --- a/nix-js/src/value.rs +++ b/nix-js/src/value.rs @@ -117,15 +117,9 @@ impl Debug for AttrSet { impl Display for AttrSet { fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { - use Value::*; write!(f, "{{")?; for (k, v) in self.data.iter() { - write!(f, " {k} = ")?; - match v { - List(_) => write!(f, "[ ... ];")?, - AttrSet(_) => write!(f, "{{ ... }};")?, - v => write!(f, "{v};")?, - } + write!(f, " {k} = {v};")?; } write!(f, " }}") } @@ -199,7 +193,20 @@ impl Display for Value { &Float(x) => write!(f, "{x}"), &Bool(x) => write!(f, "{x}"), Null => write!(f, "null"), - String(x) => write!(f, r#""{x}""#), + String(x) => { + write!(f, "\"")?; + for c in x.chars() { + match c { + '\\' => write!(f, "\\\\")?, + '"' => write!(f, "\\\"")?, + '\n' => write!(f, "\\n")?, + '\r' => write!(f, "\\r")?, + '\t' => write!(f, "\\t")?, + c => write!(f, "{c}")?, + } + } + write!(f, "\"") + } Path(x) => write!(f, "{x}"), AttrSet(x) => write!(f, "{x}"), List(x) => write!(f, "{x}"), diff --git a/nix-js/tests/lang.rs b/nix-js/tests/lang.rs new file mode 100644 index 0000000..313d803 --- /dev/null +++ b/nix-js/tests/lang.rs @@ -0,0 +1,273 @@ +#![allow(non_snake_case)] + +mod utils; + +use std::path::PathBuf; + +use nix_js::context::Context; +use nix_js::error::Source; +use nix_js::value::Value; + +fn get_lang_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/lang") +} + +fn eval_file(name: &str) -> Result { + let lang_dir = get_lang_dir(); + let nix_path = lang_dir.join(format!("{name}.nix")); + + let expr = format!(r#"import "{}""#, nix_path.display()); + + let mut ctx = Context::new().map_err(|e| e.to_string())?; + let source = Source::new_eval(expr).map_err(|e| e.to_string())?; + ctx.eval_code(source).map_err(|e| e.to_string()) +} + +fn read_expected(name: &str) -> String { + let lang_dir = get_lang_dir(); + let exp_path = lang_dir.join(format!("{name}.exp")); + std::fs::read_to_string(exp_path) + .expect("expected file should exist") + .trim_end() + .to_string() +} + +fn format_value(value: &Value) -> String { + value.to_string() +} + +macro_rules! eval_okay_test { + ($(#[$attr:meta])* $name:ident) => { + $(#[$attr])* + #[test] + fn $name() { + let test_name = concat!("eval-okay-", stringify!($name)) + .replace("_", "-") + .replace("r#", ""); + let result = eval_file(&test_name); + match result { + Ok(value) => { + let actual = format_value(&value); + let expected = read_expected(&test_name); + assert_eq!(actual, expected, "Output mismatch for {}", test_name); + } + Err(e) => { + panic!("Test {} failed to evaluate: {}", test_name, e); + } + } + } + }; +} + +macro_rules! eval_fail_test { + ($name:ident) => { + #[test] + fn $name() { + let test_name = concat!("eval-fail-", stringify!($name)) + .replace("_", "-") + .replace("r#", ""); + let result = eval_file(&test_name); + assert!( + result.is_err(), + "Test {} should have failed but succeeded with: {:?}", + test_name, + result + ); + } + }; +} + +eval_okay_test!(any_all); +eval_okay_test!(arithmetic); +eval_okay_test!(attrnames); +eval_okay_test!(attrs); +eval_okay_test!(attrs2); +eval_okay_test!(attrs3); +eval_okay_test!(attrs4); +eval_okay_test!(attrs5); +eval_okay_test!(#[ignore = "__overrides is not supported"] attrs6); +eval_okay_test!(#[ignore = "requires --arg/--argstr CLI flags"] autoargs); +eval_okay_test!(backslash_newline_1); +eval_okay_test!(backslash_newline_2); +eval_okay_test!(baseNameOf); +eval_okay_test!(builtins); +eval_okay_test!(builtins_add); +eval_okay_test!(callable_attrs); +eval_okay_test!(catattrs); +eval_okay_test!(closure); +eval_okay_test!(comments); +eval_okay_test!(concat); +eval_okay_test!(concatmap); +eval_okay_test!(concatstringssep); +eval_okay_test!(context); +eval_okay_test!(context_introspection); +eval_okay_test!(#[ignore = "not implemented: convertHash"] convertHash); +eval_okay_test!(curpos); +eval_okay_test!(deepseq); +eval_okay_test!(delayed_with); +eval_okay_test!(delayed_with_inherit); +eval_okay_test!(deprecate_cursed_or); +eval_okay_test!(derivation_legacy); +eval_okay_test!(dynamic_attrs); +eval_okay_test!(dynamic_attrs_2); +eval_okay_test!(dynamic_attrs_bare); +eval_okay_test!(elem); +eval_okay_test!(empty_args); +eval_okay_test!(eq); +eval_okay_test!(eq_derivations); +eval_okay_test!(filter); +eval_okay_test!(#[ignore = "not implemented: flakeRefToString"] flake_ref_to_string); +eval_okay_test!(flatten); +eval_okay_test!(float); +eval_okay_test!(floor_ceil); +eval_okay_test!(foldlStrict); +eval_okay_test!(foldlStrict_lazy_elements); +eval_okay_test!(foldlStrict_lazy_initial_accumulator); +eval_okay_test!(fromjson); +eval_okay_test!(fromjson_escapes); +eval_okay_test!(#[ignore = "not implemented: fromTOML"] fromTOML); +eval_okay_test!(#[ignore = "not implemented: fromTOML"] fromTOML_timestamps); +eval_okay_test!(functionargs); +eval_okay_test!(#[ignore = "not implemented: hashFile"] hashfile); +eval_okay_test!(#[ignore = "not implemented: hashString"] hashstring); +eval_okay_test!(getattrpos); +eval_okay_test!(getattrpos_functionargs); +eval_okay_test!(getattrpos_undefined); +eval_okay_test!(getenv); +eval_okay_test!(groupBy); +eval_okay_test!(r#if); +eval_okay_test!(ind_string); +eval_okay_test!(#[ignore = "not implemented: scopedImport"] import); +eval_okay_test!(inherit_attr_pos); +eval_okay_test!(inherit_from); +eval_okay_test!(intersectAttrs); +eval_okay_test!(r#let); +eval_okay_test!(list); +eval_okay_test!(listtoattrs); +eval_okay_test!(logic); +eval_okay_test!(map); +eval_okay_test!(mapattrs); +eval_okay_test!(merge_dynamic_attrs); +eval_okay_test!(nested_with); +eval_okay_test!(new_let); +eval_okay_test!(null_dynamic_attrs); +eval_okay_test!(overrides); +eval_okay_test!(#[ignore = "not implemented: parseFlakeRef"] parse_flake_ref); +eval_okay_test!(partition); +eval_okay_test!(path); +eval_okay_test!(pathexists); +eval_okay_test!(path_string_interpolation); +eval_okay_test!(patterns); +eval_okay_test!(print); +eval_okay_test!(readDir); +eval_okay_test!(readfile); +eval_okay_test!(readFileType); +eval_okay_test!(redefine_builtin); +eval_okay_test!(regex_match); +eval_okay_test!(regex_split); +eval_okay_test!(regression_20220122); +eval_okay_test!(regression_20220125); +eval_okay_test!(regrettable_rec_attrset_merge); +eval_okay_test!(remove); +eval_okay_test!(repeated_empty_attrs); +eval_okay_test!(repeated_empty_list); +eval_okay_test!(replacestrings); +eval_okay_test!(#[ignore = "requires -I CLI flags"] search_path); +eval_okay_test!(scope_1); +eval_okay_test!(scope_2); +eval_okay_test!(scope_3); +eval_okay_test!(scope_4); +eval_okay_test!(scope_6); +eval_okay_test!(scope_7); +eval_okay_test!(seq); +eval_okay_test!(sort); +eval_okay_test!(splitversion); +eval_okay_test!(string); +eval_okay_test!(strings_as_attrs_names); +eval_okay_test!(substring); +eval_okay_test!(substring_context); +eval_okay_test!(symlink_resolution); +eval_okay_test!(tail_call_1); +eval_okay_test!(tojson); +eval_okay_test!(#[ignore = "not implemented: toXML"] toxml); +eval_okay_test!(#[ignore = "not implemented: toXML"] toxml2); +eval_okay_test!(tryeval); +eval_okay_test!(types); +eval_okay_test!(versions); +eval_okay_test!(with); +eval_okay_test!(#[ignore = "not implemented: hashString"] zipAttrsWith); + +eval_fail_test!(fail_abort); +eval_fail_test!(fail_addDrvOutputDependencies_empty_context); +eval_fail_test!(fail_addDrvOutputDependencies_multi_elem_context); +eval_fail_test!(fail_addDrvOutputDependencies_wrong_element_kind); +eval_fail_test!(fail_addErrorContext_example); +eval_fail_test!(fail_assert); +eval_fail_test!(fail_assert_equal_attrs_names); +eval_fail_test!(fail_assert_equal_attrs_names_2); +eval_fail_test!(fail_assert_equal_derivations); +eval_fail_test!(fail_assert_equal_derivations_extra); +eval_fail_test!(fail_assert_equal_floats); +eval_fail_test!(fail_assert_equal_function_direct); +eval_fail_test!(fail_assert_equal_int_float); +eval_fail_test!(fail_assert_equal_ints); +eval_fail_test!(fail_assert_equal_list_length); +eval_fail_test!(fail_assert_equal_paths); +eval_fail_test!(fail_assert_equal_type); +eval_fail_test!(fail_assert_equal_type_nested); +eval_fail_test!(fail_assert_nested_bool); +eval_fail_test!(fail_attr_name_type); +eval_fail_test!(fail_attrset_merge_drops_later_rec); +eval_fail_test!(fail_bad_string_interpolation_1); +eval_fail_test!(fail_bad_string_interpolation_2); +eval_fail_test!(fail_bad_string_interpolation_3); +eval_fail_test!(fail_bad_string_interpolation_4); +eval_fail_test!(fail_blackhole); +eval_fail_test!(fail_call_primop); +eval_fail_test!(fail_deepseq); +eval_fail_test!(fail_derivation_name); +eval_fail_test!(fail_dup_dynamic_attrs); +eval_fail_test!(fail_duplicate_traces); +eval_fail_test!(fail_eol_1); +eval_fail_test!(fail_eol_2); +eval_fail_test!(fail_eol_3); +eval_fail_test!(fail_fetchTree_negative); +eval_fail_test!(fail_fetchurl_baseName); +eval_fail_test!(fail_fetchurl_baseName_attrs); +eval_fail_test!(fail_fetchurl_baseName_attrs_name); +eval_fail_test!(fail_flake_ref_to_string_negative_integer); +eval_fail_test!(fail_foldlStrict_strict_op_application); +eval_fail_test!(fail_fromJSON_keyWithNullByte); +eval_fail_test!(fail_fromJSON_overflowing); +eval_fail_test!(fail_fromJSON_valueWithNullByte); +eval_fail_test!(fail_fromTOML_keyWithNullByte); +eval_fail_test!(fail_fromTOML_timestamps); +eval_fail_test!(fail_fromTOML_valueWithNullByte); +eval_fail_test!(fail_hashfile_missing); +eval_fail_test!(fail_infinite_recursion_lambda); +eval_fail_test!(fail_list); +eval_fail_test!(fail_missing_arg); +eval_fail_test!(fail_mutual_recursion); +eval_fail_test!(fail_nested_list_items); +eval_fail_test!(fail_nonexist_path); +eval_fail_test!(fail_not_throws); +eval_fail_test!(fail_overflowing_add); +eval_fail_test!(fail_overflowing_div); +eval_fail_test!(fail_overflowing_mul); +eval_fail_test!(fail_overflowing_sub); +eval_fail_test!(fail_path_slash); +eval_fail_test!(fail_pipe_operators); +eval_fail_test!(fail_recursion); +eval_fail_test!(fail_remove); +eval_fail_test!(fail_scope_5); +eval_fail_test!(fail_seq); +eval_fail_test!(fail_set); +eval_fail_test!(fail_set_override); +eval_fail_test!(fail_string_nul_1); +eval_fail_test!(fail_string_nul_2); +eval_fail_test!(fail_substring); +eval_fail_test!(fail_toJSON); +eval_fail_test!(fail_toJSON_non_utf_8); +eval_fail_test!(fail_to_path); +eval_fail_test!(fail_undeclared_arg); +eval_fail_test!(fail_using_set_as_attr_name); diff --git a/nix-js/tests/lang/dir1/a.nix b/nix-js/tests/lang/dir1/a.nix new file mode 100644 index 0000000..231f150 --- /dev/null +++ b/nix-js/tests/lang/dir1/a.nix @@ -0,0 +1 @@ +"a" diff --git a/nix-js/tests/lang/dir2/a.nix b/nix-js/tests/lang/dir2/a.nix new file mode 100644 index 0000000..170df52 --- /dev/null +++ b/nix-js/tests/lang/dir2/a.nix @@ -0,0 +1 @@ +"X" diff --git a/nix-js/tests/lang/dir2/b.nix b/nix-js/tests/lang/dir2/b.nix new file mode 100644 index 0000000..19010cc --- /dev/null +++ b/nix-js/tests/lang/dir2/b.nix @@ -0,0 +1 @@ +"b" diff --git a/nix-js/tests/lang/dir3/a.nix b/nix-js/tests/lang/dir3/a.nix new file mode 100644 index 0000000..170df52 --- /dev/null +++ b/nix-js/tests/lang/dir3/a.nix @@ -0,0 +1 @@ +"X" diff --git a/nix-js/tests/lang/dir3/b.nix b/nix-js/tests/lang/dir3/b.nix new file mode 100644 index 0000000..170df52 --- /dev/null +++ b/nix-js/tests/lang/dir3/b.nix @@ -0,0 +1 @@ +"X" diff --git a/nix-js/tests/lang/dir3/c.nix b/nix-js/tests/lang/dir3/c.nix new file mode 100644 index 0000000..cdf1585 --- /dev/null +++ b/nix-js/tests/lang/dir3/c.nix @@ -0,0 +1 @@ +"c" diff --git a/nix-js/tests/lang/dir4/a.nix b/nix-js/tests/lang/dir4/a.nix new file mode 100644 index 0000000..170df52 --- /dev/null +++ b/nix-js/tests/lang/dir4/a.nix @@ -0,0 +1 @@ +"X" diff --git a/nix-js/tests/lang/dir4/c.nix b/nix-js/tests/lang/dir4/c.nix new file mode 100644 index 0000000..170df52 --- /dev/null +++ b/nix-js/tests/lang/dir4/c.nix @@ -0,0 +1 @@ +"X" diff --git a/nix-js/tests/lang/eval-fail-abort.err.exp b/nix-js/tests/lang/eval-fail-abort.err.exp new file mode 100644 index 0000000..20e7b9e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-abort.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'abort' builtin + at /pwd/lang/eval-fail-abort.nix:1:14: + 1| if true then abort "this should fail" else 1 + | ^ + 2| + + error: evaluation aborted with the following error message: 'this should fail' diff --git a/nix-js/tests/lang/eval-fail-abort.nix b/nix-js/tests/lang/eval-fail-abort.nix new file mode 100644 index 0000000..75c51bc --- /dev/null +++ b/nix-js/tests/lang/eval-fail-abort.nix @@ -0,0 +1 @@ +if true then abort "this should fail" else 1 diff --git a/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.err.exp b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.err.exp new file mode 100644 index 0000000..37e0bd9 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'addDrvOutputDependencies' builtin + at /pwd/lang/eval-fail-addDrvOutputDependencies-empty-context.nix:1:1: + 1| builtins.addDrvOutputDependencies "" + | ^ + 2| + + error: context of string '' must have exactly one element, but has 0 diff --git a/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.nix b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.nix new file mode 100644 index 0000000..dc9ee3b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-empty-context.nix @@ -0,0 +1 @@ +builtins.addDrvOutputDependencies "" diff --git a/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.err.exp b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.err.exp new file mode 100644 index 0000000..56fbffa --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.err.exp @@ -0,0 +1,9 @@ +error: + … while calling the 'addDrvOutputDependencies' builtin + at /pwd/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.nix:25:1: + 24| in + 25| builtins.addDrvOutputDependencies combo-path + | ^ + 26| + + error: context of string '/nix/store/pg9yqs4yd85yhdm3f4i5dyaqp5jahrsz-fail.drv/nix/store/2dxd5frb715z451vbf7s8birlf3argbk-fail-2.drv' must have exactly one element, but has 2 diff --git a/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.nix b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.nix new file mode 100644 index 0000000..a1c3461 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-multi-elem-context.nix @@ -0,0 +1,25 @@ +let + drv0 = derivation { + name = "fail"; + builder = "/bin/false"; + system = "x86_64-linux"; + outputs = [ + "out" + "foo" + ]; + }; + + drv1 = derivation { + name = "fail-2"; + builder = "/bin/false"; + system = "x86_64-linux"; + outputs = [ + "out" + "foo" + ]; + }; + + combo-path = "${drv0.drvPath}${drv1.drvPath}"; + +in +builtins.addDrvOutputDependencies combo-path diff --git a/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.err.exp b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.err.exp new file mode 100644 index 0000000..d839938 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.err.exp @@ -0,0 +1,9 @@ +error: + … while calling the 'addDrvOutputDependencies' builtin + at /pwd/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.nix:13:1: + 12| in + 13| builtins.addDrvOutputDependencies drv.outPath + | ^ + 14| + + error: `addDrvOutputDependencies` can only act on derivations, not on a derivation output such as 'out' diff --git a/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.nix b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.nix new file mode 100644 index 0000000..6aab61c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addDrvOutputDependencies-wrong-element-kind.nix @@ -0,0 +1,13 @@ +let + drv = derivation { + name = "fail"; + builder = "/bin/false"; + system = "x86_64-linux"; + outputs = [ + "out" + "foo" + ]; + }; + +in +builtins.addDrvOutputDependencies drv.outPath diff --git a/nix-js/tests/lang/eval-fail-addErrorContext-example.err.exp b/nix-js/tests/lang/eval-fail-addErrorContext-example.err.exp new file mode 100644 index 0000000..4fad8f5 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addErrorContext-example.err.exp @@ -0,0 +1,24 @@ +error: + … while counting down; n = 10 + + … while counting down; n = 9 + + … while counting down; n = 8 + + … while counting down; n = 7 + + … while counting down; n = 6 + + … while counting down; n = 5 + + … while counting down; n = 4 + + … while counting down; n = 3 + + … while counting down; n = 2 + + … while counting down; n = 1 + + (stack trace truncated; use '--show-trace' to show the full, detailed trace) + + error: kaboom diff --git a/nix-js/tests/lang/eval-fail-addErrorContext-example.nix b/nix-js/tests/lang/eval-fail-addErrorContext-example.nix new file mode 100644 index 0000000..96a9cef --- /dev/null +++ b/nix-js/tests/lang/eval-fail-addErrorContext-example.nix @@ -0,0 +1,9 @@ +let + countDown = + n: + if n == 0 then + throw "kaboom" + else + builtins.addErrorContext "while counting down; n = ${toString n}" ("x" + countDown (n - 1)); +in +countDown 10 diff --git a/nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.err.exp new file mode 100644 index 0000000..5912e6b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating the condition of the assertion '({ a = true; } == { a = true; b = true; })' + at /pwd/lang/eval-fail-assert-equal-attrs-names-2.nix:1:1: + 1| assert + | ^ + 2| { + + error: attribute names of attribute set '{ a = true; }' differs from attribute set '{ a = true; b = true; }' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.nix b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.nix new file mode 100644 index 0000000..4bce264 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names-2.nix @@ -0,0 +1,8 @@ +assert + { + a = true; + } == { + a = true; + b = true; + }; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-attrs-names.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names.err.exp new file mode 100644 index 0000000..a93b263 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating the condition of the assertion '({ a = true; b = true; } == { a = true; })' + at /pwd/lang/eval-fail-assert-equal-attrs-names.nix:1:1: + 1| assert + | ^ + 2| { + + error: attribute names of attribute set '{ a = true; b = true; }' differs from attribute set '{ a = true; }' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-attrs-names.nix b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names.nix new file mode 100644 index 0000000..f995699 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-attrs-names.nix @@ -0,0 +1,8 @@ +assert + { + a = true; + b = true; + } == { + a = true; + }; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.err.exp new file mode 100644 index 0000000..9ccf5e4 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.err.exp @@ -0,0 +1,26 @@ +error: + … while evaluating the condition of the assertion '({ foo = { outPath = "/nix/store/0"; type = "derivation"; }; } == { foo = { devious = true; outPath = "/nix/store/1"; type = "derivation"; }; })' + at /pwd/lang/eval-fail-assert-equal-derivations-extra.nix:1:1: + 1| assert + | ^ + 2| { + + … while comparing attribute 'foo' + + … where left hand side is + at /pwd/lang/eval-fail-assert-equal-derivations-extra.nix:3:5: + 2| { + 3| foo = { + | ^ + 4| type = "derivation"; + + … where right hand side is + at /pwd/lang/eval-fail-assert-equal-derivations-extra.nix:8:5: + 7| } == { + 8| foo = { + | ^ + 9| type = "derivation"; + + … while comparing a derivation by its 'outPath' attribute + + error: string '"/nix/store/0"' is not equal to string '"/nix/store/1"' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.nix b/nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.nix new file mode 100644 index 0000000..14a782a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-derivations-extra.nix @@ -0,0 +1,14 @@ +assert + { + foo = { + type = "derivation"; + outPath = "/nix/store/0"; + }; + } == { + foo = { + type = "derivation"; + outPath = "/nix/store/1"; + devious = true; + }; + }; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-derivations.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-derivations.err.exp new file mode 100644 index 0000000..2be1f48 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-derivations.err.exp @@ -0,0 +1,26 @@ +error: + … while evaluating the condition of the assertion '({ foo = { ignored = (abort "not ignored"); outPath = "/nix/store/0"; type = "derivation"; }; } == { foo = { ignored = (abort "not ignored"); outPath = "/nix/store/1"; type = "derivation"; }; })' + at /pwd/lang/eval-fail-assert-equal-derivations.nix:1:1: + 1| assert + | ^ + 2| { + + … while comparing attribute 'foo' + + … where left hand side is + at /pwd/lang/eval-fail-assert-equal-derivations.nix:3:5: + 2| { + 3| foo = { + | ^ + 4| type = "derivation"; + + … where right hand side is + at /pwd/lang/eval-fail-assert-equal-derivations.nix:9:5: + 8| } == { + 9| foo = { + | ^ + 10| type = "derivation"; + + … while comparing a derivation by its 'outPath' attribute + + error: string '"/nix/store/0"' is not equal to string '"/nix/store/1"' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-derivations.nix b/nix-js/tests/lang/eval-fail-assert-equal-derivations.nix new file mode 100644 index 0000000..0f6748c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-derivations.nix @@ -0,0 +1,15 @@ +assert + { + foo = { + type = "derivation"; + outPath = "/nix/store/0"; + ignored = abort "not ignored"; + }; + } == { + foo = { + type = "derivation"; + outPath = "/nix/store/1"; + ignored = abort "not ignored"; + }; + }; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-floats.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-floats.err.exp new file mode 100644 index 0000000..d8545e2 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-floats.err.exp @@ -0,0 +1,22 @@ +error: + … while evaluating the condition of the assertion '({ b = 1; } == { b = 1.01; })' + at /pwd/lang/eval-fail-assert-equal-floats.nix:1:1: + 1| assert { b = 1.0; } == { b = 1.01; }; + | ^ + 2| abort "unreachable" + + … while comparing attribute 'b' + + … where left hand side is + at /pwd/lang/eval-fail-assert-equal-floats.nix:1:10: + 1| assert { b = 1.0; } == { b = 1.01; }; + | ^ + 2| abort "unreachable" + + … where right hand side is + at /pwd/lang/eval-fail-assert-equal-floats.nix:1:26: + 1| assert { b = 1.0; } == { b = 1.01; }; + | ^ + 2| abort "unreachable" + + error: a float with value '1' is not equal to a float with value '1.01' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-floats.nix b/nix-js/tests/lang/eval-fail-assert-equal-floats.nix new file mode 100644 index 0000000..438e85a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-floats.nix @@ -0,0 +1,2 @@ +assert { b = 1.0; } == { b = 1.01; }; +abort "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-function-direct.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-function-direct.err.exp new file mode 100644 index 0000000..93c88a8 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-function-direct.err.exp @@ -0,0 +1,9 @@ +error: + … while evaluating the condition of the assertion '((x: x) == (x: x))' + at /pwd/lang/eval-fail-assert-equal-function-direct.nix:3:1: + 2| # This only compares a direct comparison and makes no claims about functions in nested structures. + 3| assert (x: x) == (x: x); + | ^ + 4| abort "unreachable" + + error: distinct functions and immediate comparisons of identical functions compare as unequal diff --git a/nix-js/tests/lang/eval-fail-assert-equal-function-direct.nix b/nix-js/tests/lang/eval-fail-assert-equal-function-direct.nix new file mode 100644 index 0000000..cd15c4a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-function-direct.nix @@ -0,0 +1,4 @@ +# Note: functions in nested structures, e.g. attributes, may be optimized away by pointer identity optimization. +# This only compares a direct comparison and makes no claims about functions in nested structures. +assert (x: x) == (x: x); +abort "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-int-float.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-int-float.err.exp new file mode 100644 index 0000000..c927e38 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-int-float.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating the condition of the assertion '(1 == 1.1)' + at /pwd/lang/eval-fail-assert-equal-int-float.nix:1:1: + 1| assert 1 == 1.1; + | ^ + 2| throw "unreachable" + + error: an integer with value '1' is not equal to a float with value '1.1' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-int-float.nix b/nix-js/tests/lang/eval-fail-assert-equal-int-float.nix new file mode 100644 index 0000000..1dfdf2b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-int-float.nix @@ -0,0 +1,2 @@ +assert 1 == 1.1; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-ints.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-ints.err.exp new file mode 100644 index 0000000..d6219e2 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-ints.err.exp @@ -0,0 +1,22 @@ +error: + … while evaluating the condition of the assertion '({ b = 1; } == { b = 2; })' + at /pwd/lang/eval-fail-assert-equal-ints.nix:1:1: + 1| assert { b = 1; } == { b = 2; }; + | ^ + 2| abort "unreachable" + + … while comparing attribute 'b' + + … where left hand side is + at /pwd/lang/eval-fail-assert-equal-ints.nix:1:10: + 1| assert { b = 1; } == { b = 2; }; + | ^ + 2| abort "unreachable" + + … where right hand side is + at /pwd/lang/eval-fail-assert-equal-ints.nix:1:24: + 1| assert { b = 1; } == { b = 2; }; + | ^ + 2| abort "unreachable" + + error: an integer with value '1' is not equal to an integer with value '2' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-ints.nix b/nix-js/tests/lang/eval-fail-assert-equal-ints.nix new file mode 100644 index 0000000..645258e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-ints.nix @@ -0,0 +1,2 @@ +assert { b = 1; } == { b = 2; }; +abort "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-list-length.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-list-length.err.exp new file mode 100644 index 0000000..e82f378 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-list-length.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating the condition of the assertion '([ (1) (0) ] == [ (10) ])' + at /pwd/lang/eval-fail-assert-equal-list-length.nix:1:1: + 1| assert + | ^ + 2| [ + + error: list of size '2' is not equal to list of size '1', left hand side is '[ 1 0 ]', right hand side is '[ 10 ]' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-list-length.nix b/nix-js/tests/lang/eval-fail-assert-equal-list-length.nix new file mode 100644 index 0000000..bd74ccc --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-list-length.nix @@ -0,0 +1,6 @@ +assert + [ + 1 + 0 + ] == [ 10 ]; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-paths.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-paths.err.exp new file mode 100644 index 0000000..66c34e9 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-paths.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating the condition of the assertion '(/pwd/lang/foo == /pwd/lang/bar)' + at /pwd/lang/eval-fail-assert-equal-paths.nix:1:1: + 1| assert ./foo == ./bar; + | ^ + 2| throw "unreachable" + + error: path '/pwd/lang/foo' is not equal to path '/pwd/lang/bar' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-paths.nix b/nix-js/tests/lang/eval-fail-assert-equal-paths.nix new file mode 100644 index 0000000..647e891 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-paths.nix @@ -0,0 +1,2 @@ +assert ./foo == ./bar; +throw "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-type-nested.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-type-nested.err.exp new file mode 100644 index 0000000..f78badd --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-type-nested.err.exp @@ -0,0 +1,22 @@ +error: + … while evaluating the condition of the assertion '({ ding = false; } == { ding = null; })' + at /pwd/lang/eval-fail-assert-equal-type-nested.nix:1:1: + 1| assert { ding = false; } == { ding = null; }; + | ^ + 2| abort "unreachable" + + … while comparing attribute 'ding' + + … where left hand side is + at /pwd/lang/eval-fail-assert-equal-type-nested.nix:1:10: + 1| assert { ding = false; } == { ding = null; }; + | ^ + 2| abort "unreachable" + + … where right hand side is + at /pwd/lang/eval-fail-assert-equal-type-nested.nix:1:31: + 1| assert { ding = false; } == { ding = null; }; + | ^ + 2| abort "unreachable" + + error: a Boolean of value 'false' is not equal to null of value 'null' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-type-nested.nix b/nix-js/tests/lang/eval-fail-assert-equal-type-nested.nix new file mode 100644 index 0000000..3fbd14c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-type-nested.nix @@ -0,0 +1,2 @@ +assert { ding = false; } == { ding = null; }; +abort "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-equal-type.err.exp b/nix-js/tests/lang/eval-fail-assert-equal-type.err.exp new file mode 100644 index 0000000..4dc3f2e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-type.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating the condition of the assertion '(false == null)' + at /pwd/lang/eval-fail-assert-equal-type.nix:1:1: + 1| assert false == null; + | ^ + 2| abort "unreachable" + + error: a Boolean of value 'false' is not equal to null of value 'null' diff --git a/nix-js/tests/lang/eval-fail-assert-equal-type.nix b/nix-js/tests/lang/eval-fail-assert-equal-type.nix new file mode 100644 index 0000000..7023ea0 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-equal-type.nix @@ -0,0 +1,2 @@ +assert false == null; +abort "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert-nested-bool.err.exp b/nix-js/tests/lang/eval-fail-assert-nested-bool.err.exp new file mode 100644 index 0000000..fdc0818 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-nested-bool.err.exp @@ -0,0 +1,66 @@ +error: + … while evaluating the condition of the assertion '({ a = { b = [ ({ c = { d = true; }; }) ]; }; } == { a = { b = [ ({ c = { d = false; }; }) ]; }; })' + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:1: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … while comparing attribute 'a' + + … where left hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:10: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … where right hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:44: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … while comparing attribute 'b' + + … where left hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:10: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … where right hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:44: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … while comparing list element 0 + + … while comparing attribute 'c' + + … where left hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:20: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … where right hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:54: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … while comparing attribute 'd' + + … where left hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:20: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + … where right hand side is + at /pwd/lang/eval-fail-assert-nested-bool.nix:1:54: + 1| assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + | ^ + 2| + + error: boolean 'true' is not equal to boolean 'false' diff --git a/nix-js/tests/lang/eval-fail-assert-nested-bool.nix b/nix-js/tests/lang/eval-fail-assert-nested-bool.nix new file mode 100644 index 0000000..c75fe06 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert-nested-bool.nix @@ -0,0 +1,3 @@ +assert { a.b = [ { c.d = true; } ]; } == { a.b = [ { c.d = false; } ]; }; + +abort "unreachable" diff --git a/nix-js/tests/lang/eval-fail-assert.err.exp b/nix-js/tests/lang/eval-fail-assert.err.exp new file mode 100644 index 0000000..5fffe79 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert.err.exp @@ -0,0 +1,30 @@ +error: + … while evaluating the attribute 'body' + at /pwd/lang/eval-fail-assert.nix:7:3: + 6| + 7| body = x "x"; + | ^ + 8| } + + … from call site + at /pwd/lang/eval-fail-assert.nix:7:10: + 6| + 7| body = x "x"; + | ^ + 8| } + + … while calling 'x' + at /pwd/lang/eval-fail-assert.nix:3:5: + 2| x = + 3| arg: + | ^ + 4| assert arg == "y"; + + … while evaluating the condition of the assertion '(arg == "y")' + at /pwd/lang/eval-fail-assert.nix:4:5: + 3| arg: + 4| assert arg == "y"; + | ^ + 5| 123; + + error: string '"x"' is not equal to string '"y"' diff --git a/nix-js/tests/lang/eval-fail-assert.nix b/nix-js/tests/lang/eval-fail-assert.nix new file mode 100644 index 0000000..7cb7750 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-assert.nix @@ -0,0 +1,8 @@ +let { + x = + arg: + assert arg == "y"; + 123; + + body = x "x"; +} diff --git a/nix-js/tests/lang/eval-fail-attr-name-type.err.exp b/nix-js/tests/lang/eval-fail-attr-name-type.err.exp new file mode 100644 index 0000000..4ea209b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-attr-name-type.err.exp @@ -0,0 +1,21 @@ +error: + … while evaluating the attribute 'puppy."${key}"' + at /pwd/lang/eval-fail-attr-name-type.nix:3:5: + 2| attrs = { + 3| puppy.doggy = { }; + | ^ + 4| }; + + … while evaluating an attribute name + at /pwd/lang/eval-fail-attr-name-type.nix:7:15: + 6| in + 7| attrs.puppy.${key} + | ^ + 8| + + error: expected a string but found an integer: 1 + at /pwd/lang/eval-fail-attr-name-type.nix:7:15: + 6| in + 7| attrs.puppy.${key} + | ^ + 8| diff --git a/nix-js/tests/lang/eval-fail-attr-name-type.nix b/nix-js/tests/lang/eval-fail-attr-name-type.nix new file mode 100644 index 0000000..fb6ccdd --- /dev/null +++ b/nix-js/tests/lang/eval-fail-attr-name-type.nix @@ -0,0 +1,7 @@ +let + attrs = { + puppy.doggy = { }; + }; + key = 1; +in +attrs.puppy.${key} diff --git a/nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.err.exp b/nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.err.exp new file mode 100644 index 0000000..ba9185d --- /dev/null +++ b/nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.err.exp @@ -0,0 +1,6 @@ +error: undefined variable 'd' + at /pwd/lang/eval-fail-attrset-merge-drops-later-rec.nix:4:9: + 3| a = rec { + 4| c = d + 2; + | ^ + 5| d = 3; diff --git a/nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.nix b/nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.nix new file mode 100644 index 0000000..b6b56bf --- /dev/null +++ b/nix-js/tests/lang/eval-fail-attrset-merge-drops-later-rec.nix @@ -0,0 +1,8 @@ +{ + a.b = 1; + a = rec { + c = d + 2; + d = 3; + }; +} +.c diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-1.err.exp b/nix-js/tests/lang/eval-fail-bad-string-interpolation-1.err.exp new file mode 100644 index 0000000..5ae5303 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-1.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating a path segment + at /pwd/lang/eval-fail-bad-string-interpolation-1.nix:1:2: + 1| "${x: x}" + | ^ + 2| + + error: cannot coerce a function to a string: «lambda @ /pwd/lang/eval-fail-bad-string-interpolation-1.nix:1:4» diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-1.nix b/nix-js/tests/lang/eval-fail-bad-string-interpolation-1.nix new file mode 100644 index 0000000..ffe9c98 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-1.nix @@ -0,0 +1 @@ +"${x: x}" diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-2.err.exp b/nix-js/tests/lang/eval-fail-bad-string-interpolation-2.err.exp new file mode 100644 index 0000000..a287067 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-2.err.exp @@ -0,0 +1 @@ +error: path '/pwd/lang/fnord' does not exist diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-2.nix b/nix-js/tests/lang/eval-fail-bad-string-interpolation-2.nix new file mode 100644 index 0000000..3745235 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-2.nix @@ -0,0 +1 @@ +"${./fnord}" diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-3.err.exp b/nix-js/tests/lang/eval-fail-bad-string-interpolation-3.err.exp new file mode 100644 index 0000000..170a3d1 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-3.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating a path segment + at /pwd/lang/eval-fail-bad-string-interpolation-3.nix:1:3: + 1| ''${x: x}'' + | ^ + 2| + + error: cannot coerce a function to a string: «lambda @ /pwd/lang/eval-fail-bad-string-interpolation-3.nix:1:5» diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-3.nix b/nix-js/tests/lang/eval-fail-bad-string-interpolation-3.nix new file mode 100644 index 0000000..65b9d4f --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-3.nix @@ -0,0 +1 @@ +''${x: x}'' diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-4.err.exp b/nix-js/tests/lang/eval-fail-bad-string-interpolation-4.err.exp new file mode 100644 index 0000000..ea59100 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-4.err.exp @@ -0,0 +1,9 @@ +error: + … while evaluating a path segment + at /pwd/lang/eval-fail-bad-string-interpolation-4.nix:19:3: + 18| # The error message should not be too long. + 19| ''${pkgs}'' + | ^ + 20| + + error: cannot coerce a set to a string: { a = { a = { a = { a = "ha"; b = "ha"; c = "ha"; d = "ha"; e = "ha"; f = "ha"; g = "ha"; h = "ha"; j = "ha"; }; «8 attributes elided» }; «8 attributes elided» }; «8 attributes elided» } diff --git a/nix-js/tests/lang/eval-fail-bad-string-interpolation-4.nix b/nix-js/tests/lang/eval-fail-bad-string-interpolation-4.nix new file mode 100644 index 0000000..e8349bb --- /dev/null +++ b/nix-js/tests/lang/eval-fail-bad-string-interpolation-4.nix @@ -0,0 +1,19 @@ +let + # Basically a "billion laughs" attack, but toned down to simulated `pkgs`. + ha = x: y: { + a = x y; + b = x y; + c = x y; + d = x y; + e = x y; + f = x y; + g = x y; + h = x y; + j = x y; + }; + has = ha (ha (ha (ha (x: x)))) "ha"; + # A large structure that has already been evaluated. + pkgs = builtins.deepSeq has has; +in +# The error message should not be too long. +''${pkgs}'' diff --git a/nix-js/tests/lang/eval-fail-blackhole.err.exp b/nix-js/tests/lang/eval-fail-blackhole.err.exp new file mode 100644 index 0000000..95e33a5 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-blackhole.err.exp @@ -0,0 +1,14 @@ +error: + … while evaluating the attribute 'body' + at /pwd/lang/eval-fail-blackhole.nix:2:3: + 1| let { + 2| body = x; + | ^ + 3| x = y; + + error: infinite recursion encountered + at /pwd/lang/eval-fail-blackhole.nix:3:7: + 2| body = x; + 3| x = y; + | ^ + 4| y = x; diff --git a/nix-js/tests/lang/eval-fail-blackhole.nix b/nix-js/tests/lang/eval-fail-blackhole.nix new file mode 100644 index 0000000..81133b5 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-blackhole.nix @@ -0,0 +1,5 @@ +let { + body = x; + x = y; + y = x; +} diff --git a/nix-js/tests/lang/eval-fail-call-primop.err.exp b/nix-js/tests/lang/eval-fail-call-primop.err.exp new file mode 100644 index 0000000..0c6f614 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-call-primop.err.exp @@ -0,0 +1,10 @@ +error: + … while calling the 'length' builtin + at /pwd/lang/eval-fail-call-primop.nix:1:1: + 1| builtins.length 1 + | ^ + 2| + + … while evaluating the first argument passed to builtins.length + + error: expected a list but found an integer: 1 diff --git a/nix-js/tests/lang/eval-fail-call-primop.nix b/nix-js/tests/lang/eval-fail-call-primop.nix new file mode 100644 index 0000000..972eb72 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-call-primop.nix @@ -0,0 +1 @@ +builtins.length 1 diff --git a/nix-js/tests/lang/eval-fail-deepseq.err.exp b/nix-js/tests/lang/eval-fail-deepseq.err.exp new file mode 100644 index 0000000..11b6234 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-deepseq.err.exp @@ -0,0 +1,20 @@ +error: + … while calling the 'deepSeq' builtin + at /pwd/lang/eval-fail-deepseq.nix:1:1: + 1| builtins.deepSeq { x = abort "foo"; } 456 + | ^ + 2| + + … while evaluating the attribute 'x' + at /pwd/lang/eval-fail-deepseq.nix:1:20: + 1| builtins.deepSeq { x = abort "foo"; } 456 + | ^ + 2| + + … while calling the 'abort' builtin + at /pwd/lang/eval-fail-deepseq.nix:1:24: + 1| builtins.deepSeq { x = abort "foo"; } 456 + | ^ + 2| + + error: evaluation aborted with the following error message: 'foo' diff --git a/nix-js/tests/lang/eval-fail-deepseq.nix b/nix-js/tests/lang/eval-fail-deepseq.nix new file mode 100644 index 0000000..9baa49b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-deepseq.nix @@ -0,0 +1 @@ +builtins.deepSeq { x = abort "foo"; } 456 diff --git a/nix-js/tests/lang/eval-fail-derivation-name.err.exp b/nix-js/tests/lang/eval-fail-derivation-name.err.exp new file mode 100644 index 0000000..017326c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-derivation-name.err.exp @@ -0,0 +1,26 @@ +error: + … while evaluating the attribute 'outPath' + at ::: + | value = commonAttrs // { + | outPath = builtins.getAttr outputName strict; + | ^ + | drvPath = strict.drvPath; + + … while calling the 'getAttr' builtin + at ::: + | value = commonAttrs // { + | outPath = builtins.getAttr outputName strict; + | ^ + | drvPath = strict.drvPath; + + … while calling the 'derivationStrict' builtin + at ::: + | + | strict = derivationStrict drvAttrs; + | ^ + | + + … while evaluating derivation '~jiggle~' + whose name attribute is located at /pwd/lang/eval-fail-derivation-name.nix:: + + error: invalid derivation name: name '~jiggle~' contains illegal character '~'. Please pass a different 'name'. diff --git a/nix-js/tests/lang/eval-fail-derivation-name.nix b/nix-js/tests/lang/eval-fail-derivation-name.nix new file mode 100644 index 0000000..e779ad6 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-derivation-name.nix @@ -0,0 +1,5 @@ +derivation { + name = "~jiggle~"; + system = "some-system"; + builder = "/dontcare"; +} diff --git a/nix-js/tests/lang/eval-fail-dup-dynamic-attrs.err.exp b/nix-js/tests/lang/eval-fail-dup-dynamic-attrs.err.exp new file mode 100644 index 0000000..4eafe94 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-dup-dynamic-attrs.err.exp @@ -0,0 +1,14 @@ +error: + … while evaluating the attribute 'set' + at /pwd/lang/eval-fail-dup-dynamic-attrs.nix:2:3: + 1| { + 2| set = { + | ^ + 3| "${"" + "b"}" = 1; + + error: dynamic attribute 'b' already defined at /pwd/lang/eval-fail-dup-dynamic-attrs.nix:3:5 + at /pwd/lang/eval-fail-dup-dynamic-attrs.nix:6:5: + 5| set = { + 6| "${"b" + ""}" = 2; + | ^ + 7| }; diff --git a/nix-js/tests/lang/eval-fail-dup-dynamic-attrs.nix b/nix-js/tests/lang/eval-fail-dup-dynamic-attrs.nix new file mode 100644 index 0000000..93cceef --- /dev/null +++ b/nix-js/tests/lang/eval-fail-dup-dynamic-attrs.nix @@ -0,0 +1,8 @@ +{ + set = { + "${"" + "b"}" = 1; + }; + set = { + "${"b" + ""}" = 2; + }; +} diff --git a/nix-js/tests/lang/eval-fail-duplicate-traces.err.exp b/nix-js/tests/lang/eval-fail-duplicate-traces.err.exp new file mode 100644 index 0000000..e6ae60f --- /dev/null +++ b/nix-js/tests/lang/eval-fail-duplicate-traces.err.exp @@ -0,0 +1,51 @@ +error: + … from call site + at /pwd/lang/eval-fail-duplicate-traces.nix:6:1: + 5| in + 6| throwAfter 2 + | ^ + 7| + + … while calling 'throwAfter' + at /pwd/lang/eval-fail-duplicate-traces.nix:4:16: + 3| let + 4| throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; + | ^ + 5| in + + … from call site + at /pwd/lang/eval-fail-duplicate-traces.nix:4:33: + 3| let + 4| throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; + | ^ + 5| in + + … while calling 'throwAfter' + at /pwd/lang/eval-fail-duplicate-traces.nix:4:16: + 3| let + 4| throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; + | ^ + 5| in + + … from call site + at /pwd/lang/eval-fail-duplicate-traces.nix:4:33: + 3| let + 4| throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; + | ^ + 5| in + + … while calling 'throwAfter' + at /pwd/lang/eval-fail-duplicate-traces.nix:4:16: + 3| let + 4| throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; + | ^ + 5| in + + … while calling the 'throw' builtin + at /pwd/lang/eval-fail-duplicate-traces.nix:4:57: + 3| let + 4| throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; + | ^ + 5| in + + error: Uh oh! diff --git a/nix-js/tests/lang/eval-fail-duplicate-traces.nix b/nix-js/tests/lang/eval-fail-duplicate-traces.nix new file mode 100644 index 0000000..90526f6 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-duplicate-traces.nix @@ -0,0 +1,6 @@ +# Check that we only omit duplicate stack traces when there's a bunch of them. +# Here, there's only a couple duplicate entries, so we output them all. +let + throwAfter = n: if n > 0 then throwAfter (n - 1) else throw "Uh oh!"; +in +throwAfter 2 diff --git a/nix-js/tests/lang/eval-fail-eol-1.err.exp b/nix-js/tests/lang/eval-fail-eol-1.err.exp new file mode 100644 index 0000000..3f5a5c2 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-eol-1.err.exp @@ -0,0 +1,6 @@ +error: undefined variable 'invalid' + at /pwd/lang/eval-fail-eol-1.nix:2:1: + 1| # foo + 2| invalid + | ^ + 3| # bar diff --git a/nix-js/tests/lang/eval-fail-eol-1.nix b/nix-js/tests/lang/eval-fail-eol-1.nix new file mode 100644 index 0000000..4762239 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-eol-1.nix @@ -0,0 +1,3 @@ +# foo +invalid +# bar diff --git a/nix-js/tests/lang/eval-fail-eol-2.err.exp b/nix-js/tests/lang/eval-fail-eol-2.err.exp new file mode 100644 index 0000000..ff13e2d --- /dev/null +++ b/nix-js/tests/lang/eval-fail-eol-2.err.exp @@ -0,0 +1,6 @@ +error: undefined variable 'invalid' + at /pwd/lang/eval-fail-eol-2.nix:2:1: + 1| # foo + 2| invalid + | ^ + 3| # bar diff --git a/nix-js/tests/lang/eval-fail-eol-2.nix b/nix-js/tests/lang/eval-fail-eol-2.nix new file mode 100644 index 0000000..0cf92a4 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-eol-2.nix @@ -0,0 +1,2 @@ +# foo invalid +# bar diff --git a/nix-js/tests/lang/eval-fail-eol-3.err.exp b/nix-js/tests/lang/eval-fail-eol-3.err.exp new file mode 100644 index 0000000..ada3c5e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-eol-3.err.exp @@ -0,0 +1,6 @@ +error: undefined variable 'invalid' + at /pwd/lang/eval-fail-eol-3.nix:2:1: + 1| # foo + 2| invalid + | ^ + 3| # bar diff --git a/nix-js/tests/lang/eval-fail-eol-3.nix b/nix-js/tests/lang/eval-fail-eol-3.nix new file mode 100644 index 0000000..3342245 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-eol-3.nix @@ -0,0 +1,3 @@ +# foo +invalid +# bar diff --git a/nix-js/tests/lang/eval-fail-fetchTree-negative.err.exp b/nix-js/tests/lang/eval-fail-fetchTree-negative.err.exp new file mode 100644 index 0000000..423123c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchTree-negative.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fetchTree' builtin + at /pwd/lang/eval-fail-fetchTree-negative.nix:1:1: + 1| builtins.fetchTree { + | ^ + 2| type = "file"; + + error: negative value given for 'fetchTree' argument 'owner': -1 diff --git a/nix-js/tests/lang/eval-fail-fetchTree-negative.nix b/nix-js/tests/lang/eval-fail-fetchTree-negative.nix new file mode 100644 index 0000000..90bcab5 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchTree-negative.nix @@ -0,0 +1,5 @@ +builtins.fetchTree { + type = "file"; + url = "file://eval-fail-fetchTree-negative.nix"; + owner = -1; +} diff --git a/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.err.exp b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.err.exp new file mode 100644 index 0000000..2cac02f --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fetchurl' builtin + at /pwd/lang/eval-fail-fetchurl-baseName-attrs-name.nix:1:1: + 1| builtins.fetchurl { + | ^ + 2| url = "https://example.com/foo.tar.gz"; + + error: invalid store path name when fetching URL 'https://example.com/foo.tar.gz': name '~wobble~' contains illegal character '~'. Please change the value for the 'name' attribute passed to 'fetchurl', so that it can create a valid store path. diff --git a/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.nix b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.nix new file mode 100644 index 0000000..dcaf720 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs-name.nix @@ -0,0 +1,4 @@ +builtins.fetchurl { + url = "https://example.com/foo.tar.gz"; + name = "~wobble~"; +} diff --git a/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.err.exp b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.err.exp new file mode 100644 index 0000000..cef532e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fetchurl' builtin + at /pwd/lang/eval-fail-fetchurl-baseName-attrs.nix:1:1: + 1| builtins.fetchurl { url = "https://example.com/~wiggle~"; } + | ^ + 2| + + error: invalid store path name when fetching URL 'https://example.com/~wiggle~': name '~wiggle~' contains illegal character '~'. Please add a valid 'name' attribute to the argument for 'fetchurl', so that it can create a valid store path. diff --git a/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.nix b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.nix new file mode 100644 index 0000000..068120e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchurl-baseName-attrs.nix @@ -0,0 +1 @@ +builtins.fetchurl { url = "https://example.com/~wiggle~"; } diff --git a/nix-js/tests/lang/eval-fail-fetchurl-baseName.err.exp b/nix-js/tests/lang/eval-fail-fetchurl-baseName.err.exp new file mode 100644 index 0000000..0950e8e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchurl-baseName.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fetchurl' builtin + at /pwd/lang/eval-fail-fetchurl-baseName.nix:1:1: + 1| builtins.fetchurl "https://example.com/~wiggle~" + | ^ + 2| + + error: invalid store path name when fetching URL 'https://example.com/~wiggle~': name '~wiggle~' contains illegal character '~'. Please pass an attribute set with 'url' and 'name' attributes to 'fetchurl', so that it can create a valid store path. diff --git a/nix-js/tests/lang/eval-fail-fetchurl-baseName.nix b/nix-js/tests/lang/eval-fail-fetchurl-baseName.nix new file mode 100644 index 0000000..9650938 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fetchurl-baseName.nix @@ -0,0 +1 @@ +builtins.fetchurl "https://example.com/~wiggle~" diff --git a/nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.err.exp b/nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.err.exp new file mode 100644 index 0000000..2b56939 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.err.exp @@ -0,0 +1,16 @@ +error: + … while calling the 'seq' builtin + at /pwd/lang/eval-fail-flake-ref-to-string-negative-integer.nix:4:1: + 3| in + 4| builtins.seq n ( + | ^ + 5| builtins.flakeRefToString { + + … while calling the 'flakeRefToString' builtin + at /pwd/lang/eval-fail-flake-ref-to-string-negative-integer.nix:5:3: + 4| builtins.seq n ( + 5| builtins.flakeRefToString { + | ^ + 6| type = "github"; + + error: negative value given for flake ref attr repo: -1 diff --git a/nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.nix b/nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.nix new file mode 100644 index 0000000..9cc9ef6 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-flake-ref-to-string-negative-integer.nix @@ -0,0 +1,12 @@ +let + n = -1; +in +builtins.seq n ( + builtins.flakeRefToString { + type = "github"; + owner = "NixOS"; + repo = n; + ref = "23.05"; + dir = "lib"; + } +) diff --git a/nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.err.exp b/nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.err.exp new file mode 100644 index 0000000..bb02ecd --- /dev/null +++ b/nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.err.exp @@ -0,0 +1,37 @@ +error: + … while calling the 'foldl'' builtin + at /pwd/lang/eval-fail-foldlStrict-strict-op-application.nix:2:1: + 1| # Tests that the result of applying op is forced even if the value is never used + 2| builtins.foldl' (_: f: f null) null [ + | ^ + 3| (_: throw "Not the final value, but is still forced!") + + … while calling anonymous lambda + at /pwd/lang/eval-fail-foldlStrict-strict-op-application.nix:2:21: + 1| # Tests that the result of applying op is forced even if the value is never used + 2| builtins.foldl' (_: f: f null) null [ + | ^ + 3| (_: throw "Not the final value, but is still forced!") + + … from call site + at /pwd/lang/eval-fail-foldlStrict-strict-op-application.nix:2:24: + 1| # Tests that the result of applying op is forced even if the value is never used + 2| builtins.foldl' (_: f: f null) null [ + | ^ + 3| (_: throw "Not the final value, but is still forced!") + + … while calling anonymous lambda + at /pwd/lang/eval-fail-foldlStrict-strict-op-application.nix:3:4: + 2| builtins.foldl' (_: f: f null) null [ + 3| (_: throw "Not the final value, but is still forced!") + | ^ + 4| (_: 23) + + … while calling the 'throw' builtin + at /pwd/lang/eval-fail-foldlStrict-strict-op-application.nix:3:7: + 2| builtins.foldl' (_: f: f null) null [ + 3| (_: throw "Not the final value, but is still forced!") + | ^ + 4| (_: 23) + + error: Not the final value, but is still forced! diff --git a/nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.nix b/nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.nix new file mode 100644 index 0000000..f85486d --- /dev/null +++ b/nix-js/tests/lang/eval-fail-foldlStrict-strict-op-application.nix @@ -0,0 +1,5 @@ +# Tests that the result of applying op is forced even if the value is never used +builtins.foldl' (_: f: f null) null [ + (_: throw "Not the final value, but is still forced!") + (_: 23) +] diff --git a/nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.err.exp b/nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.err.exp new file mode 100644 index 0000000..a16192c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fromJSON' builtin + at /pwd/lang/eval-fail-fromJSON-keyWithNullByte.nix:1:1: + 1| builtins.fromJSON ''{"a\u0000b": 1}'' + | ^ + 2| + + error: input string 'a␀b' cannot be represented as Nix string because it contains null bytes diff --git a/nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.nix b/nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.nix new file mode 100644 index 0000000..ffaa6a9 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromJSON-keyWithNullByte.nix @@ -0,0 +1 @@ +builtins.fromJSON ''{"a\u0000b": 1}'' diff --git a/nix-js/tests/lang/eval-fail-fromJSON-overflowing.err.exp b/nix-js/tests/lang/eval-fail-fromJSON-overflowing.err.exp new file mode 100644 index 0000000..a39082b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromJSON-overflowing.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fromJSON' builtin + at /pwd/lang/eval-fail-fromJSON-overflowing.nix:1:1: + 1| builtins.fromJSON ''{"attr": 18446744073709551615}'' + | ^ + 2| + + error: unsigned json number 18446744073709551615 outside of Nix integer range diff --git a/nix-js/tests/lang/eval-fail-fromJSON-overflowing.nix b/nix-js/tests/lang/eval-fail-fromJSON-overflowing.nix new file mode 100644 index 0000000..6dfbce3 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromJSON-overflowing.nix @@ -0,0 +1 @@ +builtins.fromJSON ''{"attr": 18446744073709551615}'' diff --git a/nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.err.exp b/nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.err.exp new file mode 100644 index 0000000..c5c08e6 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fromJSON' builtin + at /pwd/lang/eval-fail-fromJSON-valueWithNullByte.nix:1:1: + 1| builtins.fromJSON ''"a\u0000b"'' + | ^ + 2| + + error: input string 'a␀b' cannot be represented as Nix string because it contains null bytes diff --git a/nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.nix b/nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.nix new file mode 100644 index 0000000..c71ab99 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromJSON-valueWithNullByte.nix @@ -0,0 +1 @@ +builtins.fromJSON ''"a\u0000b"'' diff --git a/nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.err.exp b/nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.err.exp new file mode 100644 index 0000000..dc2180f --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fromTOML' builtin + at /pwd/lang/eval-fail-fromTOML-keyWithNullByte.nix:1:1: + 1| builtins.fromTOML ''"a\u0000b" = 1'' + | ^ + 2| + + error: while parsing TOML: error: input string 'a␀b' cannot be represented as Nix string because it contains null bytes diff --git a/nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.nix b/nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.nix new file mode 100644 index 0000000..b622dc4 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromTOML-keyWithNullByte.nix @@ -0,0 +1 @@ +builtins.fromTOML ''"a\u0000b" = 1'' diff --git a/nix-js/tests/lang/eval-fail-fromTOML-timestamps.err.exp b/nix-js/tests/lang/eval-fail-fromTOML-timestamps.err.exp new file mode 100644 index 0000000..9bbb251 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromTOML-timestamps.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fromTOML' builtin + at /pwd/lang/eval-fail-fromTOML-timestamps.nix:1:1: + 1| builtins.fromTOML '' + | ^ + 2| key = "value" + + error: while parsing TOML: Dates and times are not supported diff --git a/nix-js/tests/lang/eval-fail-fromTOML-timestamps.nix b/nix-js/tests/lang/eval-fail-fromTOML-timestamps.nix new file mode 100644 index 0000000..74cff94 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromTOML-timestamps.nix @@ -0,0 +1,130 @@ +builtins.fromTOML '' + key = "value" + bare_key = "value" + bare-key = "value" + 1234 = "value" + + "127.0.0.1" = "value" + "character encoding" = "value" + "ʎǝʞ" = "value" + 'key2' = "value" + 'quoted "value"' = "value" + + name = "Orange" + + physical.color = "orange" + physical.shape = "round" + site."google.com" = true + + # This is legal according to the spec, but cpptoml doesn't handle it. + #a.b.c = 1 + #a.d = 2 + + str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." + + int1 = +99 + int2 = 42 + int3 = 0 + int4 = -17 + int5 = 1_000 + int6 = 5_349_221 + int7 = 1_2_3_4_5 + + hex1 = 0xDEADBEEF + hex2 = 0xdeadbeef + hex3 = 0xdead_beef + + oct1 = 0o01234567 + oct2 = 0o755 + + bin1 = 0b11010110 + + flt1 = +1.0 + flt2 = 3.1415 + flt3 = -0.01 + flt4 = 5e+22 + flt5 = 1e6 + flt6 = -2E-2 + flt7 = 6.626e-34 + flt8 = 9_224_617.445_991_228_313 + + bool1 = true + bool2 = false + + odt1 = 1979-05-27T07:32:00Z + odt2 = 1979-05-27T00:32:00-07:00 + odt3 = 1979-05-27T00:32:00.999999-07:00 + odt4 = 1979-05-27 07:32:00Z + ldt1 = 1979-05-27T07:32:00 + ldt2 = 1979-05-27T00:32:00.999999 + ld1 = 1979-05-27 + lt1 = 07:32:00 + lt2 = 00:32:00.999999 + + arr1 = [ 1, 2, 3 ] + arr2 = [ "red", "yellow", "green" ] + arr3 = [ [ 1, 2 ], [3, 4, 5] ] + arr4 = [ "all", 'strings', """are the same""", ''''type''''] + arr5 = [ [ 1, 2 ], ["a", "b", "c"] ] + + arr7 = [ + 1, 2, 3 + ] + + arr8 = [ + 1, + 2, # this is ok + ] + + [table-1] + key1 = "some string" + key2 = 123 + + + [table-2] + key1 = "another string" + key2 = 456 + + [dog."tater.man"] + type.name = "pug" + + [a.b.c] + [ d.e.f ] + [ g . h . i ] + [ j . "ʞ" . 'l' ] + [x.y.z.w] + + name = { first = "Tom", last = "Preston-Werner" } + point = { x = 1, y = 2 } + animal = { type.name = "pug" } + + [[products]] + name = "Hammer" + sku = 738594937 + + [[products]] + + [[products]] + name = "Nail" + sku = 284758393 + color = "gray" + + [[fruit]] + name = "apple" + + [fruit.physical] + color = "red" + shape = "round" + + [[fruit.variety]] + name = "red delicious" + + [[fruit.variety]] + name = "granny smith" + + [[fruit]] + name = "banana" + + [[fruit.variety]] + name = "plantain" +'' diff --git a/nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.err.exp b/nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.err.exp new file mode 100644 index 0000000..0235692 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.err.exp @@ -0,0 +1,8 @@ +error: + … while calling the 'fromTOML' builtin + at /pwd/lang/eval-fail-fromTOML-valueWithNullByte.nix:1:1: + 1| builtins.fromTOML ''k = "a\u0000b"'' + | ^ + 2| + + error: while parsing TOML: error: input string 'a␀b' cannot be represented as Nix string because it contains null bytes diff --git a/nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.nix b/nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.nix new file mode 100644 index 0000000..183cab6 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-fromTOML-valueWithNullByte.nix @@ -0,0 +1 @@ +builtins.fromTOML ''k = "a\u0000b"'' diff --git a/nix-js/tests/lang/eval-fail-hashfile-missing.err.exp b/nix-js/tests/lang/eval-fail-hashfile-missing.err.exp new file mode 100644 index 0000000..0d3747a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-hashfile-missing.err.exp @@ -0,0 +1,13 @@ +error: + … while calling the 'toString' builtin + at /pwd/lang/eval-fail-hashfile-missing.nix:7:1: + 6| in + 7| toString ( + | ^ + 8| builtins.concatLists ( + + … while evaluating the first argument passed to builtins.toString + + … while calling the 'hashFile' builtin + + error: opening file '/pwd/lang/this-file-is-definitely-not-there-7392097': No such file or directory diff --git a/nix-js/tests/lang/eval-fail-hashfile-missing.nix b/nix-js/tests/lang/eval-fail-hashfile-missing.nix new file mode 100644 index 0000000..0f2872b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-hashfile-missing.nix @@ -0,0 +1,16 @@ +let + paths = [ + ./this-file-is-definitely-not-there-7392097 + "/and/neither/is/this/37293620" + ]; +in +toString ( + builtins.concatLists ( + map (hash: map (builtins.hashFile hash) paths) [ + "md5" + "sha1" + "sha256" + "sha512" + ] + ) +) diff --git a/nix-js/tests/lang/eval-fail-infinite-recursion-lambda.err.exp b/nix-js/tests/lang/eval-fail-infinite-recursion-lambda.err.exp new file mode 100644 index 0000000..712dd75 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-infinite-recursion-lambda.err.exp @@ -0,0 +1,38 @@ +error: + … from call site + at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:1: + 1| (x: x x) (x: x x) + | ^ + 2| + + … while calling anonymous lambda + at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:2: + 1| (x: x x) (x: x x) + | ^ + 2| + + … from call site + at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:5: + 1| (x: x x) (x: x x) + | ^ + 2| + + … while calling anonymous lambda + at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:11: + 1| (x: x x) (x: x x) + | ^ + 2| + + … from call site + at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:14: + 1| (x: x x) (x: x x) + | ^ + 2| + + (197 duplicate frames omitted) + + error: stack overflow; max-call-depth exceeded + at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:14: + 1| (x: x x) (x: x x) + | ^ + 2| diff --git a/nix-js/tests/lang/eval-fail-infinite-recursion-lambda.nix b/nix-js/tests/lang/eval-fail-infinite-recursion-lambda.nix new file mode 100644 index 0000000..dd0a8bf --- /dev/null +++ b/nix-js/tests/lang/eval-fail-infinite-recursion-lambda.nix @@ -0,0 +1 @@ +(x: x x) (x: x x) diff --git a/nix-js/tests/lang/eval-fail-list.err.exp b/nix-js/tests/lang/eval-fail-list.err.exp new file mode 100644 index 0000000..8b21e9a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-list.err.exp @@ -0,0 +1,8 @@ +error: + … while evaluating one of the elements to concatenate + at /pwd/lang/eval-fail-list.nix:1:3: + 1| 8 ++ 1 + | ^ + 2| + + error: expected a list but found an integer: 8 diff --git a/nix-js/tests/lang/eval-fail-list.nix b/nix-js/tests/lang/eval-fail-list.nix new file mode 100644 index 0000000..14eb4ef --- /dev/null +++ b/nix-js/tests/lang/eval-fail-list.nix @@ -0,0 +1 @@ +8 ++ 1 diff --git a/nix-js/tests/lang/eval-fail-missing-arg.err.exp b/nix-js/tests/lang/eval-fail-missing-arg.err.exp new file mode 100644 index 0000000..d5a66d2 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-missing-arg.err.exp @@ -0,0 +1,13 @@ +error: + … from call site + at /pwd/lang/eval-fail-missing-arg.nix:1:1: + 1| ( + | ^ + 2| { + + error: function 'anonymous lambda' called without required argument 'y' + at /pwd/lang/eval-fail-missing-arg.nix:2:3: + 1| ( + 2| { + | ^ + 3| x, diff --git a/nix-js/tests/lang/eval-fail-missing-arg.nix b/nix-js/tests/lang/eval-fail-missing-arg.nix new file mode 100644 index 0000000..9037aa4 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-missing-arg.nix @@ -0,0 +1,12 @@ +( + { + x, + y, + z, + }: + x + y + z +) + { + x = "foo"; + z = "bar"; + } diff --git a/nix-js/tests/lang/eval-fail-mutual-recursion.err.exp b/nix-js/tests/lang/eval-fail-mutual-recursion.err.exp new file mode 100644 index 0000000..9d84aa4 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-mutual-recursion.err.exp @@ -0,0 +1,64 @@ +error: + … from call site + at /pwd/lang/eval-fail-mutual-recursion.nix:40:1: + 39| in + 40| throwAfterA true 10 + | ^ + 41| + + … while calling 'throwAfterA' + at /pwd/lang/eval-fail-mutual-recursion.nix:32:14: + 31| throwAfterA = + 32| recurse: n: + | ^ + 33| if n > 0 then + + … from call site + at /pwd/lang/eval-fail-mutual-recursion.nix:34:7: + 33| if n > 0 then + 34| throwAfterA recurse (n - 1) + | ^ + 35| else if recurse then + + (19 duplicate frames omitted) + + … from call site + at /pwd/lang/eval-fail-mutual-recursion.nix:36:7: + 35| else if recurse then + 36| throwAfterB true 10 + | ^ + 37| else + + … while calling 'throwAfterB' + at /pwd/lang/eval-fail-mutual-recursion.nix:23:14: + 22| throwAfterB = + 23| recurse: n: + | ^ + 24| if n > 0 then + + … from call site + at /pwd/lang/eval-fail-mutual-recursion.nix:25:7: + 24| if n > 0 then + 25| throwAfterB recurse (n - 1) + | ^ + 26| else if recurse then + + (19 duplicate frames omitted) + + … from call site + at /pwd/lang/eval-fail-mutual-recursion.nix:27:7: + 26| else if recurse then + 27| throwAfterA false 10 + | ^ + 28| else + + (21 duplicate frames omitted) + + … while calling the 'throw' builtin + at /pwd/lang/eval-fail-mutual-recursion.nix:38:7: + 37| else + 38| throw "Uh oh!"; + | ^ + 39| in + + error: Uh oh! diff --git a/nix-js/tests/lang/eval-fail-mutual-recursion.nix b/nix-js/tests/lang/eval-fail-mutual-recursion.nix new file mode 100644 index 0000000..421e464 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-mutual-recursion.nix @@ -0,0 +1,40 @@ +# Check that stack frame deduplication only affects consecutive intervals, and +# that they are reported independently of any preceding sections, even if +# they're indistinguishable. +# +# In terms of the current implementation, we check that we clear the set of +# "seen frames" after eliding a group of frames. +# +# Suppose we have: +# - 10 frames in a function A +# - 10 frames in a function B +# - 10 frames in a function A +# +# We want to output: +# - a few frames of A (skip the rest) +# - a few frames of B (skip the rest) +# - a few frames of A (skip the rest) +# +# If we implemented this in the naive manner, we'd instead get: +# - a few frames of A (skip the rest) +# - a few frames of B (skip the rest, _and_ skip the remaining frames of A) +let + throwAfterB = + recurse: n: + if n > 0 then + throwAfterB recurse (n - 1) + else if recurse then + throwAfterA false 10 + else + throw "Uh oh!"; + + throwAfterA = + recurse: n: + if n > 0 then + throwAfterA recurse (n - 1) + else if recurse then + throwAfterB true 10 + else + throw "Uh oh!"; +in +throwAfterA true 10 diff --git a/nix-js/tests/lang/eval-fail-nested-list-items.err.exp b/nix-js/tests/lang/eval-fail-nested-list-items.err.exp new file mode 100644 index 0000000..1169b83 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-nested-list-items.err.exp @@ -0,0 +1,9 @@ +error: + … while evaluating a path segment + at /pwd/lang/eval-fail-nested-list-items.nix:12:3: + 11| "" + 12| + ( + | ^ + 13| let + + error: cannot coerce a list to a string: [ [ 1 2 3 4 5 6 7 8 ] [ 1 «3 items elided» ] ] diff --git a/nix-js/tests/lang/eval-fail-nested-list-items.nix b/nix-js/tests/lang/eval-fail-nested-list-items.nix new file mode 100644 index 0000000..d0aa1b5 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-nested-list-items.nix @@ -0,0 +1,34 @@ +# This reproduces https://github.com/NixOS/nix/issues/10993, for lists +# $ nix run nix/2.23.1 -- eval --expr '"" + (let v = [ [ 1 2 3 4 5 6 7 8 ] [1 2 3 4]]; in builtins.deepSeq v v)' +# error: +# … while evaluating a path segment +# at «string»:1:6: +# 1| "" + (let v = [ [ 1 2 3 4 5 6 7 8 ] [1 2 3 4]]; in builtins.deepSeq v v) +# | ^ +# +# error: cannot coerce a list to a string: [ [ 1 2 3 4 5 6 7 8 ] [ 1 «4294967290 items elided» ] ] + +"" ++ ( + let + v = [ + [ + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + ] + [ + 1 + 2 + 3 + 4 + ] + ]; + in + builtins.deepSeq v v +) diff --git a/nix-js/tests/lang/eval-fail-nonexist-path.err.exp b/nix-js/tests/lang/eval-fail-nonexist-path.err.exp new file mode 100644 index 0000000..a287067 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-nonexist-path.err.exp @@ -0,0 +1 @@ +error: path '/pwd/lang/fnord' does not exist diff --git a/nix-js/tests/lang/eval-fail-nonexist-path.nix b/nix-js/tests/lang/eval-fail-nonexist-path.nix new file mode 100644 index 0000000..f2f0810 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-nonexist-path.nix @@ -0,0 +1,4 @@ +# This must fail to evaluate, since ./fnord doesn't exist. If it did +# exist, it would produce "/nix/store/-fnord/xyzzy" (with an +# appropriate context). +"${./fnord}/xyzzy" diff --git a/nix-js/tests/lang/eval-fail-not-throws.err.exp b/nix-js/tests/lang/eval-fail-not-throws.err.exp new file mode 100644 index 0000000..b49ed7b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-not-throws.err.exp @@ -0,0 +1,14 @@ +error: + … in the argument of the not operator + at /pwd/lang/eval-fail-not-throws.nix:1:3: + 1| !(throw "uh oh!") + | ^ + 2| + + … while calling the 'throw' builtin + at /pwd/lang/eval-fail-not-throws.nix:1:3: + 1| !(throw "uh oh!") + | ^ + 2| + + error: uh oh! diff --git a/nix-js/tests/lang/eval-fail-not-throws.nix b/nix-js/tests/lang/eval-fail-not-throws.nix new file mode 100644 index 0000000..2e02473 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-not-throws.nix @@ -0,0 +1 @@ +!(throw "uh oh!") diff --git a/nix-js/tests/lang/eval-fail-overflowing-add.err.exp b/nix-js/tests/lang/eval-fail-overflowing-add.err.exp new file mode 100644 index 0000000..5a77e9c --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-add.err.exp @@ -0,0 +1,6 @@ +error: integer overflow in adding 9223372036854775807 + 1 + at /pwd/lang/eval-fail-overflowing-add.nix:5:5: + 4| in + 5| a + b + | ^ + 6| diff --git a/nix-js/tests/lang/eval-fail-overflowing-add.nix b/nix-js/tests/lang/eval-fail-overflowing-add.nix new file mode 100644 index 0000000..9e1e8aa --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-add.nix @@ -0,0 +1,5 @@ +let + a = 9223372036854775807; + b = 1; +in +a + b diff --git a/nix-js/tests/lang/eval-fail-overflowing-div.err.exp b/nix-js/tests/lang/eval-fail-overflowing-div.err.exp new file mode 100644 index 0000000..812c605 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-div.err.exp @@ -0,0 +1,23 @@ +error: + … while calling the 'seq' builtin + at /pwd/lang/eval-fail-overflowing-div.nix:8:1: + 7| in + 8| builtins.seq intMin (builtins.seq b (intMin / b)) + | ^ + 9| + + … while calling the 'seq' builtin + at /pwd/lang/eval-fail-overflowing-div.nix:8:22: + 7| in + 8| builtins.seq intMin (builtins.seq b (intMin / b)) + | ^ + 9| + + … while calling the 'div' builtin + at /pwd/lang/eval-fail-overflowing-div.nix:8:45: + 7| in + 8| builtins.seq intMin (builtins.seq b (intMin / b)) + | ^ + 9| + + error: integer overflow in dividing -9223372036854775808 / -1 diff --git a/nix-js/tests/lang/eval-fail-overflowing-div.nix b/nix-js/tests/lang/eval-fail-overflowing-div.nix new file mode 100644 index 0000000..e21b0b2 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-div.nix @@ -0,0 +1,8 @@ +let + # lol, this has to be written as an expression like this because negative + # numbers use unary negation rather than parsing directly, and 2**63 is out + # of range + intMin = -9223372036854775807 - 1; + b = -1; +in +builtins.seq intMin (builtins.seq b (intMin / b)) diff --git a/nix-js/tests/lang/eval-fail-overflowing-mul.err.exp b/nix-js/tests/lang/eval-fail-overflowing-mul.err.exp new file mode 100644 index 0000000..aaae4b7 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-mul.err.exp @@ -0,0 +1,16 @@ +error: + … while calling the 'mul' builtin + at /pwd/lang/eval-fail-overflowing-mul.nix:4:7: + 3| in + 4| a * a * a + | ^ + 5| + + … while calling the 'mul' builtin + at /pwd/lang/eval-fail-overflowing-mul.nix:4:3: + 3| in + 4| a * a * a + | ^ + 5| + + error: integer overflow in multiplying 4294967297 * 4294967297 diff --git a/nix-js/tests/lang/eval-fail-overflowing-mul.nix b/nix-js/tests/lang/eval-fail-overflowing-mul.nix new file mode 100644 index 0000000..95b1375 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-mul.nix @@ -0,0 +1,4 @@ +let + a = 4294967297; +in +a * a * a diff --git a/nix-js/tests/lang/eval-fail-overflowing-sub.err.exp b/nix-js/tests/lang/eval-fail-overflowing-sub.err.exp new file mode 100644 index 0000000..5904c8d --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-sub.err.exp @@ -0,0 +1,9 @@ +error: + … while calling the 'sub' builtin + at /pwd/lang/eval-fail-overflowing-sub.nix:5:3: + 4| in + 5| a - b + | ^ + 6| + + error: integer overflow in subtracting -9223372036854775807 - 2 diff --git a/nix-js/tests/lang/eval-fail-overflowing-sub.nix b/nix-js/tests/lang/eval-fail-overflowing-sub.nix new file mode 100644 index 0000000..4f0203a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-overflowing-sub.nix @@ -0,0 +1,5 @@ +let + a = -9223372036854775807; + b = 2; +in +a - b diff --git a/nix-js/tests/lang/eval-fail-path-slash.err.exp b/nix-js/tests/lang/eval-fail-path-slash.err.exp new file mode 100644 index 0000000..e3531d3 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-path-slash.err.exp @@ -0,0 +1,6 @@ +error: path has a trailing slash + at /pwd/lang/eval-fail-path-slash.nix:6:12: + 5| # and https://nixos.org/nix-dev/2016-June/020829.html + 6| /nix/store/ + | ^ + 7| diff --git a/nix-js/tests/lang/eval-fail-path-slash.nix b/nix-js/tests/lang/eval-fail-path-slash.nix new file mode 100644 index 0000000..8c2e104 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-path-slash.nix @@ -0,0 +1,6 @@ +# Trailing slashes in paths are not allowed. +# This restriction could be lifted sometime, +# for example if we make '/' a path concatenation operator. +# See https://github.com/NixOS/nix/issues/1138 +# and https://nixos.org/nix-dev/2016-June/020829.html +/nix/store/ diff --git a/nix-js/tests/lang/eval-fail-pipe-operators.err.exp b/nix-js/tests/lang/eval-fail-pipe-operators.err.exp new file mode 100644 index 0000000..49f3fa8 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-pipe-operators.err.exp @@ -0,0 +1,5 @@ +error: experimental Nix feature 'pipe-operators' is disabled; add '--extra-experimental-features pipe-operators' to enable it + at /pwd/lang/eval-fail-pipe-operators.nix:1:3: + 1| 1 |> 2 + | ^ + 2| diff --git a/nix-js/tests/lang/eval-fail-pipe-operators.nix b/nix-js/tests/lang/eval-fail-pipe-operators.nix new file mode 100644 index 0000000..433e0fd --- /dev/null +++ b/nix-js/tests/lang/eval-fail-pipe-operators.nix @@ -0,0 +1 @@ +1 |> 2 diff --git a/nix-js/tests/lang/eval-fail-recursion.err.exp b/nix-js/tests/lang/eval-fail-recursion.err.exp new file mode 100644 index 0000000..8bfb4e1 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-recursion.err.exp @@ -0,0 +1,14 @@ +error: + … in the right operand of the update (//) operator + at /pwd/lang/eval-fail-recursion.nix:2:11: + 1| let + 2| a = { } // a; + | ^ + 3| in + + error: infinite recursion encountered + at /pwd/lang/eval-fail-recursion.nix:2:14: + 1| let + 2| a = { } // a; + | ^ + 3| in diff --git a/nix-js/tests/lang/eval-fail-recursion.nix b/nix-js/tests/lang/eval-fail-recursion.nix new file mode 100644 index 0000000..88718a6 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-recursion.nix @@ -0,0 +1,4 @@ +let + a = { } // a; +in +a.foo diff --git a/nix-js/tests/lang/eval-fail-remove.err.exp b/nix-js/tests/lang/eval-fail-remove.err.exp new file mode 100644 index 0000000..0e08768 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-remove.err.exp @@ -0,0 +1,15 @@ +error: + … while evaluating the attribute 'body' + at /pwd/lang/eval-fail-remove.nix:7:3: + 6| + 7| body = (removeAttrs attrs [ "x" ]).x; + | ^ + 8| } + + error: attribute 'x' missing + at /pwd/lang/eval-fail-remove.nix:7:10: + 6| + 7| body = (removeAttrs attrs [ "x" ]).x; + | ^ + 8| } + Did you mean y? diff --git a/nix-js/tests/lang/eval-fail-remove.nix b/nix-js/tests/lang/eval-fail-remove.nix new file mode 100644 index 0000000..9de066a --- /dev/null +++ b/nix-js/tests/lang/eval-fail-remove.nix @@ -0,0 +1,8 @@ +let { + attrs = { + x = 123; + y = 456; + }; + + body = (removeAttrs attrs [ "x" ]).x; +} diff --git a/nix-js/tests/lang/eval-fail-scope-5.err.exp b/nix-js/tests/lang/eval-fail-scope-5.err.exp new file mode 100644 index 0000000..6edc85f --- /dev/null +++ b/nix-js/tests/lang/eval-fail-scope-5.err.exp @@ -0,0 +1,28 @@ +error: + … while evaluating the attribute 'body' + at /pwd/lang/eval-fail-scope-5.nix:13:3: + 12| + 13| body = f { }; + | ^ + 14| + + … from call site + at /pwd/lang/eval-fail-scope-5.nix:13:10: + 12| + 13| body = f { }; + | ^ + 14| + + … while calling 'f' + at /pwd/lang/eval-fail-scope-5.nix:7:5: + 6| f = + 7| { + | ^ + 8| x ? y, + + error: infinite recursion encountered + at /pwd/lang/eval-fail-scope-5.nix:8:11: + 7| { + 8| x ? y, + | ^ + 9| y ? x, diff --git a/nix-js/tests/lang/eval-fail-scope-5.nix b/nix-js/tests/lang/eval-fail-scope-5.nix new file mode 100644 index 0000000..ef6f1bb --- /dev/null +++ b/nix-js/tests/lang/eval-fail-scope-5.nix @@ -0,0 +1,15 @@ +let { + + x = "a"; + y = "b"; + + f = + { + x ? y, + y ? x, + }: + x + y; + + body = f { }; + +} diff --git a/nix-js/tests/lang/eval-fail-seq.err.exp b/nix-js/tests/lang/eval-fail-seq.err.exp new file mode 100644 index 0000000..3e3d71b --- /dev/null +++ b/nix-js/tests/lang/eval-fail-seq.err.exp @@ -0,0 +1,14 @@ +error: + … while calling the 'seq' builtin + at /pwd/lang/eval-fail-seq.nix:1:1: + 1| builtins.seq (abort "foo") 2 + | ^ + 2| + + … while calling the 'abort' builtin + at /pwd/lang/eval-fail-seq.nix:1:15: + 1| builtins.seq (abort "foo") 2 + | ^ + 2| + + error: evaluation aborted with the following error message: 'foo' diff --git a/nix-js/tests/lang/eval-fail-seq.nix b/nix-js/tests/lang/eval-fail-seq.nix new file mode 100644 index 0000000..cddbbfd --- /dev/null +++ b/nix-js/tests/lang/eval-fail-seq.nix @@ -0,0 +1 @@ +builtins.seq (abort "foo") 2 diff --git a/nix-js/tests/lang/eval-fail-set-override.err.exp b/nix-js/tests/lang/eval-fail-set-override.err.exp new file mode 100644 index 0000000..9006ca4 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-set-override.err.exp @@ -0,0 +1,4 @@ +error: + … while evaluating the `__overrides` attribute + + error: expected a set but found an integer: 1 diff --git a/nix-js/tests/lang/eval-fail-set-override.nix b/nix-js/tests/lang/eval-fail-set-override.nix new file mode 100644 index 0000000..03551c1 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-set-override.nix @@ -0,0 +1 @@ +rec { __overrides = 1; } diff --git a/nix-js/tests/lang/eval-fail-set.err.exp b/nix-js/tests/lang/eval-fail-set.err.exp new file mode 100644 index 0000000..6dd646e --- /dev/null +++ b/nix-js/tests/lang/eval-fail-set.err.exp @@ -0,0 +1,5 @@ +error: undefined variable 'x' + at /pwd/lang/eval-fail-set.nix:1:3: + 1| 8.x + | ^ + 2| diff --git a/nix-js/tests/lang/eval-fail-set.nix b/nix-js/tests/lang/eval-fail-set.nix new file mode 100644 index 0000000..c6b7980 --- /dev/null +++ b/nix-js/tests/lang/eval-fail-set.nix @@ -0,0 +1 @@ +8.x diff --git a/nix-js/tests/lang/eval-fail-string-nul-1.err.exp b/nix-js/tests/lang/eval-fail-string-nul-1.err.exp new file mode 100644 index 0000000000000000000000000000000000000000..2dfbea0635c8c2ea159249879c4d89523c2a7366 GIT binary patch literal 209 zcmYc-D#|aiQpn6JC@oPaE-A{)OIJ`&%g=u_p&==;NL?X0F)uH_L?J0vp(wSWD782> zuOu}^A+cD&FS7!sJ}EUhv9vfR(-JdtbRl-?=9T8?8tUa`R#+KY8Ck*ffOQ(yC@7`n=QAWF7Ac`f PDAXt@#G!~7)o=j-ygENH literal 0 HcmV?d00001 diff --git a/nix-js/tests/lang/eval-fail-string-nul-1.nix b/nix-js/tests/lang/eval-fail-string-nul-1.nix new file mode 100644 index 0000000000000000000000000000000000000000..3689409171139a7d310eac52df0be4315b6ba786 GIT binary patch literal 10 RcmY#N%g<*>N-R?10ss()0>}UW literal 0 HcmV?d00001 diff --git a/nix-js/tests/lang/eval-fail-string-nul-2.err.exp b/nix-js/tests/lang/eval-fail-string-nul-2.err.exp new file mode 100644 index 0000000000000000000000000000000000000000..b1cae5325d90a2c05f7304db89bca0826c2f98f0 GIT binary patch literal 256 zcmYc-D#|aiQpn6JC@oPaE-A{)OIJ`=P)N(q=Td-yM-v(loTS7e7)M 7 then err else 1) + (if 7 > 3 then 1 else err) + (if 3 > 3 then err else 1) + + (if 3 >= 7 then err else 1) + (if 7 >= 3 then 1 else err) + (if 3 >= 3 then 1 else err) + + (if 2 > 1 == 1 < 2 then 1 else err) + (if 1 + 2 * 3 >= 7 then 1 else err) + (if 1 + 2 * 3 < 7 then err else 1) + + # Not integer, but so what. + (if "aa" < "ab" then 1 else err) + (if "aa" < "aa" then err else 1) + (if "foo" < "foobar" then 1 else err) + ]; + +} diff --git a/nix-js/tests/lang/eval-okay-attrnames.exp b/nix-js/tests/lang/eval-okay-attrnames.exp new file mode 100644 index 0000000..b4aa387 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrnames.exp @@ -0,0 +1 @@ +"newxfoonewxy" diff --git a/nix-js/tests/lang/eval-okay-attrnames.nix b/nix-js/tests/lang/eval-okay-attrnames.nix new file mode 100644 index 0000000..085e780 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrnames.nix @@ -0,0 +1,22 @@ +with import ./lib.nix; + +let + + attrs = + { + y = "y"; + x = "x"; + foo = "foo"; + } + // rec { + x = "newx"; + bar = x; + }; + + names = builtins.attrNames attrs; + + values = map (name: builtins.getAttr name attrs) names; + +in +assert values == builtins.attrValues attrs; +concat values diff --git a/nix-js/tests/lang/eval-okay-attrs.exp b/nix-js/tests/lang/eval-okay-attrs.exp new file mode 100644 index 0000000..45b0f82 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs.exp @@ -0,0 +1 @@ +987 diff --git a/nix-js/tests/lang/eval-okay-attrs.nix b/nix-js/tests/lang/eval-okay-attrs.nix new file mode 100644 index 0000000..787b9a9 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs.nix @@ -0,0 +1,20 @@ +let { + as = + { + x = 123; + y = 456; + } + // { + z = 789; + } + // { + z = 987; + }; + + body = + if as ? a then + as.a + else + assert as ? z; + as.z; +} diff --git a/nix-js/tests/lang/eval-okay-attrs2.exp b/nix-js/tests/lang/eval-okay-attrs2.exp new file mode 100644 index 0000000..45b0f82 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs2.exp @@ -0,0 +1 @@ +987 diff --git a/nix-js/tests/lang/eval-okay-attrs2.nix b/nix-js/tests/lang/eval-okay-attrs2.nix new file mode 100644 index 0000000..0896f9c --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs2.nix @@ -0,0 +1,23 @@ +let { + as = + { + x = 123; + y = 456; + } + // { + z = 789; + } + // { + z = 987; + }; + + A = "a"; + Z = "z"; + + body = + if builtins.hasAttr A as then + builtins.getAttr A as + else + assert builtins.hasAttr Z as; + builtins.getAttr Z as; +} diff --git a/nix-js/tests/lang/eval-okay-attrs3.exp b/nix-js/tests/lang/eval-okay-attrs3.exp new file mode 100644 index 0000000..19de4fd --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs3.exp @@ -0,0 +1 @@ +"foo 22 80 itchyxac" diff --git a/nix-js/tests/lang/eval-okay-attrs3.nix b/nix-js/tests/lang/eval-okay-attrs3.nix new file mode 100644 index 0000000..cab3453 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs3.nix @@ -0,0 +1,22 @@ +let + + config = { + services.sshd.enable = true; + services.sshd.port = 22; + services.httpd.port = 80; + hostName = "itchy"; + a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z = "x"; + foo = { + a = "a"; + b.c = "c"; + }; + }; + +in +if config.services.sshd.enable then + "foo ${toString config.services.sshd.port} ${toString config.services.httpd.port} ${config.hostName}" + + "${config.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z}" + + "${config.foo.a}" + + "${config.foo.b.c}" +else + "bar" diff --git a/nix-js/tests/lang/eval-okay-attrs4.exp b/nix-js/tests/lang/eval-okay-attrs4.exp new file mode 100644 index 0000000..1851731 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs4.exp @@ -0,0 +1 @@ +[ true false true false false true false false ] diff --git a/nix-js/tests/lang/eval-okay-attrs4.nix b/nix-js/tests/lang/eval-okay-attrs4.nix new file mode 100644 index 0000000..3e43e4b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs4.nix @@ -0,0 +1,20 @@ +let + + as = { + x.y.z = 123; + a.b.c = 456; + }; + + bs = null; + +in +[ + (as ? x) + (as ? y) + (as ? x.y.z) + (as ? x.y.z.a) + (as ? x.y.a) + (as ? a.b.c) + (bs ? x) + (bs ? x.y.z) +] diff --git a/nix-js/tests/lang/eval-okay-attrs5.exp b/nix-js/tests/lang/eval-okay-attrs5.exp new file mode 100644 index 0000000..ce0430d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs5.exp @@ -0,0 +1 @@ +[ 123 "foo" 456 456 "foo" "xyzzy" "xyzzy" true ] diff --git a/nix-js/tests/lang/eval-okay-attrs5.nix b/nix-js/tests/lang/eval-okay-attrs5.nix new file mode 100644 index 0000000..a4584cd --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs5.nix @@ -0,0 +1,21 @@ +with import ./lib.nix; + +let + + as = { x.y.z = 123; a.b.c = 456; }; + + bs = { f-o-o.bar = "foo"; }; + + or = x: y: x || y; + +in + [ as.x.y.z + as.foo or "foo" + as.x.y.bla or as.a.b.c + as.a.b.c or as.x.y.z + as.x.y.bla or bs.f-o-o.bar or "xyzzy" + as.x.y.bla or bs.bar.foo or "xyzzy" + (123).bla or null.foo or "xyzzy" + # Backwards compatibility test. + (fold or [] [true false false]) + ] diff --git a/nix-js/tests/lang/eval-okay-attrs6.exp b/nix-js/tests/lang/eval-okay-attrs6.exp new file mode 100644 index 0000000..b469380 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs6.exp @@ -0,0 +1 @@ +{ __overrides = { bar = "qux"; }; bar = "qux"; foo = "bar"; } diff --git a/nix-js/tests/lang/eval-okay-attrs6.nix b/nix-js/tests/lang/eval-okay-attrs6.nix new file mode 100644 index 0000000..76c94af --- /dev/null +++ b/nix-js/tests/lang/eval-okay-attrs6.nix @@ -0,0 +1,6 @@ +rec { + "${"foo"}" = "bar"; + __overrides = { + bar = "qux"; + }; +} diff --git a/nix-js/tests/lang/eval-okay-autoargs.exp b/nix-js/tests/lang/eval-okay-autoargs.exp new file mode 100644 index 0000000..7a83917 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-autoargs.exp @@ -0,0 +1 @@ +"xyzzy!xyzzy!foobar" diff --git a/nix-js/tests/lang/eval-okay-autoargs.nix b/nix-js/tests/lang/eval-okay-autoargs.nix new file mode 100644 index 0000000..bc82c56 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-autoargs.nix @@ -0,0 +1,20 @@ +let + + foobar = "foobar"; + +in + +{ + xyzzy2 ? xyzzy, # mutually recursive args + xyzzy ? "blaat", # will be overridden by --argstr + fb ? foobar, + lib, # will be set by --arg +}: + +{ + result = lib.concat [ + xyzzy + xyzzy2 + fb + ]; +} diff --git a/nix-js/tests/lang/eval-okay-backslash-newline-1.exp b/nix-js/tests/lang/eval-okay-backslash-newline-1.exp new file mode 100644 index 0000000..3e75436 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-backslash-newline-1.exp @@ -0,0 +1 @@ +"a\nb" diff --git a/nix-js/tests/lang/eval-okay-backslash-newline-1.nix b/nix-js/tests/lang/eval-okay-backslash-newline-1.nix new file mode 100644 index 0000000..7fef3dd --- /dev/null +++ b/nix-js/tests/lang/eval-okay-backslash-newline-1.nix @@ -0,0 +1,2 @@ +"a\ +b" diff --git a/nix-js/tests/lang/eval-okay-backslash-newline-2.exp b/nix-js/tests/lang/eval-okay-backslash-newline-2.exp new file mode 100644 index 0000000..3e75436 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-backslash-newline-2.exp @@ -0,0 +1 @@ +"a\nb" diff --git a/nix-js/tests/lang/eval-okay-backslash-newline-2.nix b/nix-js/tests/lang/eval-okay-backslash-newline-2.nix new file mode 100644 index 0000000..35ddf49 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-backslash-newline-2.nix @@ -0,0 +1,2 @@ +''a''\ +b'' diff --git a/nix-js/tests/lang/eval-okay-baseNameOf.exp b/nix-js/tests/lang/eval-okay-baseNameOf.exp new file mode 100644 index 0000000..52c33a5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-baseNameOf.exp @@ -0,0 +1 @@ +"ok" diff --git a/nix-js/tests/lang/eval-okay-baseNameOf.nix b/nix-js/tests/lang/eval-okay-baseNameOf.nix new file mode 100644 index 0000000..a7afdd8 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-baseNameOf.nix @@ -0,0 +1,32 @@ +assert baseNameOf "" == ""; +assert baseNameOf "." == "."; +assert baseNameOf ".." == ".."; +assert baseNameOf "a" == "a"; +assert baseNameOf "a." == "a."; +assert baseNameOf "a.." == "a.."; +assert baseNameOf "a.b" == "a.b"; +assert baseNameOf "a.b." == "a.b."; +assert baseNameOf "a.b.." == "a.b.."; +assert baseNameOf "a/" == "a"; +assert baseNameOf "a/." == "."; +assert baseNameOf "a/.." == ".."; +assert baseNameOf "a/b" == "b"; +assert baseNameOf "a/b." == "b."; +assert baseNameOf "a/b.." == "b.."; +assert baseNameOf "a/b/c" == "c"; +assert baseNameOf "a/b/c." == "c."; +assert baseNameOf "a/b/c.." == "c.."; +assert baseNameOf "a/b/c/d" == "d"; +assert baseNameOf "a/b/c/d." == "d."; +assert baseNameOf "a\\b" == "a\\b"; +assert baseNameOf "C:a" == "C:a"; +assert baseNameOf "a//b" == "b"; + +# It's been like this for close to a decade. We ought to commit to it. +# https://github.com/NixOS/nix/pull/582#issuecomment-121014450 +assert baseNameOf "a//" == ""; + +assert baseNameOf ./foo == "foo"; +assert baseNameOf ./foo/bar == "bar"; + +"ok" diff --git a/nix-js/tests/lang/eval-okay-builtins-add.exp b/nix-js/tests/lang/eval-okay-builtins-add.exp new file mode 100644 index 0000000..0350b51 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-builtins-add.exp @@ -0,0 +1 @@ +[ 5 4 "int" "tt" "float" 4 ] diff --git a/nix-js/tests/lang/eval-okay-builtins-add.nix b/nix-js/tests/lang/eval-okay-builtins-add.nix new file mode 100644 index 0000000..f678f64 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-builtins-add.nix @@ -0,0 +1,8 @@ +[ + (builtins.add 2 3) + (builtins.add 2 2) + (builtins.typeOf (builtins.add 2 2)) + ("t" + "t") + (builtins.typeOf (builtins.add 2.0 2)) + (builtins.add 2.0 2) +] diff --git a/nix-js/tests/lang/eval-okay-builtins.exp b/nix-js/tests/lang/eval-okay-builtins.exp new file mode 100644 index 0000000..0661686 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-builtins.exp @@ -0,0 +1 @@ +/foo diff --git a/nix-js/tests/lang/eval-okay-builtins.nix b/nix-js/tests/lang/eval-okay-builtins.nix new file mode 100644 index 0000000..be41141 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-builtins.nix @@ -0,0 +1,12 @@ +assert builtins ? currentSystem; +assert !builtins ? __currentSystem; + +let { + + x = if builtins ? dirOf then builtins.dirOf /foo/bar else ""; + + y = if builtins ? fnord then builtins.fnord "foo" else ""; + + body = x + y; + +} diff --git a/nix-js/tests/lang/eval-okay-callable-attrs.exp b/nix-js/tests/lang/eval-okay-callable-attrs.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-callable-attrs.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-callable-attrs.nix b/nix-js/tests/lang/eval-okay-callable-attrs.nix new file mode 100644 index 0000000..a4c1ace --- /dev/null +++ b/nix-js/tests/lang/eval-okay-callable-attrs.nix @@ -0,0 +1,10 @@ +( + { + __functor = self: x: self.foo && x; + foo = false; + } + // { + foo = true; + } +) + true diff --git a/nix-js/tests/lang/eval-okay-catattrs.exp b/nix-js/tests/lang/eval-okay-catattrs.exp new file mode 100644 index 0000000..b4a1e66 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-catattrs.exp @@ -0,0 +1 @@ +[ 1 2 ] diff --git a/nix-js/tests/lang/eval-okay-catattrs.nix b/nix-js/tests/lang/eval-okay-catattrs.nix new file mode 100644 index 0000000..7ec4ba7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-catattrs.nix @@ -0,0 +1,5 @@ +builtins.catAttrs "a" [ + { a = 1; } + { b = 0; } + { a = 2; } +] diff --git a/nix-js/tests/lang/eval-okay-closure.exp b/nix-js/tests/lang/eval-okay-closure.exp new file mode 100644 index 0000000..e7dbf97 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-closure.exp @@ -0,0 +1 @@ +[ { foo = true; key = -13; } { foo = true; key = -12; } { foo = true; key = -11; } { foo = true; key = -9; } { foo = true; key = -8; } { foo = true; key = -7; } { foo = true; key = -5; } { foo = true; key = -4; } { foo = true; key = -3; } { key = -1; } { foo = true; key = 0; } { foo = true; key = 1; } { foo = true; key = 2; } { foo = true; key = 4; } { foo = true; key = 5; } { foo = true; key = 6; } { key = 8; } { foo = true; key = 9; } { foo = true; key = 10; } { foo = true; key = 13; } { foo = true; key = 14; } { foo = true; key = 15; } { key = 17; } { foo = true; key = 18; } { foo = true; key = 19; } { foo = true; key = 22; } { foo = true; key = 23; } { key = 26; } { foo = true; key = 27; } { foo = true; key = 28; } { foo = true; key = 31; } { foo = true; key = 32; } { key = 35; } { foo = true; key = 36; } { foo = true; key = 40; } { foo = true; key = 41; } { key = 44; } { foo = true; key = 45; } { foo = true; key = 49; } { key = 53; } { foo = true; key = 54; } { foo = true; key = 58; } { key = 62; } { foo = true; key = 67; } { key = 71; } { key = 80; } ] diff --git a/nix-js/tests/lang/eval-okay-closure.nix b/nix-js/tests/lang/eval-okay-closure.nix new file mode 100644 index 0000000..67c53d0 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-closure.nix @@ -0,0 +1,25 @@ +let + + closure = builtins.genericClosure { + startSet = [ { key = 80; } ]; + operator = + { + key, + foo ? false, + }: + if builtins.lessThan key 0 then + [ ] + else + [ + { key = builtins.sub key 9; } + { + key = builtins.sub key 13; + foo = true; + } + ]; + }; + + sort = (import ./lib.nix).sortBy (a: b: builtins.lessThan a.key b.key); + +in +sort closure diff --git a/nix-js/tests/lang/eval-okay-comments.exp b/nix-js/tests/lang/eval-okay-comments.exp new file mode 100644 index 0000000..7182dc2 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-comments.exp @@ -0,0 +1 @@ +"abcdefghijklmnopqrstuvwxyz" diff --git a/nix-js/tests/lang/eval-okay-comments.nix b/nix-js/tests/lang/eval-okay-comments.nix new file mode 100644 index 0000000..cb2cce2 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-comments.nix @@ -0,0 +1,59 @@ +# A simple comment +"a"+ # And another +## A double comment +"b"+ ## And another +# Nested # comments # +"c"+ # and # some # other # +# An empty line, following here: + +"d"+ # and a comment not starting the line ! + +"e"+ +/* multiline comments */ +"f" + +/* multiline + comments, + on + multiple + lines +*/ +"g" + +# Small, tricky comments +/**/ "h"+ /*/*/ "i"+ /***/ "j"+ /* /*/ "k"+ /*/* /*/ "l"+ +# Comments with an even number of ending '*' used to fail: +"m"+ +/* */ /* **/ /* ***/ /* ****/ "n"+ +/* */ /** */ /*** */ /**** */ "o"+ +/** **/ /*** ***/ /**** ****/ "p"+ +/* * ** *** **** ***** */ "q"+ +# Random comments +/* ***** ////// * / * / /* */ "r"+ +# Mixed comments +/* # */ +"s"+ +# /* # +"t"+ +# /* # */ +"u"+ +# /*********/ +"v"+ +## */* +"w"+ +/* + * Multiline, decorated comments + * # This ain't a nest'd comm'nt + */ +"x"+ +''${/** with **/"y" + # real + /* comments + inside ! # */ + + # (and empty lines) + +}''+ /* And a multiline comment, + on the same line, + after some spaces +*/ # followed by a one-line comment +"z" +/* EOF */ diff --git a/nix-js/tests/lang/eval-okay-concat.exp b/nix-js/tests/lang/eval-okay-concat.exp new file mode 100644 index 0000000..bb4bbd5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-concat.exp @@ -0,0 +1 @@ +[ 1 2 3 4 5 6 7 8 9 ] diff --git a/nix-js/tests/lang/eval-okay-concat.nix b/nix-js/tests/lang/eval-okay-concat.nix new file mode 100644 index 0000000..ce754ca --- /dev/null +++ b/nix-js/tests/lang/eval-okay-concat.nix @@ -0,0 +1,15 @@ +[ + 1 + 2 + 3 +] +++ [ + 4 + 5 + 6 +] +++ [ + 7 + 8 + 9 +] diff --git a/nix-js/tests/lang/eval-okay-concatmap.exp b/nix-js/tests/lang/eval-okay-concatmap.exp new file mode 100644 index 0000000..3b8be77 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-concatmap.exp @@ -0,0 +1 @@ +[ [ 1 3 5 7 9 ] [ "a" "z" "b" "z" ] ] diff --git a/nix-js/tests/lang/eval-okay-concatmap.nix b/nix-js/tests/lang/eval-okay-concatmap.nix new file mode 100644 index 0000000..14b5461 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-concatmap.nix @@ -0,0 +1,9 @@ +with import ./lib.nix; + +[ + (builtins.concatMap (x: if x / 2 * 2 == x then [ ] else [ x ]) (range 0 10)) + (builtins.concatMap (x: [ x ] ++ [ "z" ]) [ + "a" + "b" + ]) +] diff --git a/nix-js/tests/lang/eval-okay-concatstringssep.exp b/nix-js/tests/lang/eval-okay-concatstringssep.exp new file mode 100644 index 0000000..9398764 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-concatstringssep.exp @@ -0,0 +1 @@ +[ "" "foobarxyzzy" "foo, bar, xyzzy" "foo" "" ] diff --git a/nix-js/tests/lang/eval-okay-concatstringssep.nix b/nix-js/tests/lang/eval-okay-concatstringssep.nix new file mode 100644 index 0000000..2270d11 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-concatstringssep.nix @@ -0,0 +1,17 @@ +with builtins; + +[ + (concatStringsSep "" [ ]) + (concatStringsSep "" [ + "foo" + "bar" + "xyzzy" + ]) + (concatStringsSep ", " [ + "foo" + "bar" + "xyzzy" + ]) + (concatStringsSep ", " [ "foo" ]) + (concatStringsSep ", " [ ]) +] diff --git a/nix-js/tests/lang/eval-okay-context-introspection.exp b/nix-js/tests/lang/eval-okay-context-introspection.exp new file mode 100644 index 0000000..a136b00 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-context-introspection.exp @@ -0,0 +1 @@ +[ true true true true true true true true true true true true true ] diff --git a/nix-js/tests/lang/eval-okay-context-introspection.nix b/nix-js/tests/lang/eval-okay-context-introspection.nix new file mode 100644 index 0000000..5ed9947 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-context-introspection.nix @@ -0,0 +1,64 @@ +let + drv = derivation { + name = "fail"; + builder = "/bin/false"; + system = "x86_64-linux"; + outputs = [ + "out" + "foo" + ]; + }; + + path = "${./eval-okay-context-introspection.nix}"; + + desired-context = { + "${builtins.unsafeDiscardStringContext path}" = { + path = true; + }; + "${builtins.unsafeDiscardStringContext drv.drvPath}" = { + outputs = [ + "foo" + "out" + ]; + allOutputs = true; + }; + }; + + combo-path = "${path}${drv.outPath}${drv.foo.outPath}${drv.drvPath}"; + legit-context = builtins.getContext combo-path; + + reconstructed-path = builtins.appendContext (builtins.unsafeDiscardStringContext combo-path) desired-context; + + # Eta rule for strings with context. + etaRule = + str: + str == builtins.appendContext (builtins.unsafeDiscardStringContext str) (builtins.getContext str); + + # Only holds true if string context contains both a `DrvDeep` and + # `Opaque` element. + almostEtaRule = + str: str == builtins.addDrvOutputDependencies (builtins.unsafeDiscardOutputDependency str); + + addDrvOutputDependencies_idempotent = + str: + builtins.addDrvOutputDependencies str + == builtins.addDrvOutputDependencies (builtins.addDrvOutputDependencies str); + + rules = str: [ + (etaRule str) + (almostEtaRule str) + (addDrvOutputDependencies_idempotent str) + ]; + +in +[ + (legit-context == desired-context) + (reconstructed-path == combo-path) + (etaRule "foo") + (etaRule drv.foo.outPath) +] +++ builtins.concatMap rules [ + drv.drvPath + (builtins.addDrvOutputDependencies drv.drvPath) + (builtins.unsafeDiscardOutputDependency drv.drvPath) +] diff --git a/nix-js/tests/lang/eval-okay-context.exp b/nix-js/tests/lang/eval-okay-context.exp new file mode 100644 index 0000000..2f535bd --- /dev/null +++ b/nix-js/tests/lang/eval-okay-context.exp @@ -0,0 +1 @@ +"foo eval-okay-context.nix bar" diff --git a/nix-js/tests/lang/eval-okay-context.nix b/nix-js/tests/lang/eval-okay-context.nix new file mode 100644 index 0000000..102bc22 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-context.nix @@ -0,0 +1,7 @@ +let + s = "foo ${builtins.substring 33 100 (baseNameOf "${./eval-okay-context.nix}")} bar"; +in +if s != "foo eval-okay-context.nix bar" then + abort "context not discarded" +else + builtins.unsafeDiscardStringContext s diff --git a/nix-js/tests/lang/eval-okay-convertHash.err.exp b/nix-js/tests/lang/eval-okay-convertHash.err.exp new file mode 100644 index 0000000..41d7467 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-convertHash.err.exp @@ -0,0 +1,108 @@ +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". +warning: "base32" is a deprecated alias for hash format "nix32". diff --git a/nix-js/tests/lang/eval-okay-convertHash.exp b/nix-js/tests/lang/eval-okay-convertHash.exp new file mode 100644 index 0000000..16b0240 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-convertHash.exp @@ -0,0 +1 @@ +{ hashesBase16 = [ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ]; hashesBase32 = [ "3y8bwfr609h3lh9ch0izcqq7fl" "26mrvc0v1nslch8r0w45zywsbc" "1v4gi57l97pmnylq6lmgxkhd5v" "143xibwh31h9bvxzalr0sjvbbvpa6ffs" "i4hj30pkrfdpgc5dbcgcydqviibfhm6d" "fxz2p030yba2bza71qhss79k3l5y24kd" "0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73" "0qy6iz9yh6a079757mxdmypx0gcmnzjd3ij5q78bzk00vxll82lh" "0mkygpci4r4yb8zz5rs2kxcgvw0a2yf5zlj6r8qgfll6pnrqf0xd" "0zdl9zrg8r3i9c1g90lgg9ip5ijzv3yhz91i0zzn3r8ap9ws784gkp9dk9j3aglhgf1amqb0pj21mh7h1nxcl18akqvvf7ggqsy30yg" "19ncrpp37dx0nzzjw4k6zaqkb9mzaq2myhgpzh5aff7qqcj5wwdxslg6ixwncm7gyq8l761gwf87fgsh2bwfyr52s53k2dkqvw8c24x" "2kz74snvckxldmmbisz9ikmy031d28cs6xfdbl6rhxx42glpyz4vww4lajrc5akklxwixl0js4g84233pxvmbykiic5m7i5m9r4nr11" ]; hashesBase64 = [ "1B2M2Y8AsgTpgAmY7PhCfg==" "bGnufyEcZAQZ1TZswHauRg==" "uzQ4+6vUYOptvSfRU+IjOw==" "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" "zVToVowbN88eW62wd5vL84IhIYk=" "bRLhCx0zHa0hDkf9JdTyYIArfnc=" "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" "kApEad8AzL/QwUXG0eS3lT3Qr6+t11NOOkAZ6NOPxmM=" "rQOHs72GUvcwykbSX5wXCvD9WJ9C5/I/Wp5kEtl9flY=" "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" "nQiG+MaziTmKFiV7x5eA+rmDHH/BHIqwf6cyy3s0j+reOC+SYXycUwX++6CvAqtf05pYfTMJl/9b0NsZ92ZmUw==" "IWRLcqolnlpYjNOvuvsdQxD0iJaA9sg7nVMVlqWihPNNvr/0CdI7zIau5rrRDIkWBvB1xvR1XLU22ifbVpPzpw==" ]; hashesNix32 = [ "3y8bwfr609h3lh9ch0izcqq7fl" "26mrvc0v1nslch8r0w45zywsbc" "1v4gi57l97pmnylq6lmgxkhd5v" "143xibwh31h9bvxzalr0sjvbbvpa6ffs" "i4hj30pkrfdpgc5dbcgcydqviibfhm6d" "fxz2p030yba2bza71qhss79k3l5y24kd" "0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73" "0qy6iz9yh6a079757mxdmypx0gcmnzjd3ij5q78bzk00vxll82lh" "0mkygpci4r4yb8zz5rs2kxcgvw0a2yf5zlj6r8qgfll6pnrqf0xd" "0zdl9zrg8r3i9c1g90lgg9ip5ijzv3yhz91i0zzn3r8ap9ws784gkp9dk9j3aglhgf1amqb0pj21mh7h1nxcl18akqvvf7ggqsy30yg" "19ncrpp37dx0nzzjw4k6zaqkb9mzaq2myhgpzh5aff7qqcj5wwdxslg6ixwncm7gyq8l761gwf87fgsh2bwfyr52s53k2dkqvw8c24x" "2kz74snvckxldmmbisz9ikmy031d28cs6xfdbl6rhxx42glpyz4vww4lajrc5akklxwixl0js4g84233pxvmbykiic5m7i5m9r4nr11" ]; hashesSRI = [ "md5-1B2M2Y8AsgTpgAmY7PhCfg==" "md5-bGnufyEcZAQZ1TZswHauRg==" "md5-uzQ4+6vUYOptvSfRU+IjOw==" "sha1-2jmj7l5rSw0yVb/vlWAYkK/YBwk=" "sha1-zVToVowbN88eW62wd5vL84IhIYk=" "sha1-bRLhCx0zHa0hDkf9JdTyYIArfnc=" "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" "sha256-kApEad8AzL/QwUXG0eS3lT3Qr6+t11NOOkAZ6NOPxmM=" "sha256-rQOHs72GUvcwykbSX5wXCvD9WJ9C5/I/Wp5kEtl9flY=" "sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" "sha512-nQiG+MaziTmKFiV7x5eA+rmDHH/BHIqwf6cyy3s0j+reOC+SYXycUwX++6CvAqtf05pYfTMJl/9b0NsZ92ZmUw==" "sha512-IWRLcqolnlpYjNOvuvsdQxD0iJaA9sg7nVMVlqWihPNNvr/0CdI7zIau5rrRDIkWBvB1xvR1XLU22ifbVpPzpw==" ]; } diff --git a/nix-js/tests/lang/eval-okay-convertHash.nix b/nix-js/tests/lang/eval-okay-convertHash.nix new file mode 100644 index 0000000..6d5074f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-convertHash.nix @@ -0,0 +1,131 @@ +let + hashAlgos = [ + "md5" + "md5" + "md5" + "sha1" + "sha1" + "sha1" + "sha256" + "sha256" + "sha256" + "sha512" + "sha512" + "sha512" + ]; + hashesBase16 = import ./eval-okay-hashstring.exp; + map2 = + f: + { fsts, snds }: + if fsts == [ ] then + [ ] + else + [ (f (builtins.head fsts) (builtins.head snds)) ] + ++ map2 f { + fsts = builtins.tail fsts; + snds = builtins.tail snds; + }; + map2' = + f: fsts: snds: + map2 f { inherit fsts snds; }; + getOutputHashes = hashes: { + hashesBase16 = map2' ( + hashAlgo: hash: + builtins.convertHash { + inherit hash hashAlgo; + toHashFormat = "base16"; + } + ) hashAlgos hashes; + hashesNix32 = map2' ( + hashAlgo: hash: + builtins.convertHash { + inherit hash hashAlgo; + toHashFormat = "nix32"; + } + ) hashAlgos hashes; + hashesBase32 = map2' ( + hashAlgo: hash: + builtins.convertHash { + inherit hash hashAlgo; + toHashFormat = "base32"; + } + ) hashAlgos hashes; + hashesBase64 = map2' ( + hashAlgo: hash: + builtins.convertHash { + inherit hash hashAlgo; + toHashFormat = "base64"; + } + ) hashAlgos hashes; + hashesSRI = map2' ( + hashAlgo: hash: + builtins.convertHash { + inherit hash hashAlgo; + toHashFormat = "sri"; + } + ) hashAlgos hashes; + }; + getOutputHashesColon = hashes: { + hashesBase16 = map2' ( + hashAlgo: hashBody: + builtins.convertHash { + hash = hashAlgo + ":" + hashBody; + toHashFormat = "base16"; + } + ) hashAlgos hashes; + hashesNix32 = map2' ( + hashAlgo: hashBody: + builtins.convertHash { + hash = hashAlgo + ":" + hashBody; + toHashFormat = "nix32"; + } + ) hashAlgos hashes; + hashesBase32 = map2' ( + hashAlgo: hashBody: + builtins.convertHash { + hash = hashAlgo + ":" + hashBody; + toHashFormat = "base32"; + } + ) hashAlgos hashes; + hashesBase64 = map2' ( + hashAlgo: hashBody: + builtins.convertHash { + hash = hashAlgo + ":" + hashBody; + toHashFormat = "base64"; + } + ) hashAlgos hashes; + hashesSRI = map2' ( + hashAlgo: hashBody: + builtins.convertHash { + hash = hashAlgo + ":" + hashBody; + toHashFormat = "sri"; + } + ) hashAlgos hashes; + }; + outputHashes = getOutputHashes hashesBase16; +in +# map2'` +assert + map2' (s1: s2: s1 + s2) [ "a" "b" ] [ "c" "d" ] == [ + "ac" + "bd" + ]; +# hashesBase16 +assert outputHashes.hashesBase16 == hashesBase16; +# standard SRI hashes +assert + outputHashes.hashesSRI + == (map2' (hashAlgo: hashBody: hashAlgo + "-" + hashBody) hashAlgos outputHashes.hashesBase64); +# without prefix +assert builtins.all (x: getOutputHashes x == outputHashes) (builtins.attrValues outputHashes); +# colon-separated. +# Note that colon prefix must not be applied to the standard SRI. e.g. "sha256:sha256-..." is illegal. +assert builtins.all (x: getOutputHashesColon x == outputHashes) ( + with outputHashes; + [ + hashesBase16 + hashesBase32 + hashesBase64 + ] +); +outputHashes diff --git a/nix-js/tests/lang/eval-okay-curpos.exp b/nix-js/tests/lang/eval-okay-curpos.exp new file mode 100644 index 0000000..65fd65b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-curpos.exp @@ -0,0 +1 @@ +[ 3 7 4 9 ] diff --git a/nix-js/tests/lang/eval-okay-curpos.nix b/nix-js/tests/lang/eval-okay-curpos.nix new file mode 100644 index 0000000..b79553d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-curpos.nix @@ -0,0 +1,5 @@ +# Bla +let + x = __curPos; + y = __curPos; +in [ x.line x.column y.line y.column ] diff --git a/nix-js/tests/lang/eval-okay-deepseq.exp b/nix-js/tests/lang/eval-okay-deepseq.exp new file mode 100644 index 0000000..8d38505 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-deepseq.exp @@ -0,0 +1 @@ +456 diff --git a/nix-js/tests/lang/eval-okay-deepseq.nix b/nix-js/tests/lang/eval-okay-deepseq.nix new file mode 100644 index 0000000..f9aa5f7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-deepseq.nix @@ -0,0 +1,9 @@ +builtins.deepSeq ( + let + as = { + x = 123; + y = as; + }; + in + as +) 456 diff --git a/nix-js/tests/lang/eval-okay-delayed-with-inherit.exp b/nix-js/tests/lang/eval-okay-delayed-with-inherit.exp new file mode 100644 index 0000000..eaacb55 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-delayed-with-inherit.exp @@ -0,0 +1 @@ +"b-overridden" diff --git a/nix-js/tests/lang/eval-okay-delayed-with-inherit.nix b/nix-js/tests/lang/eval-okay-delayed-with-inherit.nix new file mode 100644 index 0000000..10ce7df --- /dev/null +++ b/nix-js/tests/lang/eval-okay-delayed-with-inherit.nix @@ -0,0 +1,31 @@ +let + pkgs_ = with pkgs; { + a = derivation { + name = "a"; + system = builtins.currentSystem; + builder = "/bin/sh"; + args = [ + "-c" + "touch $out" + ]; + inherit b; + }; + + inherit b; + }; + + packageOverrides = p: { + b = derivation { + name = "b-overridden"; + system = builtins.currentSystem; + builder = "/bin/sh"; + args = [ + "-c" + "touch $out" + ]; + }; + }; + + pkgs = pkgs_ // (packageOverrides pkgs_); +in +pkgs.a.b.name diff --git a/nix-js/tests/lang/eval-okay-delayed-with.exp b/nix-js/tests/lang/eval-okay-delayed-with.exp new file mode 100644 index 0000000..8e7c61a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-delayed-with.exp @@ -0,0 +1 @@ +"b-overridden b-overridden a" diff --git a/nix-js/tests/lang/eval-okay-delayed-with.nix b/nix-js/tests/lang/eval-okay-delayed-with.nix new file mode 100644 index 0000000..52ec24e --- /dev/null +++ b/nix-js/tests/lang/eval-okay-delayed-with.nix @@ -0,0 +1,37 @@ +let + + pkgs_ = with pkgs; { + a = derivation { + name = "a"; + system = builtins.currentSystem; + builder = "/bin/sh"; + args = [ + "-c" + "touch $out" + ]; + inherit b; + }; + + b = derivation { + name = "b"; + system = builtins.currentSystem; + builder = "/bin/sh"; + args = [ + "-c" + "touch $out" + ]; + inherit a; + }; + + c = b; + }; + + packageOverrides = + pkgs: with pkgs; { + b = derivation (b.drvAttrs // { name = "${b.name}-overridden"; }); + }; + + pkgs = pkgs_ // (packageOverrides pkgs_); + +in +"${pkgs.a.b.name} ${pkgs.c.name} ${pkgs.b.a.name}" diff --git a/nix-js/tests/lang/eval-okay-deprecate-cursed-or.err.exp b/nix-js/tests/lang/eval-okay-deprecate-cursed-or.err.exp new file mode 100644 index 0000000..4a65682 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-deprecate-cursed-or.err.exp @@ -0,0 +1,12 @@ +warning: at /pwd/lang/eval-okay-deprecate-cursed-or.nix:3:47: This expression uses `or` as an identifier in a way that will change in a future Nix release. +Wrap this entire expression in parentheses to preserve its current meaning: + ((x: x) or) +Give feedback at https://github.com/NixOS/nix/pull/11121 +warning: at /pwd/lang/eval-okay-deprecate-cursed-or.nix:4:39: This expression uses `or` as an identifier in a way that will change in a future Nix release. +Wrap this entire expression in parentheses to preserve its current meaning: + ((x: x + 1) or) +Give feedback at https://github.com/NixOS/nix/pull/11121 +warning: at /pwd/lang/eval-okay-deprecate-cursed-or.nix:5:44: This expression uses `or` as an identifier in a way that will change in a future Nix release. +Wrap this entire expression in parentheses to preserve its current meaning: + ((x: x) or) +Give feedback at https://github.com/NixOS/nix/pull/11121 diff --git a/nix-js/tests/lang/eval-okay-deprecate-cursed-or.exp b/nix-js/tests/lang/eval-okay-deprecate-cursed-or.exp new file mode 100644 index 0000000..573541a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-deprecate-cursed-or.exp @@ -0,0 +1 @@ +0 diff --git a/nix-js/tests/lang/eval-okay-deprecate-cursed-or.nix b/nix-js/tests/lang/eval-okay-deprecate-cursed-or.nix new file mode 100644 index 0000000..a4f9e74 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-deprecate-cursed-or.nix @@ -0,0 +1,11 @@ +let + # These are cursed and should warn + cursed0 = builtins.length (let or = 1; in [ (x: x) or ]); + cursed1 = let or = 1; in (x: x * 2) (x: x + 1) or; + cursed2 = let or = 1; in { a = 2; }.a or (x: x) or; + + # These are uses of `or` as an identifier that are not cursed + allowed0 = let or = (x: x); in map or []; + allowed1 = let f = (x: x); or = f; in f (f or); +in +0 diff --git a/nix-js/tests/lang/eval-okay-derivation-legacy.err.exp b/nix-js/tests/lang/eval-okay-derivation-legacy.err.exp new file mode 100644 index 0000000..94f0854 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-derivation-legacy.err.exp @@ -0,0 +1,6 @@ +warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'allowedReferences'; use 'outputChecks..allowedReferences' instead +warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'allowedRequisites'; use 'outputChecks..allowedRequisites' instead +warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedReferences'; use 'outputChecks..disallowedReferences' instead +warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedRequisites'; use 'outputChecks..disallowedRequisites' instead +warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'maxClosureSize'; use 'outputChecks..maxClosureSize' instead +warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'maxSize'; use 'outputChecks..maxSize' instead diff --git a/nix-js/tests/lang/eval-okay-derivation-legacy.exp b/nix-js/tests/lang/eval-okay-derivation-legacy.exp new file mode 100644 index 0000000..4f374a1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-derivation-legacy.exp @@ -0,0 +1 @@ +"/nix/store/mzgwvrjjir216ra58mwwizi8wj6y9ddr-eval-okay-derivation-legacy" diff --git a/nix-js/tests/lang/eval-okay-derivation-legacy.nix b/nix-js/tests/lang/eval-okay-derivation-legacy.nix new file mode 100644 index 0000000..b529cdf --- /dev/null +++ b/nix-js/tests/lang/eval-okay-derivation-legacy.nix @@ -0,0 +1,12 @@ +(builtins.derivationStrict { + name = "eval-okay-derivation-legacy"; + system = "x86_64-linux"; + builder = "/dontcare"; + __structuredAttrs = true; + allowedReferences = [ ]; + disallowedReferences = [ ]; + allowedRequisites = [ ]; + disallowedRequisites = [ ]; + maxSize = 1234; + maxClosureSize = 12345; +}).out diff --git a/nix-js/tests/lang/eval-okay-dynamic-attrs-2.exp b/nix-js/tests/lang/eval-okay-dynamic-attrs-2.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-dynamic-attrs-2.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-dynamic-attrs-2.nix b/nix-js/tests/lang/eval-okay-dynamic-attrs-2.nix new file mode 100644 index 0000000..95fe79e --- /dev/null +++ b/nix-js/tests/lang/eval-okay-dynamic-attrs-2.nix @@ -0,0 +1,5 @@ +{ + a."${"b"}" = true; + a."${"c"}" = false; +} +.a.b diff --git a/nix-js/tests/lang/eval-okay-dynamic-attrs-bare.exp b/nix-js/tests/lang/eval-okay-dynamic-attrs-bare.exp new file mode 100644 index 0000000..df8750a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-dynamic-attrs-bare.exp @@ -0,0 +1 @@ +{ binds = true; hasAttrs = true; multiAttrs = true; recBinds = true; selectAttrs = true; selectOrAttrs = true; } diff --git a/nix-js/tests/lang/eval-okay-dynamic-attrs-bare.nix b/nix-js/tests/lang/eval-okay-dynamic-attrs-bare.nix new file mode 100644 index 0000000..a612bf6 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-dynamic-attrs-bare.nix @@ -0,0 +1,28 @@ +let + aString = "a"; + + bString = "b"; +in +{ + hasAttrs = { a.b = null; } ? ${aString}.b; + + selectAttrs = { a.b = true; }.a.${bString}; + + selectOrAttrs = { }.${aString} or true; + + binds = { ${aString}."${bString}c" = true; }.a.bc; + + recBinds = + rec { + ${bString} = a; + a = true; + } + .b; + + multiAttrs = + { + ${aString} = true; + ${bString} = false; + } + .a; +} diff --git a/nix-js/tests/lang/eval-okay-dynamic-attrs.exp b/nix-js/tests/lang/eval-okay-dynamic-attrs.exp new file mode 100644 index 0000000..df8750a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-dynamic-attrs.exp @@ -0,0 +1 @@ +{ binds = true; hasAttrs = true; multiAttrs = true; recBinds = true; selectAttrs = true; selectOrAttrs = true; } diff --git a/nix-js/tests/lang/eval-okay-dynamic-attrs.nix b/nix-js/tests/lang/eval-okay-dynamic-attrs.nix new file mode 100644 index 0000000..f46e26b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-dynamic-attrs.nix @@ -0,0 +1,28 @@ +let + aString = "a"; + + bString = "b"; +in +{ + hasAttrs = { a.b = null; } ? "${aString}".b; + + selectAttrs = { a.b = true; }.a."${bString}"; + + selectOrAttrs = { }."${aString}" or true; + + binds = { "${aString}"."${bString}c" = true; }.a.bc; + + recBinds = + rec { + "${bString}" = a; + a = true; + } + .b; + + multiAttrs = + { + "${aString}" = true; + "${bString}" = false; + } + .a; +} diff --git a/nix-js/tests/lang/eval-okay-elem.exp b/nix-js/tests/lang/eval-okay-elem.exp new file mode 100644 index 0000000..3cf6c0e --- /dev/null +++ b/nix-js/tests/lang/eval-okay-elem.exp @@ -0,0 +1 @@ +[ true false 30 ] diff --git a/nix-js/tests/lang/eval-okay-elem.nix b/nix-js/tests/lang/eval-okay-elem.nix new file mode 100644 index 0000000..004111d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-elem.nix @@ -0,0 +1,11 @@ +with import ./lib.nix; + +let + xs = range 10 40; +in + +[ + (builtins.elem 23 xs) + (builtins.elem 42 xs) + (builtins.elemAt xs 20) +] diff --git a/nix-js/tests/lang/eval-okay-empty-args.exp b/nix-js/tests/lang/eval-okay-empty-args.exp new file mode 100644 index 0000000..cb5537d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-empty-args.exp @@ -0,0 +1 @@ +"ab" diff --git a/nix-js/tests/lang/eval-okay-empty-args.nix b/nix-js/tests/lang/eval-okay-empty-args.nix new file mode 100644 index 0000000..9466749 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-empty-args.nix @@ -0,0 +1,4 @@ +({ }: { x, y }: "${x}${y}") { } { + x = "a"; + y = "b"; +} diff --git a/nix-js/tests/lang/eval-okay-eq-derivations.exp b/nix-js/tests/lang/eval-okay-eq-derivations.exp new file mode 100644 index 0000000..ec04aab --- /dev/null +++ b/nix-js/tests/lang/eval-okay-eq-derivations.exp @@ -0,0 +1 @@ +[ true true true false ] diff --git a/nix-js/tests/lang/eval-okay-eq-derivations.nix b/nix-js/tests/lang/eval-okay-eq-derivations.nix new file mode 100644 index 0000000..ac802f4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-eq-derivations.nix @@ -0,0 +1,40 @@ +let + + drvA1 = derivation { + name = "a"; + builder = "/foo"; + system = "i686-linux"; + }; + drvA2 = derivation { + name = "a"; + builder = "/foo"; + system = "i686-linux"; + }; + drvA3 = + derivation { + name = "a"; + builder = "/foo"; + system = "i686-linux"; + } + // { + dummy = 1; + }; + + drvC1 = derivation { + name = "c"; + builder = "/foo"; + system = "i686-linux"; + }; + drvC2 = derivation { + name = "c"; + builder = "/bar"; + system = "i686-linux"; + }; + +in +[ + (drvA1 == drvA1) + (drvA1 == drvA2) + (drvA1 == drvA3) + (drvC1 == drvC2) +] diff --git a/nix-js/tests/lang/eval-okay-eq.exp b/nix-js/tests/lang/eval-okay-eq.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-eq.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-eq.nix b/nix-js/tests/lang/eval-okay-eq.nix new file mode 100644 index 0000000..21cb087 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-eq.nix @@ -0,0 +1,13 @@ +[ + "foobar" + (rec { + x = 1; + y = x; + }) +] == [ + ("foo" + "bar") + ({ + x = 1; + y = 1; + }) +] diff --git a/nix-js/tests/lang/eval-okay-filter.exp b/nix-js/tests/lang/eval-okay-filter.exp new file mode 100644 index 0000000..355d51c --- /dev/null +++ b/nix-js/tests/lang/eval-okay-filter.exp @@ -0,0 +1 @@ +[ 0 2 4 6 8 10 100 102 104 106 108 110 ] diff --git a/nix-js/tests/lang/eval-okay-filter.nix b/nix-js/tests/lang/eval-okay-filter.nix new file mode 100644 index 0000000..ef4e490 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-filter.nix @@ -0,0 +1,8 @@ +with import ./lib.nix; + +builtins.filter (x: x / 2 * 2 == x) ( + builtins.concatLists [ + (range 0 10) + (range 100 110) + ] +) diff --git a/nix-js/tests/lang/eval-okay-flake-ref-to-string.exp b/nix-js/tests/lang/eval-okay-flake-ref-to-string.exp new file mode 100644 index 0000000..110f844 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-flake-ref-to-string.exp @@ -0,0 +1 @@ +"github:NixOS/nixpkgs/23.05?dir=lib" diff --git a/nix-js/tests/lang/eval-okay-flake-ref-to-string.nix b/nix-js/tests/lang/eval-okay-flake-ref-to-string.nix new file mode 100644 index 0000000..f477ba5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-flake-ref-to-string.nix @@ -0,0 +1,7 @@ +builtins.flakeRefToString { + type = "github"; + owner = "NixOS"; + repo = "nixpkgs"; + ref = "23.05"; + dir = "lib"; +} diff --git a/nix-js/tests/lang/eval-okay-flatten.exp b/nix-js/tests/lang/eval-okay-flatten.exp new file mode 100644 index 0000000..b979b2b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-flatten.exp @@ -0,0 +1 @@ +"1234567" diff --git a/nix-js/tests/lang/eval-okay-flatten.nix b/nix-js/tests/lang/eval-okay-flatten.nix new file mode 100644 index 0000000..ade74c8 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-flatten.nix @@ -0,0 +1,20 @@ +with import ./lib.nix; + +let { + + l = [ + "1" + "2" + [ + "3" + [ "4" ] + [ + "5" + "6" + ] + ] + "7" + ]; + + body = concat (flatten l); +} diff --git a/nix-js/tests/lang/eval-okay-float.exp b/nix-js/tests/lang/eval-okay-float.exp new file mode 100644 index 0000000..3c50a8a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-float.exp @@ -0,0 +1 @@ +[ 3.4 3.5 2.5 1.5 ] diff --git a/nix-js/tests/lang/eval-okay-float.nix b/nix-js/tests/lang/eval-okay-float.nix new file mode 100644 index 0000000..b2702c7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-float.nix @@ -0,0 +1,6 @@ +[ + (1.1 + 2.3) + (builtins.add (0.5 + 0.5) (2.0 + 0.5)) + ((0.5 + 0.5) * (2.0 + 0.5)) + ((1.5 + 1.5) / (0.5 * 4.0)) +] diff --git a/nix-js/tests/lang/eval-okay-floor-ceil.exp b/nix-js/tests/lang/eval-okay-floor-ceil.exp new file mode 100644 index 0000000..81f8042 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-floor-ceil.exp @@ -0,0 +1 @@ +"23;24;23;23" diff --git a/nix-js/tests/lang/eval-okay-floor-ceil.nix b/nix-js/tests/lang/eval-okay-floor-ceil.nix new file mode 100644 index 0000000..06f1a13 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-floor-ceil.nix @@ -0,0 +1,16 @@ +with import ./lib.nix; + +let + n1 = builtins.floor 23.5; + n2 = builtins.ceil 23.5; + n3 = builtins.floor 23; + n4 = builtins.ceil 23; +in +builtins.concatStringsSep ";" ( + map toString [ + n1 + n2 + n3 + n4 + ] +) diff --git a/nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.exp b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.exp new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.exp @@ -0,0 +1 @@ +42 diff --git a/nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.nix b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.nix new file mode 100644 index 0000000..49751c7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-elements.nix @@ -0,0 +1,6 @@ +# Tests that the rhs argument of op is not forced unconditionally +let + lst = builtins.foldl' (acc: x: acc ++ [ x ]) [ ] [ 42 (throw "this shouldn't be evaluated") ]; +in + +builtins.head lst diff --git a/nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.exp b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.exp new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.exp @@ -0,0 +1 @@ +42 diff --git a/nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.nix b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.nix new file mode 100644 index 0000000..9cf0ef3 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-foldlStrict-lazy-initial-accumulator.nix @@ -0,0 +1,6 @@ +# Checks that the nul value for the accumulator is not forced unconditionally. +# Some languages provide a foldl' that is strict in this argument, but Nix does not. +builtins.foldl' (_: x: x) (throw "This is never forced") [ + "but the results of applying op are" + 42 +] diff --git a/nix-js/tests/lang/eval-okay-foldlStrict.exp b/nix-js/tests/lang/eval-okay-foldlStrict.exp new file mode 100644 index 0000000..837e12b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-foldlStrict.exp @@ -0,0 +1 @@ +500500 diff --git a/nix-js/tests/lang/eval-okay-foldlStrict.nix b/nix-js/tests/lang/eval-okay-foldlStrict.nix new file mode 100644 index 0000000..3b87188 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-foldlStrict.nix @@ -0,0 +1,3 @@ +with import ./lib.nix; + +builtins.foldl' (x: y: x + y) 0 (range 1 1000) diff --git a/nix-js/tests/lang/eval-okay-fromTOML-timestamps.exp b/nix-js/tests/lang/eval-okay-fromTOML-timestamps.exp new file mode 100644 index 0000000..08b3c69 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromTOML-timestamps.exp @@ -0,0 +1 @@ +{ "1234" = "value"; "127.0.0.1" = "value"; a = { b = { c = { }; }; }; arr1 = [ 1 2 3 ]; arr2 = [ "red" "yellow" "green" ]; arr3 = [ [ 1 2 ] [ 3 4 5 ] ]; arr4 = [ "all" "strings" "are the same" "type" ]; arr5 = [ [ 1 2 ] [ "a" "b" "c" ] ]; arr7 = [ 1 2 3 ]; arr8 = [ 1 2 ]; bare-key = "value"; bare_key = "value"; bin1 = 214; bool1 = true; bool2 = false; "character encoding" = "value"; d = { e = { f = { }; }; }; dog = { "tater.man" = { type = { name = "pug"; }; }; }; flt1 = 1; flt2 = 3.1415; flt3 = -0.01; flt4 = 5e+22; flt5 = 1e+06; flt6 = -0.02; flt7 = 6.626e-34; flt8 = 9.22462e+06; fruit = [ { name = "apple"; physical = { color = "red"; shape = "round"; }; variety = [ { name = "red delicious"; } { name = "granny smith"; } ]; } { name = "banana"; variety = [ { name = "plantain"; } ]; } ]; g = { h = { i = { }; }; }; hex1 = 3735928559; hex2 = 3735928559; hex3 = 3735928559; int1 = 99; int2 = 42; int3 = 0; int4 = -17; int5 = 1000; int6 = 5349221; int7 = 12345; j = { "ʞ" = { l = { }; }; }; key = "value"; key2 = "value"; ld1 = { _type = "timestamp"; value = "1979-05-27"; }; ldt1 = { _type = "timestamp"; value = "1979-05-27T07:32:00"; }; ldt2 = { _type = "timestamp"; value = "1979-05-27T00:32:00.999999"; }; lt1 = { _type = "timestamp"; value = "07:32:00"; }; lt2 = { _type = "timestamp"; value = "00:32:00.999999"; }; name = "Orange"; oct1 = 342391; oct2 = 493; odt1 = { _type = "timestamp"; value = "1979-05-27T07:32:00Z"; }; odt2 = { _type = "timestamp"; value = "1979-05-27T00:32:00-07:00"; }; odt3 = { _type = "timestamp"; value = "1979-05-27T00:32:00.999999-07:00"; }; odt4 = { _type = "timestamp"; value = "1979-05-27T07:32:00Z"; }; physical = { color = "orange"; shape = "round"; }; products = [ { name = "Hammer"; sku = 738594937; } { } { color = "gray"; name = "Nail"; sku = 284758393; } ]; "quoted \"value\"" = "value"; site = { "google.com" = true; }; str = "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF."; table-1 = { key1 = "some string"; key2 = 123; }; table-2 = { key1 = "another string"; key2 = 456; }; x = { y = { z = { w = { animal = { type = { name = "pug"; }; }; name = { first = "Tom"; last = "Preston-Werner"; }; point = { x = 1; y = 2; }; }; }; }; }; "ʎǝʞ" = "value"; } diff --git a/nix-js/tests/lang/eval-okay-fromTOML-timestamps.nix b/nix-js/tests/lang/eval-okay-fromTOML-timestamps.nix new file mode 100644 index 0000000..74cff94 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromTOML-timestamps.nix @@ -0,0 +1,130 @@ +builtins.fromTOML '' + key = "value" + bare_key = "value" + bare-key = "value" + 1234 = "value" + + "127.0.0.1" = "value" + "character encoding" = "value" + "ʎǝʞ" = "value" + 'key2' = "value" + 'quoted "value"' = "value" + + name = "Orange" + + physical.color = "orange" + physical.shape = "round" + site."google.com" = true + + # This is legal according to the spec, but cpptoml doesn't handle it. + #a.b.c = 1 + #a.d = 2 + + str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." + + int1 = +99 + int2 = 42 + int3 = 0 + int4 = -17 + int5 = 1_000 + int6 = 5_349_221 + int7 = 1_2_3_4_5 + + hex1 = 0xDEADBEEF + hex2 = 0xdeadbeef + hex3 = 0xdead_beef + + oct1 = 0o01234567 + oct2 = 0o755 + + bin1 = 0b11010110 + + flt1 = +1.0 + flt2 = 3.1415 + flt3 = -0.01 + flt4 = 5e+22 + flt5 = 1e6 + flt6 = -2E-2 + flt7 = 6.626e-34 + flt8 = 9_224_617.445_991_228_313 + + bool1 = true + bool2 = false + + odt1 = 1979-05-27T07:32:00Z + odt2 = 1979-05-27T00:32:00-07:00 + odt3 = 1979-05-27T00:32:00.999999-07:00 + odt4 = 1979-05-27 07:32:00Z + ldt1 = 1979-05-27T07:32:00 + ldt2 = 1979-05-27T00:32:00.999999 + ld1 = 1979-05-27 + lt1 = 07:32:00 + lt2 = 00:32:00.999999 + + arr1 = [ 1, 2, 3 ] + arr2 = [ "red", "yellow", "green" ] + arr3 = [ [ 1, 2 ], [3, 4, 5] ] + arr4 = [ "all", 'strings', """are the same""", ''''type''''] + arr5 = [ [ 1, 2 ], ["a", "b", "c"] ] + + arr7 = [ + 1, 2, 3 + ] + + arr8 = [ + 1, + 2, # this is ok + ] + + [table-1] + key1 = "some string" + key2 = 123 + + + [table-2] + key1 = "another string" + key2 = 456 + + [dog."tater.man"] + type.name = "pug" + + [a.b.c] + [ d.e.f ] + [ g . h . i ] + [ j . "ʞ" . 'l' ] + [x.y.z.w] + + name = { first = "Tom", last = "Preston-Werner" } + point = { x = 1, y = 2 } + animal = { type.name = "pug" } + + [[products]] + name = "Hammer" + sku = 738594937 + + [[products]] + + [[products]] + name = "Nail" + sku = 284758393 + color = "gray" + + [[fruit]] + name = "apple" + + [fruit.physical] + color = "red" + shape = "round" + + [[fruit.variety]] + name = "red delicious" + + [[fruit.variety]] + name = "granny smith" + + [[fruit]] + name = "banana" + + [[fruit.variety]] + name = "plantain" +'' diff --git a/nix-js/tests/lang/eval-okay-fromTOML.exp b/nix-js/tests/lang/eval-okay-fromTOML.exp new file mode 100644 index 0000000..d0dd3af --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromTOML.exp @@ -0,0 +1 @@ +[ { clients = { data = [ [ "gamma" "delta" ] [ 1 2 ] ]; hosts = [ "alpha" "omega" ]; }; database = { connection_max = 5000; enabled = true; ports = [ 8001 8001 8002 ]; server = "192.168.1.1"; }; owner = { name = "Tom Preston-Werner"; }; servers = { alpha = { dc = "eqdc10"; ip = "10.0.0.1"; }; beta = { dc = "eqdc10"; ip = "10.0.0.2"; }; }; title = "TOML Example"; } { "1234" = "value"; "127.0.0.1" = "value"; a = { b = { c = { }; }; }; arr1 = [ 1 2 3 ]; arr2 = [ "red" "yellow" "green" ]; arr3 = [ [ 1 2 ] [ 3 4 5 ] ]; arr4 = [ "all" "strings" "are the same" "type" ]; arr5 = [ [ 1 2 ] [ "a" "b" "c" ] ]; arr7 = [ 1 2 3 ]; arr8 = [ 1 2 ]; bare-key = "value"; bare_key = "value"; bin1 = 214; bool1 = true; bool2 = false; "character encoding" = "value"; d = { e = { f = { }; }; }; dog = { "tater.man" = { type = { name = "pug"; }; }; }; flt1 = 1; flt2 = 3.1415; flt3 = -0.01; flt4 = 5e+22; flt5 = 1e+06; flt6 = -0.02; flt7 = 6.626e-34; flt8 = 9.22462e+06; fruit = [ { name = "apple"; physical = { color = "red"; shape = "round"; }; variety = [ { name = "red delicious"; } { name = "granny smith"; } ]; } { name = "banana"; variety = [ { name = "plantain"; } ]; } ]; g = { h = { i = { }; }; }; hex1 = 3735928559; hex2 = 3735928559; hex3 = 3735928559; int1 = 99; int2 = 42; int3 = 0; int4 = -17; int5 = 1000; int6 = 5349221; int7 = 12345; j = { "ʞ" = { l = { }; }; }; key = "value"; key2 = "value"; name = "Orange"; oct1 = 342391; oct2 = 493; physical = { color = "orange"; shape = "round"; }; products = [ { name = "Hammer"; sku = 738594937; } { } { color = "gray"; name = "Nail"; sku = 284758393; } ]; "quoted \"value\"" = "value"; site = { "google.com" = true; }; str = "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF."; table-1 = { key1 = "some string"; key2 = 123; }; table-2 = { key1 = "another string"; key2 = 456; }; x = { y = { z = { w = { animal = { type = { name = "pug"; }; }; name = { first = "Tom"; last = "Preston-Werner"; }; point = { x = 1; y = 2; }; }; }; }; }; "ʎǝʞ" = "value"; } { metadata = { "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"; "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"; "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"; "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef"; }; package = [ { dependencies = [ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" ]; name = "aho-corasick"; source = "registry+https://github.com/rust-lang/crates.io-index"; version = "0.6.4"; } { name = "ansi_term"; source = "registry+https://github.com/rust-lang/crates.io-index"; version = "0.9.0"; } { dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" ]; name = "atty"; source = "registry+https://github.com/rust-lang/crates.io-index"; version = "0.2.10"; } ]; } { a = [ [ { b = true; } ] ]; c = [ [ { d = true; } ] ]; e = [ [ 123 ] ]; } ] diff --git a/nix-js/tests/lang/eval-okay-fromTOML.nix b/nix-js/tests/lang/eval-okay-fromTOML.nix new file mode 100644 index 0000000..9639326 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromTOML.nix @@ -0,0 +1,208 @@ +[ + + (builtins.fromTOML '' + # This is a TOML document. + + title = "TOML Example" + + [owner] + name = "Tom Preston-Werner" + #dob = 1979-05-27T07:32:00-08:00 # First class dates + + [database] + server = "192.168.1.1" + ports = [ 8001, 8001, 8002 ] + connection_max = 5000 + enabled = true + + [servers] + + # Indentation (tabs and/or spaces) is allowed but not required + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + + [clients] + data = [ ["gamma", "delta"], [1, 2] ] + + # Line breaks are OK when inside arrays + hosts = [ + "alpha", + "omega" + ] + '') + + (builtins.fromTOML '' + key = "value" + bare_key = "value" + bare-key = "value" + 1234 = "value" + + "127.0.0.1" = "value" + "character encoding" = "value" + "ʎǝʞ" = "value" + 'key2' = "value" + 'quoted "value"' = "value" + + name = "Orange" + + physical.color = "orange" + physical.shape = "round" + site."google.com" = true + + # This is legal according to the spec, but cpptoml doesn't handle it. + #a.b.c = 1 + #a.d = 2 + + str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." + + int1 = +99 + int2 = 42 + int3 = 0 + int4 = -17 + int5 = 1_000 + int6 = 5_349_221 + int7 = 1_2_3_4_5 + + hex1 = 0xDEADBEEF + hex2 = 0xdeadbeef + hex3 = 0xdead_beef + + oct1 = 0o01234567 + oct2 = 0o755 + + bin1 = 0b11010110 + + flt1 = +1.0 + flt2 = 3.1415 + flt3 = -0.01 + flt4 = 5e+22 + flt5 = 1e6 + flt6 = -2E-2 + flt7 = 6.626e-34 + flt8 = 9_224_617.445_991_228_313 + + bool1 = true + bool2 = false + + # FIXME: not supported because Nix doesn't have a date/time type. + #odt1 = 1979-05-27T07:32:00Z + #odt2 = 1979-05-27T00:32:00-07:00 + #odt3 = 1979-05-27T00:32:00.999999-07:00 + #odt4 = 1979-05-27 07:32:00Z + #ldt1 = 1979-05-27T07:32:00 + #ldt2 = 1979-05-27T00:32:00.999999 + #ld1 = 1979-05-27 + #lt1 = 07:32:00 + #lt2 = 00:32:00.999999 + + arr1 = [ 1, 2, 3 ] + arr2 = [ "red", "yellow", "green" ] + arr3 = [ [ 1, 2 ], [3, 4, 5] ] + arr4 = [ "all", 'strings', """are the same""", ''''type''''] + arr5 = [ [ 1, 2 ], ["a", "b", "c"] ] + + arr7 = [ + 1, 2, 3 + ] + + arr8 = [ + 1, + 2, # this is ok + ] + + [table-1] + key1 = "some string" + key2 = 123 + + + [table-2] + key1 = "another string" + key2 = 456 + + [dog."tater.man"] + type.name = "pug" + + [a.b.c] + [ d.e.f ] + [ g . h . i ] + [ j . "ʞ" . 'l' ] + [x.y.z.w] + + name = { first = "Tom", last = "Preston-Werner" } + point = { x = 1, y = 2 } + animal = { type.name = "pug" } + + [[products]] + name = "Hammer" + sku = 738594937 + + [[products]] + + [[products]] + name = "Nail" + sku = 284758393 + color = "gray" + + [[fruit]] + name = "apple" + + [fruit.physical] + color = "red" + shape = "round" + + [[fruit.variety]] + name = "red delicious" + + [[fruit.variety]] + name = "granny smith" + + [[fruit]] + name = "banana" + + [[fruit.variety]] + name = "plantain" + '') + + (builtins.fromTOML '' + [[package]] + name = "aho-corasick" + version = "0.6.4" + source = "registry+https://github.com/rust-lang/crates.io-index" + dependencies = [ + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + ] + + [[package]] + name = "ansi_term" + version = "0.9.0" + source = "registry+https://github.com/rust-lang/crates.io-index" + + [[package]] + name = "atty" + version = "0.2.10" + source = "registry+https://github.com/rust-lang/crates.io-index" + dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + ] + + [metadata] + "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" + "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" + "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" + "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" + '') + + (builtins.fromTOML '' + a = [[{ b = true }]] + c = [ [ { d = true } ] ] + e = [[123]] + '') + +] diff --git a/nix-js/tests/lang/eval-okay-fromjson-escapes.exp b/nix-js/tests/lang/eval-okay-fromjson-escapes.exp new file mode 100644 index 0000000..add5505 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromjson-escapes.exp @@ -0,0 +1 @@ +"quote \" reverse solidus \\ solidus / backspace  formfeed newline \n carriage return \r horizontal tab \t 1 char unicode encoded backspace  1 char unicode encoded e with accent é 2 char unicode encoded s with caron š 3 char unicode encoded rightwards arrow →" diff --git a/nix-js/tests/lang/eval-okay-fromjson-escapes.nix b/nix-js/tests/lang/eval-okay-fromjson-escapes.nix new file mode 100644 index 0000000..6330e9c --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromjson-escapes.nix @@ -0,0 +1,4 @@ +# This string contains all supported escapes in a JSON string, per json.org +# \b and \f are not supported by Nix +builtins.fromJSON + ''"quote \" reverse solidus \\ solidus \/ backspace \b formfeed \f newline \n carriage return \r horizontal tab \t 1 char unicode encoded backspace \u0008 1 char unicode encoded e with accent \u00e9 2 char unicode encoded s with caron \u0161 3 char unicode encoded rightwards arrow \u2192"'' diff --git a/nix-js/tests/lang/eval-okay-fromjson.exp b/nix-js/tests/lang/eval-okay-fromjson.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromjson.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-fromjson.nix b/nix-js/tests/lang/eval-okay-fromjson.nix new file mode 100644 index 0000000..0e8a235 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-fromjson.nix @@ -0,0 +1,55 @@ +builtins.fromJSON '' + { + "Video": { + "Title": "The Penguin Chronicles", + "Width": 1920, + "Height": 1080, + "EmbeddedData": [3.14159, 23493,null, true ,false, -10], + "Thumb": { + "Url": "http://www.example.com/video/5678931", + "Width": 200, + "Height": 250 + }, + "Animated" : false, + "IDs": [116, 943, 234, 38793, true ,false,null, -100], + "Escapes": "\"\\\/\t\n\r\t", + "Subtitle" : false, + "Latitude": 37.7668, + "Longitude": -122.3959 + } + } +'' == { + Video = { + Title = "The Penguin Chronicles"; + Width = 1920; + Height = 1080; + EmbeddedData = [ + 3.14159 + 23493 + null + true + false + (0 - 10) + ]; + Thumb = { + Url = "http://www.example.com/video/5678931"; + Width = 200; + Height = 250; + }; + Animated = false; + IDs = [ + 116 + 943 + 234 + 38793 + true + false + null + (0 - 100) + ]; + Escapes = "\"\\\/\t\n\r\t"; # supported in JSON but not Nix: \b\f + Subtitle = false; + Latitude = 37.7668; + Longitude = -122.3959; + }; +} diff --git a/nix-js/tests/lang/eval-okay-functionargs.exp b/nix-js/tests/lang/eval-okay-functionargs.exp new file mode 100644 index 0000000..c1c9f8f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-functionargs.exp @@ -0,0 +1 @@ +[ "stdenv" "fetchurl" "aterm-stdenv" "aterm-stdenv2" "libX11" "libXv" "mplayer-stdenv2.libXv-libX11" "mplayer-stdenv2.libXv-libX11_2" "nix-stdenv-aterm-stdenv" "nix-stdenv2-aterm2-stdenv2" ] diff --git a/nix-js/tests/lang/eval-okay-functionargs.nix b/nix-js/tests/lang/eval-okay-functionargs.nix new file mode 100644 index 0000000..7c11f19 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-functionargs.nix @@ -0,0 +1,150 @@ +let + + stdenvFun = + { }: + { + name = "stdenv"; + }; + stdenv2Fun = + { }: + { + name = "stdenv2"; + }; + fetchurlFun = + { stdenv }: + assert stdenv.name == "stdenv"; + { + name = "fetchurl"; + }; + atermFun = + { stdenv, fetchurl }: + { + name = "aterm-${stdenv.name}"; + }; + aterm2Fun = + { stdenv, fetchurl }: + { + name = "aterm2-${stdenv.name}"; + }; + nixFun = + { + stdenv, + fetchurl, + aterm, + }: + { + name = "nix-${stdenv.name}-${aterm.name}"; + }; + + mplayerFun = + { + stdenv, + fetchurl, + enableX11 ? false, + xorg ? null, + enableFoo ? true, + foo ? null, + }: + assert stdenv.name == "stdenv2"; + assert enableX11 -> xorg.libXv.name == "libXv"; + assert enableFoo -> foo != null; + { + name = "mplayer-${stdenv.name}.${xorg.libXv.name}-${xorg.libX11.name}"; + }; + + makeOverridable = + f: origArgs: + f origArgs + // { + override = + newArgs: + makeOverridable f (origArgs // (if builtins.isFunction newArgs then newArgs origArgs else newArgs)); + }; + + callPackage_ = + pkgs: f: args: + makeOverridable f ((builtins.intersectAttrs (builtins.functionArgs f) pkgs) // args); + + allPackages = + { + overrides ? (pkgs: pkgsPrev: { }), + }: + let + callPackage = callPackage_ pkgs; + pkgs = pkgsStd // (overrides pkgs pkgsStd); + pkgsStd = { + inherit pkgs; + stdenv = callPackage stdenvFun { }; + stdenv2 = callPackage stdenv2Fun { }; + fetchurl = callPackage fetchurlFun { }; + aterm = callPackage atermFun { }; + xorg = callPackage xorgFun { }; + mplayer = callPackage mplayerFun { + stdenv = pkgs.stdenv2; + enableFoo = false; + }; + nix = callPackage nixFun { }; + }; + in + pkgs; + + libX11Fun = + { stdenv, fetchurl }: + { + name = "libX11"; + }; + libX11_2Fun = + { stdenv, fetchurl }: + { + name = "libX11_2"; + }; + libXvFun = + { + stdenv, + fetchurl, + libX11, + }: + { + name = "libXv"; + }; + + xorgFun = + { pkgs }: + let + callPackage = callPackage_ (pkgs // pkgs.xorg); + in + { + libX11 = callPackage libX11Fun { }; + libXv = callPackage libXvFun { }; + }; + +in + +let + + pkgs = allPackages { }; + + pkgs2 = allPackages { + overrides = pkgs: pkgsPrev: { + stdenv = pkgs.stdenv2; + nix = pkgsPrev.nix.override { aterm = aterm2Fun { inherit (pkgs) stdenv fetchurl; }; }; + xorg = pkgsPrev.xorg // { + libX11 = libX11_2Fun { inherit (pkgs) stdenv fetchurl; }; + }; + }; + }; + +in + +[ + pkgs.stdenv.name + pkgs.fetchurl.name + pkgs.aterm.name + pkgs2.aterm.name + pkgs.xorg.libX11.name + pkgs.xorg.libXv.name + pkgs.mplayer.name + pkgs2.mplayer.name + pkgs.nix.name + pkgs2.nix.name +] diff --git a/nix-js/tests/lang/eval-okay-getattrpos-functionargs.exp b/nix-js/tests/lang/eval-okay-getattrpos-functionargs.exp new file mode 100644 index 0000000..7f9ac40 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getattrpos-functionargs.exp @@ -0,0 +1 @@ +{ column = 11; file = "eval-okay-getattrpos-functionargs.nix"; line = 2; } diff --git a/nix-js/tests/lang/eval-okay-getattrpos-functionargs.nix b/nix-js/tests/lang/eval-okay-getattrpos-functionargs.nix new file mode 100644 index 0000000..9692911 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getattrpos-functionargs.nix @@ -0,0 +1,8 @@ +let + fun = { foo }: { }; + pos = builtins.unsafeGetAttrPos "foo" (builtins.functionArgs fun); +in +{ + inherit (pos) column line; + file = baseNameOf pos.file; +} diff --git a/nix-js/tests/lang/eval-okay-getattrpos-undefined.exp b/nix-js/tests/lang/eval-okay-getattrpos-undefined.exp new file mode 100644 index 0000000..19765bd --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getattrpos-undefined.exp @@ -0,0 +1 @@ +null diff --git a/nix-js/tests/lang/eval-okay-getattrpos-undefined.nix b/nix-js/tests/lang/eval-okay-getattrpos-undefined.nix new file mode 100644 index 0000000..14dd38f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getattrpos-undefined.nix @@ -0,0 +1 @@ +builtins.unsafeGetAttrPos "abort" builtins diff --git a/nix-js/tests/lang/eval-okay-getattrpos.exp b/nix-js/tests/lang/eval-okay-getattrpos.exp new file mode 100644 index 0000000..469249b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getattrpos.exp @@ -0,0 +1 @@ +{ column = 5; file = "eval-okay-getattrpos.nix"; line = 3; } diff --git a/nix-js/tests/lang/eval-okay-getattrpos.nix b/nix-js/tests/lang/eval-okay-getattrpos.nix new file mode 100644 index 0000000..25bc574 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getattrpos.nix @@ -0,0 +1,10 @@ +let + as = { + foo = "bar"; + }; + pos = builtins.unsafeGetAttrPos "foo" as; +in +{ + inherit (pos) column line; + file = baseNameOf pos.file; +} diff --git a/nix-js/tests/lang/eval-okay-getenv.exp b/nix-js/tests/lang/eval-okay-getenv.exp new file mode 100644 index 0000000..14e24d4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getenv.exp @@ -0,0 +1 @@ +"foobar" diff --git a/nix-js/tests/lang/eval-okay-getenv.nix b/nix-js/tests/lang/eval-okay-getenv.nix new file mode 100644 index 0000000..4cfec5f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-getenv.nix @@ -0,0 +1 @@ +builtins.getEnv "TEST_VAR" + (if builtins.getEnv "NO_SUCH_VAR" == "" then "bar" else "bla") diff --git a/nix-js/tests/lang/eval-okay-groupBy.exp b/nix-js/tests/lang/eval-okay-groupBy.exp new file mode 100644 index 0000000..bfca565 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-groupBy.exp @@ -0,0 +1 @@ +{ "1" = [ 9 ]; "2" = [ 8 ]; "3" = [ 13 29 ]; "4" = [ 3 4 10 11 17 18 ]; "5" = [ 0 23 26 28 ]; "6" = [ 1 12 21 27 30 ]; "7" = [ 7 22 ]; "8" = [ 14 ]; "9" = [ 19 ]; b = [ 16 25 ]; c = [ 24 ]; d = [ 2 ]; e = [ 5 6 15 31 ]; f = [ 20 ]; } diff --git a/nix-js/tests/lang/eval-okay-groupBy.nix b/nix-js/tests/lang/eval-okay-groupBy.nix new file mode 100644 index 0000000..f4de544 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-groupBy.nix @@ -0,0 +1,5 @@ +with import ./lib.nix; + +builtins.groupBy (n: builtins.substring 0 1 (builtins.hashString "sha256" (toString n))) ( + range 0 31 +) diff --git a/nix-js/tests/lang/eval-okay-hash.exp b/nix-js/tests/lang/eval-okay-hash.exp new file mode 100644 index 0000000..e69de29 diff --git a/nix-js/tests/lang/eval-okay-hashfile.exp b/nix-js/tests/lang/eval-okay-hashfile.exp new file mode 100644 index 0000000..ff1e829 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-hashfile.exp @@ -0,0 +1 @@ +[ "d3b07384d113edec49eaa6238ad5ff00" "0f343b0931126a20f133d67c2b018a3b" "f1d2d2f924e986ac86fdf7b36c94bcdf32beec15" "60cacbf3d72e1e7834203da608037b1bf83b40e8" "b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c" "5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" "0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6" "8efb4f73c5655351c444eb109230c556d39e2c7624e9c11abc9e3fb4b9b9254218cc5085b454a9698d085cfa92198491f07a723be4574adc70617b73eb0b6461" ] diff --git a/nix-js/tests/lang/eval-okay-hashfile.nix b/nix-js/tests/lang/eval-okay-hashfile.nix new file mode 100644 index 0000000..aeaf09f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-hashfile.nix @@ -0,0 +1,14 @@ +let + paths = [ + ./data + ./binary-data + ]; +in +builtins.concatLists ( + map (hash: map (builtins.hashFile hash) paths) [ + "md5" + "sha1" + "sha256" + "sha512" + ] +) diff --git a/nix-js/tests/lang/eval-okay-hashstring.exp b/nix-js/tests/lang/eval-okay-hashstring.exp new file mode 100644 index 0000000..d720a08 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-hashstring.exp @@ -0,0 +1 @@ +[ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ] diff --git a/nix-js/tests/lang/eval-okay-hashstring.nix b/nix-js/tests/lang/eval-okay-hashstring.nix new file mode 100644 index 0000000..c760b00 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-hashstring.nix @@ -0,0 +1,15 @@ +let + strings = [ + "" + "text 1" + "text 2" + ]; +in +builtins.concatLists ( + map (hash: map (builtins.hashString hash) strings) [ + "md5" + "sha1" + "sha256" + "sha512" + ] +) diff --git a/nix-js/tests/lang/eval-okay-if.exp b/nix-js/tests/lang/eval-okay-if.exp new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/nix-js/tests/lang/eval-okay-if.exp @@ -0,0 +1 @@ +3 diff --git a/nix-js/tests/lang/eval-okay-if.nix b/nix-js/tests/lang/eval-okay-if.nix new file mode 100644 index 0000000..66b9d15 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-if.nix @@ -0,0 +1,6 @@ +if "foo" != "f" + "oo" then + 1 +else if false then + 2 +else + 3 diff --git a/nix-js/tests/lang/eval-okay-import.exp b/nix-js/tests/lang/eval-okay-import.exp new file mode 100644 index 0000000..c508125 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-import.exp @@ -0,0 +1 @@ +[ 1 2 3 4 5 6 7 8 9 10 ] diff --git a/nix-js/tests/lang/eval-okay-import.nix b/nix-js/tests/lang/eval-okay-import.nix new file mode 100644 index 0000000..484dcca --- /dev/null +++ b/nix-js/tests/lang/eval-okay-import.nix @@ -0,0 +1,12 @@ +let + + overrides = { + import = fn: scopedImport overrides fn; + + scopedImport = attrs: fn: scopedImport (overrides // attrs) fn; + + builtins = builtins // overrides; + } // import ./lib.nix; + +in +scopedImport overrides ./imported.nix diff --git a/nix-js/tests/lang/eval-okay-ind-string.exp b/nix-js/tests/lang/eval-okay-ind-string.exp new file mode 100644 index 0000000..7862331 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-ind-string.exp @@ -0,0 +1 @@ +"This is an indented multi-line string\nliteral. An amount of whitespace at\nthe start of each line matching the minimum\nindentation of all lines in the string\nliteral together will be removed. Thus,\nin this case four spaces will be\nstripped from each line, even though\n THIS LINE is indented six spaces.\n\nAlso, empty lines don't count in the\ndetermination of the indentation level (the\nprevious empty line has indentation 0, but\nit doesn't matter).\nIf the string starts with whitespace\n followed by a newline, it's stripped, but\n that's not the case here. Two spaces are\n stripped because of the \" \" at the start. \nThis line is indented\na bit further.\nAnti-quotations, like so, are\nalso allowed.\n The \\ is not special here.\n' can be followed by any character except another ', e.g. 'x'.\nLikewise for $, e.g. $$ or $varName.\nBut ' followed by ' is special, as is $ followed by {.\nIf you want them, use anti-quotations: '', \${.\n Tabs are not interpreted as whitespace (since we can't guess\n what tab settings are intended), so don't use them.\n\tThis line starts with a space and a tab, so only one\n space will be stripped from each line.\nAlso note that if the last line (just before the closing ' ')\nconsists only of whitespace, it's ignored. But here there is\nsome non-whitespace stuff, so the line isn't removed. \nThis shows a hacky way to preserve an empty line after the start.\nBut there's no reason to do so: you could just repeat the empty\nline.\n Similarly you can force an indentation level,\n in this case to 2 spaces. This works because the anti-quote\n is significant (not whitespace).\nstart on network-interfaces\n\nstart script\n\n rm -f /var/run/opengl-driver\n ln -sf 123 /var/run/opengl-driver\n\n rm -f /var/log/slim.log\n \nend script\n\nenv SLIM_CFGFILE=abc\nenv SLIM_THEMESDIR=def\nenv FONTCONFIG_FILE=/etc/fonts/fonts.conf \t\t\t\t# !!! cleanup\nenv XKB_BINDIR=foo/bin \t\t\t\t# Needed for the Xkb extension.\nenv LD_LIBRARY_PATH=libX11/lib:libXext/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\n\nenv XORG_DRI_DRIVER_PATH=nvidiaDrivers/X11R6/lib/modules/drivers/ \n\nexec slim/bin/slim\nEscaping of ' followed by ': ''\nEscaping of $ followed by {: \${\nAnd finally to interpret \\n etc. as in a string: \n, \r, \t.\nfoo\n'bla'\nbar\ncut -d $'\\t' -f 1\nending dollar $$\n" diff --git a/nix-js/tests/lang/eval-okay-ind-string.nix b/nix-js/tests/lang/eval-okay-ind-string.nix new file mode 100644 index 0000000..95d59b5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-ind-string.nix @@ -0,0 +1,128 @@ +let + + s1 = '' + This is an indented multi-line string + literal. An amount of whitespace at + the start of each line matching the minimum + indentation of all lines in the string + literal together will be removed. Thus, + in this case four spaces will be + stripped from each line, even though + THIS LINE is indented six spaces. + + Also, empty lines don't count in the + determination of the indentation level (the + previous empty line has indentation 0, but + it doesn't matter). + ''; + + s2 = '' If the string starts with whitespace + followed by a newline, it's stripped, but + that's not the case here. Two spaces are + stripped because of the " " at the start. + ''; + + s3 = '' + This line is indented + a bit further. + ''; # indentation of last line doesn't count if it's empty + + s4 = '' + Anti-quotations, like ${if true then "so" else "not so"}, are + also allowed. + ''; + + s5 = '' + The \ is not special here. + ' can be followed by any character except another ', e.g. 'x'. + Likewise for $, e.g. $$ or $varName. + But ' followed by ' is special, as is $ followed by {. + If you want them, use anti-quotations: ${"''"}, ${"\${"}. + ''; + + s6 = '' + Tabs are not interpreted as whitespace (since we can't guess + what tab settings are intended), so don't use them. + This line starts with a space and a tab, so only one + space will be stripped from each line. + ''; + + s7 = '' + Also note that if the last line (just before the closing ' ') + consists only of whitespace, it's ignored. But here there is + some non-whitespace stuff, so the line isn't removed. ''; + + s8 = '' ${""} + This shows a hacky way to preserve an empty line after the start. + But there's no reason to do so: you could just repeat the empty + line. + ''; + + s9 = '' + ${""} Similarly you can force an indentation level, + in this case to 2 spaces. This works because the anti-quote + is significant (not whitespace). + ''; + + s10 = '' + ''; + + s11 = ''''; + + s12 = '' ''; + + s13 = '' + start on network-interfaces + + start script + + rm -f /var/run/opengl-driver + ${if true + then "ln -sf 123 /var/run/opengl-driver" + else if true + then "ln -sf 456 /var/run/opengl-driver" + else "" + } + + rm -f /var/log/slim.log + + end script + + env SLIM_CFGFILE=${"abc"} + env SLIM_THEMESDIR=${"def"} + env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup + env XKB_BINDIR=${"foo"}/bin # Needed for the Xkb extension. + env LD_LIBRARY_PATH=${"libX11"}/lib:${"libXext"}/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz) + + ${if true + then "env XORG_DRI_DRIVER_PATH=${"nvidiaDrivers"}/X11R6/lib/modules/drivers/" + else if true + then "env XORG_DRI_DRIVER_PATH=${"mesa"}/lib/modules/dri" + else "" + } + + exec ${"slim"}/bin/slim + ''; + + s14 = '' + Escaping of ' followed by ': ''' + Escaping of $ followed by {: ''${ + And finally to interpret \n etc. as in a string: ''\n, ''\r, ''\t. + ''; + + # Regression test: string interpolation in '${x}' should work, but didn't. + s15 = let x = "bla"; in '' + foo + '${x}' + bar + ''; + + # Regression test: accept $'. + s16 = '' + cut -d $'\t' -f 1 + ''; + + # Accept dollars at end of strings + s17 = ''ending dollar $'' + ''$'' + "\n"; + +in s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 + s16 + s17 diff --git a/nix-js/tests/lang/eval-okay-inherit-attr-pos.exp b/nix-js/tests/lang/eval-okay-inherit-attr-pos.exp new file mode 100644 index 0000000..e87d037 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-inherit-attr-pos.exp @@ -0,0 +1 @@ +[ { column = 17; file = "/pwd/lang/eval-okay-inherit-attr-pos.nix"; line = 4; } { column = 19; file = "/pwd/lang/eval-okay-inherit-attr-pos.nix"; line = 4; } { column = 21; file = "/pwd/lang/eval-okay-inherit-attr-pos.nix"; line = 5; } { column = 23; file = "/pwd/lang/eval-okay-inherit-attr-pos.nix"; line = 5; } ] diff --git a/nix-js/tests/lang/eval-okay-inherit-attr-pos.nix b/nix-js/tests/lang/eval-okay-inherit-attr-pos.nix new file mode 100644 index 0000000..c162d11 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-inherit-attr-pos.nix @@ -0,0 +1,12 @@ +let + d = 0; + x = 1; + y = { inherit d x; }; + z = { inherit (y) d x; }; +in +[ + (builtins.unsafeGetAttrPos "d" y) + (builtins.unsafeGetAttrPos "x" y) + (builtins.unsafeGetAttrPos "d" z) + (builtins.unsafeGetAttrPos "x" z) +] diff --git a/nix-js/tests/lang/eval-okay-inherit-from.err.exp b/nix-js/tests/lang/eval-okay-inherit-from.err.exp new file mode 100644 index 0000000..3227501 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-inherit-from.err.exp @@ -0,0 +1 @@ +trace: used diff --git a/nix-js/tests/lang/eval-okay-inherit-from.exp b/nix-js/tests/lang/eval-okay-inherit-from.exp new file mode 100644 index 0000000..024daff --- /dev/null +++ b/nix-js/tests/lang/eval-okay-inherit-from.exp @@ -0,0 +1 @@ +[ 1 2 { __overrides = { y = { d = [ ]; }; }; c = [ ]; d = 4; x = { c = [ ]; }; y = «repeated»; } { inner = { c = 3; d = 4; }; } ] diff --git a/nix-js/tests/lang/eval-okay-inherit-from.nix b/nix-js/tests/lang/eval-okay-inherit-from.nix new file mode 100644 index 0000000..1a0980a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-inherit-from.nix @@ -0,0 +1,33 @@ +let + inherit + (builtins.trace "used" { + a = 1; + b = 2; + }) + a + b + ; + x.c = 3; + y.d = 4; + + merged = { + inner = { + inherit (y) d; + }; + + inner = { + inherit (x) c; + }; + }; +in +[ + a + b + rec { + x.c = [ ]; + inherit (x) c; + inherit (y) d; + __overrides.y.d = [ ]; + } + merged +] diff --git a/nix-js/tests/lang/eval-okay-intersectAttrs.exp b/nix-js/tests/lang/eval-okay-intersectAttrs.exp new file mode 100644 index 0000000..50445bc --- /dev/null +++ b/nix-js/tests/lang/eval-okay-intersectAttrs.exp @@ -0,0 +1 @@ +[ { } { a = 1; } { a = 1; } { a = "a"; } { m = 1; } { m = "m"; } { n = 1; } { n = "n"; } { n = 1; p = 2; } { n = "n"; p = "p"; } { n = 1; p = 2; } { n = "n"; p = "p"; } { a = "a"; b = "b"; c = "c"; d = "d"; e = "e"; f = "f"; g = "g"; h = "h"; i = "i"; j = "j"; k = "k"; l = "l"; m = "m"; n = "n"; o = "o"; p = "p"; q = "q"; r = "r"; s = "s"; t = "t"; u = "u"; v = "v"; w = "w"; x = "x"; y = "y"; z = "z"; } true ] diff --git a/nix-js/tests/lang/eval-okay-intersectAttrs.nix b/nix-js/tests/lang/eval-okay-intersectAttrs.nix new file mode 100644 index 0000000..bf4d58a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-intersectAttrs.nix @@ -0,0 +1,73 @@ +let + alphabet = { + a = "a"; + b = "b"; + c = "c"; + d = "d"; + e = "e"; + f = "f"; + g = "g"; + h = "h"; + i = "i"; + j = "j"; + k = "k"; + l = "l"; + m = "m"; + n = "n"; + o = "o"; + p = "p"; + q = "q"; + r = "r"; + s = "s"; + t = "t"; + u = "u"; + v = "v"; + w = "w"; + x = "x"; + y = "y"; + z = "z"; + }; + foo = { + inherit (alphabet) + f + o + b + a + r + z + q + u + x + ; + aa = throw "aa"; + }; + alphabetFail = builtins.mapAttrs throw alphabet; +in +[ + (builtins.intersectAttrs { a = abort "l1"; } { b = abort "r1"; }) + (builtins.intersectAttrs { a = abort "l2"; } { a = 1; }) + (builtins.intersectAttrs alphabetFail { a = 1; }) + (builtins.intersectAttrs { a = abort "laa"; } alphabet) + (builtins.intersectAttrs alphabetFail { m = 1; }) + (builtins.intersectAttrs { m = abort "lam"; } alphabet) + (builtins.intersectAttrs alphabetFail { n = 1; }) + (builtins.intersectAttrs { n = abort "lan"; } alphabet) + (builtins.intersectAttrs alphabetFail { + n = 1; + p = 2; + }) + (builtins.intersectAttrs { + n = abort "lan2"; + p = abort "lap"; + } alphabet) + (builtins.intersectAttrs alphabetFail { + n = 1; + p = 2; + }) + (builtins.intersectAttrs { + n = abort "lan2"; + p = abort "lap"; + } alphabet) + (builtins.intersectAttrs alphabetFail alphabet) + (builtins.intersectAttrs alphabet foo == builtins.intersectAttrs foo alphabet) +] diff --git a/nix-js/tests/lang/eval-okay-let.exp b/nix-js/tests/lang/eval-okay-let.exp new file mode 100644 index 0000000..14e24d4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-let.exp @@ -0,0 +1 @@ +"foobar" diff --git a/nix-js/tests/lang/eval-okay-let.nix b/nix-js/tests/lang/eval-okay-let.nix new file mode 100644 index 0000000..fe118c5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-let.nix @@ -0,0 +1,5 @@ +let { + x = "foo"; + y = "bar"; + body = x + y; +} diff --git a/nix-js/tests/lang/eval-okay-list.exp b/nix-js/tests/lang/eval-okay-list.exp new file mode 100644 index 0000000..f784f26 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-list.exp @@ -0,0 +1 @@ +"foobarblatest" diff --git a/nix-js/tests/lang/eval-okay-list.nix b/nix-js/tests/lang/eval-okay-list.nix new file mode 100644 index 0000000..b5045a7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-list.nix @@ -0,0 +1,12 @@ +with import ./lib.nix; + +let { + + body = concat [ + "foo" + "bar" + "bla" + "test" + ]; + +} diff --git a/nix-js/tests/lang/eval-okay-listtoattrs.exp b/nix-js/tests/lang/eval-okay-listtoattrs.exp new file mode 100644 index 0000000..74abef7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-listtoattrs.exp @@ -0,0 +1 @@ +"AAbar" diff --git a/nix-js/tests/lang/eval-okay-listtoattrs.nix b/nix-js/tests/lang/eval-okay-listtoattrs.nix new file mode 100644 index 0000000..1de9d6d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-listtoattrs.nix @@ -0,0 +1,24 @@ +# this test shows how to use listToAttrs and that evaluation is still lazy (throw isn't called) +with import ./lib.nix; + +let + asi = name: value: { inherit name value; }; + list = [ + (asi "a" "A") + (asi "b" "B") + ]; + a = builtins.listToAttrs list; + b = builtins.listToAttrs (list ++ list); + r = builtins.listToAttrs [ + (asi "result" [ + a + b + ]) + (asi "throw" (throw "this should not be thrown")) + ]; + x = builtins.listToAttrs [ + (asi "foo" "bar") + (asi "foo" "bla") + ]; +in +concat (map (x: x.a) r.result) + x.foo diff --git a/nix-js/tests/lang/eval-okay-logic.exp b/nix-js/tests/lang/eval-okay-logic.exp new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-logic.exp @@ -0,0 +1 @@ +1 diff --git a/nix-js/tests/lang/eval-okay-logic.nix b/nix-js/tests/lang/eval-okay-logic.nix new file mode 100644 index 0000000..55cd2fc --- /dev/null +++ b/nix-js/tests/lang/eval-okay-logic.nix @@ -0,0 +1,2 @@ +assert !false && (true || false) -> true; +1 diff --git a/nix-js/tests/lang/eval-okay-map.exp b/nix-js/tests/lang/eval-okay-map.exp new file mode 100644 index 0000000..dbb64f7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-map.exp @@ -0,0 +1 @@ +"foobarblabarxyzzybar" diff --git a/nix-js/tests/lang/eval-okay-map.nix b/nix-js/tests/lang/eval-okay-map.nix new file mode 100644 index 0000000..22059f3 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-map.nix @@ -0,0 +1,9 @@ +with import ./lib.nix; + +concat ( + map (x: x + "bar") [ + "foo" + "bla" + "xyzzy" + ] +) diff --git a/nix-js/tests/lang/eval-okay-mapattrs.exp b/nix-js/tests/lang/eval-okay-mapattrs.exp new file mode 100644 index 0000000..3f113f1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-mapattrs.exp @@ -0,0 +1 @@ +{ x = "x-foo"; y = "y-bar"; } diff --git a/nix-js/tests/lang/eval-okay-mapattrs.nix b/nix-js/tests/lang/eval-okay-mapattrs.nix new file mode 100644 index 0000000..c1182d1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-mapattrs.nix @@ -0,0 +1,6 @@ +with import ./lib.nix; + +builtins.mapAttrs (name: value: name + "-" + value) { + x = "foo"; + y = "bar"; +} diff --git a/nix-js/tests/lang/eval-okay-merge-dynamic-attrs.exp b/nix-js/tests/lang/eval-okay-merge-dynamic-attrs.exp new file mode 100644 index 0000000..157d677 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-merge-dynamic-attrs.exp @@ -0,0 +1 @@ +{ set1 = { a = 1; b = 2; }; set2 = { a = 1; b = 2; }; set3 = { a = 1; b = 2; }; set4 = { a = 1; b = 2; }; } diff --git a/nix-js/tests/lang/eval-okay-merge-dynamic-attrs.nix b/nix-js/tests/lang/eval-okay-merge-dynamic-attrs.nix new file mode 100644 index 0000000..8ee8e50 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-merge-dynamic-attrs.nix @@ -0,0 +1,21 @@ +{ + set1 = { + a = 1; + }; + set1 = { + "${"b" + ""}" = 2; + }; + + set2 = { + "${"b" + ""}" = 2; + }; + set2 = { + a = 1; + }; + + set3.a = 1; + set3."${"b" + ""}" = 2; + + set4."${"b" + ""}" = 2; + set4.a = 1; +} diff --git a/nix-js/tests/lang/eval-okay-nested-with.exp b/nix-js/tests/lang/eval-okay-nested-with.exp new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-nested-with.exp @@ -0,0 +1 @@ +2 diff --git a/nix-js/tests/lang/eval-okay-nested-with.nix b/nix-js/tests/lang/eval-okay-nested-with.nix new file mode 100644 index 0000000..ee069ea --- /dev/null +++ b/nix-js/tests/lang/eval-okay-nested-with.nix @@ -0,0 +1 @@ +with { x = 1; }; with { x = 2; }; x diff --git a/nix-js/tests/lang/eval-okay-new-let.exp b/nix-js/tests/lang/eval-okay-new-let.exp new file mode 100644 index 0000000..f98b388 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-new-let.exp @@ -0,0 +1 @@ +"xyzzyfoobar" diff --git a/nix-js/tests/lang/eval-okay-new-let.nix b/nix-js/tests/lang/eval-okay-new-let.nix new file mode 100644 index 0000000..1a938ce --- /dev/null +++ b/nix-js/tests/lang/eval-okay-new-let.nix @@ -0,0 +1,16 @@ +let + + f = + z: + + let + x = "foo"; + y = "bar"; + body = 1; # compat test + in + z + x + y; + + arg = "xyzzy"; + +in +f arg diff --git a/nix-js/tests/lang/eval-okay-null-dynamic-attrs.exp b/nix-js/tests/lang/eval-okay-null-dynamic-attrs.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-null-dynamic-attrs.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-null-dynamic-attrs.nix b/nix-js/tests/lang/eval-okay-null-dynamic-attrs.nix new file mode 100644 index 0000000..76286b6 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-null-dynamic-attrs.nix @@ -0,0 +1 @@ +{ ${null} = true; } == { } diff --git a/nix-js/tests/lang/eval-okay-overrides.exp b/nix-js/tests/lang/eval-okay-overrides.exp new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-overrides.exp @@ -0,0 +1 @@ +2 diff --git a/nix-js/tests/lang/eval-okay-overrides.nix b/nix-js/tests/lang/eval-okay-overrides.nix new file mode 100644 index 0000000..1c0d5d7 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-overrides.nix @@ -0,0 +1,13 @@ +let + + overrides = { + a = 2; + b = 3; + }; + +in +(rec { + __overrides = overrides; + x = a; + a = 1; +}).x diff --git a/nix-js/tests/lang/eval-okay-parse-flake-ref.exp b/nix-js/tests/lang/eval-okay-parse-flake-ref.exp new file mode 100644 index 0000000..fc17ba0 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-parse-flake-ref.exp @@ -0,0 +1 @@ +{ dir = "lib"; owner = "NixOS"; ref = "23.05"; repo = "nixpkgs"; type = "github"; } diff --git a/nix-js/tests/lang/eval-okay-parse-flake-ref.nix b/nix-js/tests/lang/eval-okay-parse-flake-ref.nix new file mode 100644 index 0000000..404c5df --- /dev/null +++ b/nix-js/tests/lang/eval-okay-parse-flake-ref.nix @@ -0,0 +1 @@ +builtins.parseFlakeRef "github:NixOS/nixpkgs/23.05?dir=lib" diff --git a/nix-js/tests/lang/eval-okay-partition.exp b/nix-js/tests/lang/eval-okay-partition.exp new file mode 100644 index 0000000..cd8b8b0 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-partition.exp @@ -0,0 +1 @@ +{ right = [ 0 2 4 6 8 10 100 102 104 106 108 110 ]; wrong = [ 1 3 5 7 9 101 103 105 107 109 ]; } diff --git a/nix-js/tests/lang/eval-okay-partition.nix b/nix-js/tests/lang/eval-okay-partition.nix new file mode 100644 index 0000000..b9566ed --- /dev/null +++ b/nix-js/tests/lang/eval-okay-partition.nix @@ -0,0 +1,8 @@ +with import ./lib.nix; + +builtins.partition (x: x / 2 * 2 == x) ( + builtins.concatLists [ + (range 0 10) + (range 100 110) + ] +) diff --git a/nix-js/tests/lang/eval-okay-path-string-interpolation.exp b/nix-js/tests/lang/eval-okay-path-string-interpolation.exp new file mode 100644 index 0000000..5b8ea02 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-path-string-interpolation.exp @@ -0,0 +1 @@ +{ absolute = /foo; expr = /pwd/lang/foo/bar; home = /fake-home/foo; notfirst = /pwd/lang/bar/foo; simple = /pwd/lang/foo; slashes = /foo/bar; surrounded = /pwd/lang/a-foo-b; } diff --git a/nix-js/tests/lang/eval-okay-path-string-interpolation.nix b/nix-js/tests/lang/eval-okay-path-string-interpolation.nix new file mode 100644 index 0000000..497d7c1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-path-string-interpolation.nix @@ -0,0 +1,12 @@ +let + foo = "foo"; +in +{ + simple = ./${foo}; + surrounded = ./a-${foo}-b; + absolute = /${foo}; + expr = ./${foo + "/bar"}; + home = ~/${foo}; + notfirst = ./bar/${foo}; + slashes = /${foo}/${"bar"}; +} diff --git a/nix-js/tests/lang/eval-okay-path.exp b/nix-js/tests/lang/eval-okay-path.exp new file mode 100644 index 0000000..635e224 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-path.exp @@ -0,0 +1 @@ +[ "/nix/store/ya937r4ydw0l6kayq8jkyqaips9c75jm-output" "/nix/store/m7y372g6jb0g4hh1dzmj847rd356fhnz-output" ] diff --git a/nix-js/tests/lang/eval-okay-path.nix b/nix-js/tests/lang/eval-okay-path.nix new file mode 100644 index 0000000..b8b48aa --- /dev/null +++ b/nix-js/tests/lang/eval-okay-path.nix @@ -0,0 +1,15 @@ +[ + (builtins.path { + path = ./.; + filter = path: _: baseNameOf path == "data"; + recursive = true; + sha256 = "1yhm3gwvg5a41yylymgblsclk95fs6jy72w0wv925mmidlhcq4sw"; + name = "output"; + }) + (builtins.path { + path = ./data; + recursive = false; + sha256 = "0k4lwj58f2w5yh92ilrwy9917pycipbrdrr13vbb3yd02j09vfxm"; + name = "output"; + }) +] diff --git a/nix-js/tests/lang/eval-okay-pathexists.exp b/nix-js/tests/lang/eval-okay-pathexists.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-pathexists.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-pathexists.nix b/nix-js/tests/lang/eval-okay-pathexists.nix new file mode 100644 index 0000000..022b22f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-pathexists.nix @@ -0,0 +1,34 @@ +builtins.pathExists (./lib.nix) +&& builtins.pathExists (builtins.toPath ./lib.nix) +&& builtins.pathExists (builtins.toString ./lib.nix) +&& !builtins.pathExists (builtins.toString ./lib.nix + "/") +&& !builtins.pathExists (builtins.toString ./lib.nix + "/.") +# FIXME +# && !builtins.pathExists (builtins.toString ./lib.nix + "/..") +# && !builtins.pathExists (builtins.toString ./lib.nix + "/a/..") +# && !builtins.pathExists (builtins.toString ./lib.nix + "/../lib.nix") +&& !builtins.pathExists (builtins.toString ./lib.nix + "/./") +&& !builtins.pathExists (builtins.toString ./lib.nix + "/./.") +&& builtins.pathExists (builtins.toString ./.. + "/lang/lib.nix") +&& !builtins.pathExists (builtins.toString ./.. + "lang/lib.nix") +&& builtins.pathExists (builtins.toString ./. + "/../lang/lib.nix") +&& builtins.pathExists (builtins.toString ./. + "/../lang/./lib.nix") +&& builtins.pathExists (builtins.toString ./.) +&& builtins.pathExists (builtins.toString ./. + "/") +&& builtins.pathExists (builtins.toString ./. + "/../lang") +&& builtins.pathExists (builtins.toString ./. + "/../lang/") +&& builtins.pathExists (builtins.toString ./. + "/../lang/.") +&& builtins.pathExists (builtins.toString ./. + "/../lang/./") +&& builtins.pathExists (builtins.toString ./. + "/../lang//./") +&& builtins.pathExists (builtins.toString ./. + "/../lang/..") +&& builtins.pathExists (builtins.toString ./. + "/../lang/../") +&& builtins.pathExists (builtins.toString ./. + "/../lang/..//") +&& builtins.pathExists (builtins.toPath (builtins.toString ./lib.nix)) +&& !builtins.pathExists (builtins.toPath (builtins.toString ./bla.nix)) +&& builtins.pathExists (builtins.toPath { __toString = x: builtins.toString ./lib.nix; }) +&& builtins.pathExists (builtins.toPath { outPath = builtins.toString ./lib.nix; }) +&& builtins.pathExists ./lib.nix +&& !builtins.pathExists ./bla.nix +&& builtins.pathExists ./symlink-resolution/foo/overlays/overlay.nix +&& builtins.pathExists ./symlink-resolution/broken +&& builtins.pathExists (builtins.toString ./symlink-resolution/foo/overlays + "/.") diff --git a/nix-js/tests/lang/eval-okay-patterns.exp b/nix-js/tests/lang/eval-okay-patterns.exp new file mode 100644 index 0000000..a430401 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-patterns.exp @@ -0,0 +1 @@ +"abcxyzDDDDEFijk" diff --git a/nix-js/tests/lang/eval-okay-patterns.nix b/nix-js/tests/lang/eval-okay-patterns.nix new file mode 100644 index 0000000..b92b232 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-patterns.nix @@ -0,0 +1,59 @@ +let + + f = + args@{ + x, + y, + z, + }: + x + args.y + z; + + g = + { + x, + y, + z, + }@args: + f args; + + h = + { + x ? "d", + y ? x, + z ? args.x, + }@args: + x + y + z; + + j = + { + x, + y, + z, + ... + }: + x + y + z; + +in +f { + x = "a"; + y = "b"; + z = "c"; +} ++ g { + x = "x"; + y = "y"; + z = "z"; +} ++ h { x = "D"; } ++ h { + x = "D"; + y = "E"; + z = "F"; +} ++ j { + x = "i"; + y = "j"; + z = "k"; + bla = "bla"; + foo = "bar"; +} diff --git a/nix-js/tests/lang/eval-okay-print.err.exp b/nix-js/tests/lang/eval-okay-print.err.exp new file mode 100644 index 0000000..80aa17c --- /dev/null +++ b/nix-js/tests/lang/eval-okay-print.err.exp @@ -0,0 +1 @@ +trace: [ «thunk» ] diff --git a/nix-js/tests/lang/eval-okay-print.exp b/nix-js/tests/lang/eval-okay-print.exp new file mode 100644 index 0000000..0d960fb --- /dev/null +++ b/nix-js/tests/lang/eval-okay-print.exp @@ -0,0 +1 @@ +[ null [ [ «repeated» ] ] ] diff --git a/nix-js/tests/lang/eval-okay-print.nix b/nix-js/tests/lang/eval-okay-print.nix new file mode 100644 index 0000000..1ad4656 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-print.nix @@ -0,0 +1,15 @@ +with builtins; +trace + [ (1 + 1) ] + [ + null + toString + (deepSeq "x") + (a: a) + ( + let + x = [ x ]; + in + x + ) + ] diff --git a/nix-js/tests/lang/eval-okay-readDir.exp b/nix-js/tests/lang/eval-okay-readDir.exp new file mode 100644 index 0000000..6413f6d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-readDir.exp @@ -0,0 +1 @@ +{ bar = "regular"; foo = "directory"; ldir = "symlink"; linked = "symlink"; } diff --git a/nix-js/tests/lang/eval-okay-readDir.nix b/nix-js/tests/lang/eval-okay-readDir.nix new file mode 100644 index 0000000..a7ec929 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-readDir.nix @@ -0,0 +1 @@ +builtins.readDir ./readDir diff --git a/nix-js/tests/lang/eval-okay-readFileType.exp b/nix-js/tests/lang/eval-okay-readFileType.exp new file mode 100644 index 0000000..6413f6d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-readFileType.exp @@ -0,0 +1 @@ +{ bar = "regular"; foo = "directory"; ldir = "symlink"; linked = "symlink"; } diff --git a/nix-js/tests/lang/eval-okay-readFileType.nix b/nix-js/tests/lang/eval-okay-readFileType.nix new file mode 100644 index 0000000..79beb9a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-readFileType.nix @@ -0,0 +1,6 @@ +{ + bar = builtins.readFileType ./readDir/bar; + foo = builtins.readFileType ./readDir/foo; + linked = builtins.readFileType ./readDir/linked; + ldir = builtins.readFileType ./readDir/ldir; +} diff --git a/nix-js/tests/lang/eval-okay-readfile.exp b/nix-js/tests/lang/eval-okay-readfile.exp new file mode 100644 index 0000000..a2c87d0 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-readfile.exp @@ -0,0 +1 @@ +"builtins.readFile ./eval-okay-readfile.nix\n" diff --git a/nix-js/tests/lang/eval-okay-readfile.nix b/nix-js/tests/lang/eval-okay-readfile.nix new file mode 100644 index 0000000..82f7cb1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-readfile.nix @@ -0,0 +1 @@ +builtins.readFile ./eval-okay-readfile.nix diff --git a/nix-js/tests/lang/eval-okay-redefine-builtin.exp b/nix-js/tests/lang/eval-okay-redefine-builtin.exp new file mode 100644 index 0000000..c508d53 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-redefine-builtin.exp @@ -0,0 +1 @@ +false diff --git a/nix-js/tests/lang/eval-okay-redefine-builtin.nix b/nix-js/tests/lang/eval-okay-redefine-builtin.nix new file mode 100644 index 0000000..ec95ffa --- /dev/null +++ b/nix-js/tests/lang/eval-okay-redefine-builtin.nix @@ -0,0 +1,4 @@ +let + throw = abort "Error!"; +in +(builtins.tryEval ).success diff --git a/nix-js/tests/lang/eval-okay-regex-match.exp b/nix-js/tests/lang/eval-okay-regex-match.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regex-match.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-regex-match.nix b/nix-js/tests/lang/eval-okay-regex-match.nix new file mode 100644 index 0000000..54b9959 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regex-match.nix @@ -0,0 +1,41 @@ +with builtins; + +let + + matches = pat: s: match pat s != null; + + splitFN = match "((.*)/)?([^/]*)\\.(nix|cc)"; + +in + +assert matches "foobar" "foobar"; +assert matches "fo*" "f"; +assert !matches "fo+" "f"; +assert matches "fo*" "fo"; +assert matches "fo*" "foo"; +assert matches "fo+" "foo"; +assert matches "fo{1,2}" "foo"; +assert !matches "fo{1,2}" "fooo"; +assert !matches "fo*" "foobar"; +assert matches "[[:space:]]+([^[:space:]]+)[[:space:]]+" " foo "; +assert !matches "[[:space:]]+([[:upper:]]+)[[:space:]]+" " foo "; + +assert match "(.*)\\.nix" "foobar.nix" == [ "foobar" ]; +assert match "[[:space:]]+([[:upper:]]+)[[:space:]]+" " FOO " == [ "FOO" ]; + +assert + splitFN "/path/to/foobar.nix" == [ + "/path/to/" + "/path/to" + "foobar" + "nix" + ]; +assert + splitFN "foobar.cc" == [ + null + null + "foobar" + "cc" + ]; + +true diff --git a/nix-js/tests/lang/eval-okay-regex-split.exp b/nix-js/tests/lang/eval-okay-regex-split.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regex-split.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-regex-split.nix b/nix-js/tests/lang/eval-okay-regex-split.nix new file mode 100644 index 0000000..8ab3e60 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regex-split.nix @@ -0,0 +1,197 @@ +with builtins; + +# Non capturing regex returns empty lists +assert + split "foobar" "foobar" == [ + "" + [ ] + "" + ]; +assert + split "fo*" "f" == [ + "" + [ ] + "" + ]; +assert split "fo+" "f" == [ "f" ]; +assert + split "fo*" "fo" == [ + "" + [ ] + "" + ]; +assert + split "fo*" "foo" == [ + "" + [ ] + "" + ]; +assert + split "fo+" "foo" == [ + "" + [ ] + "" + ]; +assert + split "fo{1,2}" "foo" == [ + "" + [ ] + "" + ]; +assert + split "fo{1,2}" "fooo" == [ + "" + [ ] + "o" + ]; +assert + split "fo*" "foobar" == [ + "" + [ ] + "bar" + ]; + +# Capturing regex returns a list of sub-matches +assert + split "(fo*)" "f" == [ + "" + [ "f" ] + "" + ]; +assert split "(fo+)" "f" == [ "f" ]; +assert + split "(fo*)" "fo" == [ + "" + [ "fo" ] + "" + ]; +assert + split "(f)(o*)" "f" == [ + "" + [ + "f" + "" + ] + "" + ]; +assert + split "(f)(o*)" "foo" == [ + "" + [ + "f" + "oo" + ] + "" + ]; +assert + split "(fo+)" "foo" == [ + "" + [ "foo" ] + "" + ]; +assert + split "(fo{1,2})" "foo" == [ + "" + [ "foo" ] + "" + ]; +assert + split "(fo{1,2})" "fooo" == [ + "" + [ "foo" ] + "o" + ]; +assert + split "(fo*)" "foobar" == [ + "" + [ "foo" ] + "bar" + ]; + +# Matches are greedy. +assert + split "(o+)" "oooofoooo" == [ + "" + [ "oooo" ] + "f" + [ "oooo" ] + "" + ]; + +# Matches multiple times. +assert + split "(b)" "foobarbaz" == [ + "foo" + [ "b" ] + "ar" + [ "b" ] + "az" + ]; + +# Split large strings containing newlines. null are inserted when a +# pattern within the current did not match anything. +assert + split "[[:space:]]+|([',.!?])" '' + Nix Rocks! + That's why I use it. + '' == [ + "Nix" + [ null ] + "Rocks" + [ "!" ] + "" + [ null ] + "That" + [ "'" ] + "s" + [ null ] + "why" + [ null ] + "I" + [ null ] + "use" + [ null ] + "it" + [ "." ] + "" + [ null ] + "" + ]; + +# Documentation examples +assert + split "(a)b" "abc" == [ + "" + [ "a" ] + "c" + ]; +assert + split "([ac])" "abc" == [ + "" + [ "a" ] + "b" + [ "c" ] + "" + ]; +assert + split "(a)|(c)" "abc" == [ + "" + [ + "a" + null + ] + "b" + [ + null + "c" + ] + "" + ]; +assert + split "([[:upper:]]+)" " FOO " == [ + " " + [ "FOO" ] + " " + ]; + +true diff --git a/nix-js/tests/lang/eval-okay-regression-20220122.exp b/nix-js/tests/lang/eval-okay-regression-20220122.exp new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regression-20220122.exp @@ -0,0 +1 @@ +3 diff --git a/nix-js/tests/lang/eval-okay-regression-20220122.nix b/nix-js/tests/lang/eval-okay-regression-20220122.nix new file mode 100644 index 0000000..694e9a1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regression-20220122.nix @@ -0,0 +1 @@ +((_: _) 1) + ((__: __) 2) diff --git a/nix-js/tests/lang/eval-okay-regression-20220125.exp b/nix-js/tests/lang/eval-okay-regression-20220125.exp new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regression-20220125.exp @@ -0,0 +1 @@ +3 diff --git a/nix-js/tests/lang/eval-okay-regression-20220125.nix b/nix-js/tests/lang/eval-okay-regression-20220125.nix new file mode 100644 index 0000000..1c4b8e0 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regression-20220125.nix @@ -0,0 +1 @@ +((__curPosFoo: __curPosFoo) 1) + ((__curPosBar: __curPosBar) 2) diff --git a/nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.exp b/nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.exp new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.exp @@ -0,0 +1 @@ +6 diff --git a/nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.nix b/nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.nix new file mode 100644 index 0000000..e92ae81 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-regrettable-rec-attrset-merge.nix @@ -0,0 +1,10 @@ +# This is for backwards compatibility, not because we like it. +# See https://github.com/NixOS/nix/issues/9020. +{ + a = rec { + b = c + 1; + d = 2; + }; + a.c = d + 3; +} +.a.b diff --git a/nix-js/tests/lang/eval-okay-remove.exp b/nix-js/tests/lang/eval-okay-remove.exp new file mode 100644 index 0000000..8d38505 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-remove.exp @@ -0,0 +1 @@ +456 diff --git a/nix-js/tests/lang/eval-okay-remove.nix b/nix-js/tests/lang/eval-okay-remove.nix new file mode 100644 index 0000000..a7ee3a0 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-remove.nix @@ -0,0 +1,8 @@ +let { + attrs = { + x = 123; + y = 456; + }; + + body = (removeAttrs attrs [ "x" ]).y; +} diff --git a/nix-js/tests/lang/eval-okay-repeated-empty-attrs.exp b/nix-js/tests/lang/eval-okay-repeated-empty-attrs.exp new file mode 100644 index 0000000..d21e6db --- /dev/null +++ b/nix-js/tests/lang/eval-okay-repeated-empty-attrs.exp @@ -0,0 +1 @@ +[ { } { } ] diff --git a/nix-js/tests/lang/eval-okay-repeated-empty-attrs.nix b/nix-js/tests/lang/eval-okay-repeated-empty-attrs.nix new file mode 100644 index 0000000..0749e21 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-repeated-empty-attrs.nix @@ -0,0 +1,5 @@ +# Tests that empty attribute sets are not printed as `«repeated»`. +[ + { } + { } +] diff --git a/nix-js/tests/lang/eval-okay-repeated-empty-list.exp b/nix-js/tests/lang/eval-okay-repeated-empty-list.exp new file mode 100644 index 0000000..701fc7e --- /dev/null +++ b/nix-js/tests/lang/eval-okay-repeated-empty-list.exp @@ -0,0 +1 @@ +[ [ ] [ ] ] diff --git a/nix-js/tests/lang/eval-okay-repeated-empty-list.nix b/nix-js/tests/lang/eval-okay-repeated-empty-list.nix new file mode 100644 index 0000000..7e24fe8 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-repeated-empty-list.nix @@ -0,0 +1,4 @@ +[ + [ ] + [ ] +] diff --git a/nix-js/tests/lang/eval-okay-replacestrings.exp b/nix-js/tests/lang/eval-okay-replacestrings.exp new file mode 100644 index 0000000..eac67c5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-replacestrings.exp @@ -0,0 +1 @@ +[ "faabar" "fbar" "fubar" "faboor" "fubar" "XaXbXcX" "X" "a_b" "fubar" ] diff --git a/nix-js/tests/lang/eval-okay-replacestrings.nix b/nix-js/tests/lang/eval-okay-replacestrings.nix new file mode 100644 index 0000000..81a932a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-replacestrings.nix @@ -0,0 +1,13 @@ +with builtins; + +[ + (replaceStrings [ "o" ] [ "a" ] "foobar") + (replaceStrings [ "o" ] [ "" ] "foobar") + (replaceStrings [ "oo" ] [ "u" ] "foobar") + (replaceStrings [ "oo" "a" ] [ "a" "oo" ] "foobar") + (replaceStrings [ "oo" "oo" ] [ "u" "i" ] "foobar") + (replaceStrings [ "" ] [ "X" ] "abc") + (replaceStrings [ "" ] [ "X" ] "") + (replaceStrings [ "-" ] [ "_" ] "a-b") + (replaceStrings [ "oo" "XX" ] [ "u" (throw "unreachable") ] "foobar") +] diff --git a/nix-js/tests/lang/eval-okay-scope-1.exp b/nix-js/tests/lang/eval-okay-scope-1.exp new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-1.exp @@ -0,0 +1 @@ +3 diff --git a/nix-js/tests/lang/eval-okay-scope-1.nix b/nix-js/tests/lang/eval-okay-scope-1.nix new file mode 100644 index 0000000..b7bbcc4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-1.nix @@ -0,0 +1,13 @@ +( + ( + { x }: + x: + + { + x = 1; + y = x; + } + ) + { x = 2; } + 3 +).y diff --git a/nix-js/tests/lang/eval-okay-scope-2.exp b/nix-js/tests/lang/eval-okay-scope-2.exp new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-2.exp @@ -0,0 +1 @@ +1 diff --git a/nix-js/tests/lang/eval-okay-scope-2.nix b/nix-js/tests/lang/eval-okay-scope-2.nix new file mode 100644 index 0000000..54f7ec3 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-2.nix @@ -0,0 +1,12 @@ +( + ( + x: + { x }: + rec { + x = 1; + y = x; + } + ) + 2 + { x = 3; } +).y diff --git a/nix-js/tests/lang/eval-okay-scope-3.exp b/nix-js/tests/lang/eval-okay-scope-3.exp new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-3.exp @@ -0,0 +1 @@ +4 diff --git a/nix-js/tests/lang/eval-okay-scope-3.nix b/nix-js/tests/lang/eval-okay-scope-3.nix new file mode 100644 index 0000000..6a77583 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-3.nix @@ -0,0 +1,13 @@ +( + ( + x: as: + { x }: + rec { + inherit (as) x; + y = x; + } + ) + 2 + { x = 4; } + { x = 3; } +).y diff --git a/nix-js/tests/lang/eval-okay-scope-4.exp b/nix-js/tests/lang/eval-okay-scope-4.exp new file mode 100644 index 0000000..00ff03a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-4.exp @@ -0,0 +1 @@ +"ccdd" diff --git a/nix-js/tests/lang/eval-okay-scope-4.nix b/nix-js/tests/lang/eval-okay-scope-4.nix new file mode 100644 index 0000000..ccae856 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-4.nix @@ -0,0 +1,15 @@ +let { + + x = "a"; + y = "b"; + + f = + { + x ? y, + y ? x, + }: + x + y; + + body = f { x = "c"; } + f { y = "d"; }; + +} diff --git a/nix-js/tests/lang/eval-okay-scope-6.exp b/nix-js/tests/lang/eval-okay-scope-6.exp new file mode 100644 index 0000000..00ff03a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-6.exp @@ -0,0 +1 @@ +"ccdd" diff --git a/nix-js/tests/lang/eval-okay-scope-6.nix b/nix-js/tests/lang/eval-okay-scope-6.nix new file mode 100644 index 0000000..be2cc31 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-6.nix @@ -0,0 +1,12 @@ +let { + + f = + { + x ? y, + y ? x, + }: + x + y; + + body = f { x = "c"; } + f { y = "d"; }; + +} diff --git a/nix-js/tests/lang/eval-okay-scope-7.exp b/nix-js/tests/lang/eval-okay-scope-7.exp new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-7.exp @@ -0,0 +1 @@ +1 diff --git a/nix-js/tests/lang/eval-okay-scope-7.nix b/nix-js/tests/lang/eval-okay-scope-7.nix new file mode 100644 index 0000000..91f22f5 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-scope-7.nix @@ -0,0 +1,7 @@ +rec { + inherit (x) y; + x = { + y = 1; + }; +} +.y diff --git a/nix-js/tests/lang/eval-okay-search-path.exp b/nix-js/tests/lang/eval-okay-search-path.exp new file mode 100644 index 0000000..4519bc4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-search-path.exp @@ -0,0 +1 @@ +"abccX" diff --git a/nix-js/tests/lang/eval-okay-search-path.nix b/nix-js/tests/lang/eval-okay-search-path.nix new file mode 100644 index 0000000..702e1b6 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-search-path.nix @@ -0,0 +1,21 @@ +with import ./lib.nix; +with builtins; + +assert isFunction (import ); + +assert length __nixPath == 5; +assert length (filter (x: baseNameOf x.path == "dir4") __nixPath) == 1; + +import ++ import ++ import ++ import ++ ( + let + __nixPath = [ + { path = ./dir2; } + { path = ./dir1; } + ]; + in + import +) diff --git a/nix-js/tests/lang/eval-okay-seq.exp b/nix-js/tests/lang/eval-okay-seq.exp new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-seq.exp @@ -0,0 +1 @@ +2 diff --git a/nix-js/tests/lang/eval-okay-seq.nix b/nix-js/tests/lang/eval-okay-seq.nix new file mode 100644 index 0000000..0a9a21c --- /dev/null +++ b/nix-js/tests/lang/eval-okay-seq.nix @@ -0,0 +1 @@ +builtins.seq 1 2 diff --git a/nix-js/tests/lang/eval-okay-sort.exp b/nix-js/tests/lang/eval-okay-sort.exp new file mode 100644 index 0000000..899119e --- /dev/null +++ b/nix-js/tests/lang/eval-okay-sort.exp @@ -0,0 +1 @@ +[ [ 42 77 147 249 483 526 ] [ 526 483 249 147 77 42 ] [ "bar" "fnord" "foo" "xyzzy" ] [ { key = 1; value = "foo"; } { key = 1; value = "fnord"; } { key = 2; value = "bar"; } ] [ [ ] [ ] [ 1 ] [ 1 4 ] [ 1 5 ] [ 1 6 ] [ 2 ] [ 2 3 ] [ 3 ] [ 3 ] ] ] diff --git a/nix-js/tests/lang/eval-okay-sort.nix b/nix-js/tests/lang/eval-okay-sort.nix new file mode 100644 index 0000000..412bda4 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-sort.nix @@ -0,0 +1,64 @@ +with builtins; + +[ + (sort lessThan [ + 483 + 249 + 526 + 147 + 42 + 77 + ]) + (sort (x: y: y < x) [ + 483 + 249 + 526 + 147 + 42 + 77 + ]) + (sort lessThan [ + "foo" + "bar" + "xyzzy" + "fnord" + ]) + (sort (x: y: x.key < y.key) [ + { + key = 1; + value = "foo"; + } + { + key = 2; + value = "bar"; + } + { + key = 1; + value = "fnord"; + } + ]) + (sort lessThan [ + [ + 1 + 6 + ] + [ ] + [ + 2 + 3 + ] + [ 3 ] + [ + 1 + 5 + ] + [ 2 ] + [ 1 ] + [ ] + [ + 1 + 4 + ] + [ 3 ] + ]) +] diff --git a/nix-js/tests/lang/eval-okay-splitversion.exp b/nix-js/tests/lang/eval-okay-splitversion.exp new file mode 100644 index 0000000..153ceb8 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-splitversion.exp @@ -0,0 +1 @@ +[ "1" "2" "3" ] diff --git a/nix-js/tests/lang/eval-okay-splitversion.nix b/nix-js/tests/lang/eval-okay-splitversion.nix new file mode 100644 index 0000000..9e5c99d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-splitversion.nix @@ -0,0 +1 @@ +builtins.splitVersion "1.2.3" diff --git a/nix-js/tests/lang/eval-okay-string.exp b/nix-js/tests/lang/eval-okay-string.exp new file mode 100644 index 0000000..63f650f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-string.exp @@ -0,0 +1 @@ +"foobar/a/b/c/d/foo/xyzzy/foo.txt/../foo/x/yescape: \"quote\" \n \\end\nof\nlinefoobarblaatfoo$bar$\"$\"$" diff --git a/nix-js/tests/lang/eval-okay-string.nix b/nix-js/tests/lang/eval-okay-string.nix new file mode 100644 index 0000000..d3b743f --- /dev/null +++ b/nix-js/tests/lang/eval-okay-string.nix @@ -0,0 +1,13 @@ +"foo" ++ "bar" ++ toString (/a/b + /c/d) ++ toString (/foo/bar + "/../xyzzy/." + "/foo.txt") ++ ("/../foo" + toString /x/y) ++ "escape: \"quote\" \n \\" ++ "end +of +line" ++ "foo${if true then "b${"a" + "r"}" else "xyzzy"}blaat" ++ "foo$bar" ++ "$\"$\"" ++ "$" diff --git a/nix-js/tests/lang/eval-okay-strings-as-attrs-names.exp b/nix-js/tests/lang/eval-okay-strings-as-attrs-names.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-strings-as-attrs-names.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-strings-as-attrs-names.nix b/nix-js/tests/lang/eval-okay-strings-as-attrs-names.nix new file mode 100644 index 0000000..158dc8e --- /dev/null +++ b/nix-js/tests/lang/eval-okay-strings-as-attrs-names.nix @@ -0,0 +1,18 @@ +let + + attr = { + "key 1" = "test"; + "key 2" = "caseok"; + }; + + t1 = builtins.getAttr "key 1" attr; + t2 = attr."key 2"; + t3 = attr ? "key 1"; + t4 = builtins.attrNames { inherit (attr) "key 1"; }; + + # This is permitted, but there is currently no way to reference this + # variable. + "foo bar" = 1; + +in +t1 == "test" && t2 == "caseok" && t3 == true && t4 == [ "key 1" ] diff --git a/nix-js/tests/lang/eval-okay-substring-context.exp b/nix-js/tests/lang/eval-okay-substring-context.exp new file mode 100644 index 0000000..2fe7f71 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-substring-context.exp @@ -0,0 +1 @@ +"okay" diff --git a/nix-js/tests/lang/eval-okay-substring-context.nix b/nix-js/tests/lang/eval-okay-substring-context.nix new file mode 100644 index 0000000..9e9d3a1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-substring-context.nix @@ -0,0 +1,16 @@ +with builtins; + +let + + s = "${builtins.derivation { + name = "test"; + builder = "/bin/sh"; + system = "x86_64-linux"; + }}"; + +in + +if getContext s == getContext "${substring 0 0 s + unsafeDiscardStringContext s}" then + "okay" +else + throw "empty substring should preserve context" diff --git a/nix-js/tests/lang/eval-okay-substring.exp b/nix-js/tests/lang/eval-okay-substring.exp new file mode 100644 index 0000000..f48b462 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-substring.exp @@ -0,0 +1 @@ +"ooxfoobarybarzobaabbc_bad" diff --git a/nix-js/tests/lang/eval-okay-substring.nix b/nix-js/tests/lang/eval-okay-substring.nix new file mode 100644 index 0000000..54c97e1 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-substring.nix @@ -0,0 +1,23 @@ +with builtins; + +let + + s = "foobar"; + +in + +substring 1 2 s ++ "x" ++ substring 0 (stringLength s) s ++ "y" ++ substring 3 100 s ++ "z" ++ substring 2 (sub (stringLength s) 3) s ++ "a" ++ substring 3 0 s ++ "b" ++ substring 3 1 s ++ "c" ++ substring 5 10 "perl" ++ "_" ++ substring 3 (-1) "tebbad" diff --git a/nix-js/tests/lang/eval-okay-symlink-resolution.exp b/nix-js/tests/lang/eval-okay-symlink-resolution.exp new file mode 100644 index 0000000..8b8441b --- /dev/null +++ b/nix-js/tests/lang/eval-okay-symlink-resolution.exp @@ -0,0 +1 @@ +"test" diff --git a/nix-js/tests/lang/eval-okay-symlink-resolution.nix b/nix-js/tests/lang/eval-okay-symlink-resolution.nix new file mode 100644 index 0000000..ffb1818 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-symlink-resolution.nix @@ -0,0 +1 @@ +import symlink-resolution/foo/overlays/overlay.nix diff --git a/nix-js/tests/lang/eval-okay-tail-call-1.nix b/nix-js/tests/lang/eval-okay-tail-call-1.nix new file mode 100644 index 0000000..d3ec0c9 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-tail-call-1.nix @@ -0,0 +1,4 @@ +let + f = n: if n == 100000 then n else f (n + 1); +in +f 0 diff --git a/nix-js/tests/lang/eval-okay-tojson.exp b/nix-js/tests/lang/eval-okay-tojson.exp new file mode 100644 index 0000000..e92aae3 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-tojson.exp @@ -0,0 +1 @@ +"{\"a\":123,\"b\":-456,\"c\":\"foo\",\"d\":\"foo\\n\\\"bar\\\"\",\"e\":true,\"f\":false,\"g\":[1,2,3],\"h\":[\"a\",[\"b\",{\"foo\\nbar\":{}}]],\"i\":3,\"j\":1.44,\"k\":\"foo\"}" diff --git a/nix-js/tests/lang/eval-okay-tojson.nix b/nix-js/tests/lang/eval-okay-tojson.nix new file mode 100644 index 0000000..863c076 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-tojson.nix @@ -0,0 +1,26 @@ +builtins.toJSON { + a = 123; + b = -456; + c = "foo"; + d = "foo\n\"bar\""; + e = true; + f = false; + g = [ + 1 + 2 + 3 + ]; + h = [ + "a" + [ + "b" + { "foo\nbar" = { }; } + ] + ]; + i = 1 + 2; + j = 1.44; + k = { + __toString = self: self.a; + a = "foo"; + }; +} diff --git a/nix-js/tests/lang/eval-okay-toxml.exp b/nix-js/tests/lang/eval-okay-toxml.exp new file mode 100644 index 0000000..8282208 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-toxml.exp @@ -0,0 +1 @@ +"\n\n \n \n \n \n \n\n" diff --git a/nix-js/tests/lang/eval-okay-toxml.nix b/nix-js/tests/lang/eval-okay-toxml.nix new file mode 100644 index 0000000..068c97a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-toxml.nix @@ -0,0 +1,3 @@ +# Make sure the expected XML output is produced; in particular, make sure it +# doesn't contain source location information. +builtins.toXML { a = "s"; } diff --git a/nix-js/tests/lang/eval-okay-toxml2.exp b/nix-js/tests/lang/eval-okay-toxml2.exp new file mode 100644 index 0000000..634a841 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-toxml2.exp @@ -0,0 +1 @@ +"\n\n \n \n \n \n \n \n \n \n \n \n \n \n\n" diff --git a/nix-js/tests/lang/eval-okay-toxml2.nix b/nix-js/tests/lang/eval-okay-toxml2.nix new file mode 100644 index 0000000..0d5989a --- /dev/null +++ b/nix-js/tests/lang/eval-okay-toxml2.nix @@ -0,0 +1,8 @@ +builtins.toXML [ + ("a" + "b") + 10 + (rec { + x = "x"; + y = x; + }) +] diff --git a/nix-js/tests/lang/eval-okay-tryeval.exp b/nix-js/tests/lang/eval-okay-tryeval.exp new file mode 100644 index 0000000..2b2e6fa --- /dev/null +++ b/nix-js/tests/lang/eval-okay-tryeval.exp @@ -0,0 +1 @@ +{ x = { success = true; value = "x"; }; y = { success = false; value = false; }; z = { success = false; value = false; }; } diff --git a/nix-js/tests/lang/eval-okay-tryeval.nix b/nix-js/tests/lang/eval-okay-tryeval.nix new file mode 100644 index 0000000..22b23d8 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-tryeval.nix @@ -0,0 +1,8 @@ +{ + x = builtins.tryEval "x"; + y = builtins.tryEval ( + assert false; + "y" + ); + z = builtins.tryEval (throw "bla"); +} diff --git a/nix-js/tests/lang/eval-okay-types.exp b/nix-js/tests/lang/eval-okay-types.exp new file mode 100644 index 0000000..92a1532 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-types.exp @@ -0,0 +1 @@ +[ true false true false true false true false true true true true true true true true true true true false true true true false "int" "bool" "string" "null" "set" "list" "lambda" "lambda" "lambda" "lambda" ] diff --git a/nix-js/tests/lang/eval-okay-types.nix b/nix-js/tests/lang/eval-okay-types.nix new file mode 100644 index 0000000..0814489 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-types.nix @@ -0,0 +1,42 @@ +with builtins; + +[ + (isNull null) + (isNull (x: x)) + (isFunction (x: x)) + (isFunction "fnord") + (isString ("foo" + "bar")) + (isString [ "x" ]) + (isInt (1 + 2)) + (isInt { x = 123; }) + (isInt (1 / 2)) + (isInt (1 + 1)) + (isInt (1 / 2)) + (isInt (1 * 2)) + (isInt (1 - 2)) + (isFloat (1.2)) + (isFloat (1 + 1.0)) + (isFloat (1 / 2.0)) + (isFloat (1 * 2.0)) + (isFloat (1 - 2.0)) + (isBool (true && false)) + (isBool null) + (isPath /nix/store) + (isPath ./.) + (isAttrs { x = 123; }) + (isAttrs null) + (typeOf (3 * 4)) + (typeOf true) + (typeOf "xyzzy") + (typeOf null) + (typeOf { x = 456; }) + (typeOf [ + 1 + 2 + 3 + ]) + (typeOf (x: x)) + (typeOf ((x: y: x) 1)) + (typeOf map) + (typeOf (map (x: x))) +] diff --git a/nix-js/tests/lang/eval-okay-versions.exp b/nix-js/tests/lang/eval-okay-versions.exp new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-versions.exp @@ -0,0 +1 @@ +true diff --git a/nix-js/tests/lang/eval-okay-versions.nix b/nix-js/tests/lang/eval-okay-versions.nix new file mode 100644 index 0000000..3456015 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-versions.nix @@ -0,0 +1,47 @@ +let + + name1 = "hello-1.0.2"; + name2 = "hello"; + name3 = "915resolution-0.5.2"; + name4 = "xf86-video-i810-1.7.4"; + name5 = "name-that-ends-with-dash--1.0"; + + eq = 0; + lt = builtins.sub 0 1; + gt = 1; + + versionTest = + v1: v2: expected: + let + d1 = builtins.compareVersions v1 v2; + d2 = builtins.compareVersions v2 v1; + in + d1 == builtins.sub 0 d2 && d1 == expected; + + tests = [ + ((builtins.parseDrvName name1).name == "hello") + ((builtins.parseDrvName name1).version == "1.0.2") + ((builtins.parseDrvName name2).name == "hello") + ((builtins.parseDrvName name2).version == "") + ((builtins.parseDrvName name3).name == "915resolution") + ((builtins.parseDrvName name3).version == "0.5.2") + ((builtins.parseDrvName name4).name == "xf86-video-i810") + ((builtins.parseDrvName name4).version == "1.7.4") + ((builtins.parseDrvName name5).name == "name-that-ends-with-dash") + ((builtins.parseDrvName name5).version == "-1.0") + (versionTest "1.0" "2.3" lt) + (versionTest "2.1" "2.3" lt) + (versionTest "2.3" "2.3" eq) + (versionTest "2.5" "2.3" gt) + (versionTest "3.1" "2.3" gt) + (versionTest "2.3.1" "2.3" gt) + (versionTest "2.3.1" "2.3a" gt) + (versionTest "2.3pre1" "2.3" lt) + (versionTest "2.3pre3" "2.3pre12" lt) + (versionTest "2.3a" "2.3c" lt) + (versionTest "2.3pre1" "2.3c" lt) + (versionTest "2.3pre1" "2.3q" lt) + ]; + +in +(import ./lib.nix).and tests diff --git a/nix-js/tests/lang/eval-okay-with.exp b/nix-js/tests/lang/eval-okay-with.exp new file mode 100644 index 0000000..378c8dc --- /dev/null +++ b/nix-js/tests/lang/eval-okay-with.exp @@ -0,0 +1 @@ +"xyzzybarxyzzybar" diff --git a/nix-js/tests/lang/eval-okay-with.nix b/nix-js/tests/lang/eval-okay-with.nix new file mode 100644 index 0000000..033e8d3 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-with.nix @@ -0,0 +1,19 @@ +let { + + a = "xyzzy"; + + as = { + a = "foo"; + b = "bar"; + }; + + bs = { + a = "bar"; + }; + + x = with as; a + b; + + y = with as; with bs; a + b; + + body = x + y; +} diff --git a/nix-js/tests/lang/eval-okay-xml.exp b/nix-js/tests/lang/eval-okay-xml.exp new file mode 100644 index 0000000..2009932 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-xml.exp @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nix-js/tests/lang/eval-okay-xml.nix b/nix-js/tests/lang/eval-okay-xml.nix new file mode 100644 index 0000000..9785c66 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-xml.nix @@ -0,0 +1,40 @@ +rec { + + x = 123; + + y = 567.890; + + a = "foo"; + + b = "bar"; + + c = "foo" + "bar"; + + f = + { + z, + x, + y, + }: + if y then x else z; + + id = x: x; + + at = + args@{ + x, + y, + z, + }: + x; + + ellipsis = + { + x, + y, + z, + ... + }: + x; + +} diff --git a/nix-js/tests/lang/eval-okay-zipAttrsWith.exp b/nix-js/tests/lang/eval-okay-zipAttrsWith.exp new file mode 100644 index 0000000..9c0b15d --- /dev/null +++ b/nix-js/tests/lang/eval-okay-zipAttrsWith.exp @@ -0,0 +1 @@ +{ "0" = { n = "0"; v = [ 5 23 29 ]; }; "1" = { n = "1"; v = [ 7 30 ]; }; "2" = { n = "2"; v = [ 18 ]; }; "4" = { n = "4"; v = [ 10 ]; }; "5" = { n = "5"; v = [ 15 25 26 31 ]; }; "6" = { n = "6"; v = [ 3 14 ]; }; "7" = { n = "7"; v = [ 12 ]; }; "8" = { n = "8"; v = [ 2 6 8 9 ]; }; "9" = { n = "9"; v = [ 0 16 ]; }; a = { n = "a"; v = [ 17 21 22 27 ]; }; c = { n = "c"; v = [ 11 24 ]; }; d = { n = "d"; v = [ 4 13 28 ]; }; e = { n = "e"; v = [ 20 ]; }; f = { n = "f"; v = [ 1 19 ]; }; } diff --git a/nix-js/tests/lang/eval-okay-zipAttrsWith.nix b/nix-js/tests/lang/eval-okay-zipAttrsWith.nix new file mode 100644 index 0000000..20f6891 --- /dev/null +++ b/nix-js/tests/lang/eval-okay-zipAttrsWith.nix @@ -0,0 +1,8 @@ +with import ./lib.nix; + +let + str = builtins.hashString "sha256" "test"; +in +builtins.zipAttrsWith (n: v: { inherit n v; }) ( + map (n: { ${builtins.substring n 1 str} = n; }) (range 0 31) +) diff --git a/nix-js/tests/lang/imported.nix b/nix-js/tests/lang/imported.nix new file mode 100644 index 0000000..fb39ee4 --- /dev/null +++ b/nix-js/tests/lang/imported.nix @@ -0,0 +1,3 @@ +# The function ‘range’ comes from lib.nix and was added to the lexical +# scope by scopedImport. +range 1 5 ++ import ./imported2.nix diff --git a/nix-js/tests/lang/imported2.nix b/nix-js/tests/lang/imported2.nix new file mode 100644 index 0000000..6d0a299 --- /dev/null +++ b/nix-js/tests/lang/imported2.nix @@ -0,0 +1 @@ +range 6 10 diff --git a/nix-js/tests/lang/lib.nix b/nix-js/tests/lang/lib.nix new file mode 100644 index 0000000..126128a --- /dev/null +++ b/nix-js/tests/lang/lib.nix @@ -0,0 +1,77 @@ +with builtins; + +rec { + + fold = + op: nul: list: + if list == [ ] then nul else op (head list) (fold op nul (tail list)); + + concat = fold (x: y: x + y) ""; + + and = fold (x: y: x && y) true; + + flatten = x: if isList x then fold (x: y: (flatten x) ++ y) [ ] x else [ x ]; + + sum = foldl' (x: y: add x y) 0; + + hasSuffix = + ext: fileName: + let + lenFileName = stringLength fileName; + lenExt = stringLength ext; + in + !(lessThan lenFileName lenExt) && substring (sub lenFileName lenExt) lenFileName fileName == ext; + + # Split a list at the given position. + splitAt = + pos: list: + if pos == 0 then + { + first = [ ]; + second = list; + } + else if list == [ ] then + { + first = [ ]; + second = [ ]; + } + else + let + res = splitAt (sub pos 1) (tail list); + in + { + first = [ (head list) ] ++ res.first; + second = res.second; + }; + + # Stable merge sort. + sortBy = + comp: list: + if lessThan 1 (length list) then + let + split = splitAt (div (length list) 2) list; + first = sortBy comp split.first; + second = sortBy comp split.second; + in + mergeLists comp first second + else + list; + + mergeLists = + comp: list1: list2: + if list1 == [ ] then + list2 + else if list2 == [ ] then + list1 + else if comp (head list2) (head list1) then + [ (head list2) ] ++ mergeLists comp list1 (tail list2) + else + [ (head list1) ] ++ mergeLists comp (tail list1) list2; + + id = x: x; + + const = x: y: x; + + range = first: last: if first > last then [ ] else genList (n: first + n) (last - first + 1); + +} diff --git a/nix-js/tests/lang/readDir/bar b/nix-js/tests/lang/readDir/bar new file mode 100644 index 0000000..e69de29 diff --git a/nix-js/tests/lang/readDir/foo/git-hates-directories b/nix-js/tests/lang/readDir/foo/git-hates-directories new file mode 100644 index 0000000..e69de29 diff --git a/nix-js/tests/lang/readDir/ldir b/nix-js/tests/lang/readDir/ldir new file mode 120000 index 0000000..1910281 --- /dev/null +++ b/nix-js/tests/lang/readDir/ldir @@ -0,0 +1 @@ +foo \ No newline at end of file diff --git a/nix-js/tests/lang/readDir/linked b/nix-js/tests/lang/readDir/linked new file mode 120000 index 0000000..c503f86 --- /dev/null +++ b/nix-js/tests/lang/readDir/linked @@ -0,0 +1 @@ +foo/git-hates-directories \ No newline at end of file diff --git a/nix-js/tests/lang/symlink-resolution/broken b/nix-js/tests/lang/symlink-resolution/broken new file mode 120000 index 0000000..e07da69 --- /dev/null +++ b/nix-js/tests/lang/symlink-resolution/broken @@ -0,0 +1 @@ +nonexistent \ No newline at end of file diff --git a/nix-js/tests/lang/symlink-resolution/foo/lib/default.nix b/nix-js/tests/lang/symlink-resolution/foo/lib/default.nix new file mode 100644 index 0000000..8b8441b --- /dev/null +++ b/nix-js/tests/lang/symlink-resolution/foo/lib/default.nix @@ -0,0 +1 @@ +"test" diff --git a/nix-js/tests/lang/symlink-resolution/foo/overlays b/nix-js/tests/lang/symlink-resolution/foo/overlays new file mode 120000 index 0000000..0d44a21 --- /dev/null +++ b/nix-js/tests/lang/symlink-resolution/foo/overlays @@ -0,0 +1 @@ +../overlays \ No newline at end of file diff --git a/nix-js/tests/lang/symlink-resolution/overlays/overlay.nix b/nix-js/tests/lang/symlink-resolution/overlays/overlay.nix new file mode 100644 index 0000000..b036830 --- /dev/null +++ b/nix-js/tests/lang/symlink-resolution/overlays/overlay.nix @@ -0,0 +1 @@ +import ../lib