aboutsummaryrefslogtreecommitdiff
path: root/core/src/test/java/coffee/liz/ecs/model/EntityTest.java
blob: c9ce59a87843520fb94e9d484e70893d805c5e88 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package coffee.liz.ecs.model;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import lombok.RequiredArgsConstructor;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;

final class EntityTest {
	@ParameterizedTest
	@MethodSource("componentCombinationProvider")
	public void hasAllReportsPresenceForComponentSets(final Collection<Class<? extends Component>> query,
			final boolean expected) {
		final Entity entity = Entity.builder().id(7).build();
		entity.add(new AlphaComponent("first"));
		entity.add(new BetaComponent(3));
		entity.add(new GammaKeyedComponent());

		assertEquals(expected, entity.hasAll(query));
	}

	private static Stream<Arguments> componentCombinationProvider() {
		return Stream
				.of(Arguments.of(List.of(AlphaComponent.class), true), Arguments.of(List.of(BetaComponent.class), true),
						Arguments.of(List.of(AlphaComponent.class, BetaComponent.class, GammaComponent.class), true),
						Arguments.of(List.of(AlphaComponent.class, BetaComponent.class, GammaKeyedComponent.class),
								false),
						Arguments.of(List.of(GammaComponent.class), true),
						Arguments.of(List.of(GammaKeyedComponent.class), false));
	}

	@Test
	public void getThrowsForMissingComponentsWithHelpfulMessage() {
		final Entity entity = Entity.builder().id(99).build();

		final IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
				() -> entity.get(AlphaComponent.class));

		assertTrue(thrown.getMessage().contains("AlphaComponent"));
		assertTrue(thrown.getMessage().contains("99"));
	}

	@Test
	public void addReplacesExistingComponentInstance() {
		final Entity entity = Entity.builder().id(17).build();
		final AlphaComponent initial = new AlphaComponent("initial");
		entity.add(initial);

		final AlphaComponent replacement = new AlphaComponent("replacement");
		entity.add(replacement);

		assertSame(replacement, entity.get(AlphaComponent.class));
	}

	@Test
	public void removeClearsComponentPresence() {
		final Entity entity = Entity.builder().id(45).build();
		entity.add(new BetaComponent(2));
		assertTrue(entity.has(BetaComponent.class));

		entity.remove(BetaComponent.class);

		assertFalse(entity.has(BetaComponent.class));
		assertTrue(entity.componentTypes().isEmpty());
	}

	private record AlphaComponent(String name) implements Component {
	}

	private record BetaComponent(int level) implements Component {
	}

	@RequiredArgsConstructor
	private class GammaComponent implements Component {
		@Override
		public Class<? extends Component> getKey() {
			return GammaComponent.class;
		}
	}

	private class GammaKeyedComponent extends GammaComponent {
	}

	private record ContextualComponent(int ownerId) implements Component {
	}
}