git.delta.rocks / jrsonnet / refs/commits / 5f9657289c33

difftreelog

test pass full go-jsonnet test suite

pwtnqznvYaroslav Bolyukin2026-02-08parent: #eea91c3.patch.diff
in: master

54 files changed

modifiedcrates/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)
 					}),
modifiedcrates/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]
modifiedcrates/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
modifiedcrates/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]
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/go_testdata_golden_override/stdlib_smoke_test.jsonnet.goldendiffbeforeafterboth
after · tests/go_testdata_golden_override/stdlib_smoke_test.jsonnet.golden
1{2    "abs": 42,3    "acos": 1.0471975511965979,4    "asciiLower": "blah",5    "asciiUpper": "BLAH",6    "asin": 0.5235987755982989,7    "assertEqual": true,8    "atan": 1.373400766945016,9    "base64": [10        "YmxhaA==",11        "YmxhaA=="12    ],13    "base64Decode": "blah\n",14    "base64DecodeBytes": [15        98,16        108,17        97,18        104,19        1020    ],21    "ceil": 5,22    "char": "A",23    "codepoint": 65,24    "cos": 0.28366218546322625,25    "count": 1,26    "decodeUTF8": "AAA",27    "encodeUTF8": [28        98,29        108,30        97,31        10432    ],33    "endsWith": true,34    "escapeStringBash": "'test '\"'\"'test'\"'\"'test'",35    "escapeStringDollars": "test 'test'test",36    "escapeStringJson": "\"test 'test'test\"",37    "escapeStringPython": "\"test 'test'test\"",38    "exp": 148.4131591025766,39    "exponent": 3,40    "filter": [41        2,42        443    ],44    "filterMap": [45        4,46        847    ],48    "find": [49        2,50        451    ],52    "findSubstr": [53        0,54        555    ],56    "flatMap": [57        2,58        3,59        4,60        6,61        6,62        963    ],64    "flattenArrays": [65        1,66        2,67        3,68        4,69        5,70        [71            6,72            773        ]74    ],75    "floor": 5,76    "foldl": [77        0,78        1,79        2,80        381    ],82    "foldr": [83        1,84        2,85        3,86        487    ],88    "format": "test blah 42",89    "get": [90        17,91        42,92        18,93        4294    ],95    "isArray": true,96    "isBoolean": true,97    "isFunction": true,98    "isNumber": true,99    "isObject": true,100    "isString": true,101    "join": "a,b,c",102    "length": 0,103    "lines": "a\nb\nc\n",104    "log": 1.6094379124341003,105    "lstripChars": "bbbbcccc",106    "makeArray": [107        0,108        1,109        2,110        3,111        4112    ],113    "manifestIni": "a = 1\nb = 2\n[s1]\nx = 1\ny = 2\n",114    "manifestJsonEx": "{\n \"a\": {\n  \"b\": \"c\"\n }\n}",115    "manifestJsonMinified": "{\"a\":{\"b\":\"c\"}}",116    "manifestPython": "{\"a\": {\"b\": \"c\"}}",117    "manifestPythonVars": "a = {\"b\": \"c\"}\n",118    "manifestTomlEx": "[a]\n b = \"c\"",119    "manifestXmlJsonml": "<blah a=\"42\"></blah>",120    "manifestYamlDoc": "\"a\":\n  \"b\": \"c\"",121    "manifestYamlStream": "---\n42\n---\n\"a\":\n  \"b\": \"c\"\n...\n",122    "mantissa": 0.6249999999999999,123    "map": [124        -1,125        -2,126        -3127    ],128    "mapWithIndex": [129        3,130        3,131        3132    ],133    "mapWithKey": {134        "a": 42135    },136    "max": 3,137    "md5": "1bc29b36f623ba82aaf6724fd3b16718",138    "member": true,139    "mergePatch": { },140    "min": 2,141    "objectFields": [ ],142    "objectFieldsAll": [ ],143    "objectHas": false,144    "objectHasAll": false,145    "objectKeysValues": [ ],146    "objectKeysValuesAll": [ ],147    "objectValues": [ ],148    "objectValuesAll": [ ],149    "parseHex": 3735928559,150    "parseInt": 42,151    "parseJson": {152        "a": "b"153    },154    "parseOctal": 83,155    "pow": 8,156    "prune": {157        "y": [158            "42"159        ]160    },161    "range": [162        1,163        2,164        3,165        4,166        5167    ],168    "repeat": "foofoofoo",169    "reverse": [170        "a",171        "b"172    ],173    "rstripChars": "aaabbbb",174    "set": [175        [176            1,177            2,178            3179        ],180        [181            3,182            2,183            1184        ]185    ],186    "setDiff": [187        [188            1,189            2190        ],191        [192            1,193            3194        ]195    ],196    "setInter": [197        [198            3199        ],200        [201            2202        ]203    ],204    "setMember": [205        false,206        true207    ],208    "setUnion": [209        [210            1,211            2,212            3,213            4,214            5215        ],216        [217            1,218            2,219            3,220            4,221            5222        ]223    ],224    "sign": 1,225    "sin": -0.9589242746631385,226    "slice": "o",227    "sort": [228        [229            1,230            2,231            3232        ],233        [234            3,235            2,236            1237        ]238    ],239    "split": [240        "a",241        "b",242        "c"243    ],244    "splitLimit": [245        "a",246        "b,c"247    ],248    "splitLimitR": [249        "a,b",250        "c"251    ],252    "sqrt": 2.23606797749979,253    "startsWith": true,254    "strReplace": "bba",255    "stringChars": [256        "b",257        "l",258        "a",259        "h"260    ],261    "stripChars": "bbbb",262    "substr": "s",263    "tan": -3.380515006246586,264    "thisFile": "stdlib_smoke_test.jsonnet",265    "toString": "42",266    "type": "object",267    "uniq": [268        [269            1,270            2,271            3272        ],273        [274            "a",275            "B",276            "a"277        ]278    ]279}
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
addedtests/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
modifiedtests/tests/cpp_test_suite.rsdiffbeforeafterboth
--- a/tests/tests/cpp_test_suite.rs
+++ b/tests/tests/cpp_test_suite.rs
@@ -183,6 +183,15 @@
 	"number_leading_zero.jsonnet",
 	// Jrsonnet has this overload
 	"number_times_string.jsonnet",
