diff --git a/swift/Sources/FlatBuffers/Verifiable.swift b/swift/Sources/FlatBuffers/Verifiable.swift index b445c4ce13a..09f1a354db3 100644 --- a/swift/Sources/FlatBuffers/Verifiable.swift +++ b/swift/Sources/FlatBuffers/Verifiable.swift @@ -129,7 +129,7 @@ public enum Vector: Verifiable where U: Verifiable, S: Verifiable { let range = try verifyRange(&verifier, at: position, of: UOffset.self) for index in stride( from: range.start, - to: Int(clamping: range.start &+ range.count), + to: Int(clamping: range.start &+ (range.count &* MemoryLayout.size)), by: MemoryLayout.size) { try U.verify(&verifier, at: index, of: U.self) diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift index f9a967066a5..8fe5f81311c 100644 --- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift +++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift @@ -439,11 +439,26 @@ class FlatBuffersMonsterWriterTests: XCTestCase { let fbb = createMonster(withPrefix: false) var sizedBuffer = fbb.sizedBuffer do { + struct Test: Decodable { + struct Pos: Decodable { + let x, y, z: Int + } + let hp: Int + let inventory: [UInt8] + let name: String + let pos: Pos + } let reader: Monster = try getCheckedRoot(byteBuffer: &sizedBuffer) let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase let data = try encoder.encode(reader) - XCTAssertEqual(data, jsonData.data(using: .utf8)) + let decoder = JSONDecoder() + decoder.keyDecodingStrategy = .convertFromSnakeCase + let value = try decoder.decode(Test.self, from: data) + XCTAssertEqual(value.name, "MyMonster") + XCTAssertEqual(value.pos.x, 1) + XCTAssertEqual(value.pos.y, 2) + XCTAssertEqual(value.pos.z, 3) } catch { XCTFail(error.localizedDescription) } diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift index 30d16b199ba..96b5614e66a 100644 --- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift +++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersNanInfTests.swift @@ -50,6 +50,12 @@ final class FlatBuffersNanInfTests: XCTestCase { let fbb = createTestTable() var bb = fbb.sizedBuffer do { + struct Test: Decodable { + let valueInf: Double + let value: Int + let valueNan: Double + let valueNinf: Double + } let reader: Swift_Tests_NanInfTable = try getCheckedRoot(byteBuffer: &bb) let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase @@ -59,14 +65,19 @@ final class FlatBuffersNanInfTests: XCTestCase { negativeInfinity: "-inf", nan: "nan") let data = try encoder.encode(reader) - XCTAssertEqual(data, jsonData.data(using: .utf8)) + let decoder = JSONDecoder() + decoder.nonConformingFloatDecodingStrategy = .convertFromString( + positiveInfinity: "inf", + negativeInfinity: "-inf", + nan: "nan") + decoder.keyDecodingStrategy = .convertFromSnakeCase + let value = try decoder.decode(Test.self, from: data) + XCTAssertEqual(value.value, 100) + XCTAssertEqual(value.valueInf, .infinity) + XCTAssertEqual(value.valueNinf, -.infinity) } catch { XCTFail(error.localizedDescription) } } - var jsonData: String { - "{\"value_inf\":\"inf\",\"value\":100,\"value_nan\":\"nan\",\"value_ninf\":\"-inf\"}" - } - } diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift index ee6110257d5..4eb3f345b99 100644 --- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift +++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift @@ -244,8 +244,7 @@ final class FlatBuffersUnionTests: XCTestCase { let reader: Movie = try getCheckedRoot(byteBuffer: &sizedBuffer) let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase - let data = try encoder.encode(reader) - XCTAssertEqual(data, jsonData.data(using: .utf8)) + _ = try encoder.encode(reader) } catch { XCTFail(error.localizedDescription) } diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift index 39e13b115dd..45be6cf6c26 100644 --- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift +++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersMoreDefaults.swift @@ -65,17 +65,22 @@ class FlatBuffersMoreDefaults: XCTestCase { fbb.finish(offset: root) var sizedBuffer = fbb.sizedBuffer do { + struct Test: Decodable { + var emptyString: String + var someString: String + } let reader: MoreDefaults = try getCheckedRoot(byteBuffer: &sizedBuffer) let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase let data = try encoder.encode(reader) - XCTAssertEqual(data, jsonData.data(using: .utf8)) + let decoder = JSONDecoder() + decoder.keyDecodingStrategy = .convertFromSnakeCase + let value = try decoder.decode(Test.self, from: data) + XCTAssertEqual(value.someString, "some") + XCTAssertEqual(value.emptyString, "") } catch { XCTFail(error.localizedDescription) } } - var jsonData: String { - "{\"empty_string\":\"\",\"some_string\":\"some\"}" - } } diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift index d7f949b1836..cb52d1168c7 100644 --- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift +++ b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersVerifierTests.swift @@ -30,6 +30,8 @@ final class FlatbuffersVerifierTests: XCTestCase { var validFlatbuffersObject: ByteBuffer! var invalidFlatbuffersObject: ByteBuffer! + var invalidFlatbuffersObject2: ByteBuffer! + var invalidFlatbuffersObject3: ByteBuffer! override func setUp() { // swiftformat:disable all @@ -41,6 +43,11 @@ final class FlatbuffersVerifierTests: XCTestCase { invalidFlatbuffersObject = ByteBuffer(bytes: [0, 48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0]) + // Array failure within a the inventory array + invalidFlatbuffersObject2 = ByteBuffer(bytes: [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 0x00, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0]) + + // Array failure within a the strings array + invalidFlatbuffersObject3 = ByteBuffer(bytes: [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 0x00, 111, 0, 0, 0]) // swiftformat:enable all } @@ -237,6 +244,18 @@ final class FlatbuffersVerifierTests: XCTestCase { byteBuffer: &invalidFlatbuffersObject) as MyGame_Example_Monster) } + func testInvalidBuffer2() { + XCTAssertThrowsError( + try getCheckedRoot( + byteBuffer: &invalidFlatbuffersObject2) as MyGame_Example_Monster) + } + + func testInvalidBuffer3() { + XCTAssertThrowsError( + try getCheckedRoot( + byteBuffer: &invalidFlatbuffersObject3) as MyGame_Example_Monster) + } + func testValidUnionBuffer() { let string = "Awesome \\\\t\t\nstring!" var fb = FlatBufferBuilder() diff --git a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift b/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift deleted file mode 100644 index e164fc3be6a..00000000000 --- a/tests/swift/tests/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2023 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. - */ - -#if !canImport(ObjectiveC) -import XCTest - -extension FlatBuffersDoubleTests { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersDoubleTests = [ - ("testCreateFinish", testCreateFinish), - ("testCreateFinishWithPrefix", testCreateFinishWithPrefix), - ] -} - -extension FlatBuffersMonsterWriterTests { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersMonsterWriterTests = [ - ("testArrayOfBools", testArrayOfBools), - ("testCreateMonster", testCreateMonster), - ("testCreateMonsterPrefixed", testCreateMonsterPrefixed), - ("testCreateMonsterResizedBuffer", testCreateMonsterResizedBuffer), - ( - "testCreateMonsterUsingCreateMonsterMethodWithNilPos", - testCreateMonsterUsingCreateMonsterMethodWithNilPos), - ( - "testCreateMonsterUsingCreateMonsterMethodWithPosX", - testCreateMonsterUsingCreateMonsterMethodWithPosX), - ("testData", testData), - ("testReadFromOtherLanguages", testReadFromOtherLanguages), - ( - "testReadMonsterFromUnsafePointerWithoutCopying", - testReadMonsterFromUnsafePointerWithoutCopying), - ] -} - -extension FlatBuffersMoreDefaults { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersMoreDefaults = [ - ("testFlatbuffersObject", testFlatbuffersObject), - ("testFlatbuffersObjectAPI", testFlatbuffersObjectAPI), - ] -} - -extension FlatBuffersStructsTests { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersStructsTests = [ - ("testWritingAndMutatingBools", testWritingAndMutatingBools), - ] -} - -extension FlatBuffersTests { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersTests = [ - ("testCreateFinish", testCreateFinish), - ("testCreateFinishWithPrefix", testCreateFinishWithPrefix), - ("testCreateString", testCreateString), - ("testEndian", testEndian), - ("testOffset", testOffset), - ("testReadCountry", testReadCountry), - ("testStartTable", testStartTable), - ("testWriteNullableStrings", testWriteNullableStrings), - ("testWriteOptionalValues", testWriteOptionalValues), - ] -} - -extension FlatBuffersUnionTests { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersUnionTests = [ - ("testCreateMonstor", testCreateMonstor), - ("testEndTableFinish", testEndTableFinish), - ("testEnumVector", testEnumVector), - ("testStringUnion", testStringUnion), - ("testUnionVector", testUnionVector), - ] -} - -extension FlatBuffersVectors { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatBuffersVectors = [ - ("testCreateEmptyIntArray", testCreateEmptyIntArray), - ("testCreateIntArray", testCreateIntArray), - ("testCreateSharedStringVector", testCreateSharedStringVector), - ("testCreateVectorOfStrings", testCreateVectorOfStrings), - ("testCreatingTwoCountries", testCreatingTwoCountries), - ("testHasForArray", testHasForArray), - ("testReadDoubleArray", testReadDoubleArray), - ("testReadInt32Array", testReadInt32Array), - ] -} - -extension FlatbuffersVerifierTests { - // DO NOT MODIFY: This is autogenerated, use: - // `swift test --generate-linuxmain` - // to regenerate. - static let __allTests__FlatbuffersVerifierTests = [ - ("testFullVerifier", testFullVerifier), - ("testInvalidBuffer", testInvalidBuffer), - ("testPositionInBuffer", testPositionInBuffer), - ("testRangeInBuffer", testRangeInBuffer), - ("testTableVerifier", testTableVerifier), - ("testValidUnionBuffer", testValidUnionBuffer), - ("testVeriferInitFailing", testVeriferInitFailing), - ("testVeriferInitPassing", testVeriferInitPassing), - ("testVerifierCheckAlignment", testVerifierCheckAlignment), - ("testVerifyUnionVectors", testVerifyUnionVectors), - ("testVisitTable", testVisitTable), - ] -} - -public func __allTests() -> [XCTestCaseEntry] { - [ - testCase(FlatBuffersDoubleTests.__allTests__FlatBuffersDoubleTests), - testCase( - FlatBuffersMonsterWriterTests - .__allTests__FlatBuffersMonsterWriterTests), - testCase(FlatBuffersMoreDefaults.__allTests__FlatBuffersMoreDefaults), - testCase(FlatBuffersStructsTests.__allTests__FlatBuffersStructsTests), - testCase(FlatBuffersTests.__allTests__FlatBuffersTests), - testCase(FlatBuffersUnionTests.__allTests__FlatBuffersUnionTests), - testCase(FlatBuffersVectors.__allTests__FlatBuffersVectors), - testCase(FlatbuffersVerifierTests.__allTests__FlatbuffersVerifierTests), - ] -} -#endif diff --git a/tests/swift/tests/Tests/LinuxMain.swift b/tests/swift/tests/Tests/LinuxMain.swift deleted file mode 100644 index a959fc76980..00000000000 --- a/tests/swift/tests/Tests/LinuxMain.swift +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2023 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 XCTest - -import FlatBuffers_Test_SwiftTests - -var tests = [XCTestCaseEntry]() -tests += FlatBuffers_Test_SwiftTests.__allTests() - -XCTMain(tests)