vlib/json2/encode_append_test.v
Rama master · réplica de lectura del repositorio original.
module json2
import time
enum AppendKind {
first
second
}
struct AppendRecord {
text string @[json: 'body']
number u64
items []int
optional ?string
kind AppendKind
created time.Time
raw string @[raw]
}
fn append_matches[T](value T, options EncoderOptions) {
expected := encode(value, options)
mut output := 'prefix:'.bytes()
encode_append(value, mut output, options)
assert output.bytestr() == 'prefix:' + expected
retained := output.bytestr()
output.clear()
encode_append(value, mut output, options)
assert output.bytestr() == expected
assert retained == 'prefix:' + expected
}
fn test_encode_append_preserves_options_and_values() {
for text in ['', 'plain ASCII', '"\\\n\r\t\b\f\x00', 'مرحبا é 😀', 'x'.repeat(8193)] {
value := AppendRecord{
text: text
number: u64(18446744073709551615)
items: [1, -2, 3]
optional: 'present'
kind: .second
created: time.unix(1700000000)
raw: '{"nested":[true,null]}'
}
append_matches(value, EncoderOptions{})
append_matches(value, EncoderOptions{ escape_unicode: true, time_as_unix: true })
append_matches(value, EncoderOptions{ prettify: true, indent_string: '--', newline_string: '\r\n' })
append_matches(value, EncoderOptions{ prettify: true, legacy_layout: true, enum_as_int: true })
}
append_matches([1, 2, 3]!, EncoderOptions{})
append_matches({
'empty': []string{}
'unicode': ['é', '😀']
}, EncoderOptions{ escape_unicode: true })
append_matches(null, EncoderOptions{})
}
fn test_encode_append_reuses_capacity_and_grows_without_corrupting_prefix() {
mut output := []u8{cap: 32768}
initial := output.data
for i in 0 .. 100 {
output.clear()
encode_append('message ${i}', mut output)
assert output.bytestr() == encode('message ${i}')
assert output.data == initial
}
output.clear()
output << 'kept:'.bytes()
large := 'é😀"\\'.repeat(10000)
encode_append(large, mut output, escape_unicode: true)
assert output.bytestr() == 'kept:' + encode(large, escape_unicode: true)
encode_append(42, mut output)
assert output.bytestr() == 'kept:' + encode(large, escape_unicode: true) + '42'
}