Add some tests to the OsisParser

Testing state machines can be difficult if it's not black box...
This commit is contained in:
Bradlee Speice 2014-11-11 00:33:51 -05:00
parent 6a45d872f8
commit c57babd68a
3 changed files with 63 additions and 16 deletions

View File

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

View File

@ -10,30 +10,29 @@ import org.crosswire.jsword.book.OSISUtil
* Created by bspeice on 9/10/14. * 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<Boolean>() val doWrite = ArrayDeque<Boolean>()
// Android Studio complains about compilation, but the method
// has @NotNull annotations, so we program for those.
override fun startElement(uri: String, localName: String, override fun startElement(uri: String, localName: String,
qName: String, attributes: Attributes) { qName: String, attributes: Attributes) {
when (localName) { when (localName) {
OSISUtil.OSIS_ELEMENT_VERSE -> doWrite.push(true) OSISUtil.OSIS_ELEMENT_VERSE -> doWrite.push(true)
else -> { else -> doWrite.push(false)
doWrite.push(false)
}
} }
} }
// Android Studio complains about compilation, but the method override fun endElement(uri: String, localName: String, qName: String) {
// has @NotNull annotations, so we program for those.
override fun endElement(uri: String?, localName: String, qName: String) {
doWrite.pop() doWrite.pop()
} }
override fun characters(ch: CharArray?, start: Int, length: Int) {
override fun characters(ch: CharArray, start: Int, length: Int) {
if (doWrite.peek()) if (doWrite.peek())
verseContent.appendContent(String(ch as CharArray)) verseContent?.appendContent(String(ch))
} }
} }

View File

@ -6,7 +6,4 @@ import org.crosswire.jsword.passage.Verse
* Created by bspeice on 9/9/14. * Created by bspeice on 9/9/14.
*/ */
class VerseReference(verse: Verse, index: Int) { class VerseReference(val verse: Verse, val index: Int) {}
val verse: Verse = verse
val index: Int = index
}