package org.mafagafogigante.dungeon.game; import org.mafagafogigante.dungeon.game.LocationPreset.Type; import org.junit.Assert; import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class LocationPresetStoreTest { private LocationPresetStore makeLocalLocationPresetStore() throws Exception { Constructor<LocationPresetStore> constructor = LocationPresetStore.class.getDeclaredConstructor(); constructor.setAccessible(true); // Change the accessibility of constructor for external object creation. LocationPresetStore store = constructor.newInstance(); constructor.setAccessible(false); // Make the constructor no longer accessible. return store; } /** * Adds a LocationPreset to a LocationPresetStore using reflection to access its addLocationPreset private method. */ private void addLocationPreset(LocationPresetStore store, LocationPreset preset) throws Exception { Method method = LocationPresetStore.class.getDeclaredMethod("addLocationPreset", LocationPreset.class); method.setAccessible(true); method.invoke(store, preset); method.setAccessible(false); } /** * This test also validates location preset data to some extent. */ @Test public void testGetDefaultLocationPresetStoreShouldWork() throws Exception { LocationPresetStore.getDefaultLocationPresetStore(); // Triggers initialization of the data. } @Test public void testAddLocationPresetShouldWorkWithDifferentIds() throws Exception { LocationPresetStore locationPresetStore = makeLocalLocationPresetStore(); LocationPreset blueTest = new LocationPreset(new Id("BLUE_TEST"), Type.LAND, NameFactory.newInstance("Blue Test")); addLocationPreset(locationPresetStore, blueTest); LocationPreset redTest = new LocationPreset(new Id("RED_TEST"), Type.LAND, NameFactory.newInstance("Red Test")); addLocationPreset(locationPresetStore, redTest); } @Test public void testAddLocationPresetShouldFailForRepeatedIds() throws Exception { LocationPresetStore locationPresetStore = makeLocalLocationPresetStore(); LocationPreset preset = new LocationPreset(new Id("TEST"), Type.LAND, NameFactory.newInstance("Blue Test")); addLocationPreset(locationPresetStore, preset); try { preset = new LocationPreset(new Id("TEST"), Type.LAND, NameFactory.newInstance("Red Test")); addLocationPreset(locationPresetStore, preset); Assert.fail("expected an IllegalArgumentException"); } catch (InvocationTargetException expected) { if (!(expected.getCause() instanceof IllegalArgumentException)) { Assert.fail("expected an IllegalArgumentException"); } } } }