| /* |
| * 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 XCTest |
| |
| @testable import FlatBuffers |
| |
| final class ByteBufferTests: XCTestCase { |
| func testCopyingMemory() { |
| let count = 100 |
| let ptr = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: 1) |
| let byteBuffer = ByteBuffer(copyingMemoryBound: ptr, capacity: count) |
| byteBuffer.withUnsafeBytes { memory in |
| XCTAssertNotEqual(memory.baseAddress, ptr) |
| } |
| } |
| |
| func testSamePointer() { |
| let count = 100 |
| let ptr = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: 1) |
| let byteBuffer = ByteBuffer(assumingMemoryBound: ptr, capacity: count) |
| byteBuffer.withUnsafeBytes { memory in |
| XCTAssertEqual(memory.baseAddress!, ptr) |
| } |
| } |
| |
| func testSameDataPtr() { |
| let count = 100 |
| let ptr = Data(repeating: 0, count: count) |
| let byteBuffer = ByteBuffer(data: ptr) |
| byteBuffer.withUnsafeBytes { memory in |
| ptr.withUnsafeBytes { ptr in |
| XCTAssertEqual(memory.baseAddress!, ptr.baseAddress!) |
| } |
| } |
| } |
| |
| func testSameArrayPtr() { |
| let count = 100 |
| let ptr: [UInt8] = Array(repeating: 0, count: count) |
| let byteBuffer = ByteBuffer(bytes: ptr) |
| ptr.withUnsafeBytes { ptr in |
| byteBuffer.withUnsafeBytes { memory in |
| XCTAssertEqual(memory.baseAddress, ptr.baseAddress) |
| } |
| } |
| } |
| |
| func testReadingDoubleBuffer() { |
| let count = 8 |
| let array: [Double] = Array(repeating: 8.8, count: count) |
| var oldBuffer = _InternalByteBuffer(initialSize: 16) |
| oldBuffer.push(elements: array) |
| let bytes: [Byte] = oldBuffer.withUnsafeBytes { bytes in |
| Array(bytes) |
| } |
| let byteBuffer = ByteBuffer(bytes: bytes) |
| byteBuffer.withUnsafePointerToSlice(index: 0, count: count) { ptr in |
| XCTAssertEqual(ptr.count, count) |
| bytes.withUnsafeBufferPointer { |
| XCTAssertEqual( |
| UnsafeRawPointer($0.baseAddress), |
| UnsafeRawPointer(ptr.baseAddress)) |
| } |
| } |
| } |
| |
| func testReadingNativeStructs() { |
| let array = [ |
| MyGame_Example_Vec3( |
| x: 3.2, |
| y: 3.2, |
| z: 3.2, |
| test1: 8, |
| test2: .red, |
| test3: MyGame_Example_Test(a: 8, b: 8)), |
| MyGame_Example_Vec3( |
| x: 3.2, |
| y: 3.2, |
| z: 3.2, |
| test1: 8, |
| test2: .green, |
| test3: MyGame_Example_Test(a: 16, b: 16)), |
| MyGame_Example_Vec3( |
| x: 3.2, |
| y: 3.2, |
| z: 3.2, |
| test1: 8, |
| test2: .blue, |
| test3: MyGame_Example_Test(a: 32, b: 32)), |
| ] |
| let count = array.count |
| var oldBuffer = _InternalByteBuffer(initialSize: 16) |
| oldBuffer.push(elements: array) |
| let bytes: [Byte] = oldBuffer.withUnsafeBytes { bytes in |
| Array(bytes) |
| } |
| let byteBuffer = ByteBuffer(bytes: bytes) |
| byteBuffer |
| .withUnsafePointerToSlice(index: 0, count: count) { bufferPointer in |
| XCTAssertEqual(bufferPointer.count, count) |
| bytes.withUnsafeBufferPointer { ptr in |
| XCTAssertEqual( |
| UnsafeRawPointer(ptr.baseAddress), |
| UnsafeRawPointer(bufferPointer.baseAddress)) |
| } |
| } |
| } |
| } |
| |
| private struct TestNativeStructs: NativeStruct { |
| let x: Double |
| let y: Double |
| let z: Int |
| } |
| |
| extension MyGame_Example_Color: CaseIterable { |
| public static var allCases: [MyGame_Example_Color] = [.red, .blue, .green] |
| } |