package net.minecraftforge.fml.common.registry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Loader;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Created by cpw on 04/07/16.
*/
@RunWith(ForgeTestRunner.class)
public class FreezingTests
{
private static RTest r1;
private static RTest r2;
private static RTest r3;
private static RTest r4;
private static RTest r5;
private static RTest r6;
private static PersistentRegistryManager.GameDataSnapshot ss;
static class RTest extends IForgeRegistryEntry.Impl<RTest> {
public RTest(String name) {
setRegistryName(name);
}
}
public static IForgeRegistry<RTest> registry;
public static ResourceLocation resloc = new ResourceLocation("fmltest:test");
@BeforeClass
public static void setup()
{
Loader.instance();
System.setProperty("fml.queryResult", "confirm");
registry = PersistentRegistryManager.createRegistry(resloc, RTest.class, null, 0, 255, false, null, null, null, null);
PersistentRegistryManager.createRegistry(PersistentRegistryManager.BLOCKS, Block.class, null, 0, 255, false, null, null, null, null);
PersistentRegistryManager.createRegistry(PersistentRegistryManager.ITEMS, Item.class, null, 0, 255, false, null, null, null, null);
r1 = new RTest("test1");
r2 = new RTest("test2");
r3 = new RTest("test3");
r4 = new RTest("test4");
r5 = new RTest("test5");
r6 = new RTest("test6");
ss = new PersistentRegistryManager.GameDataSnapshot();
ss.entries.put(PersistentRegistryManager.BLOCKS, new PersistentRegistryManager.GameDataSnapshot.Entry());
ss.entries.put(PersistentRegistryManager.ITEMS, new PersistentRegistryManager.GameDataSnapshot.Entry());
PersistentRegistryManager.findRegistryByType(RTest.class).register(r1);
PersistentRegistryManager.findRegistryByType(RTest.class).register(r2);
PersistentRegistryManager.findRegistryByType(RTest.class).register(r3);
PersistentRegistryManager.findRegistryByType(RTest.class).register(r4);
ss.entries.put(resloc, new PersistentRegistryManager.GameDataSnapshot.Entry(PersistentRegistryManager.PersistentRegistry.ACTIVE.getRegistry(RTest.class)));
PersistentRegistryManager.PersistentRegistry.ACTIVE.clean();
PersistentRegistryManager.PersistentRegistry.FROZEN.clean();
registry = PersistentRegistryManager.createRegistry(resloc, RTest.class, null, 0, 255, false, null, null, null, null);
PersistentRegistryManager.createRegistry(PersistentRegistryManager.BLOCKS, Block.class, null, 0, 255, false, null, null, null, null);
PersistentRegistryManager.createRegistry(PersistentRegistryManager.ITEMS, Item.class, null, 0, 255, false, null, null, null, null);
}
@Test
public void testFreezeCycle()
{
PersistentRegistryManager.findRegistryByType(RTest.class).register(r6);
PersistentRegistryManager.findRegistryByType(RTest.class).register(r5);
PersistentRegistryManager.findRegistryByType(RTest.class).register(r4);
PersistentRegistryManager.findRegistryByType(RTest.class).register(r3);
FMLControlledNamespacedRegistry<RTest> r = (FMLControlledNamespacedRegistry)PersistentRegistryManager.findRegistry(r3);
int r3id = r.getId(r3);
PersistentRegistryManager.freezeData();
RTest q1 = PersistentRegistryManager.PersistentRegistry.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Frozen object is the same", r3, q1);
q1 = PersistentRegistryManager.PersistentRegistry.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Active object is the same", r3, q1);
PersistentRegistryManager.injectSnapshot(ss, false, false);
assertNotEquals("IDs don't match", r3id, r.getId(r3));
q1 = PersistentRegistryManager.PersistentRegistry.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Frozen object is the same", r3, q1);
q1 = PersistentRegistryManager.PersistentRegistry.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Active object is the same", r3, q1);
PersistentRegistryManager.revertToFrozen();
assertEquals("IDs match", r3id, r.getId(r3));
q1 = PersistentRegistryManager.PersistentRegistry.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Frozen object is the same", r3, q1);
q1 = PersistentRegistryManager.PersistentRegistry.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Active object is the same", r3, q1);
PersistentRegistryManager.injectSnapshot(ss, true, true);
assertNotEquals("IDs don't match", r3id, r.getId(r3));
q1 = PersistentRegistryManager.PersistentRegistry.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Frozen object is the same", r3, q1);
q1 = PersistentRegistryManager.PersistentRegistry.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Active object is the same", r3, q1);
PersistentRegistryManager.revertToFrozen();
assertEquals("IDs match", r3id, r.getId(r3));
q1 = PersistentRegistryManager.PersistentRegistry.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Frozen object is the same", r3, q1);
q1 = PersistentRegistryManager.PersistentRegistry.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3"));
assertEquals("Active object is the same", r3, q1);
}
}