-
Notifications
You must be signed in to change notification settings - Fork 755
/
MaterialStatsManagerTest.java
146 lines (115 loc) · 6.38 KB
/
MaterialStatsManagerTest.java
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package slimeknights.tconstruct.library.materials.stats;
import org.assertj.core.data.Offset;
import org.junit.jupiter.api.Test;
import slimeknights.mantle.data.listener.MergingJsonFileLoader;
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.library.materials.definition.MaterialId;
import slimeknights.tconstruct.test.BaseMcTest;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
class MaterialStatsManagerTest extends BaseMcTest {
private static final MaterialStatsId STATS_ID_SIMPLE = new MaterialStatsId("test", "stat");
private static final MaterialStatType<ComplexTestStats> STATS_TYPE_SIMPLE = ComplexTestStats.makeType(STATS_ID_SIMPLE);
private static final MaterialStatsId STATS_ID_DONT_CARE = new MaterialStatsId("dont", "care");
private final MaterialStatsManager materialStatsManager = new MaterialStatsManager(() -> {});
private final MergingJsonFileLoader<?> fileLoader = new MergingJsonFileLoader<>(materialStatsManager);
@Test
void testLoadFile_statsExist() {
materialStatsManager.registerStatType(STATS_TYPE_SIMPLE);
MaterialId material = new MaterialId(TConstruct.getResource("teststat"));
fileLoader.loadAndParseFiles(null, material);
Optional<IMaterialStats> optionalStats = materialStatsManager.getStats(material, STATS_ID_SIMPLE);
assertThat(optionalStats).isPresent();
}
@Test
void testLoadFile_complexStats() {
materialStatsManager.registerStatType(STATS_TYPE_SIMPLE);
MaterialId material = new MaterialId(TConstruct.getResource("teststat"));
fileLoader.loadAndParseFiles(null, material);
Optional<ComplexTestStats> optionalStats = materialStatsManager.getStats(material, STATS_ID_SIMPLE);
assertThat(optionalStats).isPresent();
ComplexTestStats stats = optionalStats.get();
assertThat(stats.num()).isEqualTo(123);
assertThat(stats.floating()).isEqualTo(12.34f);
assertThat(stats.text()).isEqualTo("why would you ever do this for stats");
}
@Test
void testLoadFile_multipleStatsInOneFile() {
MaterialId material = new MaterialId(TConstruct.getResource("multiple"));
MaterialStatsId statId1 = new MaterialStatsId("test", "stat1");
materialStatsManager.registerStatType(ComplexTestStats.makeType(statId1, 1, 1f, "one"));
MaterialStatsId statId2 = new MaterialStatsId("test", "stat2");
materialStatsManager.registerStatType(ComplexTestStats.makeType(statId2, 2, 2f, "two"));
fileLoader.loadAndParseFiles(null, material);
assertThat(materialStatsManager.getStats(material, statId1)).isPresent();
assertThat(materialStatsManager.getStats(material, statId2)).isPresent();
}
@Test
void testLoadFileWithEmptyStats_ok() {
MaterialId material = new MaterialId(TConstruct.getResource("empty"));
fileLoader.loadAndParseFiles(null, material);
// ensure that we get this far and that querying the missing material causes no errors
Optional<ComplexTestStats> optionalStats = materialStatsManager.getStats(material, STATS_ID_DONT_CARE);
assertThat(optionalStats).isEmpty();
}
@Test
void testLoadFileWithoutStats_ok() {
MaterialId material = new MaterialId(TConstruct.getResource("missing_stats"));
fileLoader.loadAndParseFiles(null, material);
// ensure that we get this far and that querying the missing material causes no errors
Optional<ComplexTestStats> optionalStats = materialStatsManager.getStats(material, STATS_ID_DONT_CARE);
assertThat(optionalStats).isEmpty();
}
@Test
void testLoadMultipleFiles_addDifferentStatsToSameMaterial() {
MaterialStatsId otherStatId = new MaterialStatsId("test", "otherstat");
materialStatsManager.registerStatType(STATS_TYPE_SIMPLE);
materialStatsManager.registerStatType(ComplexTestStats.makeType(otherStatId, 5, 8, "other"));
MaterialId material = new MaterialId(TConstruct.getResource("teststat"));
fileLoader.loadAndParseFiles("extrastats", material);
assertThat(materialStatsManager.getStats(material, STATS_ID_SIMPLE)).isNotEmpty();
assertThat(materialStatsManager.getStats(material, otherStatId)).isNotEmpty();
}
// Tests the behaviour when multiple mods try to add the same material
// the top data pack should override lower ones, meaning the duplicate stats are kept
@Test
void testLoadMultipleFiles_addSameStatsFromDifferentSources_useFirst() {
materialStatsManager.registerStatType(STATS_TYPE_SIMPLE);
MaterialId material = new MaterialId(TConstruct.getResource("teststat"));
fileLoader.loadAndParseFiles("duplicate", material);
Optional<ComplexTestStats> stats = materialStatsManager.getStats(material, STATS_ID_SIMPLE);
assertThat(stats).isNotEmpty();
// ensure loadable context set the stat type
assertThat(stats.get().getType()).isEqualTo(STATS_TYPE_SIMPLE);
// top pack value replaces the bottom one
assertThat(stats.get().num()).isEqualTo(321);
// top pack unspecified value defaults to the bottom one
assertThat(stats.get().floating()).isCloseTo(12.34f, Offset.strictOffset(0.01f));
}
@Test
void loadMissingFile_ignored() {
MaterialId material = new MaterialId(TConstruct.getResource("nonexistant"));
fileLoader.loadAndParseFiles(null);
// ensure that we get this far and that querying the missing material causes no errors
Optional<ComplexTestStats> optionalStats = materialStatsManager.getStats(material, STATS_ID_DONT_CARE);
assertThat(optionalStats).isEmpty();
}
@Test
void loadFileWithOnlyUnregisteredStats_doNothing() {
MaterialId material = new MaterialId(TConstruct.getResource("invalid"));
fileLoader.loadAndParseFiles(null, material);
Optional<ComplexTestStats> optionalStats = materialStatsManager.getStats(material, new MaterialStatsId("test", "fails"));
assertThat(optionalStats).isEmpty();
}
@Test
void testLoadFile_removeStatOverride() {
MaterialId material = new MaterialId(TConstruct.getResource("multiple"));
MaterialStatsId statId1 = new MaterialStatsId("test", "stat1");
materialStatsManager.registerStatType(ComplexTestStats.makeType(statId1, 1, 1f, "one"));
MaterialStatsId statId2 = new MaterialStatsId("test", "stat2");
materialStatsManager.registerStatType(ComplexTestStats.makeType(statId2, 2, 2f, "two"));
fileLoader.loadAndParseFiles("remove", material);
assertThat(materialStatsManager.getStats(material, statId1)).isPresent();
assertThat(materialStatsManager.getStats(material, statId2)).isNotPresent();
}
}