Java tutorial
/** * Copyright 2011 The Open Source Research Group, * University of Erlangen-Nrnberg * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sweble.wikitext.parser; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import junit.framework.Assert; import org.apache.commons.io.IOUtils; import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.jxpath.ri.JXPathContextReferenceImpl; import org.junit.Test; import org.sweble.wikitext.parser.nodes.WtNode; import org.sweble.wikitext.parser.utils.NonExpandingParser; import org.sweble.wikitext.parser.utils.WtAstPrinter; import xtc.parser.ParseException; import de.fau.cs.osr.ptk.common.jxpath.AstNodePointerFactory; import de.fau.cs.osr.utils.FileUtils; import de.fau.cs.osr.utils.StringUtils; public class XPathTest { private static final String PATH = "/nopkg-xpath"; private static final boolean WARNINGS_ENABLED = false; private static final boolean GATHER_RTD = true; private static final boolean AUTO_CORRECT = false; // ========================================================================= @Test public void testFrance() throws IOException, ParseException { String title = "raw-France"; WtNode ast = parse(title); JXPathContext context = JXPathContext.newContext(ast); StringBuilder b = new StringBuilder(); doQuery(context, b, "/WtParagraph[3]"); doQuery(context, b, "(//WtSection[@level=3])[1]"); doQuery(context, b, "//WtTemplate[contains(name//WtText[@content],\"Infobox Country\")]//WtTemplateArgument[contains(name//WtText[@content],\"capital\")]/value"); String actual = FileUtils.lineEndToUnix(b.toString()); String expected = null; try { expected = load(PATH + "/ast/" + title + ".ast"); } catch (IOException e) { } Assert.assertEquals(expected, actual); } // ========================================================================= @Test public void testGermany() throws IOException, ParseException { String title = "raw-Germany"; WtNode ast = parse(title); JXPathContext context = JXPathContext.newContext(ast); StringBuilder b = new StringBuilder(); doQuery(context, b, "//WtTemplate[contains(name//WtText[@content],\"Infobox country\")]//WtTemplateArgument[contains(name//WtText[@content],\"capital\")]/value"); String actual = FileUtils.lineEndToUnix(b.toString()); String expected = null; try { expected = load(PATH + "/ast/" + title + ".ast"); } catch (IOException e) { } Assert.assertEquals(expected, actual); } // ========================================================================= private final NonExpandingParser parser; public XPathTest() { JXPathContextReferenceImpl.addNodePointerFactory(new AstNodePointerFactory()); parser = new NonExpandingParser(WARNINGS_ENABLED, GATHER_RTD, AUTO_CORRECT); } // ========================================================================= private WtNode parse(String title) throws IOException, ParseException { WtNode ast = parser.parseArticle(load(PATH + "/wikitext/" + title + ".wikitext"), title); return ast; } private String load(String path) throws IOException { InputStream in = getClass().getResourceAsStream(path); if (in == null) return null; return FileUtils.lineEndToUnix(IOUtils.toString(in, "UTF-8")); } private void doQuery(JXPathContext context, StringBuilder b, final String query) { b.append(StringUtils.strrep('-', 80)); b.append("\n "); b.append(query); b.append('\n'); b.append(StringUtils.strrep('-', 80)); b.append('\n'); int j = 1; for (Iterator<?> i = context.iterate(query); i.hasNext();) { if (j > 1) { b.append(StringUtils.strrep('-', 80)); b.append('\n'); } b.append(WtAstPrinter.print((WtNode) i.next())); b.append('\n'); ++j; } b.append(StringUtils.strrep('=', 80)); b.append('\n'); } }