diff --git a/sjsonnet/src/sjsonnet/Format.scala b/sjsonnet/src/sjsonnet/Format.scala index 99a9e1de..5dde9939 100644 --- a/sjsonnet/src/sjsonnet/Format.scala +++ b/sjsonnet/src/sjsonnet/Format.scala @@ -696,6 +696,15 @@ object Format { Error.fail( "expected number at position %d, got string".format(i) ) + if (formatted.conversion == 'c') { + val s = vs.str + val cpCount = s.codePointCount(0, s.length) + if (cpCount != 1) + Error.fail( + "%%c expected 1-sized string got: %d".format(cpCount), + pos + ) + } widenRaw(formatted, vs.str) case vn: Val.Num => val s = vn.asDouble diff --git a/sjsonnet/test/resources/new_test_suite/error.format_c_multi_char_string.jsonnet b/sjsonnet/test/resources/new_test_suite/error.format_c_multi_char_string.jsonnet new file mode 100644 index 00000000..5d5f314d --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/error.format_c_multi_char_string.jsonnet @@ -0,0 +1 @@ +"%c" % "AB" diff --git a/sjsonnet/test/resources/new_test_suite/error.format_c_multi_char_string.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.format_c_multi_char_string.jsonnet.golden new file mode 100644 index 00000000..198a3915 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/error.format_c_multi_char_string.jsonnet.golden @@ -0,0 +1,2 @@ +sjsonnet.Error: [std.format] %c expected 1-sized string got: 2 + at [].(error.format_c_multi_char_string.jsonnet:1:6) diff --git a/sjsonnet/test/resources/new_test_suite/format_c_single_char.jsonnet b/sjsonnet/test/resources/new_test_suite/format_c_single_char.jsonnet new file mode 100644 index 00000000..3919a2ed --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/format_c_single_char.jsonnet @@ -0,0 +1,8 @@ +// Regression tests for std.format %c β€” verified against C++ jsonnet v0.21.0 +// Success cases: single-char strings and numeric codepoints +std.assertEqual("%c" % "A", "A") && +std.assertEqual("%c" % 65, "A") && +std.assertEqual("%c" % "δΈ–", "δΈ–") && +std.assertEqual("%c" % 127757, "🌍") && +std.assertEqual("%10c" % "A", " A") && +true diff --git a/sjsonnet/test/resources/new_test_suite/format_c_single_char.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/format_c_single_char.jsonnet.golden new file mode 100644 index 00000000..27ba77dd --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/format_c_single_char.jsonnet.golden @@ -0,0 +1 @@ +true