package nova.microblock.test; import nova.core.block.Block; import nova.core.util.math.Vector3DUtil; import nova.core.util.shape.Cuboid; import nova.microblock.NovaMicroblock; import nova.microblock.common.BlockContainer; import nova.microblock.micro.Microblock; import nova.microblock.micro.MicroblockContainer; import nova.microblock.multi.MultiblockContainer; import nova.microblock.operation.ContainerPlace; import nova.testutils.FakeWorld; import nova.wrappertests.NovaLauncherTestFactory; import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; /** * @author Calclavia */ public class MicroblockTest { @Before public void setUp() throws Exception { new NovaLauncherTestFactory(NovaMicroblock.class, TestMicroblockMod.class).createLauncher(); } @Test public void testVectorToID() { MicroblockContainer microblockContainer = new MicroblockContainer(null); new Cuboid(Vector3D.ZERO, Vector3DUtil.ONE.scalarMultiply(microblockContainer.subdivision)).forEach(pos -> { int id = microblockContainer.posToID(pos); assertThat(microblockContainer.idToPos(id)).isEqualTo(pos); }); } @Test public void testMicroblockInjection() { //Microblock should be replaced withPriority a container. assertThat(TestMicroblockMod.singleMicroblock.build() instanceof BlockContainer).isTrue(); NovaMicroblock.MicroblockInjectFactory injectionFactory = (NovaMicroblock.MicroblockInjectFactory) TestMicroblockMod.singleMicroblock; assertThat(injectionFactory.containedFactory.getID()).isEqualTo(TestMicroblockMod.singleMicroblockID); } @Test public void testMicroblockPlacement() { /** * Microblock placement */ FakeWorld fakeWorld = new FakeWorld(); Vector3D testPosition = new Vector3D(5, 5, 5); NovaMicroblock.MicroblockInjectFactory injectionFactory = (NovaMicroblock.MicroblockInjectFactory) TestMicroblockMod.singleMicroblock; ContainerPlace microblockPlace = new ContainerPlace(fakeWorld, injectionFactory, testPosition, new Block.PlaceEvent(null, null, null, null)); assertThat(microblockPlace.operate()).isTrue(); Block block = fakeWorld.getBlock(testPosition).get(); assertThat(block.getID()).contains(TestMicroblockMod.containerID); assertThat(block.components.has(MicroblockContainer.class)).isTrue(); MicroblockContainer microblockContainer = block.components.get(MicroblockContainer.class); Assertions.assertThat(microblockContainer.get(new Vector3D(0, 0, 0)).get().block.getID()).isEqualTo(TestMicroblockMod.singleMicroblockID); } @Test public void testMultiblockPlacement() { /** * Microblock placement */ FakeWorld fakeWorld = new FakeWorld(); Vector3D testPosition = new Vector3D(5, 5, 5); NovaMicroblock.MicroblockInjectFactory injectionFactory = (NovaMicroblock.MicroblockInjectFactory) TestMicroblockMod.singleMultiblock; ContainerPlace microblockPlace = new ContainerPlace(fakeWorld, injectionFactory, testPosition); assertThat(microblockPlace.operate()).isTrue(); Block blockA = fakeWorld.getBlock(testPosition).get(); Block blockB = fakeWorld.getBlock(testPosition.add(Vector3D.PLUS_J)).get(); Block[] multiblocks = { blockA, blockB }; Arrays.stream(multiblocks) .forEach(block -> { assertThat(block.getID()).contains(TestMicroblockMod.containerID); assertThat(block.components.has(MultiblockContainer.class)).isTrue(); MultiblockContainer container = blockA.components.get(MultiblockContainer.class); assertThat(container.containedBlock.getID()).isEqualTo(TestMicroblockMod.singleMultiblockID); assertThat(Arrays.stream(multiblocks).allMatch(blockMatch -> blockMatch.components.get(MultiblockContainer.class).containedBlock == container.containedBlock)).isTrue(); } ); } @Test public void testMultiMicroblock1() { /** * Microblock placement */ FakeWorld fakeWorld = new FakeWorld(); Vector3D testPosition = new Vector3D(5, 5, 5); NovaMicroblock.MicroblockInjectFactory injectionFactory = (NovaMicroblock.MicroblockInjectFactory) TestMicroblockMod.multiMicroblock1; ContainerPlace microblockPlace = new ContainerPlace(fakeWorld, injectionFactory, testPosition, new Block.PlaceEvent(null, null, null, null)); assertThat(microblockPlace.operate()).isTrue(); Block blockA = fakeWorld.getBlock(testPosition).get(); Block blockB = fakeWorld.getBlock(testPosition.add(Vector3D.PLUS_J)).get(); Block[] multiblocks = { blockA, blockB }; //Check containers Arrays.stream(multiblocks) .forEach(block -> { assertThat(block.getID()).contains(TestMicroblockMod.containerID); assertThat(block.components.has(MicroblockContainer.class)).isTrue(); } ); //Check bottom part MicroblockContainer microblockContainerA = blockA.components.get(MicroblockContainer.class); int sub = microblockContainerA.subdivision; assertThat(microblockContainerA.map().size()).isEqualTo(sub * sub * sub); Microblock sampleA = microblockContainerA.get(new Vector3D(0, 0, 0)).get(); new Cuboid(Vector3D.ZERO, Vector3DUtil.ONE.scalarMultiply(sub)).forEach(pos -> assertThat(microblockContainerA.get(pos)).contains(sampleA)); //Check top part MicroblockContainer microblockContainerB = blockB.components.get(MicroblockContainer.class); Microblock sampleB = microblockContainerB.get(new Vector3D(0, 0, 0)).get(); assertThat(microblockContainerB.map().size()).isEqualTo(sub * sub / 2 * sub); new Cuboid(Vector3D.ZERO, new Vector3D(sub, sub / 2, sub)).forEach(pos -> assertThat(microblockContainerB.get(pos)).contains(sampleB)); new Cuboid(new Vector3D(sub, sub / 2, sub), Vector3DUtil.ONE.scalarMultiply(sub)).forEach(pos -> assertThat(microblockContainerB.get(pos)).isEmpty()); } }