// Copyright (c) 2003-2014, Jodd Team (jodd.org). All Rights Reserved.
package jodd.lagarto;
import jodd.datetime.JStopWatch;
import jodd.io.FileUtil;
import jodd.io.findfile.FindFile;
import jodd.io.findfile.WildcardFindFile;
import jodd.util.StringUtil;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import static jodd.util.StringPool.NEWLINE;
import static org.junit.Assert.*;
public class LagartoParserTest {
protected String testDataRoot;
protected String testDataRoot2;
protected String testLiveRoot;
@Before
public void setUp() throws Exception {
if (testDataRoot != null) {
return;
}
URL data = LagartoParserTest.class.getResource("test");
testDataRoot = data.getFile();
data = LagartoParserTest.class.getResource("test2");
testDataRoot2 = data.getFile();
data = LagartoParserTest.class.getResource("live");
testLiveRoot = data.getFile();
}
@Test
public void testHtmls() throws IOException {
_testHtmls(testDataRoot);
}
@Test
public void testHtmls2() throws IOException {
_testHtmls(testDataRoot2);
}
private void _testHtmls(String root) throws IOException {
FindFile ff = new WildcardFindFile().include("**/*.*ml");
long reps = 1;
JStopWatch jsw = new JStopWatch();
boolean processed = false;
while (reps-- > 0) {
ff.searchPath(root);
File file;
while ((file = ff.nextFile()) != null) {
processed = true;
System.out.println('+' + file.getName());
String content = FileUtil.readString(file);
content = StringUtil.removeChars(content, '\r');
String expectedResult = FileUtil.readString(new File(file.getAbsolutePath() + ".txt"));
String formatted = null;
File formattedFile = new File(file.getAbsolutePath() + "-fmt.htm");
if (formattedFile.exists()) {
formatted = FileUtil.readString(formattedFile);
}
if (formatted != null) {
formatted = StringUtil.removeChars(formatted, '\r');
}
boolean isXml = file.getName().endsWith(".xml");
String[] results = _parse(content, isXml);
String result = results[0]; // parsing result
String result2 = results[1]; // tag writer
expectedResult = StringUtil.removeChars(expectedResult, '\r');
result = StringUtil.removeChars(result, '\r').trim();
result2 = StringUtil.removeChars(result2, '\r').trim();
assertEquals(expectedResult, result);
if (formatted != null) {
assertEquals(formatted, result2);
} else {
assertEquals(content, result2);
}
}
}
assertTrue(processed);
System.out.println(jsw);
}
/**
* 13s
*/
@Test
public void testLiveHtmls() throws IOException {
FindFile ff = new WildcardFindFile().include("**/*.html");
ff.searchPath(testLiveRoot);
File file;
boolean processed = false;
while ((file = ff.nextFile()) != null) {
processed = true;
String name = file.getName();
System.out.println('+' + name);
String content = FileUtil.readString(file);
try {
_parseEmpty(content);
} catch (Exception ex) {
ex.printStackTrace();
fail(ex.toString());
}
}
assertTrue(processed);
}
private String _parseEmpty(String content) {
LagartoParser lagartoParser = new LagartoParser(content, false);
lagartoParser.getConfig().setCalculatePosition(true);
final StringBuilder errors = new StringBuilder();
lagartoParser.parse(new EmptyTagVisitor() {
@Override
public void error(String message) {
errors.append(message);
errors.append('\n');
}
});
return errors.toString();
}
private String[] _parse(String content, boolean isXml) {
final StringBuilder result = new StringBuilder();
final StringBuilder out = new StringBuilder();
TagVisitor visitor = new TagVisitor() {
public void start() {
}
public void end() {
}
public void tag(Tag tag) {
result.append("tag:").append(tag.getName());
result.append(':').append(tag.getDeepLevel());
switch (tag.getType()) {
case START:
result.append('<');
break;
case END:
result.append('>');
break;
case SELF_CLOSING:
result.append("<>");
break;
}
if (tag.getAttributeCount() > 0) {
try {
tag.writeTo(result);
} catch (IOException ignored) {
}
}
result.append(NEWLINE);
}
public void xml(CharSequence version, CharSequence encoding, CharSequence standalone) {
result.append("xml:").append(version).append(":").append(encoding).append(":").append(standalone);
result.append(NEWLINE);
}
public void script(Tag tag, CharSequence bodyM) {
result.append("scr:").append(tag.getDeepLevel());
if (tag.getAttributeCount() > 0) {
try {
tag.writeTo(result);
} catch (IOException ignored) {
}
}
String body = bodyM.toString();
body = StringUtil.removeChars(body, "\r\n\t\b");
result.append('[').append(body).append(']');
result.append(NEWLINE);
}
public void comment(CharSequence commentM) {
String comment = commentM.toString();
comment = StringUtil.removeChars(comment, "\r\n\t\b");
result.append("com:[").append(comment).append(']').append(NEWLINE);
}
public void cdata(CharSequence cdataM) {
String cdata = cdataM.toString();
cdata = StringUtil.removeChars(cdata, "\r\n\t\b");
result.append("cdt:[").append(cdata).append(']').append(NEWLINE);
}
public void doctype(Doctype doctype) {
result.append("doc:[").append(doctype.getName()).append(' ');
result.append(doctype.getPublicIdentifier()).append(' ').append(doctype.getSystemIdentifier()).append(']').append(NEWLINE);
}
public void condComment(CharSequence expression, boolean isStartingTag, boolean isHidden, boolean isHiddenEndTag) {
result.append(isStartingTag ? "CC" : "cc").append(isHidden ? 'H' : 'S');
result.append(isHiddenEndTag ? "h" : "");
result.append(":[").append(expression).append(']');
result.append(NEWLINE);
}
public void text(CharSequence text) {
String t = text.toString();
t = StringUtil.removeChars(t, "\r\n\t\b");
if (t.length() != 0) {
result.append("txt:[").append(t).append(']').append(NEWLINE);
}
}
public void error(String message) {
result.append("wrn:[").append(message).append(NEWLINE);
}
};
LagartoParser lagartoParser = new LagartoParser(content, false);
lagartoParser.getConfig().setCalculatePosition(true);
if (isXml) {
lagartoParser.getConfig().setParseXmlTags(true);
}
TagWriter tagWriter = new TagWriter(out);
lagartoParser.parse(new TagVisitorChain(visitor, tagWriter));
return new String[]{result.toString(), out.toString()};
}
}