diff --git a/app/src/androidTest/java/org/bspeice/minimalbible/test/format/osisparser/OsisParserTest.java b/app/src/androidTest/java/org/bspeice/minimalbible/test/format/osisparser/OsisParserTest.java new file mode 100644 index 0000000..d96d5e5 --- /dev/null +++ b/app/src/androidTest/java/org/bspeice/minimalbible/test/format/osisparser/OsisParserTest.java @@ -0,0 +1,51 @@ +package org.bspeice.minimalbible.test.format.osisparser; + +import android.annotation.SuppressLint; + +import org.bspeice.minimalbible.MBTestCase; +import org.bspeice.minimalbible.service.format.osisparser.OsisParser; +import org.crosswire.jsword.book.OSISUtil; +import org.xml.sax.Attributes; + +import static org.mockito.Mockito.mock; + +/** + * State machine testing, oh boy! + */ +public class OsisParserTest extends MBTestCase { + + OsisParser parser; + + public void setUp() { + parser = new OsisParser(null); + } + + @SuppressLint("NewApi") + public void testDoWriteEnabledVerse() { + Attributes attributes = mock(Attributes.class); + parser.startElement("", OSISUtil.OSIS_ELEMENT_VERSE, "", attributes); + assertTrue(parser.getDoWrite().peek()); + } + + @SuppressLint("NewApi") + private void parserAssert(OsisParser parser, String element) { + Attributes attributes = mock(Attributes.class); + parser.startElement("", element, "", attributes); + assertFalse(parser.getDoWrite().isEmpty()); + parser.getDoWrite().pop(); + } + + public void testDoWriteAlwaysAdded() { + parserAssert(parser, OSISUtil.OSIS_ELEMENT_VERSE); + parserAssert(parser, ""); + parserAssert(parser, "random string"); + parserAssert(parser, OSISUtil.OSIS_ELEMENT_CELL); + } + + @SuppressLint("NewApi") + public void testEndElementPopsQueue() { + parser.getDoWrite().add(true); + parser.endElement("", "", ""); + assertTrue(parser.getDoWrite().isEmpty()); + } +} diff --git a/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/OsisParser.kt b/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/OsisParser.kt index 0155074..da82cff 100644 --- a/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/OsisParser.kt +++ b/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/OsisParser.kt @@ -10,30 +10,29 @@ import org.crosswire.jsword.book.OSISUtil * Created by bspeice on 9/10/14. */ -class OsisParser(v: Verse) : DefaultHandler() { +class OsisParser(v: Verse?) : DefaultHandler() { - val verseContent = VerseContent(v) + val verseContent: VerseContent? = when (v) { + is Verse -> VerseContent(v) // not null + else -> null + } + // TODO: Implement a stack to keep min API 8 val doWrite = ArrayDeque() - // Android Studio complains about compilation, but the method - // has @NotNull annotations, so we program for those. override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) { when (localName) { OSISUtil.OSIS_ELEMENT_VERSE -> doWrite.push(true) - else -> { - doWrite.push(false) - } + else -> doWrite.push(false) } } - // Android Studio complains about compilation, but the method - // has @NotNull annotations, so we program for those. - override fun endElement(uri: String?, localName: String, qName: String) { + override fun endElement(uri: String, localName: String, qName: String) { doWrite.pop() } - override fun characters(ch: CharArray?, start: Int, length: Int) { + + override fun characters(ch: CharArray, start: Int, length: Int) { if (doWrite.peek()) - verseContent.appendContent(String(ch as CharArray)) + verseContent?.appendContent(String(ch)) } } \ No newline at end of file diff --git a/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/VerseReference.kt b/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/VerseReference.kt index d9250f4..e6fdc0e 100644 --- a/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/VerseReference.kt +++ b/app/src/main/kotlin/org/bspeice/minimalbible/service/format/osisparser/VerseReference.kt @@ -6,7 +6,4 @@ import org.crosswire.jsword.passage.Verse * Created by bspeice on 9/9/14. */ -class VerseReference(verse: Verse, index: Int) { - val verse: Verse = verse - val index: Int = index -} +class VerseReference(val verse: Verse, val index: Int) {}