import android.text.SpannableStringBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import fm.pause.stringparty.FlavoredTextBuilder;
import fm.pause.stringparty.parser.Block;
import fm.pause.stringparty.parser.BlockListener;
import fm.pause.stringparty.parser.ParseListener;
import fm.pause.stringparty.parser.Parser;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
@Config(emulateSdk = 18)
public class DanteTest {
@Test public void testRegistersOnParser() throws Exception {
Parser parser = Mockito.mock(Parser.class);
FlavoredTextBuilder builder = new FlavoredTextBuilder(parser);
verify(parser).register(builder);
}
@Test public void testAddsCharactersFromParser() throws Exception {
FlavoredTextBuilder builder = new FlavoredTextBuilder(new MockParser());
assertThat(builder.parse("").toString(), is("abc"));
}
@Test public void testCallsStartOnMatchingListener() throws Exception {
FlavoredTextBuilder builder = new FlavoredTextBuilder(new MockParser());
final BlockListener listener = Mockito.mock(BlockListener.class);
builder.register(listener);
when(listener.match(any(MockBlock.class))).thenReturn(true);
builder.parse("");
verify(listener).start(isA(MockBlock.class), isA(SpannableStringBuilder.class));
}
@Test public void testDoesNotCallStartOnNotMatchingListener() throws Exception {
FlavoredTextBuilder builder = new FlavoredTextBuilder(new MockParser());
final BlockListener listener = Mockito.mock(BlockListener.class);
builder.register(listener);
when(listener.match(any(Block.class))).thenReturn(false);
builder.parse("");
verify(listener, never()).start(any(Block.class), any(SpannableStringBuilder.class));
}
@Test public void testCallsEndOnMatchingListener() throws Exception {
FlavoredTextBuilder builder = new FlavoredTextBuilder(new MockParser());
final BlockListener listener = Mockito.mock(BlockListener.class);
builder.register(listener);
when(listener.match(any(MockBlock.class))).thenReturn(true);
builder.parse("");
verify(listener).end(isA(MockBlock.class), isA(SpannableStringBuilder.class));
}
@Test public void testDoesNotCallEndOnNotMatchingListener() throws Exception {
FlavoredTextBuilder builder = new FlavoredTextBuilder(new MockParser());
final BlockListener listener = Mockito.mock(BlockListener.class);
builder.register(listener);
when(listener.match(any(Block.class))).thenReturn(false);
builder.parse("");
verify(listener, never()).end(any(Block.class), any(SpannableStringBuilder.class));
}
private static class MockParser implements Parser {
private ParseListener listener;
@Override public void parse(String string) {
listener.start(new MockBlock());
listener.characters("abc");
listener.end(new MockBlock());
}
@Override public void register(ParseListener listener) {
this.listener = listener;
}
}
private static class MockBlock implements Block {}
}