package folioxml.folio;
import folioxml.core.InvalidMarkupException;
import folioxml.utils.Stopwatch;
import org.junit.*;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import static org.junit.Assert.assertTrue;
/**
* @author nathanael
*/
public class FolioTokenReaderTest {
public FolioTokenReaderTest() throws Exception {
/* try{
assert false;
throw new Exception("Assertions must be enabled for tests and software to run correctly!");
}catch(AssertionError e){}*/
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
private static FolioToken.TokenType comment = FolioToken.TokenType.Comment;
private static FolioToken.TokenType text = FolioToken.TokenType.Text;
private static FolioToken.TokenType tag = FolioToken.TokenType.Tag;
FolioTokenReader r;
FolioToken ft;
/**
* Test of main method, of class Indexer.
*/
private int currentReadSize = 1;
public FolioTokenReader read(String s) {
return read(s, currentReadSize);
}
public FolioTokenReader read(String s, int readSize) {
return new FolioTokenReader(new StringReader(s), readSize);
}
@Test
public void TestSingleTag() throws Exception {
r = read("<RD,ID:the<<id:\"level\"\"Type\",CH>");
ft = r.read();
assertTrue(ft.get(0).equals("ID"));
assertTrue(ft.get(1).equals("the<id"));
assertTrue(ft.get(2).equals("level"Type"));
assertTrue(ft.get(3).equals("CH"));
assertTrue(ft.getOptionAfter("iD").equals("the<id"));
assertTrue(r.read() == null);
}
@Test
public void TestComments() throws Exception {
r = read("<<<CM><CM><<<CM></CM> <cM></cm>");
ft = r.read();
assertTrue(ft.type == text);
assertTrue(ft.text.equals("<<"));
ft = r.read();
assertTrue(ft.type == comment);
assertTrue(ft.text.equals("<CM><<<CM>"));
ft = r.read();
assertTrue(ft.text.equals(" "));
assertTrue(ft.type == text);
ft = r.read();
assertTrue(ft.type == comment);
assertTrue(ft.text.length() == 0);
assertTrue(r.read() == null);
assertTrue(r.canRead() == false);
//Attributes not allowed
afail("<CM,attr>");
//Unexpected closing
afail("</CM>");
}
@Test
public void TestText() throws Exception {
r = read(" here's <<>>some invalid but < allowed markup with < extra single brackets because they aren't followed by a slash or aphabetic");
r.read();
assertTrue(r.read() == null && !r.canRead());
// generateCode("Can't have <PARTIALTAGS");
afail("Can't have <PARTIALTAGS");
afail("or </ bits and pieces");
afail("Because <IT knows there should be a tag");
}
@Test
public void TestTags() throws Exception {
r = read("</CT>");
assertTrue(r.read().isClosing());
assertTrue(read("<UN>").read().tagName.equals("UN"));
assertTrue(read("<FD:\"field << name\">").read().tagOptions.equals("\"field << name\""));
//^<(/)?([A-Z-a-z][A-Za-z][\\+\\-]?)(?:[:,;](([^<]+|<<)+))>
afail("This invalid markup won't match any of the tokens due to the number, and will cause an assertion failure: <A0>");
afail("It has to match one of them <FD:noSingle<Brackets>");
afail("Tags can only be two characters: <LONGTAG> will fail");
}
@Test
public void TestSequences() throws Exception {
String txt =
"<CM> ***********************************************\n" +
"** Folio Flat File Identifier and Version Info **\n" +
"*********************************************** </CM>\n" +
"<VI:Folio,FFF,4.6.1.0>\n\n\n" +
"<CM> ***********************************************\n" +
" ** Definition File Include **\n" +
" *********************************************** </CM>\n" +
"<TT:\" Another Title \">\n" +
"<RE:\"3/20/2005 5:57:07 PM\">\n" +
"<AU> Company Name Inc.</AU>\n" +
"<SU> Some Description </SU>\n" +
"<AS> First part of description<CR> second part of description</AS>\n" +
"<RM> The Product<CR> Product Description Details</RM>\n" +
"<HE><JU:LF><AP:0.125><IN:FI:0><TS:Right,RT,NO><BR:BT:0.00972222,0><SD:NO><GI><TB><FT:\"Times New Roman\",SR>Page: <GP><FT></HE>\n" +
"<FO></FO>\n" +
"\n" +
"\n" +
"<CM> ***********************************************\n" +
" ** Record Text **\n" +
" *********************************************** </CM>\n\n" +
"<RD,ID:911:Book,CH><GR:\"non indexed groups\"><GR:\"group 1\"><GR:\"group 2\"><GR:\"group 3\">" +
"<BH><JU:CN><BR:AL:0.15,0.0291667,FC:255,255,0><SD:255,0,0><FD:\"non indexed field\"><BD+><UN:2+><PT:48><FC:255,255,0>" +
"<BC:255,0,0>WARNING!<UN><PT><FC:0,0,255><BC><CR><PT:12><FC:255,255,0><BC:255,0,0>You have inadvertently opened the infobase: <UN+>Book911.NFO<UN><CR><CR><PT:16>";
//generateCode(txt);
this.TestMessageTop();
}
public void main() throws Exception {
BlockSizeVariations();
}
@Test
public void PerfTest() throws Exception {
//1000 loops of BlockSizeVariations in 10816 ms
//down from 27,00 with output statements.
Stopwatch s = new Stopwatch();
s.start();
for (int i = 0; i < 1000; i++) BlockSizeVariations();
s.stop();
System.out.println("1000 loops of BlockSizeVariations in " + s.toString());
}
public void BlockSizeVariations() throws Exception {
TestWithBlockSize(1);
TestWithBlockSize(3);
TestWithBlockSize(10);
TestWithBlockSize(2 ^ 16);
}
@Test
public void BlockSize1() throws Exception {
TestWithBlockSize(1);
}
@Test
public void BlockSize3() throws Exception {
TestWithBlockSize(3);
}
@Test
public void BlockSize10() throws Exception {
TestWithBlockSize(10);
}
@Test
public void BlockSize216() throws Exception {
TestWithBlockSize(216);
}
public void generateCode(String s) throws IOException, InvalidMarkupException {
PrintStream o = System.out;
r = read(s);
//Print string
o.print("\t\tr = read(");
printStringLiteral(s, "\t\t\t");
o.println(");");
//Generate asserts for each tag
while (r.canRead()) {
o.println();
ft = r.read();
if (ft == null) {
ga("r.canRead()");
ga("r.read() == null;");
} else {
ga("r.canRead()");
o.println("ft = r.read();");
ga("ft.type == FolioToken.TokenType." + ft.type.toString());
ga("ft.isClosing() == " + Boolean.toString(ft.isClosing()));
assertEquals("ft.text", ft.text);
if (ft.type == FolioToken.TokenType.Tag) {
assertEquals("ft.tagName", ft.tagName);
assertEquals("ft.tagOptions", ft.tagOptions);
}
List<String> opts = ft.getOptionsArray();
for (int i = 0; i < opts.size(); i++) {
o.print("assertTrue(ft.get(" + Integer.toString(i) + ").equals(");
printStringLiteral(opts.get(i), "\t\t\t\t");
o.println("));");
}
}
}
ga("r.read() == null");
ga("r.canRead() == false");
}
public void ga(String s) {
System.out.println("assertTrue(" + s + ");");
}
public void assertEquals(String var, String value) {
if (value == null) {
ga(var + " == null");
} else {
System.out.print("assertTrue(" + var + ".equals(");
printStringLiteral(value, "\t\t\t\t");
System.out.println("));");
}
}
public void printStringLiteral(String s, String tabPrefix) {
PrintStream o = System.out;
int index = 0;
while (index < s.length()) {
if (index > 0) {
o.println("\" + ");
o.print(tabPrefix);
}
int nextNewline = s.indexOf('\n', index) + 1;
//We +1, so no result will return 0 instead of -1
if (nextNewline < 1) {
nextNewline = s.length();
}
//wrap at 60 chars
if (nextNewline - index > 60) {
nextNewline = index + 60;
}
//System.out.println(index + "," + nextNewline);
String substr = escape(s.substring(index, nextNewline));
index = nextNewline;
o.print("\"");
o.print(substr);
}
o.print("\"");
}
public String escape(String s) {
StringWriter sw = new StringWriter((int) (s.length() * 1.1));
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '\\') {
sw.append("\\\\");
} else if (s.charAt(i) == '\t') {
sw.append("\\t");
} else if (s.charAt(i) == '\"') {
sw.append("\\\"");
} else if (s.charAt(i) == '\n') {
sw.append("\\n");
} else {
sw.append(s.charAt(i));
}
}
return sw.toString();
}
public void TestWithBlockSize(int size) throws Exception {
this.currentReadSize = size;
TestSingleTag();
TestComments();
TestText();
TestTags();
TestMessageTop();
}
public void afail(String s) throws IOException {
boolean suceeded = false;
try {
r = read(s);
while (r.canRead()) {
r.read();
}
suceeded = true;
} catch (Exception e) {
} catch (junit.framework.AssertionFailedError e) {
}
assertTrue(!suceeded); //Should have thrown an exception
}
public void TestMessageTop() throws InvalidMarkupException, IOException {
r = read("<CM> ***********************************************\n" +
"** Folio Flat File Identifier and Version Info **\n" +
"*********************************************** </CM>\n" +
"<VI:Folio,FFF,4.6.1.0>\n" +
"\n" +
"\n" +
"<CM> ***********************************************\n" +
" ** Definition File Include **\n" +
" *********************************************** </CM>\n" +
"<TT:\" Another Title \">\n" +
"<RE:\"3/20/2005 5:57:07 PM\">\n" +
"<AU> Company Name Inc.</AU>\n" +
"<SU> Some Description </SU>\n" +
"<AS> First part of description<CR> second part of description</AS>\n" +
"<RM> The Product<CR> Product Description Details</RM>\n" +
"<HE><JU:LF><AP:0.125><IN:FI:0><TS:Right,RT,NO><BR:BT:0.00972" +
"222,0><SD:NO><GI><TB><FT:\"Times New Roman\",SR>Page: <GP><FT" +
"></HE>\n" +
"<FO></FO>\n" +
"\n" +
"\n" +
"<CM> ***********************************************\n" +
" ** Record Text **\n" +
" *********************************************** </CM>\n" +
"\n" +
"<RD,ID:911:Book,CH><GR:\"non indexed groups\"><GR:\"group 1\"><GR:\"group 2\"><GR:\"group 3\"><BH><JU:C" +
"N><BR:AL:0.15,0.0291667,FC:255,255,0><SD:255,0,0><FD:\"non indexed field\"><BD+><UN:2+><PT:48><FC:255,255,0><BC:255,0,0>W" +
"ARNING!<UN><PT><FC:0,0,255><BC><CR><PT:12><FC:255,255,0><BC:" +
"255,0,0>You have inadvertently opened the infobase: <UN+>Book" +
"911.NFO<UN><CR><CR><PT:16>");
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Comment);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" ***********************************************\n" +
"** Folio Flat File Identifier and Version Info **\n" +
"*********************************************** "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<VI:Folio,FFF,4.6.1.0>"));
assertTrue(ft.tagName.equals("VI"));
assertTrue(ft.tagOptions.equals("Folio,FFF,4.6.1.0"));
assertTrue(ft.get(0).equals("Folio"));
assertTrue(ft.get(1).equals("FFF"));
assertTrue(ft.get(2).equals("4.6.1.0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n" +
"\n" +
"\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Comment);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" ***********************************************\n" +
" ** Definition File Include **\n" +
" *********************************************** "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<TT:\" Another Title \">"));
assertTrue(ft.tagName.equals("TT"));
assertTrue(ft.tagOptions.equals("\" Another Title \""));
assertTrue(ft.get(0).equals(" Another Title "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<RE:\"3/20/2005 5:57:07 PM\">"));
assertTrue(ft.tagName.equals("RE"));
assertTrue(ft.tagOptions.equals("\"3/20/2005 5:57:07 PM\""));
assertTrue(ft.get(0).equals("3/20/2005 5:57:07 PM"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<AU>"));
assertTrue(ft.tagName.equals("AU"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" Company Name Inc."));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == true);
assertTrue(ft.text.equals("</AU>"));
assertTrue(ft.tagName.equals("AU"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<SU>"));
assertTrue(ft.tagName.equals("SU"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" Some Description "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == true);
assertTrue(ft.text.equals("</SU>"));
assertTrue(ft.tagName.equals("SU"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<AS>"));
assertTrue(ft.tagName.equals("AS"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" First part of description"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<CR>"));
assertTrue(ft.tagName.equals("CR"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" second part of description"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == true);
assertTrue(ft.text.equals("</AS>"));
assertTrue(ft.tagName.equals("AS"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<RM>"));
assertTrue(ft.tagName.equals("RM"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" The Product"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<CR>"));
assertTrue(ft.tagName.equals("CR"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" Product Description Details"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == true);
assertTrue(ft.text.equals("</RM>"));
assertTrue(ft.tagName.equals("RM"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<HE>"));
assertTrue(ft.tagName.equals("HE"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<JU:LF>"));
assertTrue(ft.tagName.equals("JU"));
assertTrue(ft.tagOptions.equals("LF"));
assertTrue(ft.get(0).equals("LF"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<AP:0.125>"));
assertTrue(ft.tagName.equals("AP"));
assertTrue(ft.tagOptions.equals("0.125"));
assertTrue(ft.get(0).equals("0.125"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<IN:FI:0>"));
assertTrue(ft.tagName.equals("IN"));
assertTrue(ft.tagOptions.equals("FI:0"));
assertTrue(ft.get(0).equals("FI"));
assertTrue(ft.get(1).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<TS:Right,RT,NO>"));
assertTrue(ft.tagName.equals("TS"));
assertTrue(ft.tagOptions.equals("Right,RT,NO"));
assertTrue(ft.get(0).equals("Right"));
assertTrue(ft.get(1).equals("RT"));
assertTrue(ft.get(2).equals("NO"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BR:BT:0.00972222,0>"));
assertTrue(ft.tagName.equals("BR"));
assertTrue(ft.tagOptions.equals("BT:0.00972222,0"));
assertTrue(ft.get(0).equals("BT"));
assertTrue(ft.get(1).equals("0.00972222"));
assertTrue(ft.get(2).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<SD:NO>"));
assertTrue(ft.tagName.equals("SD"));
assertTrue(ft.tagOptions.equals("NO"));
assertTrue(ft.get(0).equals("NO"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<GI>"));
assertTrue(ft.tagName.equals("GI"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<TB>"));
assertTrue(ft.tagName.equals("TB"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FT:\"Times New Roman\",SR>"));
assertTrue(ft.tagName.equals("FT"));
assertTrue(ft.tagOptions.equals("\"Times New Roman\",SR"));
assertTrue(ft.get(0).equals("Times New Roman"));
assertTrue(ft.get(1).equals("SR"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("Page: "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<GP>"));
assertTrue(ft.tagName.equals("GP"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FT>"));
assertTrue(ft.tagName.equals("FT"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == true);
assertTrue(ft.text.equals("</HE>"));
assertTrue(ft.tagName.equals("HE"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FO>"));
assertTrue(ft.tagName.equals("FO"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == true);
assertTrue(ft.text.equals("</FO>"));
assertTrue(ft.tagName.equals("FO"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n" +
"\n" +
"\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Comment);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals(" ***********************************************\n" +
" ** Record Text **\n" +
" *********************************************** "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("\n" +
"\n"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<RD,ID:911:Book,CH>"));
assertTrue(ft.tagName.equals("RD"));
assertTrue(ft.tagOptions.equals("ID:911:Book,CH"));
assertTrue(ft.get(0).equals("ID"));
assertTrue(ft.get(1).equals("911"));
assertTrue(ft.get(2).equals("Book"));
assertTrue(ft.get(3).equals("CH"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<GR:\"non indexed groups\">"));
assertTrue(ft.tagName.equals("GR"));
assertTrue(ft.tagOptions.equals("\"non indexed groups\""));
assertTrue(ft.get(0).equals("non indexed groups"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<GR:\"group 1\">"));
assertTrue(ft.tagName.equals("GR"));
assertTrue(ft.tagOptions.equals("\"group 1\""));
assertTrue(ft.get(0).equals("group 1"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<GR:\"group 2\">"));
assertTrue(ft.tagName.equals("GR"));
assertTrue(ft.tagOptions.equals("\"group 2\""));
assertTrue(ft.get(0).equals("group 2"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<GR:\"group 3\">"));
assertTrue(ft.tagName.equals("GR"));
assertTrue(ft.tagOptions.equals("\"group 3\""));
assertTrue(ft.get(0).equals("group 3"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BH>"));
assertTrue(ft.tagName.equals("BH"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<JU:CN>"));
assertTrue(ft.tagName.equals("JU"));
assertTrue(ft.tagOptions.equals("CN"));
assertTrue(ft.get(0).equals("CN"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BR:AL:0.15,0.0291667,FC:255,255,0>"));
assertTrue(ft.tagName.equals("BR"));
assertTrue(ft.tagOptions.equals("AL:0.15,0.0291667,FC:255,255,0"));
assertTrue(ft.get(0).equals("AL"));
assertTrue(ft.get(1).equals("0.15"));
assertTrue(ft.get(2).equals("0.0291667"));
assertTrue(ft.get(3).equals("FC"));
assertTrue(ft.get(4).equals("255"));
assertTrue(ft.get(5).equals("255"));
assertTrue(ft.get(6).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<SD:255,0,0>"));
assertTrue(ft.tagName.equals("SD"));
assertTrue(ft.tagOptions.equals("255,0,0"));
assertTrue(ft.get(0).equals("255"));
assertTrue(ft.get(1).equals("0"));
assertTrue(ft.get(2).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FD:\"non indexed field\">"));
assertTrue(ft.tagName.equals("FD"));
assertTrue(ft.tagOptions.equals("\"non indexed field\""));
assertTrue(ft.get(0).equals("non indexed field"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BD+>"));
assertTrue(ft.tagName.equals("BD+"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<UN:2+>"));
assertTrue(ft.tagName.equals("UN"));
assertTrue(ft.tagOptions.equals("2+"));
assertTrue(ft.get(0).equals("2+"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<PT:48>"));
assertTrue(ft.tagName.equals("PT"));
assertTrue(ft.tagOptions.equals("48"));
assertTrue(ft.get(0).equals("48"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FC:255,255,0>"));
assertTrue(ft.tagName.equals("FC"));
assertTrue(ft.tagOptions.equals("255,255,0"));
assertTrue(ft.get(0).equals("255"));
assertTrue(ft.get(1).equals("255"));
assertTrue(ft.get(2).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BC:255,0,0>"));
assertTrue(ft.tagName.equals("BC"));
assertTrue(ft.tagOptions.equals("255,0,0"));
assertTrue(ft.get(0).equals("255"));
assertTrue(ft.get(1).equals("0"));
assertTrue(ft.get(2).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("WARNING!"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<UN>"));
assertTrue(ft.tagName.equals("UN"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<PT>"));
assertTrue(ft.tagName.equals("PT"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FC:0,0,255>"));
assertTrue(ft.tagName.equals("FC"));
assertTrue(ft.tagOptions.equals("0,0,255"));
assertTrue(ft.get(0).equals("0"));
assertTrue(ft.get(1).equals("0"));
assertTrue(ft.get(2).equals("255"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BC>"));
assertTrue(ft.tagName.equals("BC"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<CR>"));
assertTrue(ft.tagName.equals("CR"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<PT:12>"));
assertTrue(ft.tagName.equals("PT"));
assertTrue(ft.tagOptions.equals("12"));
assertTrue(ft.get(0).equals("12"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<FC:255,255,0>"));
assertTrue(ft.tagName.equals("FC"));
assertTrue(ft.tagOptions.equals("255,255,0"));
assertTrue(ft.get(0).equals("255"));
assertTrue(ft.get(1).equals("255"));
assertTrue(ft.get(2).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<BC:255,0,0>"));
assertTrue(ft.tagName.equals("BC"));
assertTrue(ft.tagOptions.equals("255,0,0"));
assertTrue(ft.get(0).equals("255"));
assertTrue(ft.get(1).equals("0"));
assertTrue(ft.get(2).equals("0"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("You have inadvertently opened the infobase: "));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<UN+>"));
assertTrue(ft.tagName.equals("UN+"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Text);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("Book911.NFO"));
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<UN>"));
assertTrue(ft.tagName.equals("UN"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<CR>"));
assertTrue(ft.tagName.equals("CR"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<CR>"));
assertTrue(ft.tagName.equals("CR"));
assertTrue(ft.tagOptions == null);
assertTrue(r.canRead());
ft = r.read();
assertTrue(ft.type == FolioToken.TokenType.Tag);
assertTrue(ft.isClosing() == false);
assertTrue(ft.text.equals("<PT:16>"));
assertTrue(ft.tagName.equals("PT"));
assertTrue(ft.tagOptions.equals("16"));
assertTrue(ft.get(0).equals("16"));
assertTrue(r.read() == null);
assertTrue(r.canRead() == false); //These were in the wrong order. canRead() returns true incorrectly if the last read block happens to grab the last bit of data without causing an EOF
}
}