aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-08 04:49:08 +0100
committereldritch horrors <pennae@lix.systems>2024-03-09 00:05:41 -0700
commit87e6ac5eb706593d15d29b070eac5f05e305a787 (patch)
tree79062f2ab0e8a298de9b68419fa4094994e26e22
parent896e525681bbf696c330af4e51c5e161d3818350 (diff)
Merge pull request #9753 from 9999years/print-value-on-type-error
Print the value in `value is X while a Y is expected` error (cherry picked from commit 5f72a97092da6af28a7d2b2a50d74e9d34fae7e1) Change-Id: Idb4bc903ae59a0f5b6fb3b1da4d47970fe0a6efe
-rw-r--r--doc/manual/rl-next/print-value-in-type-error.md23
-rw-r--r--doc/manual/rl-next/source-positions-in-errors.md2
-rw-r--r--doc/manual/rl-next/with-error-reporting.md4
-rw-r--r--src/libexpr/eval-inline.hh11
-rw-r--r--src/libexpr/eval.cc38
-rw-r--r--src/libexpr/primops.cc2
-rw-r--r--src/libexpr/print-ambiguous.cc1
-rw-r--r--src/libexpr/print-options.hh12
-rw-r--r--src/libexpr/print.cc7
-rw-r--r--src/libexpr/print.hh21
-rw-r--r--src/libutil/error.cc4
-rw-r--r--src/nix/eval.cc2
-rw-r--r--tests/functional/dyn-drv/eval-outputOf.sh2
-rw-r--r--tests/functional/lang/eval-fail-attr-name-type.err.exp2
-rw-r--r--tests/functional/lang/eval-fail-call-primop.err.exp2
-rw-r--r--tests/functional/lang/eval-fail-list.err.exp2
-rw-r--r--tests/functional/lang/eval-fail-set-override.err.exp2
-rw-r--r--tests/functional/lang/eval-fail-using-set-as-attr-name.err.exp2
-rw-r--r--tests/unit/libexpr/error_traces.cc224
19 files changed, 227 insertions, 136 deletions
diff --git a/doc/manual/rl-next/print-value-in-type-error.md b/doc/manual/rl-next/print-value-in-type-error.md
new file mode 100644
index 000000000..aaae22756
--- /dev/null
+++ b/doc/manual/rl-next/print-value-in-type-error.md
@@ -0,0 +1,23 @@
+---
+synopsis: Type errors include the failing value
+issues: #561
+prs: #9753
+---
+
+In errors like `value is an integer while a list was expected`, the message now
+includes the failing value.
+
+Before:
+
+```
+ error: value is a set while a string was expected
+```
+
+After:
+
+```
+ error: expected a string but found a set: { ghc810 = «thunk»;
+ ghc8102Binary = «thunk»; ghc8107 = «thunk»; ghc8107Binary = «thunk»;
+ ghc865Binary = «thunk»; ghc90 = «thunk»; ghc902 = «thunk»; ghc92 = «thunk»;
+ ghc924Binary = «thunk»; ghc925 = «thunk»; «17 attributes elided»}
+```
diff --git a/doc/manual/rl-next/source-positions-in-errors.md b/doc/manual/rl-next/source-positions-in-errors.md
index 5b210289d..1556f8b64 100644
--- a/doc/manual/rl-next/source-positions-in-errors.md
+++ b/doc/manual/rl-next/source-positions-in-errors.md
@@ -38,5 +38,5 @@ error:
| ^
5|
- error: value is a set while a string was expected
+ error: expected a string but found a set: { }
```
diff --git a/doc/manual/rl-next/with-error-reporting.md b/doc/manual/rl-next/with-error-reporting.md
index 10b020956..f6c4a36fe 100644
--- a/doc/manual/rl-next/with-error-reporting.md
+++ b/doc/manual/rl-next/with-error-reporting.md
@@ -8,7 +8,7 @@ prs: 9658
Previously an incorrect `with` expression would report no position at all, making it hard to determine where the error originated:
```
-nix-repl> with 1; a
+nix-repl> with 1; a
error:
… <borked>
@@ -27,5 +27,5 @@ error:
1| with 1; a
| ^
- error: value is an integer while a set was expected
+ error: expected a set but found an integer: 1
```
diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh
index f7710f819..42cb68bbe 100644
--- a/src/libexpr/eval-inline.hh
+++ b/src/libexpr/eval-inline.hh
@@ -1,6 +1,7 @@
#pragma once
///@file
+#include "print.hh"
#include "eval.hh"
namespace nix {
@@ -114,7 +115,10 @@ inline void EvalState::forceAttrs(Value & v, Callable getPos, std::string_view e
PosIdx pos = getPos();
forceValue(v, pos);
if (v.type() != nAttrs) {
- error("value is %1% while a set was expected", showType(v)).withTrace(pos, errorCtx).debugThrow<TypeError>();
+ error("expected a set but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .withTrace(pos, errorCtx).debugThrow<TypeError>();
}
}
@@ -124,7 +128,10 @@ inline void EvalState::forceList(Value & v, const PosIdx pos, std::string_view e
{
forceValue(v, pos);
if (!v.isList()) {
- error("value is %1% while a list was expected", showType(v)).withTrace(pos, errorCtx).debugThrow<TypeError>();
+ error("expected a list but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .withTrace(pos, errorCtx).debugThrow<TypeError>();
}
}
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 729b17887..5e511f49b 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -2,6 +2,7 @@
#include "eval-settings.hh"
#include "hash.hh"
#include "primops.hh"
+#include "print-options.hh"
#include "types.hh"
#include "util.hh"
#include "store-api.hh"
@@ -24,9 +25,9 @@
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
-#include <iostream>
#include <fstream>
#include <functional>
+#include <iostream>
#include <sys/resource.h>
#include <nlohmann/json.hpp>
@@ -1173,7 +1174,10 @@ inline bool EvalState::evalBool(Env & env, Expr * e, const PosIdx pos, std::stri
Value v;
e->eval(*this, env, v);
if (v.type() != nBool)
- error("value is %1% while a Boolean was expected", showType(v)).withFrame(env, *e).debugThrow<TypeError>();
+ error("expected a Boolean but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .withFrame(env, *e).debugThrow<TypeError>();
return v.boolean;
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
@@ -1187,7 +1191,10 @@ inline void EvalState::evalAttrs(Env & env, Expr * e, Value & v, const PosIdx po
try {
e->eval(*this, env, v);
if (v.type() != nAttrs)
- error("value is %1% while a set was expected", showType(v)).withFrame(env, *e).debugThrow<TypeError>();
+ error("expected a set but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .withFrame(env, *e).debugThrow<TypeError>();
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
throw;
@@ -2096,7 +2103,10 @@ NixInt EvalState::forceInt(Value & v, const PosIdx pos, std::string_view errorCt
try {
forceValue(v, pos);
if (v.type() != nInt)
- error("value is %1% while an integer was expected", showType(v)).debugThrow<TypeError>();
+ error("expected an integer but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .debugThrow<TypeError>();
return v.integer;
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
@@ -2112,7 +2122,10 @@ NixFloat EvalState::forceFloat(Value & v, const PosIdx pos, std::string_view err
if (v.type() == nInt)
return v.integer;
else if (v.type() != nFloat)
- error("value is %1% while a float was expected", showType(v)).debugThrow<TypeError>();
+ error("expected a float but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .debugThrow<TypeError>();
return v.fpoint;
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
@@ -2126,7 +2139,10 @@ bool EvalState::forceBool(Value & v, const PosIdx pos, std::string_view errorCtx
try {
forceValue(v, pos);
if (v.type() != nBool)
- error("value is %1% while a Boolean was expected", showType(v)).debugThrow<TypeError>();
+ error("expected a Boolean but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .debugThrow<TypeError>();
return v.boolean;
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
@@ -2146,7 +2162,10 @@ void EvalState::forceFunction(Value & v, const PosIdx pos, std::string_view erro
try {
forceValue(v, pos);
if (v.type() != nFunction && !isFunctor(v))
- error("value is %1% while a function was expected", showType(v)).debugThrow<TypeError>();
+ error("expected a function but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .debugThrow<TypeError>();
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
throw;
@@ -2159,7 +2178,10 @@ std::string_view EvalState::forceString(Value & v, const PosIdx pos, std::string
try {
forceValue(v, pos);
if (v.type() != nString)
- error("value is %1% while a string was expected", showType(v)).debugThrow<TypeError>();
+ error("expected a string but found %1%: %2%",
+ showType(v),
+ ValuePrinter(*this, v, errorPrintOptions))
+ .debugThrow<TypeError>();
return v.string.s;
} catch (Error & e) {
e.addTrace(positions[pos], errorCtx);
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index fbe79a0e3..8d2b2895f 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -991,7 +991,7 @@ static void prim_trace(EvalState & state, const PosIdx pos, Value * * args, Valu
if (args[0]->type() == nString)
printError("trace: %1%", args[0]->string.s);
else
- printError("trace: %1%", printValue(state, *args[0]));
+ printError("trace: %1%", ValuePrinter(state, *args[0]));
state.forceValue(*args[1], pos);
v = *args[1];
}
diff --git a/src/libexpr/print-ambiguous.cc b/src/libexpr/print-ambiguous.cc
index fb59bbf4b..5355dff65 100644
--- a/src/libexpr/print-ambiguous.cc
+++ b/src/libexpr/print-ambiguous.cc
@@ -1,5 +1,6 @@
#include "print-ambiguous.hh"
#include "print.hh"
+#include "eval.hh"
namespace nix {
diff --git a/src/libexpr/print-options.hh b/src/libexpr/print-options.hh
index 11ff9ae87..aba2eaeae 100644
--- a/src/libexpr/print-options.hh
+++ b/src/libexpr/print-options.hh
@@ -49,4 +49,16 @@ struct PrintOptions
size_t maxStringLength = std::numeric_limits<size_t>::max();
};
+/**
+ * `PrintOptions` for unknown and therefore potentially large values in error messages,
+ * to avoid printing "too much" output.
+ */
+static PrintOptions errorPrintOptions = PrintOptions {
+ .ansiColors = true,
+ .maxDepth = 10,
+ .maxAttrs = 10,
+ .maxListItems = 10,
+ .maxStringLength = 1024
+};
+
}
diff --git a/src/libexpr/print.cc b/src/libexpr/print.cc
index 0e8f80888..28ca8874c 100644
--- a/src/libexpr/print.cc
+++ b/src/libexpr/print.cc
@@ -5,6 +5,7 @@
#include "ansicolor.hh"
#include "store-api.hh"
#include "english.hh"
+#include "eval.hh"
namespace nix {
@@ -499,4 +500,10 @@ void printValue(EvalState & state, std::ostream & output, Value & v, PrintOption
Printer(output, state, options).print(v);
}
+std::ostream & operator<<(std::ostream & output, const ValuePrinter & printer)
+{
+ printValue(printer.state, output, printer.value, printer.options);
+ return output;
+}
+
}
diff --git a/src/libexpr/print.hh b/src/libexpr/print.hh
index 40207d777..a8300264a 100644
--- a/src/libexpr/print.hh
+++ b/src/libexpr/print.hh
@@ -9,11 +9,13 @@
#include <iostream>
-#include "eval.hh"
#include "print-options.hh"
namespace nix {
+class EvalState;
+struct Value;
+
/**
* Print a string as a Nix string literal.
*
@@ -59,4 +61,21 @@ std::ostream & printIdentifier(std::ostream & o, std::string_view s);
void printValue(EvalState & state, std::ostream & str, Value & v, PrintOptions options = PrintOptions {});
+/**
+ * A partially-applied form of `printValue` which can be formatted using `<<`
+ * without allocating an intermediate string.
+ */
+class ValuePrinter {
+ friend std::ostream & operator << (std::ostream & output, const ValuePrinter & printer);
+private:
+ EvalState & state;
+ Value & value;
+ PrintOptions options;
+
+public:
+ ValuePrinter(EvalState & state, Value & value, PrintOptions options = PrintOptions {})
+ : state(state), value(value), options(options) { }
+};
+
+std::ostream & operator<<(std::ostream & output, const ValuePrinter & printer);
}
diff --git a/src/libutil/error.cc b/src/libutil/error.cc
index a9e3b168f..9fac82a02 100644
--- a/src/libutil/error.cc
+++ b/src/libutil/error.cc
@@ -334,7 +334,7 @@ std::ostream & showErrorInfo(std::ostream & out, const ErrorInfo & einfo, bool s
* try {
* e->eval(*this, env, v);
* if (v.type() != nAttrs)
- * throwTypeError("value is %1% while a set was expected", v);
+ * throwTypeError("expected a set but found %1%", v);
* } catch (Error & e) {
* e.addTrace(pos, errorCtx);
* throw;
@@ -348,7 +348,7 @@ std::ostream & showErrorInfo(std::ostream & out, const ErrorInfo & einfo, bool s
* e->eval(*this, env, v);
* try {
* if (v.type() != nAttrs)
- * throwTypeError("value is %1% while a set was expected", v);
+ * throwTypeError("expected a set but found %1%", v);
* } catch (Error & e) {
* e.addTrace(pos, errorCtx);
* throw;
diff --git a/src/nix/eval.cc b/src/nix/eval.cc
index d880bef0a..3dcc483fa 100644
--- a/src/nix/eval.cc
+++ b/src/nix/eval.cc
@@ -121,7 +121,7 @@ struct CmdEval : MixJSON, InstallableValueCommand, MixReadOnlyOption
else {
state->forceValueDeep(*v);
- logger->cout("%s", printValue(*state, *v));
+ logger->cout("%s", ValuePrinter(*state, *v, PrintOptions { .force = true }));
}
}
};
diff --git a/tests/functional/dyn-drv/eval-outputOf.sh b/tests/functional/dyn-drv/eval-outputOf.sh
index 9467feb8d..3681bd098 100644
--- a/tests/functional/dyn-drv/eval-outputOf.sh
+++ b/tests/functional/dyn-drv/eval-outputOf.sh
@@ -14,7 +14,7 @@ nix --experimental-features 'nix-command' eval --impure --expr \
# resolve first. Adding a test so we don't liberalise it by accident.
expectStderr 1 nix --experimental-features 'nix-command dynamic-derivations' eval --impure --expr \
'builtins.outputOf (import ../dependencies.nix {}) "out"' \
- | grepQuiet "value is a set while a string was expected"
+ | grepQuiet "expected a string but found a set"
# Test that "DrvDeep" string contexts are not supported at this time
#
diff --git a/tests/functional/lang/eval-fail-attr-name-type.err.exp b/tests/functional/lang/eval-fail-attr-name-type.err.exp
index 23cceb58a..c8d56ba7d 100644
--- a/tests/functional/lang/eval-fail-attr-name-type.err.exp
+++ b/tests/functional/lang/eval-fail-attr-name-type.err.exp
@@ -13,4 +13,4 @@ error:
| ^
8|
- error: value is an integer while a string was expected
+ error: expected a string but found an integer: 1
diff --git a/tests/functional/lang/eval-fail-call-primop.err.exp b/tests/functional/lang/eval-fail-call-primop.err.exp
index ae5b55ed4..0c6f614e8 100644
--- a/tests/functional/lang/eval-fail-call-primop.err.exp
+++ b/tests/functional/lang/eval-fail-call-primop.err.exp
@@ -7,4 +7,4 @@ error:
… while evaluating the first argument passed to builtins.length
- error: value is an integer while a list was expected
+ error: expected a list but found an integer: 1
diff --git a/tests/functional/lang/eval-fail-list.err.exp b/tests/functional/lang/eval-fail-list.err.exp
index 4320fc022..d492f8bd2 100644
--- a/tests/functional/lang/eval-fail-list.err.exp
+++ b/tests/functional/lang/eval-fail-list.err.exp
@@ -5,4 +5,4 @@ error:
| ^
2|
- error: value is an integer while a list was expected
+ error: expected a list but found an integer: 8
diff --git a/tests/functional/lang/eval-fail-set-override.err.exp b/tests/functional/lang/eval-fail-set-override.err.exp
index 71481683d..9006ca4e6 100644
--- a/tests/functional/lang/eval-fail-set-override.err.exp
+++ b/tests/functional/lang/eval-fail-set-override.err.exp
@@ -1,4 +1,4 @@
error:
… while evaluating the `__overrides` attribute
- error: value is an integer while a set was expected
+ error: expected a set but found an integer: 1
diff --git a/tests/functional/lang/eval-fail-using-set-as-attr-name.err.exp b/tests/functional/lang/eval-fail-using-set-as-attr-name.err.exp
index 0a4f56ac5..94784c651 100644
--- a/tests/functional/lang/eval-fail-using-set-as-attr-name.err.exp
+++ b/tests/functional/lang/eval-fail-using-set-as-attr-name.err.exp
@@ -6,4 +6,4 @@ error:
| ^
6|
- error: value is a set while a string was expected
+ error: expected a string but found a set: { }
diff --git a/tests/unit/libexpr/error_traces.cc b/tests/unit/libexpr/error_traces.cc
index 628e73f25..7f83aaecd 100644
--- a/tests/unit/libexpr/error_traces.cc
+++ b/tests/unit/libexpr/error_traces.cc
@@ -105,7 +105,7 @@ namespace nix {
TEST_F(ErrorTraceTest, genericClosure) {
ASSERT_TRACE2("genericClosure 1",
TypeError,
- hintfmt("value is %s while a set was expected", "an integer"),
+ hintfmt("expected a set but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.genericClosure"));
ASSERT_TRACE2("genericClosure {}",
@@ -115,22 +115,22 @@ namespace nix {
ASSERT_TRACE2("genericClosure { startSet = 1; }",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the 'startSet' attribute passed as argument to builtins.genericClosure"));
ASSERT_TRACE2("genericClosure { startSet = [{ key = 1;}]; operator = true; }",
TypeError,
- hintfmt("value is %s while a function was expected", "a Boolean"),
+ hintfmt("expected a function but found %s: %s", "a Boolean", ANSI_CYAN "true" ANSI_NORMAL),
hintfmt("while evaluating the 'operator' attribute passed as argument to builtins.genericClosure"));
ASSERT_TRACE2("genericClosure { startSet = [{ key = 1;}]; operator = item: true; }",
TypeError,
- hintfmt("value is %s while a list was expected", "a Boolean"),
+ hintfmt("expected a list but found %s: %s", "a Boolean", ANSI_CYAN "true" ANSI_NORMAL),
hintfmt("while evaluating the return value of the `operator` passed to builtins.genericClosure"));
ASSERT_TRACE2("genericClosure { startSet = [{ key = 1;}]; operator = item: [ true ]; }",
TypeError,
- hintfmt("value is %s while a set was expected", "a Boolean"),
+ hintfmt("expected a set but found %s: %s", "a Boolean", ANSI_CYAN "true" ANSI_NORMAL),
hintfmt("while evaluating one of the elements generated by (or initially passed to) builtins.genericClosure"));
ASSERT_TRACE2("genericClosure { startSet = [{ key = 1;}]; operator = item: [ {} ]; }",
@@ -145,7 +145,7 @@ namespace nix {
ASSERT_TRACE2("genericClosure { startSet = [ true ]; operator = item: [{ key = ''a''; }]; }",
TypeError,
- hintfmt("value is %s while a set was expected", "a Boolean"),
+ hintfmt("expected a set but found %s: %s", "a Boolean", ANSI_CYAN "true" ANSI_NORMAL),
hintfmt("while evaluating one of the elements generated by (or initially passed to) builtins.genericClosure"));
}
@@ -154,12 +154,12 @@ namespace nix {
TEST_F(ErrorTraceTest, replaceStrings) {
ASSERT_TRACE2("replaceStrings 0 0 {}",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "0" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.replaceStrings"));
ASSERT_TRACE2("replaceStrings [] 0 {}",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "0" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.replaceStrings"));
ASSERT_TRACE1("replaceStrings [ 0 ] [] {}",
@@ -168,17 +168,17 @@ namespace nix {
ASSERT_TRACE2("replaceStrings [ 1 ] [ \"new\" ] {}",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating one of the strings to replace passed to builtins.replaceStrings"));
ASSERT_TRACE2("replaceStrings [ \"oo\" ] [ true ] \"foo\"",
TypeError,
- hintfmt("value is %s while a string was expected", "a Boolean"),
+ hintfmt("expected a string but found %s: %s", "a Boolean", ANSI_CYAN "true" ANSI_NORMAL),
hintfmt("while evaluating one of the replacement strings passed to builtins.replaceStrings"));
ASSERT_TRACE2("replaceStrings [ \"old\" ] [ \"new\" ] {}",
TypeError,
- hintfmt("value is %s while a string was expected", "a set"),
+ hintfmt("expected a string but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the third argument passed to builtins.replaceStrings"));
}
@@ -243,7 +243,7 @@ namespace nix {
TEST_F(ErrorTraceTest, ceil) {
ASSERT_TRACE2("ceil \"foo\"",
TypeError,
- hintfmt("value is %s while a float was expected", "a string"),
+ hintfmt("expected a float but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.ceil"));
}
@@ -252,7 +252,7 @@ namespace nix {
TEST_F(ErrorTraceTest, floor) {
ASSERT_TRACE2("floor \"foo\"",
TypeError,
- hintfmt("value is %s while a float was expected", "a string"),
+ hintfmt("expected a float but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.floor"));
}
@@ -265,7 +265,7 @@ namespace nix {
TEST_F(ErrorTraceTest, getEnv) {
ASSERT_TRACE2("getEnv [ ]",
TypeError,
- hintfmt("value is %s while a string was expected", "a list"),
+ hintfmt("expected a string but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.getEnv"));
}
@@ -286,7 +286,7 @@ namespace nix {
TEST_F(ErrorTraceTest, placeholder) {
ASSERT_TRACE2("placeholder []",
TypeError,
- hintfmt("value is %s while a string was expected", "a list"),
+ hintfmt("expected a string but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.placeholder"));
}
@@ -387,7 +387,7 @@ namespace nix {
ASSERT_TRACE2("filterSource [] ./.",
TypeError,
- hintfmt("value is %s while a function was expected", "a list"),
+ hintfmt("expected a function but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.filterSource"));
// Usupported by store "dummy"
@@ -399,7 +399,7 @@ namespace nix {
// ASSERT_TRACE2("filterSource (_: _: 1) ./.",
// TypeError,
- // hintfmt("value is %s while a Boolean was expected", "an integer"),
+ // hintfmt("expected a Boolean but found %s: %s", "an integer", "1"),
// hintfmt("while evaluating the return value of the path filter function"));
}
@@ -412,7 +412,7 @@ namespace nix {
TEST_F(ErrorTraceTest, attrNames) {
ASSERT_TRACE2("attrNames []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the argument passed to builtins.attrNames"));
}
@@ -421,7 +421,7 @@ namespace nix {
TEST_F(ErrorTraceTest, attrValues) {
ASSERT_TRACE2("attrValues []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the argument passed to builtins.attrValues"));
}
@@ -430,12 +430,12 @@ namespace nix {
TEST_F(ErrorTraceTest, getAttr) {
ASSERT_TRACE2("getAttr [] []",
TypeError,
- hintfmt("value is %s while a string was expected", "a list"),
+ hintfmt("expected a string but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.getAttr"));
ASSERT_TRACE2("getAttr \"foo\" []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the second argument passed to builtins.getAttr"));
ASSERT_TRACE2("getAttr \"foo\" {}",
@@ -453,12 +453,12 @@ namespace nix {
TEST_F(ErrorTraceTest, hasAttr) {
ASSERT_TRACE2("hasAttr [] []",
TypeError,
- hintfmt("value is %s while a string was expected", "a list"),
+ hintfmt("expected a string but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.hasAttr"));
ASSERT_TRACE2("hasAttr \"foo\" []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the second argument passed to builtins.hasAttr"));
}
@@ -471,17 +471,17 @@ namespace nix {
TEST_F(ErrorTraceTest, removeAttrs) {
ASSERT_TRACE2("removeAttrs \"\" \"\"",
TypeError,
- hintfmt("value is %s while a set was expected", "a string"),
+ hintfmt("expected a set but found %s: %s", "a string", ANSI_MAGENTA "\"\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.removeAttrs"));
ASSERT_TRACE2("removeAttrs \"\" [ 1 ]",
TypeError,
- hintfmt("value is %s while a set was expected", "a string"),
+ hintfmt("expected a set but found %s: %s", "a string", ANSI_MAGENTA "\"\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.removeAttrs"));
ASSERT_TRACE2("removeAttrs \"\" [ \"1\" ]",
TypeError,
- hintfmt("value is %s while a set was expected", "a string"),
+ hintfmt("expected a set but found %s: %s", "a string", ANSI_MAGENTA "\"\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.removeAttrs"));
}
@@ -490,12 +490,12 @@ namespace nix {
TEST_F(ErrorTraceTest, listToAttrs) {
ASSERT_TRACE2("listToAttrs 1",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the argument passed to builtins.listToAttrs"));
ASSERT_TRACE2("listToAttrs [ 1 ]",
TypeError,
- hintfmt("value is %s while a set was expected", "an integer"),
+ hintfmt("expected a set but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating an element of the list passed to builtins.listToAttrs"));
ASSERT_TRACE2("listToAttrs [ {} ]",
@@ -505,7 +505,7 @@ namespace nix {
ASSERT_TRACE2("listToAttrs [ { name = 1; } ]",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the `name` attribute of an element of the list passed to builtins.listToAttrs"));
ASSERT_TRACE2("listToAttrs [ { name = \"foo\"; } ]",
@@ -519,12 +519,12 @@ namespace nix {
TEST_F(ErrorTraceTest, intersectAttrs) {
ASSERT_TRACE2("intersectAttrs [] []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.intersectAttrs"));
ASSERT_TRACE2("intersectAttrs {} []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the second argument passed to builtins.intersectAttrs"));
}
@@ -533,22 +533,22 @@ namespace nix {
TEST_F(ErrorTraceTest, catAttrs) {
ASSERT_TRACE2("catAttrs [] {}",
TypeError,
- hintfmt("value is %s while a string was expected", "a list"),
+ hintfmt("expected a string but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.catAttrs"));
ASSERT_TRACE2("catAttrs \"foo\" {}",
TypeError,
- hintfmt("value is %s while a list was expected", "a set"),
+ hintfmt("expected a list but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the second argument passed to builtins.catAttrs"));
ASSERT_TRACE2("catAttrs \"foo\" [ 1 ]",
TypeError,
- hintfmt("value is %s while a set was expected", "an integer"),
+ hintfmt("expected a set but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating an element in the list passed as second argument to builtins.catAttrs"));
ASSERT_TRACE2("catAttrs \"foo\" [ { foo = 1; } 1 { bar = 5;} ]",
TypeError,
- hintfmt("value is %s while a set was expected", "an integer"),
+ hintfmt("expected a set but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating an element in the list passed as second argument to builtins.catAttrs"));
}
@@ -565,7 +565,7 @@ namespace nix {
TEST_F(ErrorTraceTest, mapAttrs) {
ASSERT_TRACE2("mapAttrs [] []",
TypeError,
- hintfmt("value is %s while a set was expected", "a list"),
+ hintfmt("expected a set but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the second argument passed to builtins.mapAttrs"));
// XXX: defered
@@ -590,12 +590,12 @@ namespace nix {
TEST_F(ErrorTraceTest, zipAttrsWith) {
ASSERT_TRACE2("zipAttrsWith [] [ 1 ]",
TypeError,
- hintfmt("value is %s while a function was expected", "a list"),
+ hintfmt("expected a function but found %s: %s", "a list", "[ ]"),
hintfmt("while evaluating the first argument passed to builtins.zipAttrsWith"));
ASSERT_TRACE2("zipAttrsWith (_: 1) [ 1 ]",
TypeError,
- hintfmt("value is %s while a set was expected", "an integer"),
+ hintfmt("expected a set but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating a value of the list passed as second argument to builtins.zipAttrsWith"));
// XXX: How to properly tell that the fucntion takes two arguments ?
@@ -622,7 +622,7 @@ namespace nix {
TEST_F(ErrorTraceTest, elemAt) {
ASSERT_TRACE2("elemAt \"foo\" (-1)",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.elemAt"));
ASSERT_TRACE1("elemAt [] (-1)",
@@ -639,7 +639,7 @@ namespace nix {
TEST_F(ErrorTraceTest, head) {
ASSERT_TRACE2("head 1",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.elemAt"));
ASSERT_TRACE1("head []",
@@ -652,7 +652,7 @@ namespace nix {
TEST_F(ErrorTraceTest, tail) {
ASSERT_TRACE2("tail 1",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.tail"));
ASSERT_TRACE1("tail []",
@@ -665,12 +665,12 @@ namespace nix {
TEST_F(ErrorTraceTest, map) {
ASSERT_TRACE2("map 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.map"));
ASSERT_TRACE2("map 1 [ 1 ]",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.map"));
}
@@ -679,17 +679,17 @@ namespace nix {
TEST_F(ErrorTraceTest, filter) {
ASSERT_TRACE2("filter 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.filter"));
ASSERT_TRACE2("filter 1 [ \"foo\" ]",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.filter"));
ASSERT_TRACE2("filter (_: 5) [ \"foo\" ]",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", ANSI_CYAN "5" ANSI_NORMAL),
hintfmt("while evaluating the return value of the filtering function passed to builtins.filter"));
}
@@ -698,7 +698,7 @@ namespace nix {
TEST_F(ErrorTraceTest, elem) {
ASSERT_TRACE2("elem 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.elem"));
}
@@ -707,17 +707,17 @@ namespace nix {
TEST_F(ErrorTraceTest, concatLists) {
ASSERT_TRACE2("concatLists 1",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.concatLists"));
ASSERT_TRACE2("concatLists [ 1 ]",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating a value of the list passed to builtins.concatLists"));
ASSERT_TRACE2("concatLists [ [1] \"foo\" ]",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating a value of the list passed to builtins.concatLists"));
}
@@ -726,12 +726,12 @@ namespace nix {
TEST_F(ErrorTraceTest, length) {
ASSERT_TRACE2("length 1",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.length"));
ASSERT_TRACE2("length \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.length"));
}
@@ -740,12 +740,12 @@ namespace nix {
TEST_F(ErrorTraceTest, foldlPrime) {
ASSERT_TRACE2("foldl' 1 \"foo\" true",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.foldlStrict"));
ASSERT_TRACE2("foldl' (_: 1) \"foo\" true",
TypeError,
- hintfmt("value is %s while a list was expected", "a Boolean"),
+ hintfmt("expected a list but found %s: %s", "a Boolean", ANSI_CYAN "true" ANSI_NORMAL),
hintfmt("while evaluating the third argument passed to builtins.foldlStrict"));
ASSERT_TRACE1("foldl' (_: 1) \"foo\" [ true ]",
@@ -754,7 +754,7 @@ namespace nix {
ASSERT_TRACE2("foldl' (a: b: a && b) \"foo\" [ true ]",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "a string"),
+ hintfmt("expected a Boolean but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("in the left operand of the AND (&&) operator"));
}
@@ -763,17 +763,17 @@ namespace nix {
TEST_F(ErrorTraceTest, any) {
ASSERT_TRACE2("any 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.any"));
ASSERT_TRACE2("any (_: 1) \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.any"));
ASSERT_TRACE2("any (_: 1) [ \"foo\" ]",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the return value of the function passed to builtins.any"));
}
@@ -782,17 +782,17 @@ namespace nix {
TEST_F(ErrorTraceTest, all) {
ASSERT_TRACE2("all 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.all"));
ASSERT_TRACE2("all (_: 1) \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.all"));
ASSERT_TRACE2("all (_: 1) [ \"foo\" ]",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the return value of the function passed to builtins.all"));
}
@@ -801,12 +801,12 @@ namespace nix {
TEST_F(ErrorTraceTest, genList) {
ASSERT_TRACE2("genList 1 \"foo\"",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.genList"));
ASSERT_TRACE2("genList 1 2",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.genList", "an integer"));
// XXX: defered
@@ -825,12 +825,12 @@ namespace nix {
TEST_F(ErrorTraceTest, sort) {
ASSERT_TRACE2("sort 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.sort"));
ASSERT_TRACE2("sort 1 [ \"foo\" ]",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.sort"));
ASSERT_TRACE1("sort (_: 1) [ \"foo\" \"bar\" ]",
@@ -839,7 +839,7 @@ namespace nix {
ASSERT_TRACE2("sort (_: _: 1) [ \"foo\" \"bar\" ]",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the return value of the sorting function passed to builtins.sort"));
// XXX: Trace too deep, need better asserts
@@ -857,17 +857,17 @@ namespace nix {
TEST_F(ErrorTraceTest, partition) {
ASSERT_TRACE2("partition 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.partition"));
ASSERT_TRACE2("partition (_: 1) \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.partition"));
ASSERT_TRACE2("partition (_: 1) [ \"foo\" ]",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the return value of the partition function passed to builtins.partition"));
}
@@ -876,17 +876,17 @@ namespace nix {
TEST_F(ErrorTraceTest, groupBy) {
ASSERT_TRACE2("groupBy 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.groupBy"));
ASSERT_TRACE2("groupBy (_: 1) \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.groupBy"));
ASSERT_TRACE2("groupBy (x: x) [ \"foo\" \"bar\" 1 ]",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the return value of the grouping function passed to builtins.groupBy"));
}
@@ -895,22 +895,22 @@ namespace nix {
TEST_F(ErrorTraceTest, concatMap) {
ASSERT_TRACE2("concatMap 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a function was expected", "an integer"),
+ hintfmt("expected a function but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.concatMap"));
ASSERT_TRACE2("concatMap (x: 1) \"foo\"",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.concatMap"));
ASSERT_TRACE2("concatMap (x: 1) [ \"foo\" ] # TODO",
TypeError,
- hintfmt("value is %s while a list was expected", "an integer"),
+ hintfmt("expected a list but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the return value of the function passed to builtins.concatMap"));
ASSERT_TRACE2("concatMap (x: \"foo\") [ 1 2 ] # TODO",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the return value of the function passed to builtins.concatMap"));
}
@@ -919,12 +919,12 @@ namespace nix {
TEST_F(ErrorTraceTest, add) {
ASSERT_TRACE2("add \"foo\" 1",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument of the addition"));
ASSERT_TRACE2("add 1 \"foo\"",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument of the addition"));
}
@@ -933,12 +933,12 @@ namespace nix {
TEST_F(ErrorTraceTest, sub) {
ASSERT_TRACE2("sub \"foo\" 1",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument of the subtraction"));
ASSERT_TRACE2("sub 1 \"foo\"",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument of the subtraction"));
}
@@ -947,12 +947,12 @@ namespace nix {
TEST_F(ErrorTraceTest, mul) {
ASSERT_TRACE2("mul \"foo\" 1",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first argument of the multiplication"));
ASSERT_TRACE2("mul 1 \"foo\"",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument of the multiplication"));
}
@@ -961,12 +961,12 @@ namespace nix {
TEST_F(ErrorTraceTest, div) {
ASSERT_TRACE2("div \"foo\" 1 # TODO: an integer was expected -> a number",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the first operand of the division"));
ASSERT_TRACE2("div 1 \"foo\"",
TypeError,
- hintfmt("value is %s while a float was expected", "a string"),
+ hintfmt("expected a float but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second operand of the division"));
ASSERT_TRACE1("div \"foo\" 0",
@@ -979,12 +979,12 @@ namespace nix {
TEST_F(ErrorTraceTest, bitAnd) {
ASSERT_TRACE2("bitAnd 1.1 2",
TypeError,
- hintfmt("value is %s while an integer was expected", "a float"),
+ hintfmt("expected an integer but found %s: %s", "a float", ANSI_CYAN "1.1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.bitAnd"));
ASSERT_TRACE2("bitAnd 1 2.2",
TypeError,
- hintfmt("value is %s while an integer was expected", "a float"),
+ hintfmt("expected an integer but found %s: %s", "a float", ANSI_CYAN "2.2" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.bitAnd"));
}
@@ -993,12 +993,12 @@ namespace nix {
TEST_F(ErrorTraceTest, bitOr) {
ASSERT_TRACE2("bitOr 1.1 2",
TypeError,
- hintfmt("value is %s while an integer was expected", "a float"),
+ hintfmt("expected an integer but found %s: %s", "a float", ANSI_CYAN "1.1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.bitOr"));
ASSERT_TRACE2("bitOr 1 2.2",
TypeError,
- hintfmt("value is %s while an integer was expected", "a float"),
+ hintfmt("expected an integer but found %s: %s", "a float", ANSI_CYAN "2.2" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.bitOr"));
}
@@ -1007,12 +1007,12 @@ namespace nix {
TEST_F(ErrorTraceTest, bitXor) {
ASSERT_TRACE2("bitXor 1.1 2",
TypeError,
- hintfmt("value is %s while an integer was expected", "a float"),
+ hintfmt("expected an integer but found %s: %s", "a float", ANSI_CYAN "1.1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.bitXor"));
ASSERT_TRACE2("bitXor 1 2.2",
TypeError,
- hintfmt("value is %s while an integer was expected", "a float"),
+ hintfmt("expected an integer but found %s: %s", "a float", ANSI_CYAN "2.2" ANSI_NORMAL),
hintfmt("while evaluating the second argument passed to builtins.bitXor"));
}
@@ -1047,12 +1047,12 @@ namespace nix {
TEST_F(ErrorTraceTest, substring) {
ASSERT_TRACE2("substring {} \"foo\" true",
TypeError,
- hintfmt("value is %s while an integer was expected", "a set"),
+ hintfmt("expected an integer but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the first argument (the start offset) passed to builtins.substring"));
ASSERT_TRACE2("substring 3 \"foo\" true",
TypeError,
- hintfmt("value is %s while an integer was expected", "a string"),
+ hintfmt("expected an integer but found %s: %s", "a string", ANSI_MAGENTA "\"foo\"" ANSI_NORMAL),
hintfmt("while evaluating the second argument (the substring length) passed to builtins.substring"));
ASSERT_TRACE2("substring 0 3 {}",
@@ -1079,7 +1079,7 @@ namespace nix {
TEST_F(ErrorTraceTest, hashString) {
ASSERT_TRACE2("hashString 1 {}",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.hashString"));
ASSERT_TRACE1("hashString \"foo\" \"content\"",
@@ -1088,7 +1088,7 @@ namespace nix {
ASSERT_TRACE2("hashString \"sha256\" {}",
TypeError,
- hintfmt("value is %s while a string was expected", "a set"),
+ hintfmt("expected a string but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the second argument passed to builtins.hashString"));
}
@@ -1097,12 +1097,12 @@ namespace nix {
TEST_F(ErrorTraceTest, match) {
ASSERT_TRACE2("match 1 {}",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.match"));
ASSERT_TRACE2("match \"foo\" {}",
TypeError,
- hintfmt("value is %s while a string was expected", "a set"),
+ hintfmt("expected a string but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the second argument passed to builtins.match"));
ASSERT_TRACE1("match \"(.*\" \"\"",
@@ -1115,12 +1115,12 @@ namespace nix {
TEST_F(ErrorTraceTest, split) {
ASSERT_TRACE2("split 1 {}",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.split"));
ASSERT_TRACE2("split \"foo\" {}",
TypeError,
- hintfmt("value is %s while a string was expected", "a set"),
+ hintfmt("expected a string but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the second argument passed to builtins.split"));
ASSERT_TRACE1("split \"f(o*o\" \"1foo2\"",
@@ -1133,12 +1133,12 @@ namespace nix {
TEST_F(ErrorTraceTest, concatStringsSep) {
ASSERT_TRACE2("concatStringsSep 1 {}",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument (the separator string) passed to builtins.concatStringsSep"));
ASSERT_TRACE2("concatStringsSep \"foo\" {}",
TypeError,
- hintfmt("value is %s while a list was expected", "a set"),
+ hintfmt("expected a list but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the second argument (the list of strings to concat) passed to builtins.concatStringsSep"));
ASSERT_TRACE2("concatStringsSep \"foo\" [ 1 2 {} ] # TODO: coerce to string is buggy",
@@ -1152,7 +1152,7 @@ namespace nix {
TEST_F(ErrorTraceTest, parseDrvName) {
ASSERT_TRACE2("parseDrvName 1",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.parseDrvName"));
}
@@ -1161,12 +1161,12 @@ namespace nix {
TEST_F(ErrorTraceTest, compareVersions) {
ASSERT_TRACE2("compareVersions 1 {}",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.compareVersions"));
ASSERT_TRACE2("compareVersions \"abd\" {}",
TypeError,
- hintfmt("value is %s while a string was expected", "a set"),
+ hintfmt("expected a string but found %s: %s", "a set", "{ }"),
hintfmt("while evaluating the second argument passed to builtins.compareVersions"));
}
@@ -1175,7 +1175,7 @@ namespace nix {
TEST_F(ErrorTraceTest, splitVersion) {
ASSERT_TRACE2("splitVersion 1",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", ANSI_CYAN "1" ANSI_NORMAL),
hintfmt("while evaluating the first argument passed to builtins.splitVersion"));
}
@@ -1189,7 +1189,7 @@ namespace nix {
TEST_F(ErrorTraceTest, derivationStrict) {
ASSERT_TRACE2("derivationStrict \"\"",
TypeError,
- hintfmt("value is %s while a set was expected", "a string"),
+ hintfmt("expected a set but found %s: %s", "a string", "\"\""),
hintfmt("while evaluating the argument passed to builtins.derivationStrict"));
ASSERT_TRACE2("derivationStrict {}",
@@ -1199,7 +1199,7 @@ namespace nix {
ASSERT_TRACE2("derivationStrict { name = 1; }",
TypeError,
- hintfmt("value is %s while a string was expected", "an integer"),
+ hintfmt("expected a string but found %s: %s", "an integer", "1"),
hintfmt("while evaluating the `name` attribute passed to builtins.derivationStrict"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; }",
@@ -1209,12 +1209,12 @@ namespace nix {
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; __structuredAttrs = 15; }",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", "15"),
hintfmt("while evaluating the `__structuredAttrs` attribute passed to builtins.derivationStrict"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; __ignoreNulls = 15; }",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "an integer"),
+ hintfmt("expected a Boolean but found %s: %s", "an integer", "15"),
hintfmt("while evaluating the `__ignoreNulls` attribute passed to builtins.derivationStrict"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; outputHashMode = 15; }",
@@ -1259,22 +1259,22 @@ namespace nix {
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; system = 1; outputs = \"out\"; __contentAddressed = \"true\"; }",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "a string"),
+ hintfmt("expected a Boolean but found %s: %s", "a string", "\"true\""),
hintfmt("while evaluating the attribute '__contentAddressed' of derivation 'foo'"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; system = 1; outputs = \"out\"; __impure = \"true\"; }",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "a string"),
+ hintfmt("expected a Boolean but found %s: %s", "a string", "\"true\""),
hintfmt("while evaluating the attribute '__impure' of derivation 'foo'"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; system = 1; outputs = \"out\"; __impure = \"true\"; }",
TypeError,
- hintfmt("value is %s while a Boolean was expected", "a string"),
+ hintfmt("expected a Boolean but found %s: %s", "a string", "\"true\""),
hintfmt("while evaluating the attribute '__impure' of derivation 'foo'"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; system = 1; outputs = \"out\"; args = \"foo\"; }",
TypeError,
- hintfmt("value is %s while a list was expected", "a string"),
+ hintfmt("expected a list but found %s: %s", "a string", "\"foo\""),
hintfmt("while evaluating the attribute 'args' of derivation 'foo'"));
ASSERT_TRACE2("derivationStrict { name = \"foo\"; builder = 1; system = 1; outputs = \"out\"; args = [ {} ]; }",