Ctrl K
ComunidadGuías…

vlib/json2/encode_key_tracking_test.v

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
module json2

struct KeyPlain {
	name     string @[json: 'n']
	count    int
	unused   string @[skip]
	optional ?string
	blank    string @[omitempty]
}

struct KeyNested {
	item  KeyPlain
	items []KeyPlain
}

struct KeyBase {
	name string
	x    int
}

struct KeyMiddle {
	KeyBase
	name string
}

struct KeyOuter {
	KeyMiddle
	x    int
	name string
}

type KeyVariant = KeyPlain | KeyOuter

struct KeyDuplicate {
	a int @[json: 'same']
	b int @[json: 'same']
}

fn test_key_tracking_plain_nested_and_renamed_fields() {
	value := KeyPlain{ name: 'hello', count: 42, unused: 'hidden' }
	assert encode(value) == '{"n":"hello","count":42}'
	assert encode(KeyNested{ item: value, items: [value] }) == '{"item":{"n":"hello","count":42},"items":[{"n":"hello","count":42}]}'
	assert encode(value, prettify: true) == '{\n    "n": "hello",\n    "count": 42\n}'
	assert encode(value, prettify: true, legacy_layout: true) == '{\n\t"n":\t"hello",\n\t"count":\t42\n}'
	assert encode(KeyDuplicate{ a: 1, b: 2 }) == '{"same":1,"same":2}'
}

fn test_key_tracking_embedded_collision_and_sum_variants() {
	value := KeyOuter{
		KeyMiddle: KeyMiddle{ KeyBase: KeyBase{ name: 'base', x: 1 }, name: 'middle' }
		x:         2
		name:      'outer'
	}
	expected := '{"KeyMiddle.KeyBase.name":"base","KeyMiddle.KeyBase.x":1,"KeyMiddle.name":"middle","x":2,"name":"outer"}'
	assert encode(value) == expected
	assert decode[KeyOuter](expected)! == value
	variant := KeyVariant(value)
	assert encode(variant) == expected[..expected.len - 1] + ',"_type":"KeyOuter"}'
	plain := KeyVariant(KeyPlain{ name: 'v', count: 3 })
	assert encode(plain) == '{"n":"v","count":3,"_type":"KeyPlain"}'
}