1 /* 2 * Copyright 2021 Google Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import XCTest 18 @testable import FlatBuffers 19 20 final class FlatBuffersVectors: XCTestCase { 21 testCreatingTwoCountriesnull22 func testCreatingTwoCountries() { 23 let norway = "Norway" 24 let denmark = "Denmark" 25 var b = FlatBufferBuilder(initialSize: 20) 26 let noStr = b.create(string: norway) 27 let deStr = b.create(string: denmark) 28 let n = Country.createCountry( 29 builder: &b, 30 offset: noStr, 31 log: 888, 32 lan: 700) 33 let d = Country.createCountry( 34 builder: &b, 35 offset: deStr, 36 log: 200, 37 lan: 100) 38 let vector = [n, d] 39 let vectorOffset = b.createVector(ofOffsets: vector) 40 b.finish(offset: vectorOffset) 41 // swiftformat:disable all 42 XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 2, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 10, 0, 18, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 40, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 24, 0, 0, 0, 188, 2, 0, 0, 120, 3, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]) 43 // swiftformat:enable all 44 } 45 testCreateIntArraynull46 func testCreateIntArray() { 47 let numbers: [Int32] = [1, 2, 3, 4, 5] 48 var b = FlatBufferBuilder(initialSize: 20) 49 let o = b.createVector(numbers, size: numbers.count) 50 b.finish(offset: o) 51 // swiftformat:disable all 52 XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0]) 53 // swiftformat:enable all 54 } 55 testCreateEmptyIntArraynull56 func testCreateEmptyIntArray() { 57 let numbers: [Int32] = [] 58 var b = FlatBufferBuilder(initialSize: 20) 59 let o = b.createVector(numbers, size: numbers.count) 60 b.finish(offset: o) 61 XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 0, 0, 0, 0]) 62 } 63 testCreateVectorOfStringsnull64 func testCreateVectorOfStrings() { 65 let strs = ["Denmark", "Norway"] 66 var b = FlatBufferBuilder(initialSize: 20) 67 let o = b.createVector(ofStrings: strs) 68 b.finish(offset: o) 69 // swiftformat:disable all 70 XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 2, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0]) 71 // swiftformat:enable all 72 } testCreateSharedStringVectornull73 func testCreateSharedStringVector() { 74 let norway = "Norway" 75 let denmark = "Denmark" 76 var b = FlatBufferBuilder(initialSize: 20) 77 let noStr = b.createShared(string: norway) 78 let deStr = b.createShared(string: denmark) 79 let _noStr = b.createShared(string: norway) 80 let _deStr = b.createShared(string: denmark) 81 let v = [noStr, deStr, _noStr, _deStr] 82 let end = b.createVector(ofOffsets: v) 83 b.finish(offset: end) 84 // swiftformat:disable all 85 XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 4, 0, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]) 86 // swiftformat:enable all 87 } 88 testReadInt32Arraynull89 func testReadInt32Array() { 90 let data: [Int32] = [1, 2, 3, 4, 5] 91 var b = FlatBufferBuilder(initialSize: 20) 92 let v = Numbers.createNumbersVector(b: &b, array: data) 93 let end = Numbers.createNumbers(b: &b, o: v) 94 b.finish(offset: end) 95 let number = Numbers.getRootAsNumbers(ByteBuffer(bytes: b.sizedByteArray)) 96 XCTAssertEqual(number.vArrayInt32, [1, 2, 3, 4, 5]) 97 } 98 testReadDoubleArraynull99 func testReadDoubleArray() { 100 let data: [Double] = [1, 2, 3, 4, 5] 101 var b = FlatBufferBuilder(initialSize: 20) 102 let v = Numbers.createNumbersVector(b: &b, array: data) 103 let end = Numbers.createNumbers(b: &b, o: v) 104 b.finish(offset: end) 105 let number = Numbers.getRootAsNumbers(ByteBuffer(bytes: b.sizedByteArray)) 106 XCTAssertEqual(number.vArrayDouble, [1, 2, 3, 4, 5]) 107 } 108 testHasForArraynull109 func testHasForArray() { 110 var builder = FlatBufferBuilder(initialSize: 20) 111 let emptyVector = [UInt8]() 112 let emptyOffset = builder.createVector(emptyVector) 113 let nonEmptyVector = [1, 2, 3] 114 let nonEmptyVectorOffest = builder.createVector(nonEmptyVector) 115 let start = Swift_Tests_Vectors.startVectors(&builder) 116 Swift_Tests_Vectors.addVectorOf(empty: emptyOffset, &builder) 117 Swift_Tests_Vectors.addVectorOf(array: nonEmptyVectorOffest, &builder) 118 let finish = Swift_Tests_Vectors.endVectors(&builder, start: start) 119 builder.finish(offset: finish) 120 121 let msg = Swift_Tests_Vectors.getRootAsVectors(bb: ByteBuffer(bytes: builder.sizedByteArray)) 122 XCTAssertEqual(msg.hasNone, false) 123 XCTAssertEqual(msg.hasEmpty, true) 124 XCTAssertEqual(msg.emptyCount, 0) 125 XCTAssertEqual(msg.hasArray, true) 126 XCTAssertEqual(msg.arrayCount, 3) 127 XCTAssertEqual(msg.array, [1, 2, 3]) 128 } 129 } 130 131 struct Numbers { 132 133 private var __t: Table 134 135 private init(_ t: Table) { 136 __t = t 137 } 138 139 @inlinable getRootAsNumbersnull140 static func getRootAsNumbers(_ bb: ByteBuffer) -> Numbers { 141 Numbers(Table( 142 bb: bb, 143 position: Int32(bb.read(def: UOffset.self, position: 0)))) 144 } 145 146 var vArrayInt: [Int]? { __t.getVector(at: 4) } 147 var vArrayInt32: [Int32]? { __t.getVector(at: 4) } 148 var vArrayDouble: [Double]? { __t.getVector(at: 4) } 149 var vArrayFloat: [Float32]? { __t.getVector(at: 4) } 150 151 static func createNumbersVector( 152 b: inout FlatBufferBuilder, 153 array: [Int]) -> Offset 154 { 155 b.createVector(array, size: array.count) 156 } 157 158 static func createNumbersVector( 159 b: inout FlatBufferBuilder, 160 array: [Int32]) -> Offset 161 { 162 b.createVector(array, size: array.count) 163 } 164 165 static func createNumbersVector( 166 b: inout FlatBufferBuilder, 167 array: [Double]) -> Offset 168 { 169 b.createVector(array, size: array.count) 170 } 171 172 static func createNumbersVector( 173 b: inout FlatBufferBuilder, 174 array: [Float32]) -> Offset 175 { 176 b.createVector(array, size: array.count) 177 } 178 createNumbersnull179 static func createNumbers(b: inout FlatBufferBuilder, o: Offset) -> Offset { 180 let start = b.startTable(with: 1) 181 b.add(offset: o, at: 4) 182 return Offset(offset: b.endTable(at: start)) 183 } 184 } 185