| 1 | import json as stdjson |
| 2 | import x.json2 |
| 3 | |
| 4 | struct Issue24950GateRecord { |
| 5 | exit string |
| 6 | } |
| 7 | |
| 8 | struct Issue24950RecordBase { |
| 9 | gate &Issue24950GateRecord = unsafe { nil } @[omitempty] |
| 10 | } |
| 11 | |
| 12 | struct Issue24950Record { |
| 13 | Issue24950RecordBase |
| 14 | } |
| 15 | |
| 16 | struct Issue24950Wrapper { |
| 17 | gate &Issue24950GateRecord = unsafe { nil } |
| 18 | } |
| 19 | |
| 20 | struct Issue25614Node { |
| 21 | mut: |
| 22 | value int |
| 23 | children []&Issue25614Node |
| 24 | } |
| 25 | |
| 26 | struct OptionalPointerRegressionMessage { |
| 27 | mut: |
| 28 | id int |
| 29 | text string |
| 30 | reply_to ?&OptionalPointerRegressionMessage |
| 31 | } |
| 32 | |
| 33 | fn test_decode_struct_with_reference_field() { |
| 34 | decoded := json2.decode[Issue24950Wrapper]('{"gate":{"exit":"north"}}')! |
| 35 | |
| 36 | assert decoded.gate != unsafe { nil } |
| 37 | assert decoded.gate.exit == 'north' |
| 38 | } |
| 39 | |
| 40 | fn test_decode_embedded_struct_with_reference_field() { |
| 41 | empty_std := stdjson.decode(Issue24950Record, '{}')! |
| 42 | empty_json2 := json2.decode[Issue24950Record]('{}')! |
| 43 | |
| 44 | assert empty_std.Issue24950RecordBase.gate == unsafe { nil } |
| 45 | assert empty_json2.Issue24950RecordBase.gate == unsafe { nil } |
| 46 | |
| 47 | populated_std := stdjson.decode(Issue24950Record, '{"gate":{"exit":"north"}}')! |
| 48 | populated_json2 := json2.decode[Issue24950Record]('{"gate":{"exit":"north"}}')! |
| 49 | |
| 50 | assert populated_std.Issue24950RecordBase.gate != unsafe { nil } |
| 51 | assert populated_json2.Issue24950RecordBase.gate != unsafe { nil } |
| 52 | assert populated_std.Issue24950RecordBase.gate.exit == 'north' |
| 53 | assert populated_json2.Issue24950RecordBase.gate.exit == 'north' |
| 54 | } |
| 55 | |
| 56 | fn test_decode_top_level_reference_to_primitive() { |
| 57 | decoded := json2.decode[&int]('1')! |
| 58 | |
| 59 | assert decoded != unsafe { nil } |
| 60 | assert *decoded == 1 |
| 61 | } |
| 62 | |
| 63 | fn test_decode_top_level_reference_to_primitive_null() { |
| 64 | decoded := json2.decode[&int]('null')! |
| 65 | |
| 66 | assert decoded == unsafe { nil } |
| 67 | } |
| 68 | |
| 69 | fn test_decode_top_level_reference_to_struct() { |
| 70 | decoded := json2.decode[&Issue25614Node]('{"value":1}')! |
| 71 | |
| 72 | assert decoded != unsafe { nil } |
| 73 | assert decoded.value == 1 |
| 74 | } |
| 75 | |
| 76 | fn test_decode_struct_with_array_of_references() { |
| 77 | decoded := json2.decode[Issue25614Node]('{"children":[{"value":1},{"value":2}]}')! |
| 78 | |
| 79 | assert decoded.children.len == 2 |
| 80 | assert decoded.children[0] != unsafe { nil } |
| 81 | assert decoded.children[1] != unsafe { nil } |
| 82 | assert decoded.children[0].value == 1 |
| 83 | assert decoded.children[1].value == 2 |
| 84 | } |
| 85 | |
| 86 | fn test_decode_optional_reference_field() { |
| 87 | message := |
| 88 | json2.decode[OptionalPointerRegressionMessage]('{"id":1,"text":"Hello","reply_to":{"id":2,"text":"Hi","reply_to":null}}')! |
| 89 | |
| 90 | reply := message.reply_to or { |
| 91 | assert false |
| 92 | return |
| 93 | } |
| 94 | |
| 95 | assert reply.id == 2 |
| 96 | assert reply.text == 'Hi' |
| 97 | assert reply.reply_to == none |
| 98 | } |
| 99 | |