From 2d0aad19d61c43cd6f28f42762fcc034ea3aefad Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Sat, 22 Aug 2020 16:24:39 +0200 Subject: [PATCH] Add ThingPickerManager. This little nugget is what we will wire up in the main plugin class once we're ready to introduce it to the code base for real. Its purpose is similar to that of the ThingManager, in that it _is_ a parser and can be passed around wherever a parser is needed, but it also is the main entry point for anything that is ThingPickerParser instances. --- .../MobArena/things/ThingPickerManager.java | 32 +++++++++++ .../things/ThingPickerManagerTest.java | 57 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/com/garbagemule/MobArena/things/ThingPickerManager.java create mode 100644 src/test/java/com/garbagemule/MobArena/things/ThingPickerManagerTest.java 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); + } + +}