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