Minestom/src/test/java/net/minestom/server/tag/TagUpdateTest.java

219 lines
6.8 KiB
Java

package net.minestom.server.tag;
import net.minestom.server.coordinate.Vec;
import org.junit.jupiter.api.Test;
import static net.minestom.testing.TestUtils.assertEqualsSNBT;
import static org.junit.jupiter.api.Assertions.*;
public class TagUpdateTest {
@Test
public void update() {
var tag = Tag.Integer("coin");
var handler = TagHandler.newHandler();
handler.updateTag(tag, integer -> {
assertNull(integer);
return 5;
});
assertEquals(5, handler.getTag(tag));
handler.updateTag(tag, integer -> {
assertEquals(5, integer);
return 10;
});
assertEquals(10, handler.getTag(tag));
}
@Test
public void updateDefault() {
var tag = Tag.Integer("coin").defaultValue(25);
var handler = TagHandler.newHandler();
handler.updateTag(tag, integer -> {
assertEquals(25, integer);
return 5;
});
assertEquals(5, handler.getTag(tag));
handler.updateTag(tag, integer -> {
assertEquals(5, integer);
return 10;
});
assertEquals(10, handler.getTag(tag));
}
@Test
public void updateRemoval() {
var tag = Tag.Integer("coin");
var handler = TagHandler.newHandler();
handler.setTag(tag, 5);
handler.updateTag(tag, integer -> {
assertEquals(5, integer);
return null;
});
assertNull(handler.getTag(tag));
assertEqualsSNBT("{}", handler.asCompound());
}
@Test
public void updateRemovalPath() {
var tag = Tag.Integer("coin").path("path");
var handler = TagHandler.newHandler();
handler.setTag(tag, 5);
handler.updateTag(tag, integer -> {
assertEquals(5, integer);
return null;
});
assertNull(handler.getTag(tag));
assertEqualsSNBT("{}", handler.asCompound());
}
@Test
public void updateAndGet() {
var tag = Tag.Integer("coin");
var handler = TagHandler.newHandler();
var result = handler.updateAndGetTag(tag, integer -> {
assertNull(integer);
return 5;
});
assertEquals(5, result);
result = handler.updateAndGetTag(tag, integer -> {
assertEquals(5, integer);
return 10;
});
assertEquals(10, result);
}
@Test
public void getAndUpdate() {
var tag = Tag.Integer("coin");
var handler = TagHandler.newHandler();
var result = handler.getAndUpdateTag(tag, integer -> {
assertNull(integer);
return 5;
});
assertNull(result);
result = handler.getAndUpdateTag(tag, integer -> {
assertEquals(5, integer);
return 10;
});
assertEquals(5, result);
}
@Test
public void updateHiddenSimilarity() {
var tag1 = Tag.Integer("coin");
var tag2 = Tag.Integer("coin").map(i -> i + 1, i -> i - 1);
var handler = TagHandler.newHandler();
handler.setTag(tag1, 5);
assertDoesNotThrow(() -> handler.updateTag(tag2, value -> 5));
assertEquals(4, handler.getTag(tag1));
assertEquals(5, handler.getTag(tag2));
}
@Test
public void updateStructureConversion() {
record Test(int coin) {
}
var tag1 = Tag.Integer("coin").path("path");
var tag2 = Tag.Structure("path", Test.class);
var handler = TagHandler.newHandler();
handler.setTag(tag1, 5);
assertEquals(5, handler.getTag(tag1));
assertEquals(new Test(5), handler.getTag(tag2));
assertDoesNotThrow(() -> handler.updateTag(tag2, value -> new Test(value.coin + 1)));
assertEquals(6, handler.getTag(tag1));
assertEquals(new Test(6), handler.getTag(tag2));
handler.updateTag(tag2, value -> null);
assertNull(handler.getTag(tag1));
assertNull(handler.getTag(tag2));
}
@Test
public void updateStructureConversionPath() {
record Test(int coin) {
}
var tag1 = Tag.Integer("coin").path("path", "path2");
var tag2 = Tag.Structure("path2", Test.class).path("path");
var handler = TagHandler.newHandler();
handler.setTag(tag1, 5);
assertEquals(5, handler.getTag(tag1));
assertEquals(new Test(5), handler.getTag(tag2));
assertDoesNotThrow(() -> handler.updateTag(tag2, value -> new Test(value.coin + 1)));
assertEquals(6, handler.getTag(tag1));
assertEquals(new Test(6), handler.getTag(tag2));
handler.updateTag(tag2, value -> null);
assertNull(handler.getTag(tag1));
assertNull(handler.getTag(tag2));
}
@Test
public void updateStructureConversionPathDouble() {
record Test(int coin) {
}
record Structure(Test test) {
}
var tag1 = Tag.Integer("coin").path("path", "test");
var tag2 = Tag.Structure("path", Structure.class);
var handler = TagHandler.newHandler();
handler.setTag(tag1, 5);
assertEquals(5, handler.getTag(tag1));
assertEquals(new Structure(new Test(5)), handler.getTag(tag2));
assertDoesNotThrow(() -> handler.updateTag(tag2, value -> new Structure(new Test(value.test.coin + 1))));
assertEquals(6, handler.getTag(tag1));
assertEquals(new Structure(new Test(6)), handler.getTag(tag2));
handler.updateTag(tag2, value -> null);
assertNull(handler.getTag(tag1));
assertNull(handler.getTag(tag2));
}
@Test
public void updateViewConversion() {
record Test(int coin) {
}
var tag1 = Tag.Integer("coin");
var tag2 = Tag.View(Test.class);
var handler = TagHandler.newHandler();
handler.setTag(tag1, 5);
assertDoesNotThrow(() -> handler.updateTag(tag2, value -> new Test(value.coin + 1)));
assertEquals(6, handler.getTag(tag1));
assertEquals(new Test(6), handler.getTag(tag2));
handler.updateTag(tag2, value -> null);
assertNull(handler.getTag(tag1));
assertNull(handler.getTag(tag2));
}
@Test
public void updateIncompatible() {
var tagI = Tag.Integer("coin");
var tagD = Tag.Double("coin");
var handler = TagHandler.newHandler();
handler.setTag(tagI, 5);
assertThrows(ClassCastException.class, () -> handler.updateTag(tagD, value -> 5d));
}
@Test
public void updateInner() {
var tag = Tag.Structure("vec", Vec.class);
var tagX = Tag.Double("x").path("vec");
var handler = TagHandler.newHandler();
handler.setTag(tag, new Vec(5, 10, 15));
handler.updateTag(tagX, x -> {
assertEquals(5, x);
return 7d;
});
assertEquals(7d, handler.getTag(tagX));
assertEquals(new Vec(7, 10, 15), handler.getTag(tag));
}
}