summaryrefslogtreecommitdiff
path: root/composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-10-23 21:59:37 -0700
committerElizabeth Hunt <me@liz.coffee>2025-10-24 20:00:58 -0700
commit64f825465de9fa30c4dfe2707067efdb96110db8 (patch)
tree5241385e316e2f4ceede5018603103d71be75202 /composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt
downloadabstraction-engine-kt-64f825465de9fa30c4dfe2707067efdb96110db8.tar.gz
abstraction-engine-kt-64f825465de9fa30c4dfe2707067efdb96110db8.zip
Init
Diffstat (limited to 'composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt')
-rw-r--r--composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt116
1 files changed, 116 insertions, 0 deletions
diff --git a/composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt b/composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt
new file mode 100644
index 0000000..e807bd2
--- /dev/null
+++ b/composeApp/src/commonTest/kotlin/coffee/liz/ecs/EntityTest.kt
@@ -0,0 +1,116 @@
+package coffee.liz.ecs
+
+import kotlin.test.*
+
+// Test components
+data class Position(val x: Float, val y: Float) : Component
+data class Velocity(val dx: Float, val dy: Float) : Component
+data class Health(val value: Int) : Component
+
+class EntityTest {
+
+ @Test
+ fun `entity has unique id`() {
+ val entity1 = Entity(1)
+ val entity2 = Entity(2)
+
+ assertNotEquals(entity1.id, entity2.id)
+ }
+
+ @Test
+ fun `can add component to entity`() {
+ val entity = Entity(0)
+ val position = Position(10f, 20f)
+
+ entity.add(position)
+
+ assertTrue(entity.has<Position>())
+ assertEquals(position, entity.get<Position>())
+ }
+
+ @Test
+ fun `can remove component from entity`() {
+ val entity = Entity(0)
+ entity.add(Position(10f, 20f))
+
+ entity.remove<Position>()
+
+ assertFalse(entity.has<Position>())
+ assertNull(entity.get<Position>())
+ }
+
+ @Test
+ fun `add returns entity for chaining`() {
+ val entity = Entity(0)
+
+ val result = entity
+ .add(Position(10f, 20f))
+ .add(Velocity(1f, 2f))
+
+ assertSame(entity, result)
+ assertTrue(entity.has<Position>())
+ assertTrue(entity.has<Velocity>())
+ }
+
+ @Test
+ fun `can replace component by adding same type`() {
+ val entity = Entity(0)
+ entity.add(Position(10f, 20f))
+ entity.add(Position(30f, 40f))
+
+ val position = entity.get<Position>()
+
+ assertNotNull(position)
+ assertEquals(30f, position.x)
+ assertEquals(40f, position.y)
+ }
+
+ @Test
+ fun `hasAll returns true when entity has all components`() {
+ val entity = Entity(0)
+ entity.add(Position(10f, 20f))
+ entity.add(Velocity(1f, 2f))
+
+ assertTrue(entity.hasAll(Position::class, Velocity::class))
+ }
+
+ @Test
+ fun `hasAll returns false when entity missing component`() {
+ val entity = Entity(0)
+ entity.add(Position(10f, 20f))
+
+ assertFalse(entity.hasAll(Position::class, Velocity::class))
+ }
+
+ @Test
+ fun `componentTypes returns all component types`() {
+ val entity = Entity(0)
+ entity.add(Position(10f, 20f))
+ entity.add(Velocity(1f, 2f))
+ entity.add(Health(100))
+
+ val types = entity.componentTypes()
+
+ assertEquals(3, types.size)
+ assertTrue(types.contains(Position::class))
+ assertTrue(types.contains(Velocity::class))
+ assertTrue(types.contains(Health::class))
+ }
+
+ @Test
+ fun `entities with same id are equal`() {
+ val entity1 = Entity(1)
+ val entity2 = Entity(1)
+
+ assertEquals(entity1, entity2)
+ assertEquals(entity1.hashCode(), entity2.hashCode())
+ }
+
+ @Test
+ fun `entities with different id are not equal`() {
+ val entity1 = Entity(1)
+ val entity2 = Entity(2)
+
+ assertNotEquals(entity1, entity2)
+ }
+}