package com.dteviot.epubviewer.test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import junit.framework.Assert;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLFilterImpl;
import org.xmlpull.v1.XmlSerializer;
import com.dteviot.epubviewer.Globals;
import com.dteviot.epubviewer.IResourceSource;
import com.dteviot.epubviewer.MainActivity;
import com.dteviot.epubviewer.ResourceResponse;
import com.dteviot.epubviewer.XhtmlToText;
import com.dteviot.epubviewer.XmlUtil;
import com.dteviot.epubviewer.XmlFilter.InlineImageElementFilter;
import com.dteviot.epubviewer.XmlFilter.RemoveSvgElementFilter;
import com.dteviot.epubviewer.XmlFilter.StyleSheetElementFilter;
import com.dteviot.epubviewer.XmlFilter.XmlSerializerToXmlFilterAdapter;
import com.dteviot.epubviewer.epub.Book;
import android.content.res.AssetManager;
import android.net.Uri;
import android.test.ActivityUnitTestCase;
import android.util.Log;
import android.util.Xml;
public class TestXmlUtil extends ActivityUnitTestCase<MainActivity> {
public TestXmlUtil() {
super(MainActivity.class);
// TODO Auto-generated constructor stub
}
public void testStyleSheetElementFilter() {
AssetManager assetManager = getInstrumentation().getContext().getAssets();
IResourceSource source = buildSource(assetManager, "file:/stylesheet.css", "stylesheet.css", "text/css");
String resourceName = "sampleHtml.html";
Uri uri = Book.resourceName2Url(resourceName);
XMLFilterImpl stylesheetFilter = new StyleSheetElementFilter(uri, source);
try {
TestFilter(stylesheetFilter, assetManager.open(resourceName));
} catch (Exception e) {
e.printStackTrace();
Assert.fail("testStyleSheetElementFilter");
}
}
public void testRemoveSvgImageElementFilter() {
AssetManager assetManager = getInstrumentation().getContext().getAssets();
String resourceName = "sampleHtml.html";
XMLFilterImpl svgFilter = new RemoveSvgElementFilter();
try {
TestFilter(svgFilter, assetManager.open(resourceName));
} catch (Exception e) {
e.printStackTrace();
Assert.fail("testStyleSheetElementFilter");
}
}
public void testInlineImageElementFilter() {
AssetManager assetManager = getInstrumentation().getContext().getAssets();
IResourceSource source = buildSource(assetManager, "file:/resources/_cover_.jpg", "dummy.bin", "text/css");
String resourceName = "sampleHtml.html";
Uri uri = Book.resourceName2Url(resourceName);
XMLFilterImpl imageFilter = new InlineImageElementFilter(uri, source);
try {
TestFilter(imageFilter, assetManager.open(resourceName));
} catch (Exception e) {
e.printStackTrace();
Assert.fail("testStyleSheetElementFilter");
}
}
private static String TestFilter(XMLFilterImpl filter, InputStream in)
throws IllegalArgumentException, IllegalStateException, IOException {
// build SAX pipeline to run filter and serialize result
StringWriter writer = new StringWriter();
XmlSerializer serializer = android.util.Xml.newSerializer();
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
XmlSerializerToXmlFilterAdapter serializerFilter =
new XmlSerializerToXmlFilterAdapter(serializer);
serializerFilter.setParent(filter);
// convert the XHTML
serializer.setOutput(writer);
XmlUtil.parseXmlResource(in, filter, serializerFilter);
Log.i(Globals.TAG, "Filtered XML=" + writer.toString());
return writer.toString();
}
private static IResourceSource buildSource(final AssetManager assets, final String nameToLookFor, final String fileName, final String mimeType) {
return new IResourceSource() {
@Override
public ResourceResponse fetch(Uri resourceUri) {
if (nameToLookFor.equals(resourceUri.toString())) {
try {
return new ResourceResponse(
mimeType,
assets.open(fileName)
);
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
};
}
public void testExtractText() {
AssetManager assetManager = getInstrumentation().getContext().getAssets();
ArrayList<String> text = new ArrayList<String>();
DefaultHandler handler = new XhtmlToText(text);
InputStream in;
try {
in = assetManager.open("chapter_030.xhtml");
XmlUtil.parseXmlResource(in, handler, null);
Assert.assertEquals("wrong number of strings", 2, text.size());
Assert.assertTrue("First string is wrong", text.get(0).startsWith("\n\n\nChapter 30"));
Assert.assertTrue("Last string is wrong", text.get(1).endsWith("the planks. \n"));
} catch (IOException e) {
e.printStackTrace();
Assert.fail();
}
}
public void testBasicXmlSerializer() {
String sampleXml =
"<?xml version='1.0' encoding='UTF-8' ?><html xmlns=\"http://www.w3.org/1999/xhtml\"><head /><body>2005</body></html>";
StringWriter writer = new StringWriter();
XmlSerializer serializer = Xml.newSerializer();
XmlSerializerToXmlFilterAdapter serializerFilter =
new XmlSerializerToXmlFilterAdapter(serializer);
try {
serializer.setOutput(writer);
InputStream sb = new ByteArrayInputStream(sampleXml.getBytes("UTF-8"));
XmlUtil.parseXmlResource(sb, serializerFilter, null);
Assert.assertEquals("not original string", sampleXml, writer.toString());
} catch (Exception e) {
Log.e(Globals.TAG, "Error generating XML ", e);
Assert.fail();
}
}
public void testXmlSerializer() {
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);
StringWriter writer = new StringWriter();
XmlSerializer serializer = Xml.newSerializer();
XmlSerializerToXmlFilterAdapter serializerFilter =
new XmlSerializerToXmlFilterAdapter(serializer);
Uri sourceUri = Book.resourceName2Url("OPS/chapter_030.xhtml");
XMLFilterImpl linkFilter = new StyleSheetElementFilter(sourceUri, book);
serializerFilter.setParent(linkFilter);
try {
serializer.setOutput(writer);
XmlUtil.parseXmlResource(book.fetch(sourceUri).getData(), linkFilter, serializerFilter);
Log.i(Globals.TAG, "Xml Echo = " + writer.toString());
} catch (Exception e) {
Log.e(Globals.TAG, "Error generating XML ", e);
Assert.fail();
}
}
}