mirror of
https://github.com/vlang/v.git
synced 2025-08-05 10:47:11 -04:00
342 lines
9.6 KiB
V
342 lines
9.6 KiB
V
module decoder2
|
|
|
|
fn test_nodes() {
|
|
mut nodes := []Node{}
|
|
|
|
mut decoder := Decoder{
|
|
json: '{"val": "2"}'
|
|
}
|
|
|
|
decoder.fulfill_nodes(mut nodes)
|
|
|
|
assert nodes.len == 1
|
|
assert nodes[0].key_pos == 2
|
|
assert nodes[0].key_len == 3
|
|
assert nodes[0].children == none
|
|
nodes = []
|
|
|
|
decoder = Decoder{
|
|
json: '{"val": 0, "val1": 1}'
|
|
}
|
|
decoder.fulfill_nodes(mut nodes)
|
|
|
|
assert nodes.len == 2
|
|
assert nodes[0].key_pos == 2
|
|
assert nodes[0].key_len == 3
|
|
|
|
assert nodes[1].key_pos == 12
|
|
assert nodes[1].key_len == 4
|
|
|
|
nodes = []
|
|
|
|
decoder = Decoder{
|
|
json: '{"val": {"val": 2}}'
|
|
}
|
|
decoder.fulfill_nodes(mut nodes)
|
|
|
|
assert nodes.len == 1
|
|
assert nodes[0].children != none
|
|
assert nodes[0].children?.len == 1
|
|
assert nodes[0].children?[0].key_pos == 10
|
|
assert nodes[0].children?[0].children == none
|
|
}
|
|
|
|
fn test_check_if_json_match() {
|
|
// /* Test wrong string values */
|
|
mut has_error := false
|
|
|
|
check_if_json_match[string]('{"key": "value"}') or {
|
|
assert err.str() == 'Expected string, but got object'
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error'
|
|
has_error = false
|
|
|
|
check_if_json_match[map[string]string]('"value"') or {
|
|
assert err.str() == 'Expected object, but got string_'
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error'
|
|
has_error = false
|
|
|
|
check_if_json_match[[]int]('{"key": "value"}') or {
|
|
assert err.str() == 'Expected array, but got object'
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error'
|
|
has_error = false
|
|
|
|
check_if_json_match[string]('[1, 2, 3]') or {
|
|
assert err.str() == 'Expected string, but got array'
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error'
|
|
has_error = false
|
|
|
|
check_if_json_match[int]('{"key": "value"}') or {
|
|
assert err.str() == 'Expected number, but got object'
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error'
|
|
has_error = false
|
|
|
|
check_if_json_match[bool]('{"key": "value"}') or {
|
|
assert err.str() == 'Expected boolean, but got object'
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error'
|
|
has_error = false
|
|
|
|
// /* Right string values */
|
|
check_if_json_match[string]('"value"') or { assert false }
|
|
|
|
check_if_json_match[map[string]string]('{"key": "value"}') or { assert false }
|
|
|
|
check_if_json_match[[]int]('[1, 2, 3]') or { assert false }
|
|
|
|
check_if_json_match[string]('"string"') or { assert false }
|
|
|
|
check_if_json_match[int]('123') or { assert false }
|
|
|
|
check_if_json_match[bool]('true') or { assert false }
|
|
|
|
check_if_json_match[bool]('false') or { assert false }
|
|
|
|
// TODO: test null
|
|
}
|
|
|
|
fn test_check_json_format() {
|
|
// primitives
|
|
for variable in ['""', '"string"', '123', '0', 'true'] {
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: variable
|
|
}
|
|
|
|
checker.check_json_format(variable) or { assert false, err.str() }
|
|
assert checker.checker_idx == checker.json.len - 1, 'Expected to reach the end of the json string ${checker.json}'
|
|
}
|
|
|
|
// simple objects
|
|
for variable in ['{}', '{"key": null}', '{"key": "value"}', '{"key": 123}', '{"key": true}'] {
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: variable
|
|
}
|
|
|
|
checker.check_json_format(variable) or { assert false, err.str() }
|
|
assert checker.checker_idx == checker.json.len - 1, 'Expected to reach the end of the json string ${checker.json}'
|
|
}
|
|
|
|
// Nested objects
|
|
for variable in ['{"key": {"key": 123}}'] {
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: variable
|
|
}
|
|
|
|
checker.check_json_format(variable) or { assert false, err.str() }
|
|
assert checker.checker_idx == checker.json.len - 1, 'Expected to reach the end of the json string ${checker.json}'
|
|
}
|
|
|
|
// simple arrays
|
|
for variable in ['[]', '[1, 2, 3]', '["a", "b", "c"]', '[true, false]'] {
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: variable
|
|
}
|
|
|
|
checker.check_json_format(variable) or { assert false, err.str() }
|
|
assert checker.checker_idx == checker.json.len - 1, 'Expected to reach the end of the json string ${checker.json}'
|
|
}
|
|
|
|
// Nested arrays
|
|
for variable in ['[[1, 2, 3], [4, 5, 6]]'] {
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: variable
|
|
}
|
|
|
|
checker.check_json_format(variable) or { assert false, err.str() }
|
|
// assert checker.checker_idx == checker.json.len - 1, 'Expected to reach the end of the json string ${checker.json}'
|
|
}
|
|
|
|
// Wrong jsons
|
|
|
|
json_and_error_message := [
|
|
{
|
|
'json': ']'
|
|
'error': '\n]\n^ unknown value kind'
|
|
},
|
|
{
|
|
'json': '}'
|
|
'error': '\n}\n^ unknown value kind'
|
|
},
|
|
{
|
|
'json': 'truely'
|
|
'error': '\ntruel\n ^ invalid value. Unexpected character after boolean end'
|
|
},
|
|
{
|
|
'json': '0[1]' //
|
|
'error': '\n0[\n ^ invalid number'
|
|
},
|
|
{
|
|
'json': '[1, 2, g3]'
|
|
'error': '\n[1, 2, g\n ^ unknown value kind'
|
|
},
|
|
{
|
|
'json': '[1, 2,, 3]'
|
|
'error': '\n[1, 2,,\n ^ unknown value kind'
|
|
},
|
|
{
|
|
'json': '{"key": 123'
|
|
'error': '\n{"key": 123\n ^ EOF error: braces are not closed'
|
|
},
|
|
{
|
|
'json': '{"key": 123,'
|
|
'error': '\n{"key": 123,\n ^ EOF error: braces are not closed'
|
|
},
|
|
{
|
|
'json': '{"key": 123, "key2": 456,}'
|
|
'error': '\n{"key": 123, "key2": 456,}\n ^ Expecting object key'
|
|
},
|
|
{
|
|
'json': '[[1, 2, 3], [4, 5, 6],]'
|
|
'error': '\n[[1, 2, 3], [4, 5, 6],]\n ^ Cannot use `,`, before `]`'
|
|
},
|
|
]
|
|
|
|
for json_and_error in json_and_error_message {
|
|
mut has_error := false
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: json_and_error['json']
|
|
}
|
|
|
|
checker.check_json_format(json_and_error['json']) or {
|
|
assert err.str() == json_and_error['error']
|
|
has_error = true
|
|
}
|
|
assert has_error, 'Expected error ${json_and_error['error']}'
|
|
}
|
|
}
|
|
|
|
fn test_get_value_kind() {
|
|
assert get_value_kind(`"`) == .string_
|
|
assert get_value_kind(`t`) == .boolean
|
|
assert get_value_kind(`f`) == .boolean
|
|
assert get_value_kind(`{`) == .object
|
|
assert get_value_kind(`[`) == .array
|
|
assert get_value_kind(`0`) == .number
|
|
assert get_value_kind(`-`) == .number
|
|
assert get_value_kind(`n`) == .null
|
|
assert get_value_kind(`x`) == .unknown
|
|
}
|
|
|
|
fn test_checker_values_info() {
|
|
// Test for string value
|
|
mut checker := Decoder{
|
|
checker_idx: 0
|
|
json: '"value"'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
assert checker.values_info.len == 1
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 7
|
|
assert checker.values_info[0].value_kind == .string_
|
|
|
|
// Test for number value
|
|
checker = Decoder{
|
|
checker_idx: 0
|
|
json: '123'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
assert checker.values_info.len == 1
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 3
|
|
assert checker.values_info[0].value_kind == .number
|
|
|
|
// Test for boolean value
|
|
checker = Decoder{
|
|
checker_idx: 0
|
|
json: 'true'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
assert checker.values_info.len == 1
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 4
|
|
assert checker.values_info[0].value_kind == .boolean
|
|
|
|
// Test for null value
|
|
checker = Decoder{
|
|
checker_idx: 0
|
|
json: 'null'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
assert checker.values_info.len == 1
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 4
|
|
assert checker.values_info[0].value_kind == .null
|
|
|
|
// Test for object value
|
|
checker = Decoder{
|
|
checker_idx: 0
|
|
json: '{"key": "value"}'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
assert checker.values_info.len == 3
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 16
|
|
assert checker.values_info[0].value_kind == .object
|
|
assert checker.values_info[1].position == 1
|
|
assert checker.values_info[1].length == 5
|
|
assert checker.values_info[1].value_kind == .string_
|
|
assert checker.values_info[2].position == 8
|
|
assert checker.values_info[2].length == 7
|
|
assert checker.values_info[2].value_kind == .string_
|
|
|
|
// Test for nested object value
|
|
checker = Decoder{
|
|
checker_idx: 0
|
|
// json: '0<-{1"key1": 9<-{10"key2": 18"value1"}}'
|
|
json: '{"key1": {"key2": "value1"}'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
dump(checker.values_info)
|
|
assert checker.values_info.len == 5
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 27
|
|
assert checker.values_info[0].value_kind == .object
|
|
assert checker.values_info[1].position == 1
|
|
assert checker.values_info[1].length == 6
|
|
assert checker.values_info[1].value_kind == .string_
|
|
assert checker.values_info[2].position == 9
|
|
assert checker.values_info[2].length == 18
|
|
assert checker.values_info[2].value_kind == .object
|
|
assert checker.values_info[3].position == 10
|
|
assert checker.values_info[3].length == 6
|
|
assert checker.values_info[3].value_kind == .string_
|
|
assert checker.values_info[4].position == 18
|
|
assert checker.values_info[4].length == 8
|
|
|
|
// Test for array value
|
|
checker = Decoder{
|
|
checker_idx: 0
|
|
json: '[1, 22, 333]'
|
|
}
|
|
checker.check_json_format(checker.json) or { assert false, err.str() }
|
|
assert checker.values_info.len == 4
|
|
assert checker.values_info[0].position == 0
|
|
assert checker.values_info[0].length == 12
|
|
assert checker.values_info[0].value_kind == .array
|
|
assert checker.values_info[1].position == 1
|
|
assert checker.values_info[1].length == 1
|
|
assert checker.values_info[1].value_kind == .number
|
|
assert checker.values_info[2].position == 4
|
|
assert checker.values_info[2].length == 2
|
|
assert checker.values_info[2].value_kind == .number
|
|
assert checker.values_info[3].position == 8
|
|
assert checker.values_info[3].length == 3
|
|
assert checker.values_info[3].value_kind == .number
|
|
}
|