1*890232f2SAndroid Build Coastguard Worker /* 2*890232f2SAndroid Build Coastguard Worker * Copyright 2021 Google Inc. All rights reserved. 3*890232f2SAndroid Build Coastguard Worker * 4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*890232f2SAndroid Build Coastguard Worker * 8*890232f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*890232f2SAndroid Build Coastguard Worker * 10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*890232f2SAndroid Build Coastguard Worker * limitations under the License. 15*890232f2SAndroid Build Coastguard Worker */ 16*890232f2SAndroid Build Coastguard Worker 17*890232f2SAndroid Build Coastguard Worker import XCTest 18*890232f2SAndroid Build Coastguard Worker @testable import FlatBuffers 19*890232f2SAndroid Build Coastguard Worker 20*890232f2SAndroid Build Coastguard Worker final class FlatBuffersTests: XCTestCase { 21*890232f2SAndroid Build Coastguard Worker 22*890232f2SAndroid Build Coastguard Worker let country = "Norway" 23*890232f2SAndroid Build Coastguard Worker testEndiannull24*890232f2SAndroid Build Coastguard Worker func testEndian() { XCTAssertEqual(isLitteEndian, true) } 25*890232f2SAndroid Build Coastguard Worker testOffsetnull26*890232f2SAndroid Build Coastguard Worker func testOffset() { 27*890232f2SAndroid Build Coastguard Worker let o = Offset() 28*890232f2SAndroid Build Coastguard Worker let b = Offset(offset: 1) 29*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(o.isEmpty, true) 30*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.isEmpty, false) 31*890232f2SAndroid Build Coastguard Worker } 32*890232f2SAndroid Build Coastguard Worker testCreateStringnull33*890232f2SAndroid Build Coastguard Worker func testCreateString() { 34*890232f2SAndroid Build Coastguard Worker let helloWorld = "Hello, world!" 35*890232f2SAndroid Build Coastguard Worker var b = FlatBufferBuilder(initialSize: 16) 36*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.create(string: country).o, 12) 37*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.create(string: helloWorld).o, 32) 38*890232f2SAndroid Build Coastguard Worker b.clear() 39*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.create(string: helloWorld).o, 20) 40*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.create(string: country).o, 32) 41*890232f2SAndroid Build Coastguard Worker b.clear() 42*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.create(string: String(repeating: "a", count: 257)).o, 264) 43*890232f2SAndroid Build Coastguard Worker } 44*890232f2SAndroid Build Coastguard Worker testStartTablenull45*890232f2SAndroid Build Coastguard Worker func testStartTable() { 46*890232f2SAndroid Build Coastguard Worker var b = FlatBufferBuilder(initialSize: 16) 47*890232f2SAndroid Build Coastguard Worker XCTAssertNoThrow(b.startTable(with: 0)) 48*890232f2SAndroid Build Coastguard Worker b.clear() 49*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.create(string: country).o, 12) 50*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.startTable(with: 0), 12) 51*890232f2SAndroid Build Coastguard Worker } 52*890232f2SAndroid Build Coastguard Worker testCreateFinishnull53*890232f2SAndroid Build Coastguard Worker func testCreateFinish() { 54*890232f2SAndroid Build Coastguard Worker var b = FlatBufferBuilder(initialSize: 16) 55*890232f2SAndroid Build Coastguard Worker let countryOff = Country.createCountry( 56*890232f2SAndroid Build Coastguard Worker builder: &b, 57*890232f2SAndroid Build Coastguard Worker name: country, 58*890232f2SAndroid Build Coastguard Worker log: 200, 59*890232f2SAndroid Build Coastguard Worker lan: 100) 60*890232f2SAndroid Build Coastguard Worker b.finish(offset: countryOff) 61*890232f2SAndroid Build Coastguard Worker // swiftformat:disable all 62*890232f2SAndroid Build Coastguard Worker let v: [UInt8] = [16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0] 63*890232f2SAndroid Build Coastguard Worker // swiftformat:enable all 64*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.sizedByteArray, v) 65*890232f2SAndroid Build Coastguard Worker } 66*890232f2SAndroid Build Coastguard Worker testCreateFinishWithPrefixnull67*890232f2SAndroid Build Coastguard Worker func testCreateFinishWithPrefix() { 68*890232f2SAndroid Build Coastguard Worker var b = FlatBufferBuilder(initialSize: 16) 69*890232f2SAndroid Build Coastguard Worker let countryOff = Country.createCountry( 70*890232f2SAndroid Build Coastguard Worker builder: &b, 71*890232f2SAndroid Build Coastguard Worker name: country, 72*890232f2SAndroid Build Coastguard Worker log: 200, 73*890232f2SAndroid Build Coastguard Worker lan: 100) 74*890232f2SAndroid Build Coastguard Worker b.finish(offset: countryOff, addPrefix: true) 75*890232f2SAndroid Build Coastguard Worker // swiftformat:disable all 76*890232f2SAndroid Build Coastguard Worker let v: [UInt8] = [44, 0, 0, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0] 77*890232f2SAndroid Build Coastguard Worker // swiftformat:enable all 78*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(b.sizedByteArray, v) 79*890232f2SAndroid Build Coastguard Worker } 80*890232f2SAndroid Build Coastguard Worker testReadCountrynull81*890232f2SAndroid Build Coastguard Worker func testReadCountry() { 82*890232f2SAndroid Build Coastguard Worker // swiftformat:disable all 83*890232f2SAndroid Build Coastguard Worker let v: [UInt8] = [16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0] 84*890232f2SAndroid Build Coastguard Worker // swiftformat:enable all 85*890232f2SAndroid Build Coastguard Worker let buffer = ByteBuffer(bytes: v) 86*890232f2SAndroid Build Coastguard Worker let c = Country.getRootAsCountry(buffer) 87*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(c.lan, 100) 88*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(c.log, 200) 89*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(c.nameVector, [78, 111, 114, 119, 97, 121]) 90*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(c.name, country) 91*890232f2SAndroid Build Coastguard Worker } 92*890232f2SAndroid Build Coastguard Worker testWriteNullableStringsnull93*890232f2SAndroid Build Coastguard Worker func testWriteNullableStrings() { 94*890232f2SAndroid Build Coastguard Worker var b = FlatBufferBuilder() 95*890232f2SAndroid Build Coastguard Worker XCTAssertTrue(b.create(string: nil).isEmpty) 96*890232f2SAndroid Build Coastguard Worker XCTAssertTrue(b.createShared(string: nil).isEmpty) 97*890232f2SAndroid Build Coastguard Worker } 98*890232f2SAndroid Build Coastguard Worker testWriteOptionalValuesnull99*890232f2SAndroid Build Coastguard Worker func testWriteOptionalValues() { 100*890232f2SAndroid Build Coastguard Worker var b = FlatBufferBuilder() 101*890232f2SAndroid Build Coastguard Worker let root = optional_scalars_ScalarStuff.createScalarStuff( 102*890232f2SAndroid Build Coastguard Worker &b, 103*890232f2SAndroid Build Coastguard Worker justI8: 80, 104*890232f2SAndroid Build Coastguard Worker maybeI8: nil, 105*890232f2SAndroid Build Coastguard Worker justU8: 100, 106*890232f2SAndroid Build Coastguard Worker maybeU8: 10, 107*890232f2SAndroid Build Coastguard Worker maybeBool: true, 108*890232f2SAndroid Build Coastguard Worker justEnum: .one, 109*890232f2SAndroid Build Coastguard Worker maybeEnum: nil) 110*890232f2SAndroid Build Coastguard Worker b.finish(offset: root) 111*890232f2SAndroid Build Coastguard Worker let scalarTable = optional_scalars_ScalarStuff 112*890232f2SAndroid Build Coastguard Worker .getRootAsScalarStuff(bb: b.sizedBuffer) 113*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(scalarTable.justI8, 80) 114*890232f2SAndroid Build Coastguard Worker XCTAssertNil(scalarTable.maybeI8) 115*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(scalarTable.maybeBool, true) 116*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(scalarTable.defaultI8, 42) 117*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(scalarTable.justU8, 100) 118*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(scalarTable.maybeU8, 10) 119*890232f2SAndroid Build Coastguard Worker XCTAssertEqual(scalarTable.justEnum, .one) 120*890232f2SAndroid Build Coastguard Worker XCTAssertNil(scalarTable.maybeEnum) 121*890232f2SAndroid Build Coastguard Worker } 122*890232f2SAndroid Build Coastguard Worker } 123*890232f2SAndroid Build Coastguard Worker 124*890232f2SAndroid Build Coastguard Worker class Country { 125*890232f2SAndroid Build Coastguard Worker 126*890232f2SAndroid Build Coastguard Worker static let offsets: (name: VOffset, lan: VOffset, lng: VOffset) = (4, 6, 8) 127*890232f2SAndroid Build Coastguard Worker private var __t: Table 128*890232f2SAndroid Build Coastguard Worker 129*890232f2SAndroid Build Coastguard Worker private init(_ t: Table) { 130*890232f2SAndroid Build Coastguard Worker __t = t 131*890232f2SAndroid Build Coastguard Worker } 132*890232f2SAndroid Build Coastguard Worker 133*890232f2SAndroid Build Coastguard Worker var lan: Int32 { let o = __t.offset(6); return o == 0 ? 0 : __t.readBuffer( 134*890232f2SAndroid Build Coastguard Worker of: Int32.self, 135*890232f2SAndroid Build Coastguard Worker at: o) } 136*890232f2SAndroid Build Coastguard Worker var log: Int32 { let o = __t.offset(8); return o == 0 ? 0 : __t.readBuffer( 137*890232f2SAndroid Build Coastguard Worker of: Int32.self, 138*890232f2SAndroid Build Coastguard Worker at: o) } 139*890232f2SAndroid Build Coastguard Worker var nameVector: [UInt8]? { __t.getVector(at: 4) } 140*890232f2SAndroid Build Coastguard Worker var name: String? { 141*890232f2SAndroid Build Coastguard Worker let o = __t.offset(4); return o == 0 ? nil : __t.string(at: o) } 142*890232f2SAndroid Build Coastguard Worker 143*890232f2SAndroid Build Coastguard Worker @inlinable getRootAsCountrynull144*890232f2SAndroid Build Coastguard Worker static func getRootAsCountry(_ bb: ByteBuffer) -> Country { 145*890232f2SAndroid Build Coastguard Worker Country(Table( 146*890232f2SAndroid Build Coastguard Worker bb: bb, 147*890232f2SAndroid Build Coastguard Worker position: Int32(bb.read(def: UOffset.self, position: 0)))) 148*890232f2SAndroid Build Coastguard Worker } 149*890232f2SAndroid Build Coastguard Worker 150*890232f2SAndroid Build Coastguard Worker @inlinable 151*890232f2SAndroid Build Coastguard Worker static func createCountry( 152*890232f2SAndroid Build Coastguard Worker builder: inout FlatBufferBuilder, 153*890232f2SAndroid Build Coastguard Worker name: String, 154*890232f2SAndroid Build Coastguard Worker log: Int32, 155*890232f2SAndroid Build Coastguard Worker lan: Int32) -> Offset 156*890232f2SAndroid Build Coastguard Worker { 157*890232f2SAndroid Build Coastguard Worker createCountry( 158*890232f2SAndroid Build Coastguard Worker builder: &builder, 159*890232f2SAndroid Build Coastguard Worker offset: builder.create(string: name), 160*890232f2SAndroid Build Coastguard Worker log: log, 161*890232f2SAndroid Build Coastguard Worker lan: lan) 162*890232f2SAndroid Build Coastguard Worker } 163*890232f2SAndroid Build Coastguard Worker 164*890232f2SAndroid Build Coastguard Worker @inlinable 165*890232f2SAndroid Build Coastguard Worker static func createCountry( 166*890232f2SAndroid Build Coastguard Worker builder: inout FlatBufferBuilder, 167*890232f2SAndroid Build Coastguard Worker offset: Offset, 168*890232f2SAndroid Build Coastguard Worker log: Int32, 169*890232f2SAndroid Build Coastguard Worker lan: Int32) -> Offset 170*890232f2SAndroid Build Coastguard Worker { 171*890232f2SAndroid Build Coastguard Worker let _start = builder.startTable(with: 3) 172*890232f2SAndroid Build Coastguard Worker Country.add(builder: &builder, lng: log) 173*890232f2SAndroid Build Coastguard Worker Country.add(builder: &builder, lan: lan) 174*890232f2SAndroid Build Coastguard Worker Country.add(builder: &builder, name: offset) 175*890232f2SAndroid Build Coastguard Worker return Country.end(builder: &builder, startOffset: _start) 176*890232f2SAndroid Build Coastguard Worker } 177*890232f2SAndroid Build Coastguard Worker 178*890232f2SAndroid Build Coastguard Worker @inlinable 179*890232f2SAndroid Build Coastguard Worker static func end( 180*890232f2SAndroid Build Coastguard Worker builder: inout FlatBufferBuilder, 181*890232f2SAndroid Build Coastguard Worker startOffset: UOffset) -> Offset 182*890232f2SAndroid Build Coastguard Worker { 183*890232f2SAndroid Build Coastguard Worker Offset(offset: builder.endTable(at: startOffset)) 184*890232f2SAndroid Build Coastguard Worker } 185*890232f2SAndroid Build Coastguard Worker 186*890232f2SAndroid Build Coastguard Worker @inlinable addnull187*890232f2SAndroid Build Coastguard Worker static func add(builder: inout FlatBufferBuilder, name: String) { 188*890232f2SAndroid Build Coastguard Worker add(builder: &builder, name: builder.create(string: name)) 189*890232f2SAndroid Build Coastguard Worker } 190*890232f2SAndroid Build Coastguard Worker 191*890232f2SAndroid Build Coastguard Worker @inlinable addnull192*890232f2SAndroid Build Coastguard Worker static func add(builder: inout FlatBufferBuilder, name: Offset) { 193*890232f2SAndroid Build Coastguard Worker builder.add(offset: name, at: Country.offsets.name) 194*890232f2SAndroid Build Coastguard Worker } 195*890232f2SAndroid Build Coastguard Worker 196*890232f2SAndroid Build Coastguard Worker @inlinable addnull197*890232f2SAndroid Build Coastguard Worker static func add(builder: inout FlatBufferBuilder, lan: Int32) { 198*890232f2SAndroid Build Coastguard Worker builder.add(element: lan, def: 0, at: Country.offsets.lan) 199*890232f2SAndroid Build Coastguard Worker } 200*890232f2SAndroid Build Coastguard Worker 201*890232f2SAndroid Build Coastguard Worker @inlinable addnull202*890232f2SAndroid Build Coastguard Worker static func add(builder: inout FlatBufferBuilder, lng: Int32) { 203*890232f2SAndroid Build Coastguard Worker builder.add(element: lng, def: 0, at: Country.offsets.lng) 204*890232f2SAndroid Build Coastguard Worker } 205*890232f2SAndroid Build Coastguard Worker } 206