From ec8a59f03bc71b2f6562c22711d9d290a9f12e6a Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 09:10:41 +0200 Subject: [PATCH 1/7] Fix trait set validation --- Sources/FirebladeECS/FamilyTraitSet.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/FirebladeECS/FamilyTraitSet.swift b/Sources/FirebladeECS/FamilyTraitSet.swift index 1f98a9f..bf1220c 100644 --- a/Sources/FirebladeECS/FamilyTraitSet.swift +++ b/Sources/FirebladeECS/FamilyTraitSet.swift @@ -15,8 +15,8 @@ public struct FamilyTraitSet { let requiresAll = Set(requiresAll.map { $0.identifier }) let excludesAll = Set(excludesAll.map { $0.identifier }) - let valid: Bool = FamilyTraitSet.isValid(requiresAll: requiresAll, excludesAll: excludesAll) - precondition(valid, "invalid family trait created - requiresAll: \(requiresAll), excludesAll: \(excludesAll)") + precondition(FamilyTraitSet.isValid(requiresAll: requiresAll, excludesAll: excludesAll), + "invalid family trait created - requiresAll: \(requiresAll), excludesAll: \(excludesAll)") self.requiresAll = requiresAll self.excludesAll = excludesAll From 6d19d93ed82a1cf65bc5113179751de3f1507516 Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 11:28:41 +0200 Subject: [PATCH 2/7] Extend travis ci script to use linux --- .travis.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index fbf01a8..ab23541 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,19 @@ language: swift -osx_image: xcode11 - -script: - - swift package clean - - swift package resolve - - swift test +matrix: + include: + - + name: "Xcode 11" + os: osx + osx_image: xcode11 + - + dist: trusty + env: + - SWIFT_VERSION=5.0 + install: + - "eval \"$(curl -sL https://swiftenv.fuller.li/install.sh)\"" + name: "Linux Swift 5.0" + os: linux + sudo: required +script: + - "swift package reset" + - "swift test" \ No newline at end of file From 4dc65d28391cf00090e50dfad86dce22d721015f Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 11:37:04 +0200 Subject: [PATCH 3/7] Update ci config --- .travis.yml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index ab23541..eb6f90c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,20 @@ -language: swift -matrix: - include: - - - name: "Xcode 11" +matrix: + include: + - name: "Xcode 11" os: osx osx_image: xcode11 - - + language: swift + + - name: "Linux Swift 5.0" + os: linux dist: trusty + sudo: required + language: swift env: - SWIFT_VERSION=5.0 - install: - - "eval \"$(curl -sL https://swiftenv.fuller.li/install.sh)\"" - name: "Linux Swift 5.0" - os: linux - sudo: required -script: - - "swift package reset" - - "swift test" \ No newline at end of file + install: + - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" + +script: + - swift package reset + - swift test From 0bc2d8cb8aa58b9c5093aaa1d0258d6c5b3b5cd7 Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 11:55:52 +0200 Subject: [PATCH 4/7] Travis.ci linux & macOS in one job --- .travis.yml | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index eb6f90c..ac39e4b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,20 +1,13 @@ -matrix: - include: - - name: "Xcode 11" - os: osx - osx_image: xcode11 - language: swift - - - name: "Linux Swift 5.0" - os: linux - dist: trusty - sudo: required - language: swift - env: - - SWIFT_VERSION=5.0 - install: - - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" - +os: + - linux + - osx +language: generic +sudo: required +dist: trusty +osx_image: xcode11 +install: + - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" script: - swift package reset + - swift build - swift test From 2084e042571b6592eab9e223639867ec58296429 Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 13:44:01 +0200 Subject: [PATCH 5/7] Fix build for Swift 5.0.1 --- Sources/FirebladeECS/Component+Access.swift | 2 ++ Sources/FirebladeECS/Entity.swift | 7 ++++++- Sources/FirebladeECS/Family.swift | 7 ++++++- Tests/FirebladeECSTests/AccessTests.swift | 3 ++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Sources/FirebladeECS/Component+Access.swift b/Sources/FirebladeECS/Component+Access.swift index 054fd25..acd650e 100644 --- a/Sources/FirebladeECS/Component+Access.swift +++ b/Sources/FirebladeECS/Component+Access.swift @@ -5,6 +5,7 @@ // Created by Christian Treffs on 25.06.19. // +#if swift(>=5.1) @dynamicMemberLookup public struct ReadableOnly where Comp: Component { @usableFromInline let component: Comp @@ -31,3 +32,4 @@ public struct Writable where Comp: Component { nonmutating set { component[keyPath: keyPath] = newValue } } } +#endif diff --git a/Sources/FirebladeECS/Entity.swift b/Sources/FirebladeECS/Entity.swift index ad48690..0b45535 100644 --- a/Sources/FirebladeECS/Entity.swift +++ b/Sources/FirebladeECS/Entity.swift @@ -104,4 +104,9 @@ public struct Entity { } // MARK: - Equatable -extension Entity: Equatable { } +extension Entity: Equatable { + public static func == (lhs: Entity, rhs: Entity) -> Bool { + return lhs.nexus == rhs.nexus && + lhs.identifier == rhs.identifier + } +} diff --git a/Sources/FirebladeECS/Family.swift b/Sources/FirebladeECS/Family.swift index a122402..cbfe10a 100644 --- a/Sources/FirebladeECS/Family.swift +++ b/Sources/FirebladeECS/Family.swift @@ -124,4 +124,9 @@ extension Family { extension Family.EntityComponentIterator: LazySequenceProtocol { } // MARK: - Equatable -extension Family: Equatable { } +extension Family: Equatable { + public static func == (lhs: Family, rhs: Family) -> Bool { + return lhs.nexus == rhs.nexus && + lhs.traits == rhs.traits + } +} diff --git a/Tests/FirebladeECSTests/AccessTests.swift b/Tests/FirebladeECSTests/AccessTests.swift index 423ceb8..d5fbcd3 100644 --- a/Tests/FirebladeECSTests/AccessTests.swift +++ b/Tests/FirebladeECSTests/AccessTests.swift @@ -10,7 +10,7 @@ import FirebladeECS import XCTest - +#if swift(>=5.1) class AccessTests: XCTestCase { func testReadOnly() { @@ -42,3 +42,4 @@ class AccessTests: XCTestCase { } } +#endif From f824505501ef7fe13b47aefe13005d929c3c9774 Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 13:55:05 +0200 Subject: [PATCH 6/7] Fix unit tests on Linux --- Tests/FirebladeECSTests/HashingTests.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Tests/FirebladeECSTests/HashingTests.swift b/Tests/FirebladeECSTests/HashingTests.swift index 09854fb..ad93d5b 100644 --- a/Tests/FirebladeECSTests/HashingTests.swift +++ b/Tests/FirebladeECSTests/HashingTests.swift @@ -12,12 +12,13 @@ class HashingTests: XCTestCase { func makeComponent() -> Int { let upperBound: Int = 44 - let high = UInt(arc4random()) << UInt(upperBound) - let low = UInt(arc4random()) - assert(high.leadingZeroBitCount < 64 - upperBound) - assert(high.trailingZeroBitCount >= upperBound) - assert(low.leadingZeroBitCount >= 32) - assert(low.trailingZeroBitCount <= 32) + let range = UInt32.min...UInt32.max + let high = UInt(UInt32.random(in: range)) << UInt(upperBound) + let low = UInt(UInt32.random(in: range)) + XCTAssertTrue(high.leadingZeroBitCount < 64 - upperBound) + XCTAssertTrue(high.trailingZeroBitCount >= upperBound) + XCTAssertTrue(low.leadingZeroBitCount >= 32) + XCTAssertTrue(low.trailingZeroBitCount <= 32) let rand: UInt = high | low let cH = Int(bitPattern: rand) return cH From 971554f58926a6bee798cec3c493943ac188cceb Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Thu, 22 Aug 2019 14:03:06 +0200 Subject: [PATCH 7/7] Add all tests to LinuxMain.swift --- .../XCTestManifests.swift | 52 ++++++++ Tests/FirebladeECSTests/XCTestManifests.swift | 124 ++++++++++++++++++ Tests/LinuxMain.swift | 12 +- 3 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 Tests/FirebladeECSPerformanceTests/XCTestManifests.swift create mode 100644 Tests/FirebladeECSTests/XCTestManifests.swift diff --git a/Tests/FirebladeECSPerformanceTests/XCTestManifests.swift b/Tests/FirebladeECSPerformanceTests/XCTestManifests.swift new file mode 100644 index 0000000..7aa0491 --- /dev/null +++ b/Tests/FirebladeECSPerformanceTests/XCTestManifests.swift @@ -0,0 +1,52 @@ +#if !canImport(ObjectiveC) +import XCTest + +extension ComponentTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ComponentTests = [ + ("testMeasureComponentIdentifier", testMeasureComponentIdentifier), + ("testMeasureStaticComponentIdentifier", testMeasureStaticComponentIdentifier), + ] +} + +extension HashingPerformanceTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__HashingPerformanceTests = [ + ("testMeasureCombineHash", testMeasureCombineHash), + ("testMeasureSetOfSetHash", testMeasureSetOfSetHash), + ] +} + +extension TypedFamilyPerformanceTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__TypedFamilyPerformanceTests = [ + ("testMeasureTraitMatching", testMeasureTraitMatching), + ("testPerformanceArray", testPerformanceArray), + ("testPerformanceTypedFamilyEntities", testPerformanceTypedFamilyEntities), + ("testPerformanceTypedFamilyEntityFiveComponents", testPerformanceTypedFamilyEntityFiveComponents), + ("testPerformanceTypedFamilyEntityFourComponents", testPerformanceTypedFamilyEntityFourComponents), + ("testPerformanceTypedFamilyEntityOneComponent", testPerformanceTypedFamilyEntityOneComponent), + ("testPerformanceTypedFamilyEntityThreeComponents", testPerformanceTypedFamilyEntityThreeComponents), + ("testPerformanceTypedFamilyEntityTwoComponents", testPerformanceTypedFamilyEntityTwoComponents), + ("testPerformanceTypedFamilyFiveComponents", testPerformanceTypedFamilyFiveComponents), + ("testPerformanceTypedFamilyFourComponents", testPerformanceTypedFamilyFourComponents), + ("testPerformanceTypedFamilyOneComponent", testPerformanceTypedFamilyOneComponent), + ("testPerformanceTypedFamilyThreeComponents", testPerformanceTypedFamilyThreeComponents), + ("testPerformanceTypedFamilyTwoComponents", testPerformanceTypedFamilyTwoComponents), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { + return [ + testCase(ComponentTests.__allTests__ComponentTests), + testCase(HashingPerformanceTests.__allTests__HashingPerformanceTests), + testCase(TypedFamilyPerformanceTests.__allTests__TypedFamilyPerformanceTests), + ] +} +#endif diff --git a/Tests/FirebladeECSTests/XCTestManifests.swift b/Tests/FirebladeECSTests/XCTestManifests.swift new file mode 100644 index 0000000..846ccab --- /dev/null +++ b/Tests/FirebladeECSTests/XCTestManifests.swift @@ -0,0 +1,124 @@ +#if !canImport(ObjectiveC) +import XCTest + +extension ComponentTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ComponentTests = [ + ("testComponentIdentifier", testComponentIdentifier), + ] +} + +extension EntityTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__EntityTests = [ + ("testEntityIdentifierAndIndex", testEntityIdentifierAndIndex), + ] +} + +extension FamilyTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__FamilyTests = [ + ("testFamilyAbandoned", testFamilyAbandoned), + ("testFamilyBulkDestroy", testFamilyBulkDestroy), + ("testFamilyCreation", testFamilyCreation), + ("testFamilyExchange", testFamilyExchange), + ("testFamilyLateMember", testFamilyLateMember), + ("testFamilyMemberBasicIteration", testFamilyMemberBasicIteration), + ("testFamilyReuse", testFamilyReuse), + ] +} + +extension FamilyTraitsTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__FamilyTraitsTests = [ + ("testTraitCommutativity", testTraitCommutativity), + ("testTraitMatching", testTraitMatching), + ] +} + +extension HashingTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__HashingTests = [ + ("testCollisionsInCritialRange", testCollisionsInCritialRange), + ] +} + +extension NexusTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__NexusTests = [ + ("testComponentCreation", testComponentCreation), + ("testComponentDeletion", testComponentDeletion), + ("testComponentRetrieval", testComponentRetrieval), + ("testComponentUniqueness", testComponentUniqueness), + ("testEntityCreate", testEntityCreate), + ("testEntityDestroy", testEntityDestroy), + ] +} + +extension SingleTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__SingleTests = [ + ("testSingleCreation", testSingleCreation), + ("testSingleCreationOnExistingFamilyMember", testSingleCreationOnExistingFamilyMember), + ("testSingleEntityAndComponentCreation", testSingleEntityAndComponentCreation), + ("testSingleReuse", testSingleReuse), + ] +} + +extension SparseSetTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__SparseSetTests = [ + ("testSparseSetAdd", testSparseSetAdd), + ("testSparseSetAddAndReplace", testSparseSetAddAndReplace), + ("testSparseSetClear", testSparseSetClear), + ("testSparseSetDoubleRemove", testSparseSetDoubleRemove), + ("testSparseSetGet", testSparseSetGet), + ("testSparseSetNonCongiuousData", testSparseSetNonCongiuousData), + ("testSparseSetReduce", testSparseSetReduce), + ("testSparseSetRemove", testSparseSetRemove), + ("testSparseSetRemoveAndAdd", testSparseSetRemoveAndAdd), + ("testSparseSetRemoveNonPresent", testSparseSetRemoveNonPresent), + ("testStartEndIndex", testStartEndIndex), + ("testSubscript", testSubscript), + ] +} + +extension SystemsTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__SystemsTests = [ + ("testSystemsUpdate", testSystemsUpdate), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { + return [ + testCase(ComponentTests.__allTests__ComponentTests), + testCase(EntityTests.__allTests__EntityTests), + testCase(FamilyTests.__allTests__FamilyTests), + testCase(FamilyTraitsTests.__allTests__FamilyTraitsTests), + testCase(HashingTests.__allTests__HashingTests), + testCase(NexusTests.__allTests__NexusTests), + testCase(SingleTests.__allTests__SingleTests), + testCase(SparseSetTests.__allTests__SparseSetTests), + testCase(SystemsTests.__allTests__SystemsTests), + ] +} +#endif diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 11f5c55..7889cf4 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -1,6 +1,10 @@ -import FirebladeECSTests import XCTest -XCTMain([ - testCase(FirebladeECSTests.allTests) -]) +import FirebladeECSPerformanceTests +import FirebladeECSTests + +var tests = [XCTestCaseEntry]() +tests += FirebladeECSPerformanceTests.__allTests() +tests += FirebladeECSTests.__allTests() + +XCTMain(tests)