diff --git a/Sources/FirebladeECS/FSM.swift b/Sources/FirebladeECS/FSM.swift index d37fa41..6167a84 100644 --- a/Sources/FirebladeECS/FSM.swift +++ b/Sources/FirebladeECS/FSM.swift @@ -354,7 +354,7 @@ public class EntityStateMachine { toAdd = newState.providers } - for (_, provider) in toAdd { + for (_, provider) in toAdd { entity.assign(provider.getComponent()) } currentState = newState diff --git a/Tests/FirebladeECSTests/FSMTests.swift b/Tests/FirebladeECSTests/FSMTests.swift index 1d3cc86..f7dc428 100644 --- a/Tests/FirebladeECSTests/FSMTests.swift +++ b/Tests/FirebladeECSTests/FSMTests.swift @@ -413,6 +413,27 @@ class EntityStateMachineTests: XCTestCase { XCTAssertTrue(entity.get(component: MockComponent.self) === component1) XCTAssertTrue(entity.get(component: MockComponent2.self) === component2) } + + func testGetsDeinitedWhileBeingStronglyReferencedByComponentAssignedToEntity() { + class Marker: Component { + let fsm: EntityStateMachine + init(fsm: EntityStateMachine) { + self.fsm = fsm + } + } + + let nexus = Nexus() + var entity = nexus.createEntity() + var markerComponent = Marker(fsm: EntityStateMachine(entity: entity)) + entity.assign(markerComponent) + weak var weakMarker = markerComponent + weak var weakFsm = markerComponent.fsm + nexus.destroy(entity: entity) + entity = nexus.createEntity() + markerComponent = .init(fsm: .init(entity: entity)) + XCTAssertNil(weakMarker) + XCTAssertNil(weakFsm) + } class MockComponent: ComponentInitializable { let value: Int