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>