| /* |
| * Copyright 2024 Google Inc. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import Common |
| import FlexBuffers |
| import XCTest |
| |
| final class FlexBuffersWriterTests: XCTestCase { |
| func testDeallocation() { |
| let buf: ByteBuffer = { |
| var fbx = FlexBuffersWriter() |
| fbx.add(string: "Hello") |
| fbx.finish() |
| return fbx.sizedByteBuffer |
| }() |
| |
| buf.withUnsafeBytes { |
| XCTAssertEqual( |
| Array($0), |
| [5, 72, 101, 108, 108, 111, 0, 6, 20, 1]) |
| } |
| } |
| |
| func testAddingVectorOfScalars() { |
| var fbx = FlexBuffersWriter() |
| fbx.vector { |
| let arr: [Int32] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 20] |
| $0.create(vector: arr) |
| } |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| [ |
| 10, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, |
| 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 1, 41, 46, 2, 40, 1, |
| ]) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testAddingVectorOfUnsignedScalars() { |
| var fbx = FlexBuffersWriter() |
| fbx.vector { |
| let arr: [UInt] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 20] |
| $0.create(vector: arr) |
| } |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| [ |
| 10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, |
| 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, |
| 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 1, |
| 81, 51, 2, 40, 1, |
| ]) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testAddingVectorOfBools() { |
| var fbx = FlexBuffersWriter() |
| fbx.vector { |
| let arr: [Bool] = [true, false, true, false] |
| $0.create(vector: arr) |
| } |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| [4, 1, 0, 1, 0, 1, 5, 144, 2, 40, 1]) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testSortingWithinMap() { |
| var fbx = FlexBuffersWriter() |
| fbx.map { |
| $0.add(bool: false, key: "bool2") |
| $0.add(bool: true, key: "bool1") |
| } |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| [ |
| 98, 111, 111, 108, 50, 0, 98, 111, 111, 108, 49, 0, 2, 7, 14, 2, 1, 2, 1, 0, 104, 104, 4, |
| 36, 1, |
| ] |
| ) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testSharingKeyWithinMap() { |
| var fbx = FlexBuffersWriter(initialSize: 1000, flags: .shareKeysAndStrings) |
| fbx.map { |
| $0.add(string: "welcome", key: "welcome") |
| $0.add(string: "welcome", key: "welcome") |
| $0.add(string: "welcome", key: "welcome") |
| } |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| [ |
| 119, 101, 108, 99, 111, 109, 101, 0, 7, 119, 101, 108, 99, 111, 109, 101, 0, 3, 18, 19, |
| 20, 3, 1, 3, 15, 16, 17, 20, 20, 20, 6, 36, 1, |
| ] |
| ) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testNestingVectorInMap() { |
| let buf: ByteBuffer = createSizedBuffer() |
| |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| flexbufferGolden |
| ) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testAddingNil() { |
| var fbx = FlexBuffersWriter( |
| initialSize: 8, |
| flags: .shareKeysAndStrings) |
| |
| fbx.map { map in |
| map.addNil(key: "v") |
| } |
| |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| [118, 0, 1, 3, 1, 1, 1, 0, 0, 2, 36, 1] |
| ) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testAddingManually() { |
| var fbx = FlexBuffersWriter( |
| initialSize: 8, |
| flags: .shareKeysAndStrings) |
| |
| let outerMap = fbx.startMap() |
| |
| let vector = fbx.startVector(key: "vec") |
| fbx.add(int64: -100) |
| fbx.add(string: "Fred") |
| fbx.indirect(float32: 4.0) |
| let lv = fbx.lastValue() |
| let blob: [UInt8] = [77] |
| fbx.add(blob: blob, length: blob.count) |
| fbx.add(bool: false) |
| fbx.reuse(value: lv!) |
| fbx.endVector(start: vector) |
| |
| let ints: [Int32] = [1, 2, 3] |
| fbx.create(vector: ints, key: "bar") |
| fbx.createFixed(vector: ints, key: "bar3") |
| let bools = [true, false, true, false] |
| fbx.create(vector: bools, key: "bools") |
| fbx.add(bool: true, key: "bool") |
| fbx.add(double: 100, key: "foo") |
| |
| let innerMap = fbx.startMap(key: "mymap") |
| fbx.add(string: "Fred", key: "foo") |
| fbx.endMap(start: innerMap) |
| |
| fbx.endMap(start: outerMap) |
| |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| flexbufferGolden |
| ) |
| // swiftformat:enable all |
| } |
| } |
| |
| func testEncodingAllTypes() { |
| var fbx = FlexBuffersWriter() |
| fbx.vector { |
| $0.indirect(int64: 9) |
| $0.indirect(uint64: 9) |
| $0.indirect(float32: 3) |
| $0.indirect(double: 3) |
| |
| $0.addNil() |
| $0.add(bool: true) |
| $0.add(int64: 9) |
| $0.add(int64: -9) |
| $0.add(uint64: 9) |
| $0.add(double: 2.4) |
| $0.add(float32: 2.4) |
| $0.add(double: -2.4) |
| $0.add(float32: -2.4) |
| } |
| fbx.finish() |
| let buf: ByteBuffer = fbx.sizedByteBuffer |
| |
| buf.withUnsafeBytes { |
| // swiftformat:disable all |
| XCTAssertEqual( |
| Array($0), |
| allTypesGolden) |
| // swiftformat:enable all |
| } |
| } |
| } |