xref: /aosp_15_r20/external/flatbuffers/tests/lobstertest.lobster (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*890232f2SAndroid Build Coastguard Worker//
3*890232f2SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*890232f2SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*890232f2SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*890232f2SAndroid Build Coastguard Worker//
7*890232f2SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*890232f2SAndroid Build Coastguard Worker//
9*890232f2SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*890232f2SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*890232f2SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*890232f2SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*890232f2SAndroid Build Coastguard Worker// limitations under the License.
14*890232f2SAndroid Build Coastguard Worker
15*890232f2SAndroid Build Coastguard Workerimport from "../lobster/"
16*890232f2SAndroid Build Coastguard Workerimport monster_test_generated
17*890232f2SAndroid Build Coastguard Workerimport optional_scalars_generated
18*890232f2SAndroid Build Coastguard Worker
19*890232f2SAndroid Build Coastguard Workerdef check_read_buffer(buf):
20*890232f2SAndroid Build Coastguard Worker    // Check that the given buffer is evaluated correctly as the example Monster.
21*890232f2SAndroid Build Coastguard Worker    assert flatbuffers_has_identifier(buf, "MONS")
22*890232f2SAndroid Build Coastguard Worker
23*890232f2SAndroid Build Coastguard Worker    let monster = MyGame_Example_GetRootAsMonster(buf)
24*890232f2SAndroid Build Coastguard Worker
25*890232f2SAndroid Build Coastguard Worker    assert monster.hp == 80
26*890232f2SAndroid Build Coastguard Worker    assert monster.mana == 150
27*890232f2SAndroid Build Coastguard Worker    assert monster.name == "MyMonster"
28*890232f2SAndroid Build Coastguard Worker
29*890232f2SAndroid Build Coastguard Worker    let vec = monster.pos
30*890232f2SAndroid Build Coastguard Worker    assert vec
31*890232f2SAndroid Build Coastguard Worker    assert vec.x == 1.0
32*890232f2SAndroid Build Coastguard Worker    assert vec.y == 2.0
33*890232f2SAndroid Build Coastguard Worker    assert vec.z == 3.0
34*890232f2SAndroid Build Coastguard Worker    assert vec.test1 == 3.0
35*890232f2SAndroid Build Coastguard Worker    assert vec.test2 == 2
36*890232f2SAndroid Build Coastguard Worker
37*890232f2SAndroid Build Coastguard Worker    let t = vec.test3
38*890232f2SAndroid Build Coastguard Worker    assert t
39*890232f2SAndroid Build Coastguard Worker    assert t.a == 5
40*890232f2SAndroid Build Coastguard Worker    assert t.b == 6
41*890232f2SAndroid Build Coastguard Worker
42*890232f2SAndroid Build Coastguard Worker    assert monster.test_type == MyGame_Example_Any_Monster
43*890232f2SAndroid Build Coastguard Worker    assert monster.test_as_Monster.name == "Fred"
44*890232f2SAndroid Build Coastguard Worker
45*890232f2SAndroid Build Coastguard Worker    assert monster.inventory_length == 5
46*890232f2SAndroid Build Coastguard Worker    assert sum(map(monster.inventory_length) i: monster.inventory(i)) == 10
47*890232f2SAndroid Build Coastguard Worker
48*890232f2SAndroid Build Coastguard Worker    for(5) i:
49*890232f2SAndroid Build Coastguard Worker        assert monster.vector_of_longs(i) == pow(10, i * 2)
50*890232f2SAndroid Build Coastguard Worker
51*890232f2SAndroid Build Coastguard Worker    assert equal([-1.7976931348623157e+308, 0, 1.7976931348623157e+308],
52*890232f2SAndroid Build Coastguard Worker                 (map(monster.vector_of_doubles_length) i: monster.vector_of_doubles(i)))
53*890232f2SAndroid Build Coastguard Worker
54*890232f2SAndroid Build Coastguard Worker    assert monster.test4_length == 2
55*890232f2SAndroid Build Coastguard Worker    let test0 = monster.test4(0)
56*890232f2SAndroid Build Coastguard Worker    let test1 = monster.test4(1)
57*890232f2SAndroid Build Coastguard Worker    assert test0.a + test0.b + test1.a + test1.b == 100
58*890232f2SAndroid Build Coastguard Worker
59*890232f2SAndroid Build Coastguard Worker    assert monster.testarrayofstring_length == 2
60*890232f2SAndroid Build Coastguard Worker    assert monster.testarrayofstring(0) == "test1"
61*890232f2SAndroid Build Coastguard Worker    assert monster.testarrayofstring(1) == "test2"
62*890232f2SAndroid Build Coastguard Worker
63*890232f2SAndroid Build Coastguard Worker    assert monster.testarrayoftables_length == 0
64*890232f2SAndroid Build Coastguard Worker    assert monster.testnestedflatbuffer_length == 0
65*890232f2SAndroid Build Coastguard Worker    assert not monster.testempty()
66*890232f2SAndroid Build Coastguard Worker
67*890232f2SAndroid Build Coastguard Workerdef make_monster_from_generated_code():
68*890232f2SAndroid Build Coastguard Worker    // Use generated code to build the example Monster.
69*890232f2SAndroid Build Coastguard Worker    let b = flatbuffers_builder {}
70*890232f2SAndroid Build Coastguard Worker
71*890232f2SAndroid Build Coastguard Worker    let name = b.CreateString("MyMonster")
72*890232f2SAndroid Build Coastguard Worker    let fred = b.CreateString("Fred")
73*890232f2SAndroid Build Coastguard Worker
74*890232f2SAndroid Build Coastguard Worker    let inv = b.MyGame_Example_MonsterCreateInventoryVector([ 0, 1, 2, 3, 4 ])
75*890232f2SAndroid Build Coastguard Worker
76*890232f2SAndroid Build Coastguard Worker    let mon2 = MyGame_Example_MonsterBuilder { b }
77*890232f2SAndroid Build Coastguard Worker        .start()
78*890232f2SAndroid Build Coastguard Worker        .add_name(fred)
79*890232f2SAndroid Build Coastguard Worker        .end()
80*890232f2SAndroid Build Coastguard Worker
81*890232f2SAndroid Build Coastguard Worker    b.MyGame_Example_MonsterStartTest4Vector(2)
82*890232f2SAndroid Build Coastguard Worker    b.MyGame_Example_CreateTest(10, 20)
83*890232f2SAndroid Build Coastguard Worker    b.MyGame_Example_CreateTest(30, 40)
84*890232f2SAndroid Build Coastguard Worker    let test4 = b.EndVector(2)
85*890232f2SAndroid Build Coastguard Worker
86*890232f2SAndroid Build Coastguard Worker    let test_array_of_string = b.MyGame_Example_MonsterCreateTestarrayofstringVector(
87*890232f2SAndroid Build Coastguard Worker                                   [ b.CreateString("test1"), b.CreateString("test2") ])
88*890232f2SAndroid Build Coastguard Worker
89*890232f2SAndroid Build Coastguard Worker    let vector_of_longs = b.MyGame_Example_MonsterCreateVectorOfLongsVector(
90*890232f2SAndroid Build Coastguard Worker                              [ 1, 100, 10000, 1000000, 100000000 ])
91*890232f2SAndroid Build Coastguard Worker
92*890232f2SAndroid Build Coastguard Worker    let vector_of_doubles = b.MyGame_Example_MonsterCreateVectorOfDoublesVector(
93*890232f2SAndroid Build Coastguard Worker                                [ -1.7976931348623157e+308, 0, 1.7976931348623157e+308 ])
94*890232f2SAndroid Build Coastguard Worker
95*890232f2SAndroid Build Coastguard Worker    let mon = MyGame_Example_MonsterBuilder { b }
96*890232f2SAndroid Build Coastguard Worker        .start()
97*890232f2SAndroid Build Coastguard Worker        .add_pos(b.MyGame_Example_CreateVec3(1.0, 2.0, 3.0, 3.0,
98*890232f2SAndroid Build Coastguard Worker                 MyGame_Example_Color_Green, 5, 6))
99*890232f2SAndroid Build Coastguard Worker        .add_hp(80)
100*890232f2SAndroid Build Coastguard Worker        .add_name(name)
101*890232f2SAndroid Build Coastguard Worker        .add_inventory(inv)
102*890232f2SAndroid Build Coastguard Worker        .add_test_type(MyGame_Example_Any_Monster)
103*890232f2SAndroid Build Coastguard Worker        .add_test(mon2)
104*890232f2SAndroid Build Coastguard Worker        .add_test4(test4)
105*890232f2SAndroid Build Coastguard Worker        .add_testarrayofstring(test_array_of_string)
106*890232f2SAndroid Build Coastguard Worker        .add_vector_of_longs(vector_of_longs)
107*890232f2SAndroid Build Coastguard Worker        .add_vector_of_doubles(vector_of_doubles)
108*890232f2SAndroid Build Coastguard Worker        .end()
109*890232f2SAndroid Build Coastguard Worker
110*890232f2SAndroid Build Coastguard Worker    b.Finish(mon, "MONS")
111*890232f2SAndroid Build Coastguard Worker
112*890232f2SAndroid Build Coastguard Worker    return b.SizedCopy()
113*890232f2SAndroid Build Coastguard Worker
114*890232f2SAndroid Build Coastguard Workerdef test_optional_scalars():
115*890232f2SAndroid Build Coastguard Worker    def build(add_fields):
116*890232f2SAndroid Build Coastguard Worker        let b = flatbuffers_builder {}
117*890232f2SAndroid Build Coastguard Worker        let ss = optional_scalars_ScalarStuffBuilder { b }.start()
118*890232f2SAndroid Build Coastguard Worker        if add_fields:
119*890232f2SAndroid Build Coastguard Worker            ss.add_just_i8(1)
120*890232f2SAndroid Build Coastguard Worker            ss.add_maybe_i8(1)
121*890232f2SAndroid Build Coastguard Worker            ss.add_default_i8(1)
122*890232f2SAndroid Build Coastguard Worker            ss.add_just_f64(1.0)
123*890232f2SAndroid Build Coastguard Worker            ss.add_maybe_f64(1.0)
124*890232f2SAndroid Build Coastguard Worker            ss.add_default_f64(1.0)
125*890232f2SAndroid Build Coastguard Worker            ss.add_just_bool(true)
126*890232f2SAndroid Build Coastguard Worker            ss.add_maybe_bool(true)
127*890232f2SAndroid Build Coastguard Worker            ss.add_default_bool(true)
128*890232f2SAndroid Build Coastguard Worker            ss.add_just_enum(optional_scalars_OptionalByte_Two)
129*890232f2SAndroid Build Coastguard Worker            ss.add_maybe_enum(optional_scalars_OptionalByte_Two)
130*890232f2SAndroid Build Coastguard Worker            ss.add_default_enum(optional_scalars_OptionalByte_Two)
131*890232f2SAndroid Build Coastguard Worker        b.Finish(ss.end(), "NULL")
132*890232f2SAndroid Build Coastguard Worker        let buf = b.SizedCopy()
133*890232f2SAndroid Build Coastguard Worker        assert flatbuffers_has_identifier(buf, "NULL")
134*890232f2SAndroid Build Coastguard Worker        return optional_scalars_GetRootAsScalarStuff(buf)
135*890232f2SAndroid Build Coastguard Worker
136*890232f2SAndroid Build Coastguard Worker    var root = build(true)
137*890232f2SAndroid Build Coastguard Worker
138*890232f2SAndroid Build Coastguard Worker    assert root.just_i8() == 1 and root.default_i8() == 1
139*890232f2SAndroid Build Coastguard Worker    var maybe_val_i8, maybe_present_i8 = root.maybe_i8()
140*890232f2SAndroid Build Coastguard Worker    assert maybe_val_i8 == 1 and maybe_present_i8 == true
141*890232f2SAndroid Build Coastguard Worker
142*890232f2SAndroid Build Coastguard Worker    assert root.just_f64() == 1.0 and root.default_f64() == 1.0
143*890232f2SAndroid Build Coastguard Worker    var maybe_val_f64, maybe_present_f64 = root.maybe_f64()
144*890232f2SAndroid Build Coastguard Worker    assert maybe_val_f64 == 1.0 and maybe_present_f64 == true
145*890232f2SAndroid Build Coastguard Worker
146*890232f2SAndroid Build Coastguard Worker    assert root.just_bool() == true and root.default_bool() == true
147*890232f2SAndroid Build Coastguard Worker    var maybe_val_bool, maybe_present_bool = root.maybe_bool()
148*890232f2SAndroid Build Coastguard Worker    assert maybe_val_bool == true and maybe_present_bool == true
149*890232f2SAndroid Build Coastguard Worker
150*890232f2SAndroid Build Coastguard Worker    assert root.just_enum() == optional_scalars_OptionalByte_Two and root.default_enum() == optional_scalars_OptionalByte_Two
151*890232f2SAndroid Build Coastguard Worker    var maybe_val_enum, maybe_present_enum = root.maybe_enum()
152*890232f2SAndroid Build Coastguard Worker    assert maybe_val_enum == optional_scalars_OptionalByte_Two and maybe_present_enum == true
153*890232f2SAndroid Build Coastguard Worker
154*890232f2SAndroid Build Coastguard Worker    root = build(false)
155*890232f2SAndroid Build Coastguard Worker
156*890232f2SAndroid Build Coastguard Worker    assert root.just_i8() == 0 and root.default_i8() == 42
157*890232f2SAndroid Build Coastguard Worker    maybe_val_i8, maybe_present_i8 = root.maybe_i8()
158*890232f2SAndroid Build Coastguard Worker    assert maybe_val_i8 == 0 and maybe_present_i8 == false
159*890232f2SAndroid Build Coastguard Worker
160*890232f2SAndroid Build Coastguard Worker    assert root.just_f64() == 0.0 and root.default_f64() == 42.0
161*890232f2SAndroid Build Coastguard Worker    maybe_val_f64, maybe_present_f64 = root.maybe_f64()
162*890232f2SAndroid Build Coastguard Worker    assert maybe_val_f64 == 0.0 and maybe_present_f64 == false
163*890232f2SAndroid Build Coastguard Worker
164*890232f2SAndroid Build Coastguard Worker    assert root.just_bool() == false and root.default_bool() == true
165*890232f2SAndroid Build Coastguard Worker    maybe_val_bool, maybe_present_bool = root.maybe_bool()
166*890232f2SAndroid Build Coastguard Worker    assert maybe_val_bool == false and maybe_present_bool == false
167*890232f2SAndroid Build Coastguard Worker
168*890232f2SAndroid Build Coastguard Worker    assert root.just_enum() == optional_scalars_OptionalByte_None and root.default_enum() == optional_scalars_OptionalByte_One
169*890232f2SAndroid Build Coastguard Worker    maybe_val_enum, maybe_present_enum = root.maybe_enum()
170*890232f2SAndroid Build Coastguard Worker    assert maybe_val_enum == optional_scalars_OptionalByte_None and maybe_present_enum == false
171*890232f2SAndroid Build Coastguard Worker
172*890232f2SAndroid Build Coastguard Worker
173*890232f2SAndroid Build Coastguard Worker// Verify that the canonical flatbuffer file (produced by the C++ implementation)
174*890232f2SAndroid Build Coastguard Worker// is readable by the generated Lobster code.
175*890232f2SAndroid Build Coastguard Workerlet fb2 = read_file("monsterdata_test.mon")
176*890232f2SAndroid Build Coastguard Workerassert fb2
177*890232f2SAndroid Build Coastguard Workercheck_read_buffer(fb2)
178*890232f2SAndroid Build Coastguard Worker
179*890232f2SAndroid Build Coastguard Worker// Verify that using the generated Lobster code builds a buffer without
180*890232f2SAndroid Build Coastguard Worker// returning errors, and is interpreted correctly.
181*890232f2SAndroid Build Coastguard Workerlet fb1 = make_monster_from_generated_code()
182*890232f2SAndroid Build Coastguard Workercheck_read_buffer(fb1)
183*890232f2SAndroid Build Coastguard Worker// Write the result to file for no good reason.
184*890232f2SAndroid Build Coastguard Workerwrite_file("monsterdata_lobster_wire.mon", fb1)
185*890232f2SAndroid Build Coastguard Worker
186*890232f2SAndroid Build Coastguard Worker// Test converting the buffer to JSON and parsing the JSON back again.
187*890232f2SAndroid Build Coastguard Workerlet schema = read_file("monster_test.fbs")
188*890232f2SAndroid Build Coastguard Workerassert schema
189*890232f2SAndroid Build Coastguard Workerlet includedirs = [ "include_test" ]
190*890232f2SAndroid Build Coastguard Worker// Convert binary to JSON:
191*890232f2SAndroid Build Coastguard Workerlet json, err1 = flatbuffers_binary_to_json(schema, fb1, includedirs)
192*890232f2SAndroid Build Coastguard Workerassert not err1
193*890232f2SAndroid Build Coastguard Worker// Parse JSON back to binary:
194*890232f2SAndroid Build Coastguard Workerlet fb3, err2 = flatbuffers_json_to_binary(schema, json, includedirs)
195*890232f2SAndroid Build Coastguard Workerassert not err2
196*890232f2SAndroid Build Coastguard Worker// Check the resulting binary again (full roundtrip test):
197*890232f2SAndroid Build Coastguard Workercheck_read_buffer(fb3)
198*890232f2SAndroid Build Coastguard Worker
199*890232f2SAndroid Build Coastguard Worker// Additional tests.
200*890232f2SAndroid Build Coastguard Workertest_optional_scalars()
201*890232f2SAndroid Build Coastguard Worker
202*890232f2SAndroid Build Coastguard Workerprint "Lobster test succesful!"
203