mirror of https://github.com/Minestom/Minestom.git
219 lines
6.8 KiB
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));
|
|
}
|
|
}
|