Skip to content

Commit

Permalink
Deep clones BlockData + Change test for BlockData#matches() (#874)
Browse files Browse the repository at this point in the history
* Assert that material is a block material

* Now deep clones block data

---------

Co-authored-by: thelooter <lenakolb2204@gmail.com>
Co-authored-by: thelooter <evekolb2204@gmail.com>
  • Loading branch information
3 people committed Dec 5, 2023
1 parent 3d7841f commit 1c28b83
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class BlockDataMock implements BlockData
private static final String NULL_MATERIAL_EXCEPTION_MESSAGE = "Material cannot be null";

private final @NotNull Material type;
private final @NotNull Map<String, Object> data;
private @NotNull Map<String, Object> data;

/**
* Constructs a new {@link BlockDataMock} for the provided {@link Material}.
Expand Down Expand Up @@ -315,11 +315,13 @@ public boolean equals(Object obj)
{
try
{
return (BlockData) super.clone();
BlockDataMock clonedObject = (BlockDataMock) super.clone();
clonedObject.data = new LinkedHashMap<>(clonedObject.data);
return clonedObject;
}
catch (CloneNotSupportedException e)
{
return BlockDataMock.mock(type);
return BlockDataMock.mock(type, this.data);
}
}

Expand Down Expand Up @@ -354,6 +356,13 @@ public boolean equals(Object obj)
};
}

private static @NotNull BlockDataMock mock(@NotNull Material material, @NotNull Map<String, Object> previousData)
{
BlockDataMock blockDataMock = BlockDataMock.mock(material);
blockDataMock.data.putAll(previousData);
return blockDataMock;
}

/**
* Attempts to construct a BlockDataMock object by matching against Paper MaterialTags. Returns null if the given
* material does not match any supported MaterialSetTag.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,18 @@
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.type.WallSign;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import java.util.LinkedHashMap;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
import static org.junit.jupiter.api.Assertions.assertTrue;

Expand Down Expand Up @@ -75,7 +81,8 @@ void testMatchesNotEquals()
BlockDataMock blockData2 = new BlockDataMock(Material.STONE);
blockData2.set("key", "value");

assertTrue(blockData.matches(blockData2));
assertTrue(blockData2.matches(blockData));
assertFalse(blockData.matches(blockData2));
}

@Test
Expand Down Expand Up @@ -108,5 +115,25 @@ void testCheckTypeBlockTag()
blockData.checkType(block, Tag.PLANKS);
}

@Test
void clone_isClone()
{
WallSign wallSign = (WallSign) BlockDataMock.mock(Material.ACACIA_WALL_SIGN);
wallSign.setFacing(BlockFace.NORTH);
WallSign clone = (WallSign) wallSign.clone();
assertNotSame(wallSign,clone);
assertEquals(wallSign,clone);
assertEquals(wallSign.getFacing(), clone.getFacing());
}

@Test
void clone_isCloneChangeInValue()
{
WallSign wallSign = (WallSign) BlockDataMock.mock(Material.ACACIA_WALL_SIGN);
wallSign.setFacing(BlockFace.EAST);
WallSign clone = (WallSign) wallSign.clone();
clone.setFacing(BlockFace.WEST);
assertNotEquals(wallSign.getFacing(), clone.getFacing());
}

}

0 comments on commit 1c28b83

Please sign in to comment.