package org.test.fbreader.formats.fb2; import org.geometerplus.fbreader.bookmodel.BookModel; import org.geometerplus.fbreader.bookmodel.ContentsModel; import org.geometerplus.fbreader.formats.fb2.FB2Reader; import org.geometerplus.zlibrary.core.image.*; import org.geometerplus.zlibrary.core.xml.own.ZLOwnXMLProcessorFactory; import org.geometerplus.zlibrary.text.model.ZLTextModel; import org.geometerplus.zlibrary.text.model.ZLTextParagraph; import org.geometerplus.zlibrary.text.model.ZLTextTreeParagraph; import org.geometerplus.zlibrary.text.model.impl.ZLImageEntry; import org.geometerplus.zlibrary.ui.swing.library.ZLSwingLibrary; import org.geometerplus.zlibrary.ui.swing.view.ZLSwingPaintContext; import org.test.zlibrary.model.ModelDumper; import junit.framework.TestCase; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; public class TestFB2Reader extends TestCase { public void setUp() { new ZLSwingLibrary(); new ZLOwnXMLProcessorFactory(); } private String myDirectory = "test/data/fb2/"; private boolean compareFiles(String f1, String f2) { int i1; int i2; InputStreamReader fis1 = null; InputStreamReader fis2 = null; try { fis1 = new InputStreamReader(new FileInputStream(f1), "utf8"); fis2 = new InputStreamReader(new FileInputStream(f2), "utf8"); } catch (FileNotFoundException e) { return false; } catch (UnsupportedEncodingException e) { return false; } try{ try{ i1 = fis1.read(); i2 = fis2.read(); while ((i1 == i2) && (i1 != -1)){ i1 = fis1.read(); i2 = fis2.read(); } } finally { fis1.close(); fis2.close(); } } catch (IOException e) { return false; } return i1 == i2; } private void writeDumpToFile(ZLTextModel model, String outputFile) { try { OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream(outputFile), "utf8"); osw.write(ModelDumper.dump(model)); osw.close(); } catch (Exception e) { fail(); } } private void writeTextModelDumpToFile(String inputFile, String outputFile) { BookModel bookModel = new BookModel(inputFile); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getBookTextModel(); writeDumpToFile(model, outputFile); } private void writeTreeModelDumpToFile(String inputFile, String outputFile) { BookModel bookModel = new BookModel(inputFile); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getContentsModel(); writeDumpToFile(model, outputFile); } private void doTreeModelTest(String test) { String test_result = myDirectory + test + "_act.txt"; writeTreeModelDumpToFile(myDirectory + test + ".fb2", test_result); assertTrue("File " + test, compareFiles(myDirectory + test + "_exp.txt", test_result)); new File(test_result).delete(); } private void doTest(String test) { String test_result = myDirectory + test + "_act.txt"; writeTextModelDumpToFile(myDirectory + test + ".fb2", test_result); assertTrue(compareFiles(myDirectory + test + "_exp.txt", test_result)); new File(test_result).delete(); } public void testOneParagraph() { doTest("test1"); } public void testTwoParagraphs() { doTest("test2"); } public void testControlSup() { doTest("test3"); } public void testControlSub() { doTest("test4"); } public void testControlEmphasis() { doTest("test5"); } public void testControlStrong() { doTest("test6"); } public void testControlStrikeThrough() { doTest("test7"); } public void testControlCode() { doTest("test8"); } public void testControlVerse() { doTest("verse"); } public void testControlDate() { doTest("date"); } public void testControlSubtitle() { doTest("subtitle"); } public void testControlTextAuthor() { doTest("text_author"); } public void testEmptyLine() { doTest("empty_line"); } public void testEmptyLineParagraphKind() { BookModel bookModel = new BookModel(myDirectory + "empty_line.fb2"); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getBookTextModel(); assertEquals(model.getParagraph(0).getKind(), ZLTextParagraph.Kind.EMPTY_LINE_PARAGRAPH); } public void testControlCite() { doTest("cite"); } public void testControlEpigraph() { doTest("epigraph"); } public void testNotesSimple() { BookModel model = new BookModel(myDirectory + "simple_notes.fb2"); new FB2Reader(model).read(); assertNotNull(model.getFootnoteModel("1")); } public void testOneNote() { BookModel bookModel = new BookModel(myDirectory + "one_note.fb2"); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getFootnoteModel("1"); String output = myDirectory + "one_note_act.txt"; writeDumpToFile(model, output); assertTrue(compareFiles(myDirectory + "one_note_exp.txt", output)); new File(output).delete(); } public void testStanza() { doTest("stanza"); } public void testStanzaParagraphKinds() { BookModel bookModel = new BookModel(myDirectory + "stanza.fb2"); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getBookTextModel(); assertEquals(model.getParagraph(0).getKind(), ZLTextParagraph.Kind.BEFORE_SKIP_PARAGRAPH); assertEquals(model.getParagraph(2).getKind(), ZLTextParagraph.Kind.AFTER_SKIP_PARAGRAPH); assertEquals(model.getParagraph(1).getKind(), ZLTextParagraph.Kind.TEXT_PARAGRAPH); } public void testAnnotation() { doTest("annotation"); } public void testAnnotationBeforeBodyParagraph() { BookModel bookModel = new BookModel(myDirectory + "annotation_before.fb2"); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getBookTextModel(); assertEquals(model.getParagraph(1).getKind(), ZLTextParagraph.Kind.END_OF_SECTION_PARAGRAPH); } public void testAnnotationBeforeBody() { doTest("annotation_before"); } public void testEndOfSection() { doTest("section"); } public void testEndOfSectionParagraph() { BookModel bookModel = new BookModel(myDirectory + "section.fb2"); new FB2Reader(bookModel).read(); ZLTextModel model = bookModel.getBookTextModel(); assertEquals(model.getParagraph(1).getKind(), ZLTextParagraph.Kind.END_OF_SECTION_PARAGRAPH); } public void testTitle() { doTest("title"); } public void testPoemTitle() { doTest("poem_title"); } public void testSectionTitle() { doTest("section_title"); } public void testFootnote() { doTest("footnote"); } public void testFootnote1() { BookModel model = new BookModel(myDirectory + "footnote1.fb2"); new FB2Reader(model).read(); ZLTextParagraph paragraph = model.getParagraphByLink("note1"); ZLTextParagraph.EntryIterator it = paragraph.iterator(); it.next(); it.next(); assertEquals(it.getType(), ZLTextParagraph.Entry.TEXT); assertEquals("footnote", new String(it.getTextData(), it.getTextOffset(), it.getTextLength())); } public void testExternalHyperlink() { doTest("ext_hyperlink"); } public void testTreeParagraph() { doTreeModelTest("tree1"); } public void testTreeParagraphRef() { BookModel bookModel = new BookModel(myDirectory + "tree1.fb2"); new FB2Reader(bookModel).read(); ContentsModel model = bookModel.getContentsModel(); assertTrue(model.getReference((ZLTextTreeParagraph)model.getParagraph(0)) == 0); } public void testTreeParagraphTitle() { doTreeModelTest("tree2"); } public void test2TreeParagraphs() { doTreeModelTest("tree2sections"); } // big tests public void testPoem() { doTest("poem"); } public void testText1() { doTest("karenina"); } public void testTextWithNotes() { doTest("whiteguard"); // for (Object s : System.getProperties().keySet()) // System.out.println(s); } /* public void testPnvs() { FB2Reader reader = new FB2Reader("M:/Books/pnvs.fb2"); reader.read(); } */ public void testImage() { BookModel model = new BookModel(myDirectory + "image.fb2"); new FB2Reader(model).read(); byte [] image = (model.getImageMap().getImage("cover.jpg")).byteData(); try { BufferedImage img = ImageIO.read(new ByteArrayInputStream(image)); ImageIO.write(img, "jpg", new File(myDirectory + "img.jpg")); } catch (IOException e) { fail(); } } public void testImageKind() { doTest("image"); } public void testImageModel() { BookModel bModel = new BookModel(myDirectory + "image.fb2"); new FB2Reader(bModel).read(); ZLTextModel model = bModel.getBookTextModel(); ZLTextParagraph paragraph = model.getParagraph(0); ZLTextParagraph.EntryIterator it = paragraph.iterator(); it.next(); it.next(); ZLImageEntry entry = it.getImageEntry(); assertEquals(entry.VOffset, 0); assertEquals(entry.getImage(), bModel.getImageMap().getImage("cover.jpg")); } public void testImageSize() { BookModel model = new BookModel(myDirectory + "image.fb2"); new FB2Reader(model).read(); ZLImage image = model.getImageMap().getImage("cover.jpg"); ZLImageData imageData = ZLImageManager.getInstance().getImageData(image); ZLSwingPaintContext paint = new ZLSwingPaintContext(); assertTrue(paint.imageHeight(imageData) == 277); assertTrue(paint.imageWidth(imageData) == 200); } }