diff --git a/src/main/java/com/garbagemule/MobArena/things/ThingPickerManager.java b/src/main/java/com/garbagemule/MobArena/things/ThingPickerManager.java new file mode 100644 index 0000000..21bb108 --- /dev/null +++ b/src/main/java/com/garbagemule/MobArena/things/ThingPickerManager.java @@ -0,0 +1,32 @@ +package com.garbagemule.MobArena.things; + +import java.util.ArrayList; +import java.util.List; + +public class ThingPickerManager implements ThingPickerParser { + + private final List parsers; + private final ThingParser things; + + public ThingPickerManager(ThingParser things) { + this.parsers = new ArrayList<>(); + this.things = things; + } + + public void register(ThingPickerParser parser) { + parsers.add(parser); + } + + @Override + public ThingPicker parse(String s) { + for (ThingPickerParser parser : parsers) { + ThingPicker picker = parser.parse(s); + if (picker != null) { + return picker; + } + } + Thing thing = things.parse(s); + return new SingleThingPicker(thing); + } + +} diff --git a/src/test/java/com/garbagemule/MobArena/things/ThingPickerManagerTest.java b/src/test/java/com/garbagemule/MobArena/things/ThingPickerManagerTest.java new file mode 100644 index 0000000..099f515 --- /dev/null +++ b/src/test/java/com/garbagemule/MobArena/things/ThingPickerManagerTest.java @@ -0,0 +1,57 @@ +package com.garbagemule.MobArena.things; + +import org.junit.Before; +import org.junit.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class ThingPickerManagerTest { + + private ThingPickerManager subject; + private ThingParser things; + + @Before + public void setup() { + things = mock(ThingParser.class); + subject = new ThingPickerManager(things); + } + + @Test + public void invokesParsersUntilOneReturnsNonNull() { + String input = "all(a, b, c)"; + ThingPickerParser first = mock(ThingPickerParser.class); + ThingPickerParser second = mock(ThingPickerParser.class); + ThingPickerParser third = mock(ThingPickerParser.class); + ThingPicker picker = mock(ThingPicker.class); + when(first.parse(input)).thenReturn(null); + when(second.parse(input)).thenReturn(picker); + subject.register(first); + subject.register(second); + subject.register(third); + + subject.parse(input); + + verify(third, never()).parse(input); + verify(things, never()).parse(input); + } + + @Test + public void invokesThingParserIfNothingElseWorks() { + String input = "random(a, b, c)"; + ThingPickerParser first = mock(ThingPickerParser.class); + ThingPickerParser second = mock(ThingPickerParser.class); + when(first.parse(input)).thenReturn(null); + when(second.parse(input)).thenReturn(null); + subject.register(first); + subject.register(second); + + subject.parse(input); + + verify(things, times(1)).parse(input); + } + +}