+	// Jrsonnet has stricter implementations, this is a dumb thing that the filter value might not be
+	// evaluated anyway...
+	"std.filter7.jsonnet",
+	// Golang fails with max stack frames exceeded error
+	"std.makeArray_recursive_evalutation_order_matters.jsonnet",
+	// Jrsonnet has this overload
+	"string_times_number.jsonnet",
+	// Tailstrict semantics is partially unspecified
+	"tailstrict3.jsonnet",
 ];
 
 #[test]
@@ -244,17 +253,21 @@
 				"expected error for golden {}:\n<got>\n{result}\n</got>\n<golden>\n{golden}\n</golden>",
 				entry.path().display()
 			),
-			(Ok(result), Ok(golden)) => {
+			(Ok(result_v), Ok(golden)) => {
 				// Show diff relative to golden`.
-				let diff = JsonDiff::diff_string(&golden, &result, false);
+				let diff = JsonDiff::diff_string(&golden, &result_v, false);
 				if let Some(diff) = diff {
-					panic!(
-						"Result \n{result:#}\n\
-							and golden \n{golden:#}\n\
-							did not match structurally:\n{diff:#}\n\
-							for golden {}",
-						entry.path().display()
-					);
+					if env::var_os("UPDATE_GOLDEN").is_some() {
+						fs::write(golden_override, result)?;
+					} else {
+						panic!(
+							"Result \n{result_v:#}\n\
+								and golden \n{golden:#}\n\
+								did not match structurally:\n{diff:#}\n\
+								for golden {}",
+							entry.path().display()
+						);
+					}
 				}
 			}
 			(Err(_), Err(_)) => {