Fixes forward offset verifiable objects within arrays (#8135)

Fixes failing tests & removes XCTestsManifests

Co-authored-by: Derek Bailey <derekbailey@google.com>
diff --git a/swift/Sources/FlatBuffers/Verifiable.swift b/swift/Sources/FlatBuffers/Verifiable.swift
index b445c4c..09f1a35 100644
--- a/swift/Sources/FlatBuffers/Verifiable.swift
+++ b/swift/Sources/FlatBuffers/Verifiable.swift
@@ -129,7 +129,7 @@
       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<Int32>.size)),
         by: MemoryLayout<UOffset>.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 f9a9670..8fe5f81 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 @@
     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 30d16b1..96b5614 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 @@
     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 @@
           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 ee61102..4eb3f34 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 @@
       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 39e13b1..45be6cf 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 @@
     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 d7f949b..cb52d11 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 @@
 
   var validFlatbuffersObject: ByteBuffer!
   var invalidFlatbuffersObject: ByteBuffer!
+  var invalidFlatbuffersObject2: ByteBuffer!
+  var invalidFlatbuffersObject3: ByteBuffer!
 
   override func setUp() {
     // swiftformat:disable all
@@ -41,6 +43,11 @@
 
     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 @@
         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 e164fc3..0000000
--- 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 a959fc7..0000000
--- 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)