mirror of
				https://github.com/MinimalBible/MinimalBible
				synced 2025-11-03 18:10:27 -05:00 
			
		
		
		
	Add some tests to the OsisParser
Testing state machines can be difficult if it's not black box...
This commit is contained in:
		@ -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());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -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))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -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
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user