difftreelog
test pass full go-jsonnet test suite
in: master
54 files changed
crates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs
@@ -532,17 +532,23 @@
)),
(Val::Str(s), Val::Num(n)) => Val::Str({
+ let n = n.get();
+ if n.fract() > f64::EPSILON {
+ bail!(FractionalIndex)
+ }
+ if n < 0.0 {
+ bail!(ArrayBoundsError(n as isize, s.into_flat().chars().count()));
+ }
let v: IStr = s
.clone()
.into_flat()
.chars()
- .skip(n.get() as usize)
+ .skip(n as usize)
.take(1)
.collect::<String>()
.into();
if v.is_empty() {
- let size = s.into_flat().chars().count();
- bail!(StringBoundsError(n.get() as usize, size))
+ bail!(StringBoundsError(n as usize, s.into_flat().chars().count()))
}
StrValue::Flat(v)
}),
crates/jrsonnet-stdlib/src/math.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/math.rs
+++ b/crates/jrsonnet-stdlib/src/math.rs
@@ -168,12 +168,12 @@
#[builtin]
pub fn builtin_deg2rad(x: f64) -> f64 {
- x * f64::consts::PI / 180.0
+ x.to_radians()
}
#[builtin]
pub fn builtin_rad2deg(x: f64) -> f64 {
- x * 180.0 / f64::consts::PI
+ x.to_degrees()
}
#[builtin]
crates/jrsonnet-stdlib/src/sort.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/sort.rs
+++ b/crates/jrsonnet-stdlib/src/sort.rs
@@ -17,6 +17,7 @@
enum SortKeyType {
Number,
String,
+ Unspecialized,
Unknown,
}
@@ -31,7 +32,7 @@
(Val::Str(_) | Val::Num(_), _) => {
bail!("sort elements should have the same types")
}
- _ => {}
+ (_, _) => return Ok(SortKeyType::Unspecialized),
}
}
Ok(sort_type)
@@ -49,7 +50,7 @@
Val::Str(s) => s.clone(),
_ => unreachable!(),
}),
- SortKeyType::Unknown => {
+ SortKeyType::Unknown | SortKeyType::Unspecialized => {
let mut err = None;
// evaluate_compare_op will never return equal on types, which are different from
// jsonnet perspective
@@ -88,7 +89,7 @@
Val::Str(s) => s.clone(),
_ => unreachable!(),
}),
- SortKeyType::Unknown => {
+ SortKeyType::Unknown | SortKeyType::Unspecialized => {
let mut err = None;
// evaluate_compare_op will never return equal on types, which are different from
// jsonnet perspective
crates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/strings.rs
+++ b/crates/jrsonnet-stdlib/src/strings.rs
@@ -25,8 +25,11 @@
}
#[builtin]
-pub fn builtin_str_replace(str: String, from: IStr, to: IStr) -> String {
- str.replace(&from as &str, &to as &str)
+pub fn builtin_str_replace(str: String, from: IStr, to: IStr) -> Result<String> {
+ if from.is_empty() {
+ bail!("'from' string must not be zero length");
+ }
+ Ok(str.replace(&from as &str, &to as &str))
}
#[builtin]
tests/go_testdata_golden_override/builtinObjectRemoveKey_super_assert.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/builtinObjectRemoveKey_super_assert.jsonnet.golden
@@ -0,0 +1,3 @@
+no such field: x
+ builtinObjectRemoveKey_super_assert.jsonnet:2:15-17: field <x> access
+ builtinObjectRemoveKey_super_assert.jsonnet:2:10-17: assertion condition
\ No newline at end of file
tests/go_testdata_golden_override/std.filter8.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.filter8.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected function, got array
+ argument <func> evaluation
+ std.filter8.jsonnet:1:1-37: function <builtin_filter> call
\ No newline at end of file
tests/go_testdata_golden_override/std.filter_swapped_args.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.filter_swapped_args.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected function, got array
+ argument <func> evaluation
+ std.filter_swapped_args.jsonnet:1:1-39: function <builtin_filter> call
\ No newline at end of file
tests/go_testdata_golden_override/std.flatmap5.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.flatmap5.jsonnet.golden
@@ -0,0 +1,5 @@
+runtime error: a
+ std.flatmap5.jsonnet:1:21-29: error statement
+ std.flatmap5.jsonnet:2:10-49: function <builtin_flatmap> call
+ argument <x> evaluation
+ std.flatmap5.jsonnet:2:1-50: function <builtin_type> call
\ No newline at end of file
tests/go_testdata_golden_override/std.join7.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.join7.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: in std.join all items should be strings
+ std.join7.jsonnet:1:1-28: function <builtin_join> call
\ No newline at end of file
tests/go_testdata_golden_override/std.join8.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.join8.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: in std.join all items should be arrays
+ std.join8.jsonnet:1:1-34: function <builtin_join> call
\ No newline at end of file
tests/go_testdata_golden_override/std.makeArrayNamed3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.makeArrayNamed3.jsonnet.golden
@@ -0,0 +1,2 @@
+parameter blahblah is not defined
+ std.makeArrayNamed3.jsonnet:1:1-55: function <builtin_make_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.makeArray_bad.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.makeArray_bad.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected BoundedNumber<0, 2147483647>, got string
+ argument <sz> evaluation
+ std.makeArray_bad.jsonnet:1:1-37: function <builtin_make_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.makeArray_bad2.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.makeArray_bad2.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected function, got string
+ argument <func> evaluation
+ std.makeArray_bad2.jsonnet:1:1-26: function <builtin_make_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.makeArray_noninteger.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.makeArray_noninteger.jsonnet.golden
@@ -0,0 +1,3 @@
+runtime error: cannot convert number with fractional part to i32
+ argument <sz> evaluation
+ std.makeArray_noninteger.jsonnet:1:1-35: function <builtin_make_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.makeArray_noninteger_big.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.makeArray_noninteger_big.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: number out of bounds: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 not in 0..2147483647
+ argument <sz> evaluation
+ std.makeArray_noninteger_big.jsonnet:1:1-37: function <builtin_make_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.manifestYamlDoc_error.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.manifestYamlDoc_error.jsonnet.golden
@@ -0,0 +1,5 @@
+runtime error: foo
+ std.manifestYamlDoc_error.jsonnet:1:31-43: error statement
+ field <y> evaluation
+ field <x> manifestification
+ std.manifestYamlDoc_error.jsonnet:1:1-48: function <builtin_manifest_yaml_doc> call
\ No newline at end of file
tests/go_testdata_golden_override/std.mantissa2.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.mantissa2.jsonnet.golden
@@ -0,0 +1 @@
+0.6562500000000002
\ No newline at end of file
tests/go_testdata_golden_override/std.mantissa3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.mantissa3.jsonnet.golden
@@ -0,0 +1 @@
+0.8399999999999999
\ No newline at end of file
tests/go_testdata_golden_override/std.mantissa4.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.mantissa4.jsonnet.golden
@@ -0,0 +1 @@
+0.571493695641147
\ No newline at end of file
tests/go_testdata_golden_override/std.mantissa5.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.mantissa5.jsonnet.golden
@@ -0,0 +1 @@
+0.6562499999999998
\ No newline at end of file
tests/go_testdata_golden_override/std.mantissa6.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.mantissa6.jsonnet.golden
@@ -0,0 +1 @@
+0.6562499999999998
\ No newline at end of file
tests/go_testdata_golden_override/std.mantissa7.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.mantissa7.jsonnet.golden
@@ -0,0 +1 @@
+-0.6562500000000002
\ No newline at end of file
tests/go_testdata_golden_override/std.maxArrayOnEmpty.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.maxArrayOnEmpty.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: expected non-empty array
+ std.maxArrayOnEmpty.jsonnet:1:1-18: function <builtin_max_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.md5_6.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.md5_6.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected string, got number
+ argument <s> evaluation
+ std.md5_6.jsonnet:1:1-13: function <builtin_md5> call
\ No newline at end of file
tests/go_testdata_golden_override/std.minArrayOnEmpty.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.minArrayOnEmpty.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: expected non-empty array
+ std.minArrayOnEmpty.jsonnet:1:1-18: function <builtin_min_array> call
\ No newline at end of file
tests/go_testdata_golden_override/std.modulo2.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.modulo2.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected number, got string
+ argument <x> evaluation
+ std.modulo2.jsonnet:1:1-23: function <builtin_modulo> call
\ No newline at end of file
tests/go_testdata_golden_override/std.modulo3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.modulo3.jsonnet.golden
@@ -0,0 +1,3 @@
+type error: expected number, got string
+ argument <x> evaluation
+ std.modulo3.jsonnet:1:1-23: function <builtin_modulo> call
\ No newline at end of file
tests/go_testdata_golden_override/std.primitiveEquals10.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.primitiveEquals10.jsonnet.golden
@@ -0,0 +1,4 @@
+runtime error: x
+ std.primitiveEquals10.jsonnet:1:21-31: error statement
+ argument <x> evaluation
+ std.primitiveEquals10.jsonnet:1:1-36: function <builtin_primitive_equals> call
\ No newline at end of file
tests/go_testdata_golden_override/std.primitiveEquals13.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.primitiveEquals13.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: primitiveEquals operates on primitive types, got array
+ std.primitiveEquals13.jsonnet:1:1-29: function <builtin_primitive_equals> call
\ No newline at end of file
tests/go_testdata_golden_override/std.primitiveEquals6.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.primitiveEquals6.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: primitiveEquals operates on primitive types, got object
+ std.primitiveEquals6.jsonnet:1:1-29: function <builtin_primitive_equals> call
\ No newline at end of file
tests/go_testdata_golden_override/std.primitiveEquals7.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.primitiveEquals7.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: cannot test equality of functions
+ std.primitiveEquals7.jsonnet:1:1-51: function <builtin_primitive_equals> call
\ No newline at end of file
tests/go_testdata_golden_override/std.primitiveEquals9.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.primitiveEquals9.jsonnet.golden
@@ -0,0 +1,4 @@
+runtime error: x
+ std.primitiveEquals9.jsonnet:1:25-35: error statement
+ argument <y> evaluation
+ std.primitiveEquals9.jsonnet:1:1-36: function <builtin_primitive_equals> call
\ No newline at end of file
tests/go_testdata_golden_override/std.sort3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.sort3.jsonnet.golden
@@ -0,0 +1,3 @@
+runtime error: foo
+ std.sort3.jsonnet:1:16-28: error statement
+ std.sort3.jsonnet:1:1-30: function <builtin_sort> call
\ No newline at end of file
tests/go_testdata_golden_override/std.sort4.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.sort4.jsonnet.golden
@@ -0,0 +1,2 @@
+binary operation array < number is not implemented
+ std.sort4.jsonnet:1:1-30: function <builtin_sort> call
\ No newline at end of file
tests/go_testdata_golden_override/std.thisFile.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.thisFile.jsonnet.golden
@@ -0,0 +1 @@
+"std.thisFile.jsonnet"
\ No newline at end of file
tests/go_testdata_golden_override/std.thisFile2.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.thisFile2.jsonnet.golden
@@ -0,0 +1 @@
+"std.thisFile.jsonnet"
\ No newline at end of file
tests/go_testdata_golden_override/std.toString5.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/std.toString5.jsonnet.golden
@@ -0,0 +1,4 @@
+runtime error: x
+ std.toString5.jsonnet:1:14-24: error statement
+ argument <a> evaluation
+ std.toString5.jsonnet:1:1-25: function <builtin_to_string> call
\ No newline at end of file
tests/go_testdata_golden_override/stdlib_smoke_test.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/stdlib_smoke_test.jsonnet.golden
@@ -0,0 +1,279 @@
+{
+ "abs": 42,
+ "acos": 1.0471975511965979,
+ "asciiLower": "blah",
+ "asciiUpper": "BLAH",
+ "asin": 0.5235987755982989,
+ "assertEqual": true,
+ "atan": 1.373400766945016,
+ "base64": [
+ "YmxhaA==",
+ "YmxhaA=="
+ ],
+ "base64Decode": "blah\n",
+ "base64DecodeBytes": [
+ 98,
+ 108,
+ 97,
+ 104,
+ 10
+ ],
+ "ceil": 5,
+ "char": "A",
+ "codepoint": 65,
+ "cos": 0.28366218546322625,
+ "count": 1,
+ "decodeUTF8": "AAA",
+ "encodeUTF8": [
+ 98,
+ 108,
+ 97,
+ 104
+ ],
+ "endsWith": true,
+ "escapeStringBash": "'test '\"'\"'test'\"'\"'test'",
+ "escapeStringDollars": "test 'test'test",
+ "escapeStringJson": "\"test 'test'test\"",
+ "escapeStringPython": "\"test 'test'test\"",
+ "exp": 148.4131591025766,
+ "exponent": 3,
+ "filter": [
+ 2,
+ 4
+ ],
+ "filterMap": [
+ 4,
+ 8
+ ],
+ "find": [
+ 2,
+ 4
+ ],
+ "findSubstr": [
+ 0,
+ 5
+ ],
+ "flatMap": [
+ 2,
+ 3,
+ 4,
+ 6,
+ 6,
+ 9
+ ],
+ "flattenArrays": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ [
+ 6,
+ 7
+ ]
+ ],
+ "floor": 5,
+ "foldl": [
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "foldr": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "format": "test blah 42",
+ "get": [
+ 17,
+ 42,
+ 18,
+ 42
+ ],
+ "isArray": true,
+ "isBoolean": true,
+ "isFunction": true,
+ "isNumber": true,
+ "isObject": true,
+ "isString": true,
+ "join": "a,b,c",
+ "length": 0,
+ "lines": "a\nb\nc\n",
+ "log": 1.6094379124341003,
+ "lstripChars": "bbbbcccc",
+ "makeArray": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "manifestIni": "a = 1\nb = 2\n[s1]\nx = 1\ny = 2\n",
+ "manifestJsonEx": "{\n \"a\": {\n \"b\": \"c\"\n }\n}",
+ "manifestJsonMinified": "{\"a\":{\"b\":\"c\"}}",
+ "manifestPython": "{\"a\": {\"b\": \"c\"}}",
+ "manifestPythonVars": "a = {\"b\": \"c\"}\n",
+ "manifestTomlEx": "[a]\n b = \"c\"",
+ "manifestXmlJsonml": "<blah a=\"42\"></blah>",
+ "manifestYamlDoc": "\"a\":\n \"b\": \"c\"",
+ "manifestYamlStream": "---\n42\n---\n\"a\":\n \"b\": \"c\"\n...\n",
+ "mantissa": 0.6249999999999999,
+ "map": [
+ -1,
+ -2,
+ -3
+ ],
+ "mapWithIndex": [
+ 3,
+ 3,
+ 3
+ ],
+ "mapWithKey": {
+ "a": 42
+ },
+ "max": 3,
+ "md5": "1bc29b36f623ba82aaf6724fd3b16718",
+ "member": true,
+ "mergePatch": { },
+ "min": 2,
+ "objectFields": [ ],
+ "objectFieldsAll": [ ],
+ "objectHas": false,
+ "objectHasAll": false,
+ "objectKeysValues": [ ],
+ "objectKeysValuesAll": [ ],
+ "objectValues": [ ],
+ "objectValuesAll": [ ],
+ "parseHex": 3735928559,
+ "parseInt": 42,
+ "parseJson": {
+ "a": "b"
+ },
+ "parseOctal": 83,
+ "pow": 8,
+ "prune": {
+ "y": [
+ "42"
+ ]
+ },
+ "range": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "repeat": "foofoofoo",
+ "reverse": [
+ "a",
+ "b"
+ ],
+ "rstripChars": "aaabbbb",
+ "set": [
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2,
+ 1
+ ]
+ ],
+ "setDiff": [
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ "setInter": [
+ [
+ 3
+ ],
+ [
+ 2
+ ]
+ ],
+ "setMember": [
+ false,
+ true
+ ],
+ "setUnion": [
+ [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ]
+ ],
+ "sign": 1,
+ "sin": -0.9589242746631385,
+ "slice": "o",
+ "sort": [
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2,
+ 1
+ ]
+ ],
+ "split": [
+ "a",
+ "b",
+ "c"
+ ],
+ "splitLimit": [
+ "a",
+ "b,c"
+ ],
+ "splitLimitR": [
+ "a,b",
+ "c"
+ ],
+ "sqrt": 2.23606797749979,
+ "startsWith": true,
+ "strReplace": "bba",
+ "stringChars": [
+ "b",
+ "l",
+ "a",
+ "h"
+ ],
+ "stripChars": "bbbb",
+ "substr": "s",
+ "tan": -3.380515006246586,
+ "thisFile": "stdlib_smoke_test.jsonnet",
+ "toString": "42",
+ "type": "object",
+ "uniq": [
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ "a",
+ "B",
+ "a"
+ ]
+ ]
+}
\ No newline at end of file
tests/go_testdata_golden_override/strReplace3.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/strReplace3.jsonnet.golden
@@ -0,0 +1,2 @@
+runtime error: 'from' string must not be zero length
+ strReplace3.jsonnet:1:1-36: function <builtin_str_replace> call
\ No newline at end of file
tests/go_testdata_golden_override/string_divided_by_number.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/string_divided_by_number.jsonnet.golden
@@ -0,0 +1 @@
+binary operation string / number is not implemented
\ No newline at end of file
tests/go_testdata_golden_override/string_index_negative.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/string_index_negative.jsonnet.golden
@@ -0,0 +1 @@
+array out of bounds: -1 is not within [0,4)
\ No newline at end of file
tests/go_testdata_golden_override/string_index_out_of_bounds.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/string_index_out_of_bounds.jsonnet.golden
@@ -0,0 +1 @@
+string out of bounds: 4 is not within [0,4)
\ No newline at end of file
tests/go_testdata_golden_override/string_minus_number.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/string_minus_number.jsonnet.golden
@@ -0,0 +1 @@
+binary operation string - number is not implemented
\ No newline at end of file
tests/go_testdata_golden_override/string_plus_function.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/string_plus_function.jsonnet.golden
@@ -0,0 +1 @@
+runtime error: tried to manifest function
\ No newline at end of file
tests/go_testdata_golden_override/supersugar8.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/supersugar8.jsonnet.golden
@@ -0,0 +1,2 @@
+assert failed: null
+ supersugar8.jsonnet:1:10-17: assertion failure
\ No newline at end of file
tests/go_testdata_golden_override/syntax_error.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/syntax_error.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "EOF"
+ syntax_error.jsonnet:1:5
\ No newline at end of file
tests/go_testdata_golden_override/tailstrict2.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/tailstrict2.jsonnet.golden
@@ -0,0 +1,3 @@
+runtime error: xxx
+ tailstrict2.jsonnet:1:13-21: error statement
+ tailstrict2.jsonnet:2:14-19: function <e> call
\ No newline at end of file
tests/go_testdata_golden_override/too_many_arguments.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/too_many_arguments.jsonnet.golden
@@ -0,0 +1,3 @@
+too many args, function has 3
+Function has the following signature: (x, y, z)
+ too_many_arguments.jsonnet:1:1-36: function <anonymous> call
\ No newline at end of file
tests/go_testdata_golden_override/type_error.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/type_error.jsonnet.golden
@@ -0,0 +1,4 @@
+runtime error: xxx
+ type_error.jsonnet:1:10-22: error statement
+ argument <x> evaluation
+ type_error.jsonnet:1:1-23: function <builtin_type> call
\ No newline at end of file
tests/go_testdata_golden_override/unary_minus4.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/unary_minus4.jsonnet.golden
@@ -0,0 +1 @@
+operator - does not operate on type string
\ No newline at end of file
tests/go_testdata_golden_override/unary_object.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/unary_object.jsonnet.golden
@@ -0,0 +1 @@
+operator + does not operate on type object
\ No newline at end of file
tests/go_testdata_golden_override/unfinished_args.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/unfinished_args.jsonnet.golden
@@ -0,0 +1,2 @@
+syntax error: expected one of "(", ")", ".", "?", "[", "{", <binary op>, got "EOF"
+ unfinished_args.jsonnet:1:18
\ No newline at end of file
tests/go_testdata_golden_override/variable_not_visible.jsonnet.goldendiffbeforeafterboth--- /dev/null
+++ b/tests/go_testdata_golden_override/variable_not_visible.jsonnet.golden
@@ -0,0 +1,3 @@
+local is not defined: nested
+ variable_not_visible.jsonnet:1:44-51: local <nested> access
+ variable_not_visible.jsonnet:1:52-55: local <x2> access
\ No newline at end of file
tests/tests/cpp_test_suite.rsdiffbeforeafterboth1use std::{2 env, fs,3 io::{self, ErrorKind},4 path::{Path, PathBuf},5};67use jrsonnet_evaluator::{8 FileImportResolver, IStr, ObjValueBuilder, State, Val, apply_tla,9 function::TlaArg,10 gc::WithCapacityExt as _,11 manifest::JsonFormat,12 rustc_hash::FxHashMap,13 trace::{CompactFormat, PathResolver, TraceFormat},14};15use jrsonnet_stdlib::ContextInitializer;16mod common;17use common::ContextInitializer as TestContextInitializer;1819fn run(file: &Path, root: &Path) -> String {20 let mut s = State::builder();2122 let std_context = ContextInitializer::new(PathResolver::Relative(root.to_owned()));23 // C++ test suite24 std_context.add_ext_str("var1".into(), "test".into());25 std_context26 .add_ext_code("var2".into(), "{x:1,y:2}")27 .expect("code is valid");2829 // Golang test suite30 std_context31 .add_ext_code("codeVar".into(), "3+3")32 .expect("code is valid");33 std_context.add_ext_str("stringVar".into(), "2 + 2".into());34 std_context35 .add_ext_code(36 "selfRecursiveVar".into(),37 r#"[42, std.extVar("selfRecursiveVar")[0] + 1]"#,38 )39 .expect("code is valid");40 std_context41 .add_ext_code(42 "mutuallyRecursiveVar1".into(),43 r#"[42, std.extVar("mutuallyRecursiveVar2")[0] + 1]"#,44 )45 .expect("code is valid");46 std_context47 .add_ext_code(48 "mutuallyRecursiveVar2".into(),49 r#"[42, std.extVar("mutuallyRecursiveVar1")[0] + 1]"#,50 )51 .expect("code is valid");5253 s.context_initializer((std_context, TestContextInitializer))54 .import_resolver(FileImportResolver::default());55 let s = s.build();5657 let _entered = s.enter();5859 let trace_format = CompactFormat {60 resolver: PathResolver::FileName,61 max_trace: 20,62 padding: 4,63 };6465 let mut v = match s.import(file) {66 Ok(v) => v,67 Err(e) => return trace_format.format(&e).unwrap(),68 };6970 if file71 .file_name()72 .expect("file has basename")73 .to_str()74 .expect("jsonnet testsuite has ascii names")75 .starts_with("tla.")76 {77 let mut args = FxHashMap::new();78 args.insert(IStr::from("var1"), TlaArg::String("test".into()));79 args.insert(80 IStr::from("var2"),81 TlaArg::Val({82 let mut o = ObjValueBuilder::new();8384 o.field("x").value(Val::num(1));85 o.field("y").value(Val::num(2));8687 Val::Obj(o.build())88 }),89 );90 v = apply_tla(&args, v).expect("failed to apply tla");91 } else {92 v = match apply_tla(&FxHashMap::new(), v) {93 Ok(v) => v,94 Err(e) => return trace_format.format(&e).unwrap(),95 };96 }9798 match v.manifest(JsonFormat::default()) {99 Ok(v) => v,100 Err(e) => trace_format.format(&e).unwrap(),101 }102}103104fn read_file(path: &Path) -> io::Result<Option<String>> {105 match fs::read_to_string(path) {106 Ok(v) => Ok(Some(v)),107 Err(e) if e.kind() == ErrorKind::NotFound => Ok(None),108 Err(e) => Err(e),109 }110}111112const SKIPPED: &[&str] = &[113 // C++ tests:114115 // Parser fails with stack overflow. While is a bug, this is a too unusual116 // thing to run untrusted jsonnet code? Will be fixed with nom/rowan.117 "error.parse.deep_array_nesting.jsonnet",118 // Runtime, not static error in jrsonnet119 "error.parse.object_local_clash.jsonnet",120 "error.function_duplicate_param.jsonnet",121 // Too slow to throw due to how lazyness is implemented in jrsonnet122 "error.recursive_object_non_term.jsonnet",123 // In jrsonnet returns the one passed argument, works as Rust's dbg!()124 "error.trace_one_param.jsonnet",125 // In jrsonnet can display any value126 "error.trace_two_param.jsonnet",127 // Depends on unsafe handling of strings as arrays in jsonnet stdlib128 "invariant_manifest.jsonnet",129 // Little bit hard to capture trace logs in this test suite at this moment130 "trace.jsonnet",131 // Go tests:132133 // Something is wrong, go-jsonnet skips safe integer range check here134 "bitwise_or9.jsonnet",135 // Jrsonnet does not use byte strings, all utf8 is converted to bytes first136 "builtinBase64_string_high_codepoint.jsonnet",137 // Split by empty string is string characters, same as everywhere else138 "builtinSplitLimitR6.jsonnet",139 // escapeStringJson only accepts string in jrsonnet140 "builtin_escapeStringJson.jsonnet",141 // golang float formatting is inefficient and not portable142 "builtin_manifestTomlEx.jsonnet",143 "div3.jsonnet",144 "pow6.jsonnet",145 // golang escapes "e" yaml key, does it think it is float?146 "builtin_manifestYamlDoc.jsonnet",147 // Wtf?..148 // Result149 // [150 // {},151 // {},152 // []153 // ]154 // and golden155 // [156 // {},157 // {},158 // []159 // ]160 // did not match structurally:161 // [162 // ...163 // - {164 // - }165 // + {166 // + }167 // [168 // ]169 // ]170 "empty_object_comp.jsonnet",171 "object_hidden.jsonnet",172 // multi output is a CLI part, not an interpreter.173 "multi.jsonnet",174 "multi_no_newline.jsonnet",175 "multi_no_newline_string_output.jsonnet",176 "multi_string_output.jsonnet",177 // Tested otherwise178 "native1.jsonnet",179 "native2.jsonnet",180 "native3.jsonnet",181 "native6.jsonnet",182 // Since when parser should throw an error for that?..183 "number_leading_zero.jsonnet",184 // Jrsonnet has this overload185 "number_times_string.jsonnet",186];187188#[test]189fn cpp_test_suite() -> io::Result<()> {190 use json_structural_diff::JsonDiff;191192 for root_dir in ["cpp_test_suite", "go_testdata"] {193 let root_tests = PathBuf::from(env!("CARGO_MANIFEST_DIR"));194 let root = root_tests.join(root_dir);195 let root_override = root_tests.join(format!("{root_dir}_golden_override"));196197 for entry in fs::read_dir(&root).map_err(|e| io::Error::new(ErrorKind::Other, format!("failed to enumerate cpp_test_suite dir (Note: it needs to be cloned from C++ jsonnet repo for this test): {e}")))? {198 let entry = entry?;199 if !entry.path().extension().map_or(false, |e| e == "jsonnet") {200 continue;201 }202203 if entry204 .path()205 .file_name()206 .and_then(|v| v.to_str())207 .map_or(false, |v| SKIPPED.contains(&v))208 {209 continue;210 }211212 let result = run(&entry.path(), &root);213214 let mut golden_path = entry.path();215 golden_path.set_extension("jsonnet.golden");216217 let mut golden_path2 = entry.path();218 golden_path2.set_extension("golden");219220 let golden_override =221 root_override.join(&golden_path.file_name().expect("file has basename"));222223 // .jsonnet.golden for C++ tests224 let mut golden = read_file(&golden_path)?;225 // .golden for Go tests226 if golden.is_none() && let Some(golden_path) = read_file(&dbg!(golden_path2))? {227 golden = Some(golden_path);228 }229230 // Any of them can be overriden by overrides231 if let Some(golden_path) = read_file(&golden_override)? {232 golden = Some(golden_path);233 }234235 // Otherwise assume test should just not fail and return true.236 let golden = golden.unwrap_or_else(|| "true".to_owned());237238 match (serde_json::from_str(&result), serde_json::from_str(&golden)) {239 (Err(_), Ok(_)) => panic!(240 "unexpected error for golden {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",241 entry.path().display()242 ),243 (Ok(_), Err(_)) => panic!(244 "expected error for golden {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",245 entry.path().display()246 ),247 (Ok(result), Ok(golden)) => {248 // Show diff relative to golden`.249 let diff = JsonDiff::diff_string(&golden, &result, false);250 if let Some(diff) = diff {251 panic!(252 "Result \n{result:#}\n\253 and golden \n{golden:#}\n\254 did not match structurally:\n{diff:#}\n\255 for golden {}",256 entry.path().display()257 );258 }259 }260 (Err(_), Err(_)) => {261 if result != golden.trim_end() {262 if env::var_os("UPDATE_GOLDEN").is_some() {263 fs::write(golden_override, result)?;264 } else {265 panic!(266 "golden didn't match for {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",267 entry.path().display()268 )269 }270 }271 }272 };273 }274 }275276 Ok(())277}1use std::{2 env, fs,3 io::{self, ErrorKind},4 path::{Path, PathBuf},5};67use jrsonnet_evaluator::{8 FileImportResolver, IStr, ObjValueBuilder, State, Val, apply_tla,9 function::TlaArg,10 gc::WithCapacityExt as _,11 manifest::JsonFormat,12 rustc_hash::FxHashMap,13 trace::{CompactFormat, PathResolver, TraceFormat},14};15use jrsonnet_stdlib::ContextInitializer;16mod common;17use common::ContextInitializer as TestContextInitializer;1819fn run(file: &Path, root: &Path) -> String {20 let mut s = State::builder();2122 let std_context = ContextInitializer::new(PathResolver::Relative(root.to_owned()));23 // C++ test suite24 std_context.add_ext_str("var1".into(), "test".into());25 std_context26 .add_ext_code("var2".into(), "{x:1,y:2}")27 .expect("code is valid");2829 // Golang test suite30 std_context31 .add_ext_code("codeVar".into(), "3+3")32 .expect("code is valid");33 std_context.add_ext_str("stringVar".into(), "2 + 2".into());34 std_context35 .add_ext_code(36 "selfRecursiveVar".into(),37 r#"[42, std.extVar("selfRecursiveVar")[0] + 1]"#,38 )39 .expect("code is valid");40 std_context41 .add_ext_code(42 "mutuallyRecursiveVar1".into(),43 r#"[42, std.extVar("mutuallyRecursiveVar2")[0] + 1]"#,44 )45 .expect("code is valid");46 std_context47 .add_ext_code(48 "mutuallyRecursiveVar2".into(),49 r#"[42, std.extVar("mutuallyRecursiveVar1")[0] + 1]"#,50 )51 .expect("code is valid");5253 s.context_initializer((std_context, TestContextInitializer))54 .import_resolver(FileImportResolver::default());55 let s = s.build();5657 let _entered = s.enter();5859 let trace_format = CompactFormat {60 resolver: PathResolver::FileName,61 max_trace: 20,62 padding: 4,63 };6465 let mut v = match s.import(file) {66 Ok(v) => v,67 Err(e) => return trace_format.format(&e).unwrap(),68 };6970 if file71 .file_name()72 .expect("file has basename")73 .to_str()74 .expect("jsonnet testsuite has ascii names")75 .starts_with("tla.")76 {77 let mut args = FxHashMap::new();78 args.insert(IStr::from("var1"), TlaArg::String("test".into()));79 args.insert(80 IStr::from("var2"),81 TlaArg::Val({82 let mut o = ObjValueBuilder::new();8384 o.field("x").value(Val::num(1));85 o.field("y").value(Val::num(2));8687 Val::Obj(o.build())88 }),89 );90 v = apply_tla(&args, v).expect("failed to apply tla");91 } else {92 v = match apply_tla(&FxHashMap::new(), v) {93 Ok(v) => v,94 Err(e) => return trace_format.format(&e).unwrap(),95 };96 }9798 match v.manifest(JsonFormat::default()) {99 Ok(v) => v,100 Err(e) => trace_format.format(&e).unwrap(),101 }102}103104fn read_file(path: &Path) -> io::Result<Option<String>> {105 match fs::read_to_string(path) {106 Ok(v) => Ok(Some(v)),107 Err(e) if e.kind() == ErrorKind::NotFound => Ok(None),108 Err(e) => Err(e),109 }110}111112const SKIPPED: &[&str] = &[113 // C++ tests:114115 // Parser fails with stack overflow. While is a bug, this is a too unusual116 // thing to run untrusted jsonnet code? Will be fixed with nom/rowan.117 "error.parse.deep_array_nesting.jsonnet",118 // Runtime, not static error in jrsonnet119 "error.parse.object_local_clash.jsonnet",120 "error.function_duplicate_param.jsonnet",121 // Too slow to throw due to how lazyness is implemented in jrsonnet122 "error.recursive_object_non_term.jsonnet",123 // In jrsonnet returns the one passed argument, works as Rust's dbg!()124 "error.trace_one_param.jsonnet",125 // In jrsonnet can display any value126 "error.trace_two_param.jsonnet",127 // Depends on unsafe handling of strings as arrays in jsonnet stdlib128 "invariant_manifest.jsonnet",129 // Little bit hard to capture trace logs in this test suite at this moment130 "trace.jsonnet",131 // Go tests:132133 // Something is wrong, go-jsonnet skips safe integer range check here134 "bitwise_or9.jsonnet",135 // Jrsonnet does not use byte strings, all utf8 is converted to bytes first136 "builtinBase64_string_high_codepoint.jsonnet",137 // Split by empty string is string characters, same as everywhere else138 "builtinSplitLimitR6.jsonnet",139 // escapeStringJson only accepts string in jrsonnet140 "builtin_escapeStringJson.jsonnet",141 // golang float formatting is inefficient and not portable142 "builtin_manifestTomlEx.jsonnet",143 "div3.jsonnet",144 "pow6.jsonnet",145 // golang escapes "e" yaml key, does it think it is float?146 "builtin_manifestYamlDoc.jsonnet",147 // Wtf?..148 // Result149 // [150 // {},151 // {},152 // []153 // ]154 // and golden155 // [156 // {},157 // {},158 // []159 // ]160 // did not match structurally:161 // [162 // ...163 // - {164 // - }165 // + {166 // + }167 // [168 // ]169 // ]170 "empty_object_comp.jsonnet",171 "object_hidden.jsonnet",172 // multi output is a CLI part, not an interpreter.173 "multi.jsonnet",174 "multi_no_newline.jsonnet",175 "multi_no_newline_string_output.jsonnet",176 "multi_string_output.jsonnet",177 // Tested otherwise178 "native1.jsonnet",179 "native2.jsonnet",180 "native3.jsonnet",181 "native6.jsonnet",182 // Since when parser should throw an error for that?..183 "number_leading_zero.jsonnet",184 // Jrsonnet has this overload185 "number_times_string.jsonnet",186 // Jrsonnet has stricter implementations, this is a dumb thing that the filter value might not be187 // evaluated anyway...188 "std.filter7.jsonnet",189 // Golang fails with max stack frames exceeded error190 "std.makeArray_recursive_evalutation_order_matters.jsonnet",191 // Jrsonnet has this overload192 "string_times_number.jsonnet",193 // Tailstrict semantics is partially unspecified194 "tailstrict3.jsonnet",195];196197#[test]198fn cpp_test_suite() -> io::Result<()> {199 use json_structural_diff::JsonDiff;200201 for root_dir in ["cpp_test_suite", "go_testdata"] {202 let root_tests = PathBuf::from(env!("CARGO_MANIFEST_DIR"));203 let root = root_tests.join(root_dir);204 let root_override = root_tests.join(format!("{root_dir}_golden_override"));205206 for entry in fs::read_dir(&root).map_err(|e| io::Error::new(ErrorKind::Other, format!("failed to enumerate cpp_test_suite dir (Note: it needs to be cloned from C++ jsonnet repo for this test): {e}")))? {207 let entry = entry?;208 if !entry.path().extension().map_or(false, |e| e == "jsonnet") {209 continue;210 }211212 if entry213 .path()214 .file_name()215 .and_then(|v| v.to_str())216 .map_or(false, |v| SKIPPED.contains(&v))217 {218 continue;219 }220221 let result = run(&entry.path(), &root);222223 let mut golden_path = entry.path();224 golden_path.set_extension("jsonnet.golden");225226 let mut golden_path2 = entry.path();227 golden_path2.set_extension("golden");228229 let golden_override =230 root_override.join(&golden_path.file_name().expect("file has basename"));231232 // .jsonnet.golden for C++ tests233 let mut golden = read_file(&golden_path)?;234 // .golden for Go tests235 if golden.is_none() && let Some(golden_path) = read_file(&dbg!(golden_path2))? {236 golden = Some(golden_path);237 }238239 // Any of them can be overriden by overrides240 if let Some(golden_path) = read_file(&golden_override)? {241 golden = Some(golden_path);242 }243244 // Otherwise assume test should just not fail and return true.245 let golden = golden.unwrap_or_else(|| "true".to_owned());246247 match (serde_json::from_str(&result), serde_json::from_str(&golden)) {248 (Err(_), Ok(_)) => panic!(249 "unexpected error for golden {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",250 entry.path().display()251 ),252 (Ok(_), Err(_)) => panic!(253 "expected error for golden {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",254 entry.path().display()255 ),256 (Ok(result_v), Ok(golden)) => {257 // Show diff relative to golden`.258 let diff = JsonDiff::diff_string(&golden, &result_v, false);259 if let Some(diff) = diff {260 if env::var_os("UPDATE_GOLDEN").is_some() {261 fs::write(golden_override, result)?;262 } else {263 panic!(264 "Result \n{result_v:#}\n\265 and golden \n{golden:#}\n\266 did not match structurally:\n{diff:#}\n\267 for golden {}",268 entry.path().display()269 );270 }271 }272 }273 (Err(_), Err(_)) => {274 if result != golden.trim_end() {275 if env::var_os("UPDATE_GOLDEN").is_some() {276 fs::write(golden_override, result)?;277 } else {278 panic!(279 "golden didn't match for {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",280 entry.path().display()281 )282 }283 }284 }285 };286 }287 }288289 Ok(())290}