/* * 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 Testing struct FlexBuffersWriterTests { @Test func testDeallocation() { let buf: ByteBuffer = { var fbx = FlexBuffersWriter() fbx.add(string: "Hello") fbx.finish() return fbx.sizedByteBuffer }() buf.withUnsafeBytes { #expect( Array($0) == [5, 72, 101, 108, 108, 111, 0, 6, 20, 1]) } } @Test 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 #expect( 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 } } @Test func testAddingVectorOfUnsignedScalars() { var fbx = FlexBuffersWriter() fbx.vector { let arr: [UInt64] = [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 #expect( 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 } } @Test 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 #expect( Array($0) == [4, 1, 0, 1, 0, 1, 5, 144, 2, 40, 1]) // swiftformat:enable all } } @Test 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 #expect( 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 } } @Test 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 #expect( 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 } } @Test func testNestingVectorInMap() { let buf: ByteBuffer = createSizedBuffer() buf.withUnsafeBytes { // swiftformat:disable all #expect( Array($0) == flexbufferGolden ) // swiftformat:enable all } } @Test 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 #expect( Array($0) == [118, 0, 1, 3, 1, 1, 1, 0, 0, 2, 36, 1] ) // swiftformat:enable all } } @Test 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 #expect( Array($0) == flexbufferGolden ) // swiftformat:enable all } } @Test 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 #expect( Array($0) == allTypesGolden) // swiftformat:enable all } } }