From 56dc21de202f7928a2668326e7f37a9dd7f7ada8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Sat, 11 Apr 2026 06:17:19 +0800 Subject: [PATCH] fix: add base64DecodeBytes unsigned round-trip test + improve JMH config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add regression test base64DecodeBytes_unsigned.jsonnet verifying that bytes >= 128 are returned as unsigned values (0-255). This serves as a guard against regressions after the & 0xff fix was merged in master. - Increase JMH RegressionBenchmark warmup/measurement iterations from 1 to 3, providing more stable and reliable benchmark results. 🤖 Generated with [Qoder][https://qoder.com] --- .../sjsonnet/bench/RegressionBenchmark.scala | 4 ++-- .../base64DecodeBytes_unsigned.jsonnet | 21 +++++++++++++++++++ .../base64DecodeBytes_unsigned.jsonnet.golden | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet create mode 100644 sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet.golden diff --git a/bench/src/sjsonnet/bench/RegressionBenchmark.scala b/bench/src/sjsonnet/bench/RegressionBenchmark.scala index 5e6f7329..10bfe5fe 100644 --- a/bench/src/sjsonnet/bench/RegressionBenchmark.scala +++ b/bench/src/sjsonnet/bench/RegressionBenchmark.scala @@ -23,8 +23,8 @@ object RegressionBenchmark { @BenchmarkMode(Array(Mode.AverageTime)) @Fork(1) -@Warmup(iterations = 1, time = 2) -@Measurement(iterations = 1) +@Warmup(iterations = 3, time = 2) +@Measurement(iterations = 3) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) class RegressionBenchmark { diff --git a/sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet b/sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet new file mode 100644 index 00000000..10227500 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet @@ -0,0 +1,21 @@ +// Regression test: base64DecodeBytes must return unsigned byte values (0-255). +// Java's byte type is signed (-128..127), so without masking with 0xff, +// bytes >= 128 would appear as negative numbers. +local bytes = std.base64DecodeBytes("gIA="); // decodes to [0x80, 0x80] = [128, 128] + +std.assertEqual(bytes[0], 128) && +std.assertEqual(bytes[1], 128) && + +// Test full range: 0xFF = 255 +local highByte = std.base64DecodeBytes("/w=="); // decodes to [0xFF] = [255] +std.assertEqual(highByte[0], 255) && + +// Test zero byte +local zeroByte = std.base64DecodeBytes("AA=="); // decodes to [0x00] = [0] +std.assertEqual(zeroByte[0], 0) && + +// Round-trip test: encode then decode should preserve all byte values including high bytes +local mixed = [0, 127, 128, 200, 255]; +std.assertEqual(std.base64DecodeBytes(std.base64(mixed)), mixed) && + +true diff --git a/sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet.golden new file mode 100644 index 00000000..27ba77dd --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/base64DecodeBytes_unsigned.jsonnet.golden @@ -0,0 +1 @@ +true