You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2008/08/25 12:57:29 UTC
svn commit: r688693 [5/5] - in /servicemix/utils/trunk: ./ src/ src/main/
src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/servicemix/
src/main/java/org/apache/servicemix/components/
src/main/java/org/apache/servicem...
Added: servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/SourceTransformerTest.java
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/SourceTransformerTest.java?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/SourceTransformerTest.java (added)
+++ servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/SourceTransformerTest.java Mon Aug 25 03:57:27 2008
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.jbi.jaxp;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.dom.DOMSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import junit.framework.TestCase;
+
+public class SourceTransformerTest extends TestCase {
+
+ private SourceTransformer transformer = new SourceTransformer();
+
+ /*
+ * Test method for 'org.apache.servicemix.jbi.jaxp.SourceTransformer.toDOMNode(Source)'
+ */
+ public void testToDOMNodeSource() throws Exception {
+ Node node = transformer.toDOMNode(new StringSource(
+ "<definition xmlns:tns='http://foo.bar.com'><value>tns:bar</value></definition>"));
+
+ assertNotNull(node);
+ assertTrue(node instanceof Document);
+ Document doc = (Document) node;
+ Element e = (Element) doc.getDocumentElement().getFirstChild();
+ QName q = createQName(e, e.getFirstChild().getNodeValue());
+ assertEquals("http://foo.bar.com", q.getNamespaceURI());
+ }
+
+ public void testToDOMSourceFromStream() throws Exception {
+ DOMSource domsource = transformer.toDOMSourceFromStream(new StringSource(
+ "<definition xmlns:tns='http://foo.bar.com'><value>J�rgen</value></definition>"));
+ assertNotNull(domsource);
+ }
+
+ /**
+ * Creates a QName instance from the given namespace context for the given qualifiedName
+ *
+ * @param element the element to use as the namespace context
+ * @param qualifiedName the fully qualified name
+ * @return the QName which matches the qualifiedName
+ */
+ public static QName createQName(Element element, String qualifiedName) {
+ int index = qualifiedName.indexOf(':');
+ if (index >= 0) {
+ String prefix = qualifiedName.substring(0, index);
+ String localName = qualifiedName.substring(index + 1);
+ String uri = recursiveGetAttributeValue(element, "xmlns:" + prefix);
+ return new QName(uri, localName, prefix);
+ } else {
+ String uri = recursiveGetAttributeValue(element, "xmlns");
+ if (uri != null) {
+ return new QName(uri, qualifiedName);
+ }
+ return new QName(qualifiedName);
+ }
+ }
+
+ /**
+ * Recursive method to find a given attribute value
+ */
+ public static String recursiveGetAttributeValue(Element element, String attributeName) {
+ String answer = null;
+ try {
+ answer = element.getAttribute(attributeName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (answer == null || answer.length() == 0) {
+ Node parentNode = element.getParentNode();
+ if (parentNode instanceof Element) {
+ return recursiveGetAttributeValue((Element) parentNode, attributeName);
+ }
+ }
+ return answer;
+ }
+
+}
Added: servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java (added)
+++ servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/StaxSourceTest.java Mon Aug 25 03:57:27 2008
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.jbi.jaxp;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class StaxSourceTest extends TestCase {
+
+ private static final Log LOG = LogFactory.getLog(StaxSourceTest.class);
+
+ public void testStaxSourceOnStream() throws Exception {
+ InputStream is = getClass().getResourceAsStream("test.xml");
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
+ XMLStreamReader xsr = factory.createXMLStreamReader(is);
+ StaxSource ss = new StaxSource(xsr);
+ StringWriter buffer = new StringWriter();
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.transform(ss, new StreamResult(buffer));
+ LOG.info(buffer.toString());
+
+ /*
+ * Attribute ordering is not preserved, so we can not compare the
+ * strings
+ *
+ * is = getClass().getResourceAsStream("test.xml");
+ * ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ * FileUtil.copyInputStream(is, baos);
+ * compare(baos.toString().replaceAll("\r", ""),
+ * buffer.toString().replaceAll("\r", ""));
+ */
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ Document doc = dbf.newDocumentBuilder().parse(new ByteArrayInputStream(buffer.toString().getBytes()));
+ checkDomResult(doc);
+
+ StringWriter buffer2 = new StringWriter();
+ transformer.transform(new DOMSource(doc), new StreamResult(buffer2));
+ LOG.info(buffer2.toString());
+ }
+
+ public void testStaxSourceOnDOM() throws Exception {
+ InputStream is = getClass().getResourceAsStream("test.xml");
+ XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader(is);
+ StaxSource ss = new StaxSource(xsr);
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ DOMResult result = new DOMResult();
+ transformer.transform(ss, result);
+ assertNotNull(result.getNode());
+ checkDomResult((Document) result.getNode());
+ }
+
+ public void testStaxToDOM() throws Exception {
+ InputStream is = getClass().getResourceAsStream("test.xml");
+ XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader(is);
+ StaxSource ss = new StaxSource(xsr);
+ DOMSource src = new SourceTransformer().toDOMSource(ss);
+ assertNotNull(src);
+ assertNotNull(src.getNode());
+ checkDomResult((Document) src.getNode());
+ }
+
+ public void testEncoding() throws Exception {
+ final String msg = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><hello>���</hello>";
+ StringSource src = new StringSource(msg);
+ DOMSource dom = new SourceTransformer().toDOMSource(src);
+ StreamSource stream = new SourceTransformer().toStreamSource(dom);
+ LOG.info(new SourceTransformer().toString(stream));
+ SAXSource sax = new SourceTransformer().toSAXSource(dom);
+ LOG.info(new SourceTransformer().toString(sax));
+ }
+
+ protected void checkDomResult(Document doc) {
+ // Whitespace only elements must be preserved
+ NodeList l = doc.getElementsByTagName("child4");
+ assertEquals(1, l.getLength());
+ assertEquals(1, l.item(0).getChildNodes().getLength());
+ Text txt = (Text) l.item(0).getFirstChild();
+ assertEquals(" ", txt.getTextContent());
+
+ // Check long string
+ l = doc.getDocumentElement().getElementsByTagName("long");
+ assertEquals(1, l.getLength());
+ assertEquals(1, l.item(0).getChildNodes().getLength());
+ txt = (Text) l.item(0).getFirstChild();
+ StringBuffer expected = new StringBuffer();
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 10; j++) {
+ for (int k = 0; k < 10; k++) {
+ expected.append((char) ('0' + j));
+ expected.append((char) ('0' + k));
+ if (k != 9) {
+ expected.append(' ');
+ }
+ }
+ expected.append("\n");
+ }
+ }
+ assertEquals(expected.toString(), txt.getTextContent());
+ }
+
+ protected void compare(String s1, String s2) {
+ char[] c1 = s1.toCharArray();
+ char[] c2 = s2.toCharArray();
+ for (int i = 0; i < c1.length; i++) {
+ if (c1[i] != c2[i]) {
+ fail("Expected '" + (int) c2[i] + "' but found '" + (int) c1[i] + "' at index " + i + ". Expected '" + build(c2, i)
+ + "' but found '" + build(c1, i) + "'.");
+ }
+ }
+ }
+
+ protected String build(char[] c, int i) {
+ int min = Math.max(0, i - 10);
+ int cnt = Math.min(20, c.length - min);
+ return new String(c, min, cnt);
+ }
+
+}
Added: servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/W3CDOMStreamReaderTest.java
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/W3CDOMStreamReaderTest.java?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/W3CDOMStreamReaderTest.java (added)
+++ servicemix/utils/trunk/src/test/java/org/apache/servicemix/jbi/jaxp/W3CDOMStreamReaderTest.java Mon Aug 25 03:57:27 2008
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.jbi.jaxp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
+ * @since Oct 26, 2004
+ */
+public class W3CDOMStreamReaderTest extends AbstractStreamReaderTest {
+
+ private static final Log LOG = LogFactory.getLog(W3CDOMStreamReaderTest.class);
+
+ public void testSingleElement() throws Exception {
+ Document doc = getDocument();
+ Element e = doc.createElementNS("urn:test", "root");
+ e.setAttribute("xmlns", "urn:test");
+ doc.appendChild(e);
+
+ assertEquals(1, e.getAttributes().getLength());
+ LOG.info("start: " + XMLStreamReader.START_ELEMENT);
+ LOG.info("attr: " + XMLStreamReader.ATTRIBUTE);
+ LOG.info("ns: " + XMLStreamReader.NAMESPACE);
+ LOG.info("chars: " + XMLStreamReader.CHARACTERS);
+ LOG.info("end: " + XMLStreamReader.END_ELEMENT);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ writeXml(doc, baos);
+ LOG.info(baos.toString());
+ W3CDOMStreamReader reader = new W3CDOMStreamReader(doc.getDocumentElement());
+ testSingleElement(reader);
+ }
+
+ private Document getDocument() throws Exception {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ return factory.newDocumentBuilder().newDocument();
+ }
+
+ public void testTextChild() throws Exception {
+ Document doc = getDocument();
+ Element e = doc.createElementNS("urn:test", "root");
+ e.setAttribute("xmlns", "urn:test");
+ doc.appendChild(e);
+ Node text = doc.createTextNode("Hello World");
+ e.appendChild(text);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ writeXml(doc, baos);
+ LOG.info(baos.toString());
+
+ W3CDOMStreamReader reader = new W3CDOMStreamReader(e);
+ testTextChild(reader);
+ }
+
+ public void testMixedContent() throws Exception {
+ Document doc = getDocument();
+ Element e = doc.createElementNS("urn:test", "test:root");
+ e.setAttribute("xmlns", "urn:test");
+ doc.appendChild(e);
+ Node text = doc.createTextNode("Hello World");
+ e.appendChild(text);
+ Element child = doc.createElement("element");
+ e.appendChild(child);
+ text = doc.createTextNode(" more text");
+ e.appendChild(text);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ writeXml(doc, baos);
+ LOG.info(baos);
+
+ W3CDOMStreamReader reader = new W3CDOMStreamReader(e);
+ testMixedContent(reader);
+ }
+
+ public void testAttributes() throws Exception {
+ Document doc = getDocument();
+
+ Element e = doc.createElementNS("urn:test", "root");
+ e.setAttribute("xmlns", "urn:test");
+ doc.appendChild(e);
+ e.setAttribute("att1", "value1");
+
+ Attr attr = doc.createAttributeNS("urn:test2", "att2");
+ attr.setValue("value2");
+ attr.setPrefix("p");
+
+ e.setAttribute("xmlns:p", "urn:test2");
+
+ e.setAttributeNode(attr);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ writeXml(doc, baos);
+ LOG.info(baos.toString());
+
+ W3CDOMStreamReader reader = new W3CDOMStreamReader(doc.getDocumentElement());
+
+ testAttributes(reader);
+ }
+
+ public void testElementChild() throws Exception {
+ Document doc = getDocument();
+ Element e = doc.createElementNS("urn:test", "root");
+ e.setAttribute("xmlns", "urn:test");
+ Element child = doc.createElementNS("urn:test2", "child");
+ child.setAttribute("xmlns:a", "urn:test2");
+
+ child.setPrefix("a");
+ e.appendChild(child);
+ doc.appendChild(e);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ writeXml(doc, baos);
+ LOG.info(baos.toString());
+
+ W3CDOMStreamReader reader = new W3CDOMStreamReader(e);
+ testElementChild(reader);
+ }
+
+ protected void writeXml(Document doc, OutputStream out) throws TransformerException {
+ TransformerFactory tf = TransformerFactory.newInstance();
+ // identity
+ Transformer t = tf.newTransformer();
+ t.setOutputProperty(OutputKeys.INDENT, "yes");
+ t.transform(new DOMSource(doc), new StreamResult(out));
+ }
+}
Added: servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/csv_simplesample.csv
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/csv_simplesample.csv?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/csv_simplesample.csv (added)
+++ servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/csv_simplesample.csv Mon Aug 25 03:57:27 2008
@@ -0,0 +1,3 @@
+AA;B;CCCC
+C;BBB;AAAAA
+AA;B;C
Added: servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength.txt
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength.txt?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength.txt (added)
+++ servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength.txt Mon Aug 25 03:57:27 2008
@@ -0,0 +1,3 @@
+AABBBCCCCC
+CCBBBAAAAA
+AABBBCCCCC
Added: servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength_morecomplex.txt
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength_morecomplex.txt?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength_morecomplex.txt (added)
+++ servicemix/utils/trunk/src/test/resources/org/apache/servicemix/components/util/fixedlength_morecomplex.txt Mon Aug 25 03:57:27 2008
@@ -0,0 +1,3 @@
+01B CCCCC20070215
+02BB AAAAA
+03BBBCCCCC20070216
Added: servicemix/utils/trunk/src/test/resources/org/apache/servicemix/expression/expression-editor.xml
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/resources/org/apache/servicemix/expression/expression-editor.xml?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/resources/org/apache/servicemix/expression/expression-editor.xml (added)
+++ servicemix/utils/trunk/src/test/resources/org/apache/servicemix/expression/expression-editor.xml Mon Aug 25 03:57:27 2008
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+
+-->
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<beans>
+
+ <bean id="ExpressionTestSupport" class="org.apache.servicemix.expression.ExpressionTestSupport">
+ <property name="expression"><value>test</value></property>
+ </bean>
+</beans>
Added: servicemix/utils/trunk/src/test/resources/org/apache/servicemix/jbi/jaxp/test.xml
URL: http://svn.apache.org/viewvc/servicemix/utils/trunk/src/test/resources/org/apache/servicemix/jbi/jaxp/test.xml?rev=688693&view=auto
==============================================================================
--- servicemix/utils/trunk/src/test/resources/org/apache/servicemix/jbi/jaxp/test.xml (added)
+++ servicemix/utils/trunk/src/test/resources/org/apache/servicemix/jbi/jaxp/test.xml Mon Aug 25 03:57:27 2008
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+
+-->
+<test firstAtt="toto" secondAtt="titit" xmlns:u="uri:test3">
+ <u:hello u:id="3">world</u:hello>
+ <!-- A comment -->
+ <child xmlns="uri:test" atr1="val1" xmlns:t="uri:test2" t:atr2="val2">
+ <child2> t i u </child2>
+ <child3 xmlns=""/>
+ </child>
+ <child4> </child4>
+ <long>00 01 02 03 04 05 06 07 08 09
+10 11 12 13 14 15 16 17 18 19
+20 21 22 23 24 25 26 27 28 29
+30 31 32 33 34 35 36 37 38 39
+40 41 42 43 44 45 46 47 48 49
+50 51 52 53 54 55 56 57 58 59
+60 61 62 63 64 65 66 67 68 69
+70 71 72 73 74 75 76 77 78 79
+80 81 82 83 84 85 86 87 88 89
+90 91 92 93 94 95 96 97 98 99
+00 01 02 03 04 05 06 07 08 09
+10 11 12 13 14 15 16 17 18 19
+20 21 22 23 24 25 26 27 28 29
+30 31 32 33 34 35 36 37 38 39
+40 41 42 43 44 45 46 47 48 49
+50 51 52 53 54 55 56 57 58 59
+60 61 62 63 64 65 66 67 68 69
+70 71 72 73 74 75 76 77 78 79
+80 81 82 83 84 85 86 87 88 89
+90 91 92 93 94 95 96 97 98 99
+00 01 02 03 04 05 06 07 08 09
+10 11 12 13 14 15 16 17 18 19
+20 21 22 23 24 25 26 27 28 29
+30 31 32 33 34 35 36 37 38 39
+40 41 42 43 44 45 46 47 48 49
+50 51 52 53 54 55 56 57 58 59
+60 61 62 63 64 65 66 67 68 69
+70 71 72 73 74 75 76 77 78 79
+80 81 82 83 84 85 86 87 88 89
+90 91 92 93 94 95 96 97 98 99
+00 01 02 03 04 05 06 07 08 09
+10 11 12 13 14 15 16 17 18 19
+20 21 22 23 24 25 26 27 28 29
+30 31 32 33 34 35 36 37 38 39
+40 41 42 43 44 45 46 47 48 49
+50 51 52 53 54 55 56 57 58 59
+60 61 62 63 64 65 66 67 68 69
+70 71 72 73 74 75 76 77 78 79
+80 81 82 83 84 85 86 87 88 89
+90 91 92 93 94 95 96 97 98 99
+</long>
+</test>