mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
json: make enums work with json encode+decode (serialised as string names by default; the old integer one is supported too, using [json_as_number]
) (#17696)
This commit is contained in:
134
vlib/json/json_encode_enum_test.v
Normal file
134
vlib/json/json_encode_enum_test.v
Normal file
@ -0,0 +1,134 @@
|
||||
import json
|
||||
|
||||
[json_as_number]
|
||||
pub enum MessageType {
|
||||
error = 1
|
||||
warning = 2
|
||||
info = 3
|
||||
log = 4
|
||||
}
|
||||
|
||||
pub enum MessageType2 {
|
||||
error = 1
|
||||
warning = 2
|
||||
info = 3
|
||||
log = 4
|
||||
}
|
||||
|
||||
enum TestEnum {
|
||||
one = 1
|
||||
two
|
||||
}
|
||||
|
||||
type TestAlias = TestEnum
|
||||
type TestSum = TestEnum | string
|
||||
type TestSum2 = MessageType | string
|
||||
type TestAliasAttr = MessageType
|
||||
|
||||
struct TestStruct {
|
||||
test []TestEnum
|
||||
test2 TestEnum
|
||||
test3 TestAlias
|
||||
test4 TestSum
|
||||
test5 MessageType
|
||||
}
|
||||
|
||||
struct TestStruct2 {
|
||||
a TestAliasAttr
|
||||
b TestSum2
|
||||
c TestSum2
|
||||
}
|
||||
|
||||
struct Test {
|
||||
ab ?int
|
||||
a ?MessageType
|
||||
}
|
||||
|
||||
struct Test2 {
|
||||
a ?MessageType2
|
||||
}
|
||||
|
||||
type TSum = MessageType | string
|
||||
type TSum2 = MessageType2 | string
|
||||
|
||||
struct Test3 {
|
||||
a ?TSum
|
||||
}
|
||||
|
||||
struct Test4 {
|
||||
a ?TSum2
|
||||
}
|
||||
|
||||
fn test_encode_with_enum() {
|
||||
out := json.encode(TestStruct{
|
||||
test: [TestEnum.one, TestEnum.one]
|
||||
test2: TestEnum.two
|
||||
test3: TestEnum.one
|
||||
test4: TestEnum.two
|
||||
test5: .log
|
||||
})
|
||||
assert out == '{"test":["one","one"],"test2":"two","test3":"one","test4":"two","test5":4}'
|
||||
}
|
||||
|
||||
fn test_encode_direct_enum() {
|
||||
assert json.encode(TestEnum.one) == '"one"'
|
||||
}
|
||||
|
||||
fn test_encode_alias_and_sumtype() {
|
||||
assert json.decode(TestStruct, '{"test":["one","one"],"test2":"two","test3": "one", "test4": "two", "test5":4}')! == TestStruct{
|
||||
test: [.one, .one]
|
||||
test2: .two
|
||||
test3: TestAlias(.one)
|
||||
test4: TestSum('two')
|
||||
test5: .log
|
||||
}
|
||||
}
|
||||
|
||||
fn test_enum_attr() {
|
||||
assert dump(json.encode(MessageType.log)) == '4'
|
||||
assert dump(json.encode(MessageType.error)) == '1'
|
||||
}
|
||||
|
||||
fn test_enum_attr_decode() {
|
||||
assert json.decode(TestStruct2, '{"a": 1, "b":4, "c": "test"}')! == TestStruct2{
|
||||
a: .error
|
||||
b: MessageType.log
|
||||
c: 'test'
|
||||
}
|
||||
}
|
||||
|
||||
fn test_enum_attr_encode() {
|
||||
assert json.encode(TestStruct2{
|
||||
a: .error
|
||||
b: MessageType.log
|
||||
c: 'test'
|
||||
}) == '{"a":1,"b":4,"c":"test"}'
|
||||
}
|
||||
|
||||
fn test_option_enum() {
|
||||
assert dump(json.encode(Test{none, none})) == '{}'
|
||||
assert dump(json.encode(Test{none, MessageType.log})) == '{"a":4}'
|
||||
t := dump(json.decode(Test, '{"a":4}')!)
|
||||
assert t.ab == none
|
||||
assert t.a? == .log
|
||||
|
||||
t2 := dump(json.decode(Test, '{"a":null}')!)
|
||||
assert t2.a == none
|
||||
|
||||
assert json.encode(Test2{none}) == '{}'
|
||||
assert dump(json.encode(Test2{MessageType2.log})) == '{"a":"log"}'
|
||||
z := dump(json.decode(Test2, '{"a":"log"}')!)
|
||||
assert z.a? == .log
|
||||
a := dump(json.decode(Test2, '{"a": null}')!)
|
||||
assert a.a == none
|
||||
}
|
||||
|
||||
fn test_option_sumtype_enum() {
|
||||
assert dump(json.encode(Test3{none})) == '{}'
|
||||
assert dump(json.encode(Test3{ a: 'foo' })) == '{"a":"foo"}'
|
||||
assert dump(json.encode(Test3{ a: MessageType.warning })) == '{"a":2}'
|
||||
|
||||
assert dump(json.encode(Test4{none})) == '{}'
|
||||
assert dump(json.encode(Test4{ a: 'foo' })) == '{"a":"foo"}'
|
||||
assert dump(json.encode(Test4{ a: MessageType2.warning })) == '{"a":"warning"}'
|
||||
}
|
Reference in New Issue
Block a user