FlatBuffersMonsterWriterTests.swift 13.7 KB
Newer Older
1 2 3 4
import XCTest
import Foundation
@testable import FlatBuffers

5 6 7 8
public typealias Test = MyGame.Example.Test
public typealias Monster = MyGame.Example.Monster
public typealias Vec3 = MyGame.Example.Vec3
public typealias Stat = MyGame.Example.Stat
9 10 11 12 13 14 15 16

class FlatBuffersMonsterWriterTests: XCTestCase {
    
    func testData() {
        let data = Data([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])
        let _data = ByteBuffer(data: data)
        readMonster(fb: _data)
    }
17
    
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
    func testReadFromOtherLangagues() {
        let path = FileManager.default.currentDirectoryPath
        let url = URL(fileURLWithPath: path, isDirectory: true).appendingPathComponent("monsterdata_test").appendingPathExtension("mon")
        guard let data = try? Data(contentsOf: url) else { return }
        let _data = ByteBuffer(data: data)
        readMonster(fb: _data)
    }
    
    func testCreateMonster() {
        let bytes = createMonster(withPrefix: false)
        XCTAssertEqual(bytes.sizedByteArray, [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])
        readMonster(fb: bytes.buffer)
        mutateMonster(fb: bytes.buffer)
        readMonster(fb: bytes.buffer)
    }
33
    
34 35 36
    func testCreateMonsterResizedBuffer() {
        let bytes = createMonster(withPrefix: false)
        XCTAssertEqual(bytes.sizedByteArray, [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])
37
        readMonster(fb: bytes.sizedBuffer)
38
    }
39
    
40 41 42
    func testCreateMonsterPrefixed() {
        let bytes = createMonster(withPrefix: true)
        XCTAssertEqual(bytes.sizedByteArray, [44, 1, 0, 0, 44, 0, 0, 0, 77, 79, 78, 83, 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])
43
        
44 45 46
        let newBuf = FlatBuffersUtils.removeSizePrefix(bb: bytes.buffer)
        readMonster(fb: newBuf)
    }
47 48
    
    func readMonster(fb: ByteBuffer) {
49
        var monster = Monster.getRootAsMonster(bb: fb)
50 51 52 53
        readFlatbufferMonster(monster: &monster)
        var unpacked: MyGame.Example.MonsterT? = monster.unpack()
        readObjectApi(monster: unpacked!)
        var builder = FlatBufferBuilder()
54
        let root = Monster.pack(&builder, obj: &unpacked)
55
        builder.finish(offset: root)
56
        var newMonster = Monster.getRootAsMonster(bb: builder.sizedBuffer)
57 58 59
        readFlatbufferMonster(monster: &newMonster)
    }
    
60
    func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder {
61
        var fbb = FlatBufferBuilder(initialSize: 1)
62 63
        let names = [fbb.create(string: "Frodo"), fbb.create(string: "Barney"), fbb.create(string: "Wilma")]
        var offsets: [Offset<UOffset>] = []
64 65 66 67 68 69 70 71 72
        let start1 = Monster.startMonster(&fbb)
        Monster.add(name: names[0], &fbb)
        offsets.append(Monster.endMonster(&fbb, start: start1))
        let start2 = Monster.startMonster(&fbb)
        Monster.add(name: names[1], &fbb)
        offsets.append(Monster.endMonster(&fbb, start: start2))
        let start3 = Monster.startMonster(&fbb)
        Monster.add(name: names[2], &fbb)
        offsets.append(Monster.endMonster(&fbb, start: start3))
73
        
74
        let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb)
75
        
76 77 78 79 80
        let str = fbb.create(string: "MyMonster")
        let test1 = fbb.create(string: "test1")
        let test2 = fbb.create(string: "test2")
        let _inv: [Byte] = [0, 1, 2, 3, 4]
        let inv = fbb.createVector(_inv)
81
        
82
        let fred = fbb.create(string: "Fred")
83 84 85
        let mon1Start = Monster.startMonster(&fbb)
        Monster.add(name: fred, &fbb)
        let mon2 = Monster.endMonster(&fbb, start: mon1Start)
86 87
        let test4 = fbb.createVector(structs: [MyGame.Example.createTest(a: 30, b: 40),
                                               MyGame.Example.createTest(a: 10, b: 20)],
88
                                     type: Test.self)
89
        
90
        let stringTestVector = fbb.createVector(ofOffsets: [test1, test2])
91
        
92
        let mStart = Monster.startMonster(&fbb)
93
        let posOffset = fbb.create(struct: MyGame.Example.createVec3(x: 1, y: 2, z: 3, test1: 3, test2: .green, test3a: 5, test3b: 6), type: Vec3.self)
94 95 96 97 98 99 100 101 102 103 104 105
        Monster.add(pos: posOffset, &fbb)
        Monster.add(hp: 80, &fbb)
        Monster.add(name: str, &fbb)
        Monster.addVectorOf(inventory: inv, &fbb)
        Monster.add(testType: .monster, &fbb)
        Monster.add(test: mon2, &fbb)
        Monster.addVectorOf(test4: test4, &fbb)
        Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb)
        Monster.add(testbool: true, &fbb)
        Monster.addVectorOf(testarrayoftables: sortedArray, &fbb)
        let end = Monster.endMonster(&fbb, start: mStart)
        Monster.finish(&fbb, end: end, prefix: prefix)
106 107
        return fbb
    }
108
    
