diff --git a/tests/swift/Wasm.tests/Package.swift b/tests/swift/Wasm.tests/Package.swift index c2f7dcbf2e3..c5e34a625bd 100644 --- a/tests/swift/Wasm.tests/Package.swift +++ b/tests/swift/Wasm.tests/Package.swift @@ -33,4 +33,9 @@ let package = Package( dependencies: [ .product(name: "FlatBuffers", package: "flatbuffers"), ]), + .testTarget( + name: "FlexBuffers.Test.Swift.WasmTests", + dependencies: [ + .product(name: "FlexBuffers", package: "flatbuffers"), + ]) ]) diff --git a/tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersJSONTests.swift b/tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersJSONTests.swift new file mode 100644 index 00000000000..c2546666667 --- /dev/null +++ b/tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersJSONTests.swift @@ -0,0 +1,51 @@ +/* + * 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 FlexBuffersJSONTests: XCTestCase { + func testEncodingJSON() throws { + let buf: ByteBuffer = createProperBuffer().sizedByteBuffer + let reference = try getRoot(buffer: buf)! + + let json = reference.jsonString() + // swiftformat:disable all + XCTAssertEqual( + json, + "{\"bar\": [1, 2, 3], \"bar3\": [1, 2, 3], \"bool\": true, \"bools\": [true, false, true, false], \"foo\": 100.0, \"mymap\": {\"foo\": \"Fred\"}, \"vec\": [-100, \"Fred\", 4.0, \"M\", false, 4.0]}" + ) + // swiftformat:enable all + + let data = json.data(using: .utf8)! + let decodedData = + try JSONSerialization.jsonObject( + with: data, + options: []) as! [String: Any] + + XCTAssertEqual(decodedData["bar"] as! [Int], [1, 2, 3]) + XCTAssertEqual(decodedData["bar3"] as! [Int], [1, 2, 3]) + + let vec: [Any] = decodedData["vec"] as! [Any] + XCTAssertEqual(vec[0] as! Int, -100) + XCTAssertEqual(vec[1] as! String, "Fred") + XCTAssertEqual(vec[2] as! Double, 4.0) + XCTAssertEqual(vec[3] as! String, "M") + XCTAssertEqual(vec[4] as! Bool, false) + XCTAssertEqual(vec[5] as! Double, 4.0) + } +} diff --git a/tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersReaderTests.swift b/tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersReaderTests.swift new file mode 100644 index 00000000000..06f01421fa7 --- /dev/null +++ b/tests/swift/Wasm.tests/Tests/FlexBuffers.Test.Swift.WasmTests/FlexBuffersReaderTests.swift @@ -0,0 +1,140 @@ +/* + * 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 XCTest + +@testable import FlexBuffers + +final class FlexBuffersReaderTests: XCTestCase { + + func testReadingProperBuffer() throws { + let buf: ByteBuffer = createProperBuffer().byteBuffer + try validate(buffer: buf) + } + + func testReadingSizedBuffer() throws { + let buf: ByteBuffer = createSizedBuffer() + try validate(buffer: buf) + } + + func testReset() throws { + var fbx = FlexBuffersWriter( + initialSize: 8, + flags: .shareKeysAndStrings) + write(fbx: &fbx) + + try validate(buffer: ByteBuffer(bytes: fbx.sizedByteArray)) + XCTAssertEqual(fbx.capacity, 512) + fbx.reset() + XCTAssertEqual(fbx.writerIndex, 0) + XCTAssertEqual(fbx.capacity, 8) + + write(fbx: &fbx) + try validate(buffer: ByteBuffer(bytes: fbx.sizedByteArray)) + fbx.reset(keepingCapacity: true) + XCTAssertEqual(fbx.writerIndex, 0) + XCTAssertEqual(fbx.capacity, 512) + + write(fbx: &fbx) + try validate(buffer: ByteBuffer(bytes: fbx.sizedByteArray)) + XCTAssertEqual(fbx.capacity, 512) + } + + private func validate(buffer buf: ByteBuffer) throws { + let reference = try getRoot(buffer: buf)! + XCTAssertEqual(reference.type, .map) + let map = reference.map! + XCTAssertEqual(map.count, 7) + let vecRef = map["vec"]! + XCTAssertEqual(vecRef.type, .vector) + let vec = vecRef.vector! + XCTAssertEqual(vec.count, 6) + XCTAssertEqual(vec[0]?.type, .int) + XCTAssertEqual(vec[0]?.int, -100) + XCTAssertEqual(vec[1]?.type, .string) + XCTAssertEqual(vec[1]?.cString, "Fred") + XCTAssertNil(vec[1]?.int) + XCTAssertEqual(vec[2]?.double, 4.0) + XCTAssertTrue(vec[3]?.type == .blob) + + let blob = vec[3]!.blob { pointer in + Array(pointer) + } + + XCTAssertEqual(blob?.count, 1) + XCTAssertEqual(blob?[0], 77) + XCTAssertEqual(vec[4]?.type, .bool) + XCTAssertEqual(vec[4]?.bool, false) + XCTAssertEqual(vec[5]?.double, 4.0) // Shared with vec[2] + + let barVec = map["bar"]!.typedVector! + XCTAssertEqual(barVec.count, 3) + XCTAssertEqual(barVec[2]?.int, 3) + XCTAssertEqual(barVec[2]?.asInt(), UInt8(3)) + + let fixedVec = map["bar3"]!.fixedTypedVector! + XCTAssertEqual(fixedVec.count, 3) + XCTAssertEqual(fixedVec[2]?.int, 3) + XCTAssertEqual(fixedVec[2]?.asInt(), UInt8(3)) + XCTAssertEqual(map["bool"]?.bool, true) + + let boolsVector = map["bools"]!.typedVector! + XCTAssertEqual(boolsVector.type, .bool) + XCTAssertEqual(boolsVector[0]?.bool, true) + XCTAssertEqual(boolsVector[1]?.bool, false) + + let bools = [true, false, true, false] + boolsVector.withUnsafeRawBufferPointer { buff in + for i in 0.. ByteBuffer { + createProperBuffer().sizedByteBuffer +} + +@inline(__always) +func createProperBuffer() -> FlexBuffersWriter { + var fbx = FlexBuffersWriter( + initialSize: 8, + flags: .shareKeysAndStrings) + write(fbx: &fbx) + return fbx +} + +func write(fbx: inout FlexBuffersWriter) { + fbx.map { map in + map.vector(key: "vec") { v in + v.add(int64: -100) + v.add(string: "Fred") + v.indirect(float32: 4.0) + let lv = v.lastValue() + let blob: [UInt8] = [77] + v.add(blob: blob, length: blob.count) + v.add(bool: false) + v.reuse(value: lv!) + } + let ints: [Int32] = [1, 2, 3] + map.create(vector: ints, key: "bar") + map.createFixed(vector: ints, key: "bar3") + let bools = [true, false, true, false] + map.create(vector: bools, key: "bools") + map.add(bool: true, key: "bool") + map.add(double: 100, key: "foo") + map.map(key: "mymap") { m in + m.add(string: "Fred", key: "foo") + } + } + + fbx.finish() +}