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