109
    func mutateMonster(fb: ByteBuffer) {
110
        let monster = Monster.getRootAsMonster(bb: fb)
111 112 113 114
        XCTAssertFalse(monster.mutate(mana: 10))
        XCTAssertEqual(monster.testarrayoftables(at: 0)?.name, "Barney")
        XCTAssertEqual(monster.testarrayoftables(at: 1)?.name, "Frodo")
        XCTAssertEqual(monster.testarrayoftables(at: 2)?.name, "Wilma")
115
        
116 117 118 119
        // Example of searching for a table by the key
        XCTAssertNotNil(monster.testarrayoftablesBy(key: "Frodo"))
        XCTAssertNotNil(monster.testarrayoftablesBy(key: "Barney"))
        XCTAssertNotNil(monster.testarrayoftablesBy(key: "Wilma"))
120
        
121
        XCTAssertEqual(monster.testType, .monster)
122
        
123 124 125 126 127
        XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true)
        XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true)
        XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true)
        XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true)
        XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true)
128
        
129 130 131
        for i in 0..<monster.inventoryCount {
            XCTAssertEqual(monster.inventory(at: i), Byte(i + 1))
        }
132
        
133 134 135 136 137
        XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true)
        XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true)
        XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true)
        XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true)
        XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true)
138
        
139 140 141 142 143 144 145 146 147 148
        let vec = monster.pos
        XCTAssertEqual(vec?.x, 1)
        XCTAssertTrue(vec?.mutate(x: 55.0) ?? false)
        XCTAssertTrue(vec?.mutate(test1: 55) ?? false)
        XCTAssertEqual(vec?.x, 55.0)
        XCTAssertEqual(vec?.test1, 55.0)
        XCTAssertTrue(vec?.mutate(x: 1) ?? false)
        XCTAssertEqual(vec?.x, 1)
        XCTAssertTrue(vec?.mutate(test1: 3) ?? false)
    }
149
    
150
    func readFlatbufferMonster(monster: inout MyGame.Example.Monster) {
151 152 153 154 155 156 157 158 159 160 161 162 163
        XCTAssertEqual(monster.hp, 80)
        XCTAssertEqual(monster.mana, 150)
        XCTAssertEqual(monster.name, "MyMonster")
        let pos = monster.pos
        XCTAssertEqual(pos?.x, 1)
        XCTAssertEqual(pos?.y, 2)
        XCTAssertEqual(pos?.z, 3)
        XCTAssertEqual(pos?.test1, 3)
        XCTAssertEqual(pos?.test2, .green)
        let test = pos?.test3
        XCTAssertEqual(test?.a, 5)
        XCTAssertEqual(test?.b, 6)
        XCTAssertEqual(monster.testType, .monster)
164
        let monster2 = monster.test(type: Monster.self)
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
        XCTAssertEqual(monster2?.name, "Fred")
        
        XCTAssertEqual(monster.mutate(mana: 10), false)
        
        XCTAssertEqual(monster.mana, 150)
        XCTAssertEqual(monster.inventoryCount, 5)
        var sum: Byte = 0
        for i in 0...monster.inventoryCount {
            sum += monster.inventory(at: i)
        }
        XCTAssertEqual(sum, 10)
        XCTAssertEqual(monster.test4Count, 2)
        let test0 = monster.test4(at: 0)
        let test1 = monster.test4(at: 1)
        var sum0 = 0
        var sum1 = 0
        if let a = test0?.a, let b = test0?.b {
            sum0 = Int(a) + Int(b)
        }
        if let a = test1?.a, let b = test1?.b {
            sum1 = Int(a) + Int(b)
        }
        XCTAssertEqual(sum0 + sum1, 100)
        XCTAssertEqual(monster.testarrayofstringCount, 2)
        XCTAssertEqual(monster.testarrayofstring(at: 0), "test1")
        XCTAssertEqual(monster.testarrayofstring(at: 1), "test2")
        XCTAssertEqual(monster.testbool, true)
192
        
193 194
        let array = monster.nameSegmentArray
        XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), "MyMonster")
195
        
196 197 198 199 200 201
        if 0 == monster.testarrayofboolsCount  {
            XCTAssertEqual(monster.testarrayofbools.isEmpty, true)
        } else {
            XCTAssertEqual(monster.testarrayofbools.isEmpty, false)
        }
    }
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
    
    func readObjectApi(monster: MyGame.Example.MonsterT) {
        XCTAssertEqual(monster.hp, 80)
        XCTAssertEqual(monster.mana, 150)
        XCTAssertEqual(monster.name, "MyMonster")
        let pos = monster.pos
        XCTAssertEqual(pos?.x, 1)
        XCTAssertEqual(pos?.y, 2)
        XCTAssertEqual(pos?.z, 3)
        XCTAssertEqual(pos?.test1, 3)
        XCTAssertEqual(pos?.test2, .green)
        let test = pos?.test3
        XCTAssertEqual(test?.a, 5)
        XCTAssertEqual(test?.b, 6)
        let monster2 = monster.test?.value as? MyGame.Example.MonsterT
        XCTAssertEqual(monster2?.name, "Fred")
        XCTAssertEqual(monster.mana, 150)
        monster.mana = 10
        XCTAssertEqual(monster.mana, 10)
        monster.mana = 150
        XCTAssertEqual(monster.mana, 150)
        
        XCTAssertEqual(monster.inventory.count, 5)
        var sum: Byte = 0
        for i in monster.inventory {
            sum += i
        }
        XCTAssertEqual(sum, 10)
        XCTAssertEqual(monster.test4.count, 2)
        let test0 = monster.test4[0]
        let test1 = monster.test4[1]
        var sum0 = 0
        var sum1 = 0
        if let a = test0?.a, let b = test0?.b {
            sum0 = Int(a) + Int(b)
        }
        if let a = test1?.a, let b = test1?.b {
            sum1 = Int(a) + Int(b)
        }
        XCTAssertEqual(sum0 + sum1, 100)
        XCTAssertEqual(monster.testbool, true)
    }
244
}