aboutsummaryrefslogtreecommitdiff
path: root/core/src/test/java/coffee/liz/ecs/model/EntityTest.java
blob: a8fd1e34c09432e4e1067ea8d2f9f42c54b1ea54 (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 {
    }
}