package com.dteviot.epubviewer.test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import junit.framework.Assert;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import com.dteviot.epubviewer.Globals;
import com.dteviot.epubviewer.HrefResolver;
import com.dteviot.epubviewer.MainActivity;
import com.dteviot.epubviewer.epub.Book;
import com.dteviot.epubviewer.epub.ManifestItem;
import com.dteviot.epubviewer.epub.TableOfContents;
import android.content.res.AssetManager;
import android.test.ActivityUnitTestCase;
import android.util.Log;
import android.util.Xml;
public class TestEpubParse extends ActivityUnitTestCase<MainActivity> {
public TestEpubParse() {
super(MainActivity.class);
// TODO Auto-generated constructor stub
}
@Override
protected void setUp() throws Exception {
super.setUp();
mAssetManager = getInstrumentation().getContext().getAssets();
}
private boolean exerciseParser(String testDataFileName, ContentHandler handler) {
try {
InputStream in = mAssetManager.open(testDataFileName);
try {
Xml.parse(in, Xml.Encoding.UTF_8, handler);
return true;
} finally {
if (in != null) {
in.close();
}
}
} catch (IOException e) {
Log.e(Globals.TAG, "Error reading XML file ", e);
} catch (SAXException e) {
Log.e(Globals.TAG, "Error parsing XML file ", e);
}
// if get here, failed
return false;
}
private AssetManager mAssetManager;
public void testFindContainer() {
String MOBY_DICK_FILENAME = "/mnt/sdcard/Download/moby-dick-20120118.epub";
File file = new File(MOBY_DICK_FILENAME);
// File can be down loaded from Internet. Goggle for filename.
Assert.assertTrue("moby-dick-20120118 file not on SD card.", file.exists());
Book book = new Book(MOBY_DICK_FILENAME);
Assert.assertEquals(".opf not found", "OPS/package.opf", book.getOpfFileName());
}
private void setMOpfFileName(Book book)
{
try {
Field field = book.getClass().getDeclaredField("mOpfFileName");
if(!field.isAccessible()) {
field.setAccessible(true);
}
field.set(book, "");
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testParseOpfFile() {
Book book = new Book();
// set mOpfFileName to not null, or next call will fail.
setMOpfFileName(book);
exerciseParser("metadata.opf", book.constructOpfFileParser());
ArrayList<ManifestItem> spine = book.getSpine();
Assert.assertEquals("toc not found", "ncx", book.getTocID());
Assert.assertEquals("spine wrong size", 10, spine.size());
Assert.assertEquals("spine 1st element wrong", "content/calibre_title_page.html", spine.get(0).getHref());
Assert.assertEquals("spine last element wrong", "content/076543219X_top.htm", spine.get(9).getHref());
ArrayList<ManifestItem> items = book.getManifest().getItems();
Assert.assertEquals("manifest wrong size", 18, items.size());
Assert.assertEquals("manifest 1st item id wrong", "id1", items.get(0).getID());
Assert.assertEquals("manifest 1st item href wrong", "content/calibre_title_page.html", items.get(0).getHref());
Assert.assertEquals("manifest 1st item media-type wrong", "application/xhtml+xml", items.get(0).getMediaType());
Assert.assertEquals("manifest last item id wrong", "id2", items.get(17).getID());
Assert.assertEquals("manifest last item href wrong", "content/resources/_cover_.jpg", items.get(17).getHref());
Assert.assertEquals("manifest last item media-type wrong", "image/jpeg", items.get(17).getMediaType());
}
public void testParseTocFile() {
Book book = new Book();
TableOfContents points = book.getTableOfContents();
HrefResolver resolver = new HrefResolver("");
exerciseParser("toc.ncx", points.constructTocFileParser(resolver));
Assert.assertEquals("toc wrong size", 2, points.size());
Assert.assertEquals("ToC 1st item playOrder wrong", 1, points.get(0).getPlayOrder());
Assert.assertEquals("ToC 1st item NavLabel wrong", "Prologue", points.get(0).getNavLabel());
Assert.assertEquals("ToC 1st item Content wrong", "content/078912345X__p__split_1.html#Chap_0", points.get(0).getContent());
Assert.assertEquals("ToC last item playOrder wrong", 2, points.get(1).getPlayOrder());
Assert.assertEquals("ToC last item NavLabel wrong", "Lights, Camera, Action.", points.get(1).getNavLabel());
Assert.assertEquals("ToC last item Content wrong", "content/078912345X__p__split_2.html#Chap_1", points.get(1).getContent());
}
public void testParseNestedTocFile() {
TableOfContents toc = new TableOfContents();
HrefResolver resolver = new HrefResolver("");
ContentHandler handler = toc.constructTocFileParser(resolver);
exerciseParser("toc.xml", handler);
Assert.assertEquals("toc wrong size", 5, toc.size());
Assert.assertEquals("ToC 1st item navLabel wrong", "Prologue 1", toc.get(0).getNavLabel());
Assert.assertEquals("ToC 1st item navLabel wrong", "Prologue 1.1", toc.get(1).getNavLabel());
Assert.assertEquals("ToC 1st item navLabel wrong", "Prologue 1.2", toc.get(2).getNavLabel());
Assert.assertEquals("ToC 1st item navLabel wrong", "Prologue 1.2.1", toc.get(3).getNavLabel());
Assert.assertEquals("ToC 2nd item navLabel wrong", "Prologue 2", toc.get(4).getNavLabel());
}
}