001 /*
002 * Copyright 2002 - 2010 JEuclid, http://jeuclid.sf.net
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 /* $Id: DOMBuilderTest.java,v 92b6a7c39d7f 2010/08/11 20:23:17 max $ */
018
019 package net.sourceforge.jeuclid.test;
020
021 import java.io.StringReader;
022
023 import javax.xml.parsers.DocumentBuilderFactory;
024
025 import net.sourceforge.jeuclid.DOMBuilder;
026 import net.sourceforge.jeuclid.elements.AbstractJEuclidElement;
027 import net.sourceforge.jeuclid.elements.presentation.token.Mspace;
028
029 import org.junit.Assert;
030 import org.junit.Test;
031 import org.w3c.dom.Document;
032 import org.w3c.dom.DocumentFragment;
033 import org.w3c.dom.Node;
034 import org.w3c.dom.mathml.MathMLPresentationToken;
035 import org.xml.sax.InputSource;
036
037 /**
038 * A JUnit test for DOMBuilder; in particular, the sources it can take as input.
039 *
040 * @version $Revision: 92b6a7c39d7f $
041 */
042 public class DOMBuilderTest {
043
044 private final DocumentBuilderFactory documentBuilderFactory;
045
046 /**
047 * Initialize test.
048 */
049 public DOMBuilderTest() {
050 this.documentBuilderFactory = DocumentBuilderFactory.newInstance();
051 this.documentBuilderFactory.setNamespaceAware(true);
052 this.documentBuilderFactory.setValidating(false);
053 }
054
055 /**
056 * Tests if DOM can be constructed manually.
057 *
058 * @throws Exception
059 * if the test fails.
060 */
061 @Test
062 public void testConstructor() throws Exception {
063 final Document doc = this.parse("<math><mn>1</mn></math>");
064 final Document jdoc = DOMBuilder.getInstance().createJeuclidDom(doc);
065 final Node firstChild = jdoc.getFirstChild();
066 Assert.assertEquals(firstChild.getNodeName(), "math");
067 Assert.assertEquals(firstChild.getFirstChild().getNodeName(), "mn");
068 final DocumentFragment documentFragment = doc.createDocumentFragment();
069 documentFragment.appendChild(doc.createElement(Mspace.ELEMENT));
070 Assert.assertEquals(DOMBuilder.getInstance().createJeuclidDom(
071 documentFragment).getFirstChild().getNodeName(), "mspace");
072 try {
073 DOMBuilder.getInstance().createJeuclidDom(
074 doc.getDocumentElement().getFirstChild().getFirstChild());
075 Assert.fail("Expected IllegalArgumentException");
076 } catch (final IllegalArgumentException e) {
077 }
078 }
079
080 private Document parse(final String text) throws Exception {
081 return this.documentBuilderFactory.newDocumentBuilder().parse(
082 new InputSource(new StringReader(text)));
083 }
084
085 /**
086 * Tests for namespace issues with manual element construction in default
087 * namespace.
088 *
089 * @throws Exception
090 * if the test fails.
091 */
092 @Test
093 public void testConstructionNSDefault() throws Exception {
094 final Document doc = this.parse("<math></math>");
095 final Document jdoc = DOMBuilder.getInstance().createJeuclidDom(doc);
096 final Node mathNode = jdoc.getFirstChild();
097 Assert.assertEquals(mathNode.getNodeName(), "math");
098 Assert.assertEquals(mathNode.getNamespaceURI(),
099 AbstractJEuclidElement.URI);
100 final MathMLPresentationToken mn = (MathMLPresentationToken) mathNode
101 .getOwnerDocument().createElement("mn");
102 mn.setTextContent("1");
103 mathNode.appendChild(mn);
104 Assert.assertSame(mn.getOwnerDocument(), mathNode.getOwnerDocument());
105 Assert.assertSame(mn.getOwnerMathElement(), mathNode);
106 Assert.assertEquals(mn.getNamespaceURI(), AbstractJEuclidElement.URI);
107 }
108
109 /**
110 * Tests for namespace issues with manual element construction in mml
111 * namespace.
112 *
113 * @throws Exception
114 * if the test fails.
115 */
116 @Test
117 public void testConstructionNSMml() throws Exception {
118 final Document doc = this.parse("<mml:math "
119 + "xmlns:mml='http://www.w3.org/1998/Math/MathML' "
120 + "xmlns='http://bla'></mml:math>");
121 final Document jdoc = DOMBuilder.getInstance().createJeuclidDom(doc);
122 final Node mathNode = jdoc.getFirstChild();
123 Assert.assertEquals(mathNode.getNodeName(), "mml:math");
124 Assert.assertEquals(mathNode.getLocalName(), "math");
125 Assert.assertEquals(mathNode.getNamespaceURI(),
126 AbstractJEuclidElement.URI);
127 final MathMLPresentationToken mn = (MathMLPresentationToken) mathNode
128 .getOwnerDocument().createElement("mn");
129 mn.setTextContent("1");
130 mathNode.appendChild(mn);
131 Assert.assertSame(mn.getOwnerDocument(), mathNode.getOwnerDocument());
132 Assert.assertSame(mn.getOwnerMathElement(), mathNode);
133 Assert.assertEquals(mn.getNamespaceURI(), AbstractJEuclidElement.URI);
134 }
135
136 }