Overall improvements to consistency

This commit is contained in:
Christian Treffs 2019-02-14 16:18:03 +01:00
parent ea632606d6
commit 9486e633df
7 changed files with 68 additions and 39 deletions

View File

@ -5,7 +5,7 @@
// Created by Christian Treffs on 08.10.17.
//
public struct Entity: UniqueEntityIdentifiable {
public struct Entity: UniqueEntityIdentifiable, Equatable {
public internal(set) var identifier = EntityIdentifier.invalid
public var name: String?
public let nexus: Nexus

View File

@ -25,12 +25,6 @@ public extension EntityIndex {
}
// MARK: Unique Entity Identifiable
public protocol UniqueEntityIdentifiable: Hashable {
public protocol UniqueEntityIdentifiable {
var identifier: EntityIdentifier { get }
}
public extension UniqueEntityIdentifiable {
func hash(into hasher: inout Hasher) {
hasher.combine(identifier.hashValue)
}
}

View File

@ -5,7 +5,7 @@
// Created by Christian Treffs on 09.10.17.
//
public struct FamilyTraitSet: CustomStringConvertible, CustomDebugStringConvertible {
public struct FamilyTraitSet {
public let requiresAll: ComponentSet
public let excludesAll: ComponentSet
@ -45,14 +45,6 @@ public struct FamilyTraitSet: CustomStringConvertible, CustomDebugStringConverti
return !requiresAll.isEmpty &&
requiresAll.isDisjoint(with: excludesAll)
}
@inlinable public var description: String {
return "<FamilyTraitSet [requiresAll:\(requiresAll.description) excludesAll:\(excludesAll.description)]>"
}
@inlinable public var debugDescription: String {
return "<FamilyTraitSet [requiresAll:\(requiresAll.debugDescription) excludesAll: \(excludesAll.debugDescription)]>"
}
}
// MARK: - Equatable
@ -68,3 +60,13 @@ extension FamilyTraitSet: Hashable {
hasher.combine(setHash)
}
}
extension FamilyTraitSet: CustomStringConvertible, CustomDebugStringConvertible {
@inlinable public var description: String {
return "<FamilyTraitSet [requiresAll:\(requiresAll.description) excludesAll:\(excludesAll.description)]>"
}
@inlinable public var debugDescription: String {
return "<FamilyTraitSet [requiresAll:\(requiresAll.debugDescription) excludesAll: \(excludesAll.debugDescription)]>"
}
}

View File

@ -20,8 +20,8 @@ public extension Nexus {
return traits.isMatch(components: componentSet)
}
func members(withFamilyTraits traits: FamilyTraitSet) -> UniformEntityIdentifiers? {
return familyMembersByTraits[traits]
func members(withFamilyTraits traits: FamilyTraitSet) -> UniformEntityIdentifiers {
return familyMembersByTraits[traits] ?? UniformEntityIdentifiers()
}
func isMember(_ entity: Entity, in family: FamilyTraitSet) -> Bool {
@ -33,9 +33,6 @@ public extension Nexus {
}
func isMember(entity entityId: EntityIdentifier, inFamilyWithTraits traits: FamilyTraitSet) -> Bool {
guard let members: UniformEntityIdentifiers = members(withFamilyTraits: traits) else {
return false
}
return members.contains(entityId.index)
return members(withFamilyTraits: traits).contains(entityId.index)
}
}

View File

@ -39,7 +39,7 @@ public extension TypedFamilyProtocol {
}
@inlinable var memberIds: UniformEntityIdentifiers {
return nexus.members(withFamilyTraits: traits) ?? UniformEntityIdentifiers()
return nexus.members(withFamilyTraits: traits)
}
@inlinable var count: Int {

View File

@ -5,7 +5,7 @@
// Created by Christian Treffs on 09.10.17.
//
@testable import FirebladeECS
import FirebladeECS
import XCTest
class FamilyTests: XCTestCase {
@ -35,8 +35,9 @@ class FamilyTests: XCTestCase {
XCTAssertEqual(family.nexus, self.nexus)
XCTAssertTrue(family.nexus === self.nexus)
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1)
XCTAssertEqual(nexus.familyMembersByTraits.values.count, 1)
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(nexus.numEntities, 0)
let traits = FamilyTraitSet(requiresAll: [Position.self], excludesAll: [Name.self])
XCTAssertEqual(family.traits, traits)
@ -50,36 +51,56 @@ class FamilyTests: XCTestCase {
let familyB = nexus.family(requires: Position.self,
excludesAll: Name.self)
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1)
XCTAssertEqual(nexus.familyMembersByTraits.values.count, 1)
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(familyA, familyB)
}
func testFamilyAbandoned() {
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 0)
XCTAssertEqual(nexus.numFamilies, 0)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(nexus.numEntities, 0)
_ = nexus.family(requires: Position.self)
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1)
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(nexus.numEntities, 0)
let entity = nexus.create(entity: "eimer")
XCTAssertFalse(entity.has(Position.self))
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(nexus.numEntities, 1)
entity.assign(Position(x: 1, y: 1))
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1)
XCTAssertTrue(entity.has(Position.self))
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 1)
XCTAssertEqual(nexus.numEntities, 1)
entity.remove(Position.self)
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1)
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(nexus.numEntities, 1)
nexus.destroy(entity: entity)
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1)
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 0)
XCTAssertEqual(nexus.numEntities, 0)
}
func testFamilyLateMember() {
let eEarly = nexus.create(entity: "eary").assign(Position(x: 1, y: 2))
XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 0)
let eEarly = nexus.create(entity: "early").assign(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.familyMembersByTraits.keys.count, 1)
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 1)
XCTAssertEqual(nexus.numEntities, 1)
let eLate = nexus.create(entity: "late").assign(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() {

View File

@ -127,6 +127,21 @@ class NexusTests: XCTestCase {
XCTAssert(e0.numComponents == 0)
}
func testComponentRetrieval() {
let pos = Position(x: 1, y: 2)
let name = Name(name: "myName")
let vel = Velocity(a: 3)
let entity = nexus.create(entity: "TrippleComponents", with: pos, name, vel)
let (rPos, rName, rVel) = entity.get(components: Position.self, Name.self, Velocity.self)
XCTAssertTrue(rPos === pos)
XCTAssertTrue(rName === name)
XCTAssertTrue(rVel === vel)
}
func testComponentUniqueness() {
let a = nexus.create()