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.
This commit is contained in:
Andreas Troelsen 2020-08-22 16:24:39 +02:00
parent 5566d8fd86
commit 2d0aad19d6
2 changed files with 89 additions and 0 deletions

View File

@ -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<ThingPickerParser> 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);
}
}

View File

@ -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);
}
}