250 lines
8.0 KiB
Swift
250 lines
8.0 KiB
Swift
//
|
|
// FamilyTests.swift
|
|
// FirebladeECSTests
|
|
//
|
|
// Created by Christian Treffs on 09.10.17.
|
|
//
|
|
|
|
@testable import FirebladeECS
|
|
import XCTest
|
|
|
|
class FamilyTests: XCTestCase {
|
|
var nexus: Nexus!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
nexus = Nexus()
|
|
}
|
|
|
|
override func tearDown() {
|
|
nexus = nil
|
|
super.tearDown()
|
|
}
|
|
|
|
func createDefaultEntity() {
|
|
let e = nexus.createEntity()
|
|
e.assign(Position(x: 1, y: 2))
|
|
e.assign(Color())
|
|
}
|
|
|
|
func testFamilyCreation() {
|
|
let family = nexus.family(requires: Position.self,
|
|
excludesAll: Name.self)
|
|
|
|
XCTAssertTrue(family.nexus === self.nexus)
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
XCTAssertEqual(nexus.numEntities, 0)
|
|
XCTAssertFalse(family.traits.description.isEmpty)
|
|
XCTAssertFalse(family.traits.debugDescription.isEmpty)
|
|
|
|
let traits = FamilyTraitSet(requiresAll: [Position.self], excludesAll: [Name.self])
|
|
XCTAssertEqual(family.traits, traits)
|
|
}
|
|
|
|
func testFamilyReuse() {
|
|
let familyA = nexus.family(requires: Position.self,
|
|
excludesAll: Name.self)
|
|
|
|
let familyB = nexus.family(requires: Position.self,
|
|
excludesAll: Name.self)
|
|
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
|
|
XCTAssertEqual(familyA, familyB)
|
|
}
|
|
|
|
func testFamilyAbandoned() {
|
|
XCTAssertEqual(nexus.numFamilies, 0)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
XCTAssertEqual(nexus.numEntities, 0)
|
|
_ = nexus.family(requires: Position.self)
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
XCTAssertEqual(nexus.numEntities, 0)
|
|
let entity = nexus.createEntity()
|
|
XCTAssertFalse(entity.has(Position.self))
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
entity.assign(Position(x: 1, y: 1))
|
|
XCTAssertTrue(entity.has(Position.self))
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 1)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
entity.remove(Position.self)
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
nexus.destroy(entity: entity)
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 0)
|
|
XCTAssertEqual(nexus.numEntities, 0)
|
|
}
|
|
|
|
func testFamilyLateMember() {
|
|
let eEarly = nexus.createEntity(with: Position(x: 1, y: 2))
|
|
XCTAssertEqual(nexus.numFamilies, 0)
|
|
XCTAssertEqual(nexus.numComponents, 1)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
let family = nexus.family(requires: Position.self)
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 1)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
let eLate = nexus.createEntity(with: Position(x: 1, y: 2))
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 2)
|
|
XCTAssertEqual(nexus.numEntities, 2)
|
|
XCTAssertTrue(family.isMember(eEarly))
|
|
XCTAssertTrue(family.isMember(eLate))
|
|
}
|
|
|
|
func testFamilyExchange() {
|
|
let number: Int = 10
|
|
|
|
for i in 0..<number {
|
|
nexus.createEntity(with: Position(x: i + 1, y: i + 2))
|
|
}
|
|
|
|
let familyA = nexus.family(requires: Position.self,
|
|
excludesAll: Velocity.self)
|
|
|
|
let familyB = nexus.family(requires: Velocity.self,
|
|
excludesAll: Position.self)
|
|
|
|
XCTAssertEqual(familyA.count, 10)
|
|
XCTAssertEqual(familyB.count, 0)
|
|
|
|
familyA
|
|
.entityAndComponents
|
|
.forEach { (entity: Entity, _: Position) in
|
|
entity.assign(Velocity(a: 3.14))
|
|
entity.remove(Position.self)
|
|
}
|
|
|
|
XCTAssertEqual(familyA.count, 0)
|
|
XCTAssertEqual(familyB.count, 10)
|
|
|
|
familyB
|
|
.entityAndComponents
|
|
.forEach { (entity: Entity, velocity: Velocity) in
|
|
entity.assign(Position(x: 1, y: 2))
|
|
entity.remove(velocity)
|
|
}
|
|
|
|
XCTAssertEqual(familyA.count, 10)
|
|
XCTAssertEqual(familyB.count, 0)
|
|
}
|
|
|
|
func testFamilyMemberBasicIteration() {
|
|
for i in 0..<1000 {
|
|
nexus.createEntity(with: Position(x: i + 1, y: i + 2))
|
|
nexus.createEntity(with: Velocity(a: Float(i)))
|
|
}
|
|
|
|
let familyA = nexus.family(requires: Position.self,
|
|
excludesAll: Velocity.self)
|
|
|
|
let familyB = nexus.family(requires: Velocity.self,
|
|
excludesAll: Position.self)
|
|
|
|
familyA.forEach { (pos: Position?) in
|
|
XCTAssertNotNil(pos)
|
|
}
|
|
|
|
familyB.forEach { (vel: Velocity?) in
|
|
XCTAssertNotNil(vel)
|
|
}
|
|
}
|
|
|
|
func testFamilyBulkDestroy() {
|
|
let count = 10_000
|
|
|
|
for _ in 0..<count {
|
|
createDefaultEntity()
|
|
}
|
|
|
|
let family = nexus.family(requires: Position.self)
|
|
|
|
XCTAssertEqual(family.memberIds.count, count)
|
|
|
|
let currentCount: Int = (count / 2)
|
|
|
|
family
|
|
.entities
|
|
.prefix(currentCount)
|
|
.forEach { (entity: Entity) in
|
|
entity.destroy()
|
|
}
|
|
|
|
XCTAssertEqual(family.memberIds.count, (count / 2))
|
|
|
|
for _ in 0..<count {
|
|
createDefaultEntity()
|
|
}
|
|
|
|
XCTAssertEqual(family.memberIds.count, count + (count / 2))
|
|
}
|
|
|
|
func testFamilyDestroyMembers() {
|
|
let family = nexus.family(requiresAll: Position.self, Color.self)
|
|
|
|
family.createMember(with: (Position(x: 1, y: 2), Color(r: 1, g: 2, b: 3)))
|
|
family.createMember(with: (Position(x: 3, y: 4), Color(r: 4, g: 5, b: 6)))
|
|
nexus.createEntity(with: Name(name: "anotherEntity"))
|
|
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 5)
|
|
XCTAssertEqual(nexus.numEntities, 3)
|
|
XCTAssertEqual(family.count, 2)
|
|
|
|
XCTAssertTrue(family.destroyMembers())
|
|
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 1)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
XCTAssertEqual(family.count, 0)
|
|
|
|
XCTAssertFalse(family.destroyMembers())
|
|
|
|
XCTAssertEqual(nexus.numFamilies, 1)
|
|
XCTAssertEqual(nexus.numComponents, 1)
|
|
XCTAssertEqual(nexus.numEntities, 1)
|
|
XCTAssertEqual(family.count, 0)
|
|
}
|
|
|
|
func testFamilyCreateMembers() {
|
|
let position = Position(x: 0, y: 1)
|
|
let name = Name(name: "SomeName")
|
|
let velocity = Velocity(a: 123)
|
|
let party = Party(partying: true)
|
|
let color = Color()
|
|
|
|
let family1 = nexus.family(requires: Position.self, excludesAll: Name.self)
|
|
XCTAssertTrue(family1.isEmpty)
|
|
family1.createMember(with: position)
|
|
XCTAssertEqual(family1.count, 1)
|
|
|
|
let family2 = nexus.family(requiresAll: Position.self, Name.self)
|
|
XCTAssertTrue(family2.isEmpty)
|
|
family2.createMember(with: (position, name))
|
|
XCTAssertEqual(family2.count, 1)
|
|
|
|
let family3 = nexus.family(requiresAll: Position.self, Name.self, Velocity.self)
|
|
XCTAssertTrue(family3.isEmpty)
|
|
family3.createMember(with: (position, name, velocity))
|
|
XCTAssertEqual(family3.count, 1)
|
|
|
|
let family4 = nexus.family(requiresAll: Position.self, Name.self, Velocity.self, Party.self)
|
|
XCTAssertTrue(family4.isEmpty)
|
|
family4.createMember(with: (position, name, velocity, party))
|
|
XCTAssertEqual(family4.count, 1)
|
|
|
|
let family5 = nexus.family(requiresAll: Position.self, Name.self, Velocity.self, Party.self, Color.self)
|
|
XCTAssertTrue(family5.isEmpty)
|
|
family5.createMember(with: (position, name, velocity, party, color))
|
|
XCTAssertEqual(family5.count, 1)
|
|
}
|
|
}
|