v2 / vlib / x / json2 / tests / decode_enum_test.v
125 lines · 110 sloc · 3.0 KB · 6be2fbb700781cffff42cb8f82b451a0b30364fd
Raw
1import x.json2 as json
2
3enum Bar {
4 a
5 b @[json: 'BBB']
6 c = 10
7 e @[badattr: 'bad'; foobar]
8}
9
10type BarAlias = Bar
11
12fn test_number_decode() {
13 assert json.decode[Bar]('0')! == Bar.a
14 assert json.decode[Bar]('1')! == Bar.b
15 assert json.decode[Bar]('10')! == Bar.c
16
17 assert json.decode[BarAlias]('0')! == Bar.a
18 assert json.decode[BarAlias]('1')! == Bar.b
19 assert json.decode[BarAlias]('10')! == Bar.c
20}
21
22fn test_number_decode_fails() {
23 if _ := json.decode[Bar]('2') {
24 assert false
25 } else {
26 if err is json.JsonDecodeError {
27 assert err.line == 1
28 assert err.character == 1
29 assert err.message == 'Data: Number value: `2` does not match any field in enum: &Bar'
30 }
31 }
32
33 if _ := json.decode[BarAlias]('2') {
34 assert false
35 } else {
36 if err is json.JsonDecodeError {
37 assert err.line == 1
38 assert err.character == 1
39 assert err.message == 'Data: Number value: `2` does not match any field in enum: &BarAlias'
40 }
41 }
42}
43
44fn test_string_decode() {
45 assert json.decode[Bar]('"a"')! == Bar.a
46 assert json.decode[Bar]('"BBB"')! == Bar.b
47 assert json.decode[Bar]('"c"')! == Bar.c
48
49 assert json.decode[BarAlias]('"a"')! == Bar.a
50 assert json.decode[BarAlias]('"BBB"')! == Bar.b
51 assert json.decode[BarAlias]('"c"')! == Bar.c
52}
53
54fn test_string_decode_uses_only_json_attr() {
55 assert json.decode[Bar]('"e"')! == Bar.e
56 assert json.decode[BarAlias]('"e"')! == Bar.e
57 for badval in ['"badattr: bad"', '"bad"', '"foobar"'] {
58 if _ := json.decode[Bar](badval) {
59 assert false, '${badval} must not be decoded to Bar'
60 } else {
61 assert true
62 }
63 if _ := json.decode[BarAlias](badval) {
64 assert false, '${badval} must not be decoded to BarAlias'
65 } else {
66 assert true
67 }
68 }
69}
70
71fn test_string_decode_fails() {
72 if _ := json.decode[Bar]('"d"') {
73 assert false
74 } else {
75 if err is json.JsonDecodeError {
76 assert err.line == 1
77 assert err.character == 1
78 assert err.message == 'Data: String value: `d` does not match any field in enum: &Bar'
79 }
80 }
81
82 if _ := json.decode[BarAlias]('"d"') {
83 assert false
84 } else {
85 if err is json.JsonDecodeError {
86 assert err.line == 1
87 assert err.character == 1
88 assert err.message == 'Data: String value: `d` does not match any field in enum: &BarAlias'
89 }
90 }
91}
92
93fn test_invalid_decode_fails() {
94 if _ := json.decode[Bar]('true') {
95 assert false
96 } else {
97 if err is json.JsonDecodeError {
98 assert err.line == 1
99 assert err.character == 1
100 assert err.message == 'Data: Expected number or string value for enum, got: boolean'
101 }
102 }
103
104 if _ := json.decode[BarAlias]('true') {
105 assert false
106 } else {
107 if err is json.JsonDecodeError {
108 assert err.line == 1
109 assert err.character == 1
110 assert err.message == 'Data: Expected number or string value for enum, got: boolean'
111 }
112 }
113}
114
115fn test_map_string_enum_decode() {
116 m := json.decode[map[string]Bar]('{"foo": "a", "bar": "b", "baz": "c"}')!
117 assert m['foo'] == .a
118 assert m['bar'] == .b
119 assert m['baz'] == .c
120
121 m2 := json.decode[map[string]Bar]('{"x": 0, "y": 1, "z": 10}')!
122 assert m2['x'] == .a
123 assert m2['y'] == .b
124 assert m2['z'] == .c
125}
126