Fixup some registry tests, dummies are now persisted across syncing.
This commit is contained in:
parent
dee84dc1e4
commit
e805b12df8
8 changed files with 100 additions and 37 deletions
|
@ -199,6 +199,15 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
|
|||
{
|
||||
return getID(this.names.get(name));
|
||||
}
|
||||
private int getIDRaw(V value)
|
||||
{
|
||||
Integer ret = this.ids.inverse().get(value);
|
||||
return ret == null ? -1 : ret.intValue();
|
||||
}
|
||||
private int getIDRaw(ResourceLocation name)
|
||||
{
|
||||
return getIDRaw(this.names.get(name));
|
||||
}
|
||||
|
||||
public V getValue(int id)
|
||||
{
|
||||
|
@ -411,6 +420,8 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
|
|||
if (from.superType != this.superType)
|
||||
throw new IllegalArgumentException("Attempted to copy to incompatible registry: " + name + " " + from.superType + " -> " + this.superType);
|
||||
|
||||
this.isFrozen = false;
|
||||
|
||||
if (this.clear != null)
|
||||
this.clear.onClear(this, stage);
|
||||
|
||||
|
@ -421,14 +432,11 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
|
|||
*/
|
||||
this.aliases.clear();
|
||||
from.aliases.forEach((f, t) -> this.addAlias(f, t));
|
||||
this.dummies.clear();
|
||||
from.dummies.forEach(dummy -> this.addDummy(dummy));
|
||||
|
||||
this.ids.clear();
|
||||
this.names.clear();
|
||||
this.availabilityMap.clear(0, this.availabilityMap.length());
|
||||
this.defaultValue = null;
|
||||
this.isFrozen = false;
|
||||
|
||||
boolean errored = false;
|
||||
|
||||
|
@ -443,6 +451,10 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
|
|||
}
|
||||
}
|
||||
|
||||
//Needs to be below add so that dummies are persisted
|
||||
this.dummies.clear();
|
||||
from.dummies.forEach(dummy -> this.addDummy(dummy));
|
||||
|
||||
if (errored)
|
||||
throw new RuntimeException("One of more entry values did not copy to the correct id. Check log for details!");
|
||||
}
|
||||
|
@ -538,7 +550,7 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
|
|||
{
|
||||
ResourceLocation itemName = entry.getKey();
|
||||
int newId = entry.getValue();
|
||||
int currId = old.getID(itemName);
|
||||
int currId = old.getIDRaw(itemName);
|
||||
|
||||
if (currId == -1)
|
||||
{
|
||||
|
@ -572,9 +584,12 @@ public class ForgeRegistry<V extends IForgeRegistryEntry<V>> implements IForgeRe
|
|||
if (DEBUG)
|
||||
FMLLog.finer("Registry Dummy Add: %s %d -> %s", key, id, dummy);
|
||||
|
||||
//It was blocked before so we need to unset the blocking map
|
||||
this.availabilityMap.clear(id);
|
||||
|
||||
int realId = this.add(id, dummy);
|
||||
if (realId != id)
|
||||
FMLLog.warning("Registered object did not get ID it asked for. Name: {} Type: {} Expected: {} Got: {}", key, dummy.getRegistryType().getName(), id, realId);
|
||||
FMLLog.warning("Registered object did not get ID it asked for. Name: %s Type: %s Expected: %s Got: %s", key, dummy.getRegistryType().getName(), id, realId);
|
||||
this.dummies.add(key);
|
||||
|
||||
return true;
|
||||
|
|
|
@ -325,7 +325,14 @@ public class GameData
|
|||
@Override
|
||||
public Block createDummy(ResourceLocation key)
|
||||
{
|
||||
return new Block(Material.AIR).setUnlocalizedName("air").setRegistryName(key);
|
||||
return new BlockDummyAir().setUnlocalizedName("air").setRegistryName(key);
|
||||
}
|
||||
private static class BlockDummyAir extends Block //A named class so DummyBlockReplacementTest can detect if its a dummy
|
||||
{
|
||||
private BlockDummyAir()
|
||||
{
|
||||
super(Material.AIR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ public class RegistryManager
|
|||
if (!overlappedTypes.isEmpty())
|
||||
{
|
||||
Class<?> foundType = overlappedTypes.iterator().next();
|
||||
FMLLog.severe("Found existing registry of type %1s named %2s, you cannot create a new registry (%3s) with type %4s, as %4s has a parent of that type", foundType, superTypes.get(foundType), name, type);
|
||||
FMLLog.severe("Found existing registry of type %s named %s, you cannot create a new registry (%s) with type %s, as %s has a parent of that type", foundType, superTypes.get(foundType), name, type, type);
|
||||
throw new IllegalArgumentException("Duplicate registry parent type found - you can only have one registry for a particular super type");
|
||||
}
|
||||
ForgeRegistry<V> reg = new ForgeRegistry<V>(type, defaultKey, min, max, create, add, clear, this, allowOverrides, isModifiable, dummyFactory);
|
||||
|
|
|
@ -70,9 +70,9 @@ public class DummyBlockReplacementTest
|
|||
|
||||
fnd = blockRegistry.getValue(myDirt);
|
||||
assertNotEquals("Did not find my block", fnd, testDirtBlock);
|
||||
assertTrue("Found a dummy air block", fnd.getClass().getName().endsWith("BlockDummyAir"));
|
||||
assertTrue("Did not find a dummy air block", fnd.getClass().getName().endsWith("BlockDummyAir"));
|
||||
final Set<ResourceLocation> dummied = RegistryManager.ACTIVE.takeSnapshot(false).get(GameData.BLOCKS).dummied;
|
||||
assertTrue("Found my block in the dummy list", dummied.contains(myDirt));
|
||||
assertTrue("Did not find my block in the dummy list", dummied.contains(myDirt));
|
||||
|
||||
GameData.revertToFrozen();
|
||||
ObjectHolderRegistry.INSTANCE.applyObjectHolders();
|
||||
|
@ -80,6 +80,7 @@ public class DummyBlockReplacementTest
|
|||
assertNotEquals("Did not find my block", fnd, testDirtBlock);
|
||||
assertEquals("Found a default air block", fnd, Blocks.AIR);
|
||||
|
||||
((ForgeRegistry<Block>)RegistryManager.ACTIVE.getRegistry(Block.class)).unfreeze();
|
||||
RegistryManager.ACTIVE.getRegistry(Block.class).register(testDirtBlock.setRegistryName(myDirt));
|
||||
fnd = blockRegistry.getValue(myDirt);
|
||||
assertEquals("Found my block", fnd, testDirtBlock);
|
||||
|
|
|
@ -76,6 +76,7 @@ public class ForgeTestRunner extends Runner
|
|||
{
|
||||
try
|
||||
{
|
||||
System.setProperty("forge.disableVanillaGameData", "false");
|
||||
innerRunnerClass.getMethod("run", RunNotifier.class).invoke(innerRunner, notifier);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
|
@ -43,9 +43,13 @@ public class FreezingTests
|
|||
{
|
||||
setRegistryName(name);
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return this.getRegistryName().toString();
|
||||
}
|
||||
}
|
||||
|
||||
public static IForgeRegistry<RTest> registry;
|
||||
public static ResourceLocation resloc = new ResourceLocation("fmltest:test");
|
||||
|
||||
@BeforeClass
|
||||
|
@ -53,27 +57,33 @@ public class FreezingTests
|
|||
{
|
||||
Loader.instance();
|
||||
System.setProperty("fml.queryResult", "confirm");
|
||||
System.setProperty("fml.doNotBackup", "true");
|
||||
System.setProperty("forge.disableVanillaGameData", "true");
|
||||
registry = new RegistryBuilder<RTest>().setName(resloc).setType(RTest.class).setIDRange(0, 255).create();
|
||||
|
||||
new RegistryBuilder<RTest>().setName(resloc).setType(RTest.class).setIDRange(0, 255).create();
|
||||
new RegistryBuilder<Block>().setName(GameData.BLOCKS).setType(Block.class).setIDRange(0, 255).create();
|
||||
new RegistryBuilder<Item>().setName(GameData.ITEMS).setType(Item.class).setIDRange(0, 255).create();
|
||||
|
||||
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 = Maps.newHashMap();
|
||||
ss.put(GameData.BLOCKS, new ForgeRegistry.Snapshot());
|
||||
ss.put(GameData.ITEMS, new ForgeRegistry.Snapshot());
|
||||
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r1);
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r2);
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r3);
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r4);
|
||||
ss.put(resloc, ((ForgeRegistry<?>)RegistryManager.ACTIVE.getRegistry(RTest.class)).makeSnapshot());
|
||||
|
||||
RegistryManager.ACTIVE.clean();
|
||||
RegistryManager.FROZEN.clean();
|
||||
registry = new RegistryBuilder<RTest>().setName(resloc).setType(RTest.class).setIDRange(0, 255).create();
|
||||
new RegistryBuilder<RTest>().setName(resloc).setType(RTest.class).setIDRange(0, 255).create();
|
||||
new RegistryBuilder<Block>().setName(GameData.BLOCKS).setType(Block.class).setIDRange(0, 255).create();
|
||||
new RegistryBuilder<Item>().setName(GameData.ITEMS).setType(Item.class).setIDRange(0, 255).create();
|
||||
}
|
||||
|
@ -81,30 +91,43 @@ public class FreezingTests
|
|||
@Test
|
||||
public void testFreezeCycle()
|
||||
{
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r6);
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r5);
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r4);
|
||||
RegistryManager.ACTIVE.getRegistry(RTest.class).register(r3);
|
||||
ForgeRegistry<RTest> r = (ForgeRegistry<RTest>)RegistryManager.ACTIVE.getRegistry(r3.getRegistryType());
|
||||
int r3id = r.getID(r3);
|
||||
ResourceLocation name = new ResourceLocation("test3");
|
||||
ForgeRegistry<RTest> active = (ForgeRegistry<RTest>)RegistryManager.ACTIVE.getRegistry(RTest.class);
|
||||
active.register(r6);
|
||||
active.register(r5);
|
||||
active.register(r4);
|
||||
active.register(r3);
|
||||
|
||||
int r3id = active.getID(r3);
|
||||
GameData.freezeData();
|
||||
assertEquals("Frozen object is the same", r3, RegistryManager.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("Active object is the same", r3, RegistryManager.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
GameData.injectSnapshot(ss, false, false);
|
||||
assertNotEquals("IDs don't match", r3id, r.getID(r3));
|
||||
assertEquals("Frozen object is the same", r3, RegistryManager.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("Active object is the same", r3, RegistryManager.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
|
||||
//Frozen data should be the same, as there are no replacement
|
||||
ForgeRegistry<RTest> frozen = (ForgeRegistry<RTest>)RegistryManager.ACTIVE.getRegistry(RTest.class);
|
||||
assertEquals("Frozen object not the same", r3, frozen.getValue(name));
|
||||
assertEquals("Active object not the same", r3, active.getValue(name));
|
||||
|
||||
// r3 is in the snapshot, so the ID SHOULD change to whats in the snapshot.
|
||||
GameData.injectSnapshot(ss, false, true); //Unlike the old system we die on missing mappings for custom registries. So we need to tell it to continue loading as if we're local
|
||||
assertNotEquals("IDs match", r3id, active.getID(r3));
|
||||
assertEquals("Frozen object not the same", r3, frozen.getValue(name));
|
||||
assertEquals("Active object not the same", r3, active.getValue(name));
|
||||
|
||||
// Frozen has the original ID
|
||||
GameData.revertToFrozen();
|
||||
assertEquals("IDs match", r3id, r.getID(r3));
|
||||
assertEquals("Frozen object is the same", r3, RegistryManager.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("Active object is the same", r3, RegistryManager.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("IDs don't match", r3id, active.getID(r3));
|
||||
assertEquals("Frozen object not the same", r3, frozen.getValue(name));
|
||||
assertEquals("Active object not the same", r3, active.getValue(name));
|
||||
|
||||
// Make sure we have snapshot ID again
|
||||
GameData.injectSnapshot(ss, true, true);
|
||||
assertNotEquals("IDs don't match", r3id, r.getID(r3));
|
||||
assertEquals("Frozen object is the same", r3, RegistryManager.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("Active object is the same", r3, RegistryManager.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertNotEquals("IDs match", r3id, active.getID(r3));
|
||||
assertEquals("Frozen object not the same", r3, frozen.getValue(name));
|
||||
assertEquals("Active object not the same", r3, active.getValue(name));
|
||||
|
||||
//And back to the frozen ID
|
||||
GameData.revertToFrozen();
|
||||
assertEquals("IDs match", r3id, r.getID(r3));
|
||||
assertEquals("Frozen object is the same", r3, RegistryManager.FROZEN.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("Active object is the same", r3, RegistryManager.ACTIVE.getRegistry(RTest.class).getValue(new ResourceLocation("test3")));
|
||||
assertEquals("IDs don't match", r3id, active.getID(r3));
|
||||
assertEquals("Frozen object not the same", r3, frozen.getValue(name));
|
||||
assertEquals("Active object not the same", r3, active.getValue(name));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,11 +86,11 @@ public class ItemBlockSubstitutionRemoveRestoreTest
|
|||
snapshot.get(GameData.ITEMS).substitutions.clear();
|
||||
GameData.injectSnapshot(snapshot, false, false);
|
||||
ObjectHolderRegistry.INSTANCE.applyObjectHolders();
|
||||
*/
|
||||
|
||||
dirtitem = (ItemBlock) itemRegistry.getValue(myDirt);
|
||||
assertEquals("ItemBlock points at vanilla block", originalDirt, dirtitem);
|
||||
assertNotEquals("ItemBlock points at my block", myDirtInstance, dirtitem);
|
||||
*/
|
||||
|
||||
// TEST 3: Does the substitute get restored when reverting to frozen state? The substitute should be found in the registry again
|
||||
GameData.revertToFrozen();
|
||||
|
|
|
@ -18,6 +18,8 @@ import org.junit.runner.RunWith;
|
|||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
/**
|
||||
* Vanilla registry tests
|
||||
*/
|
||||
|
@ -42,7 +44,7 @@ public class VanillaRegistryTests
|
|||
|
||||
// Our lookups find the same stuff vanilla sees
|
||||
final IForgeRegistry<Block> blocks = RegistryManager.ACTIVE.getRegistry(Block.class);
|
||||
assertEquals("We have the right blocks for a block", blocks, Block.REGISTRY);
|
||||
assertEquals("We have a different block registry then vanilla", blocks, getDelegate(Block.REGISTRY));
|
||||
|
||||
// We can look up stuff through our APIs
|
||||
Block bl = blocks.getValue(new ResourceLocation("minecraft:air"));
|
||||
|
@ -54,7 +56,7 @@ public class VanillaRegistryTests
|
|||
|
||||
// Our lookups find the same stuff vanilla sees
|
||||
final IForgeRegistry<Item> items = RegistryManager.ACTIVE.getRegistry(Item.class);
|
||||
assertEquals("We have the right items for an item", items, Item.REGISTRY);
|
||||
assertEquals("We have a different item registry then vanilla", items, getDelegate(Item.REGISTRY));
|
||||
|
||||
// We can look up stuff through our APIs
|
||||
Item it = items.getValue(new ResourceLocation("minecraft:bed"));
|
||||
|
@ -65,6 +67,20 @@ public class VanillaRegistryTests
|
|||
assertEquals("We got nothing (items) when we asked for cheese", null, none);
|
||||
}
|
||||
|
||||
private Object getDelegate(Object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
Field f = obj.getClass().getDeclaredField("delegate");
|
||||
f.setAccessible(true);
|
||||
return f.get(obj);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegistration()
|
||||
{
|
||||
|
@ -74,7 +90,7 @@ public class VanillaRegistryTests
|
|||
assertNotNull("Registered my block", myBlock);
|
||||
|
||||
// Our lookups find the same stuff vanilla sees
|
||||
assertEquals("We have the right blocks for a block", blocks, Block.REGISTRY);
|
||||
assertEquals("We have a different block registry then vanilla", blocks, getDelegate(Block.REGISTRY));
|
||||
|
||||
Block found = blocks.getValue(new ResourceLocation("minecraft:testy"));
|
||||
assertEquals("Registry lookup works", myBlock, found);
|
||||
|
|
Loading…
Reference in a new issue