blob: 468456ba6ffcfa15621284381f13cb2c18333ca0 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* 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 xmlcursor.detailed;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlCursor.TokenType;
import org.apache.xmlbeans.XmlObject;
import org.junit.Test;
import test.xbean.xmlcursor.purchaseOrder.PurchaseOrderDocument;
import test.xbean.xmlcursor.purchaseOrder.PurchaseOrderType;
import test.xbean.xmlcursor.purchaseOrder.USAddress;
import tools.util.JarUtil;
import xmlcursor.common.BasicCursorTestCase;
import xmlcursor.common.Common;
import java.math.BigDecimal;
import static org.junit.Assert.*;
public class CursorLocations extends BasicCursorTestCase {
private Bookmark0 _theBookmark0 = new Bookmark0("value0");
@Test(expected = IllegalArgumentException.class)
public void testLocation() throws Exception {
XmlCursor xc1, xc2, xc3, xc4;
XmlObject m_xo1;
m_xo = XmlObject.Factory.parse(
JarUtil.getResourceFromJar(Common.TRANXML_FILE_XMLCURSOR_PO));
m_xo1 = XmlObject.Factory.parse(Common.XML_FOO_BAR_TEXT);
xc1 = m_xo.newCursor();
xc2 = m_xo.newCursor();
xc3 = m_xo1.newCursor();
toNextTokenOfType(xc2, TokenType.END);
toNextTokenOfType(xc3, TokenType.START);
//start w/ xc1 at beg of doc
//xc2 at end of first elt (po:name)
while (xc1.isLeftOf(xc2)) {
assertFalse(xc1.isRightOf(xc2));
assertTrue(xc2.isRightOf(xc1));
assertTrue(xc1.isInSameDocument(xc2));
assertFalse(xc2.isAtSamePositionAs(xc1));
assertFalse(xc1.isAtSamePositionAs(xc2));
assertEquals(1, xc2.comparePosition(xc1));
assertEquals(-1, xc1.comparePosition(xc2));
// System.out.println(xc1.currentTokenType() + " " + xc2.currentTokenType());
xc1.toNextToken();
xc2.toPrevToken();
}
//xc1 & xc2 @ shipTo
toNextTokenOfType(xc1,TokenType.TEXT);
toNextTokenOfType(xc2,TokenType.TEXT);
assertEquals("Current Token Type ",
xc1.currentTokenType(),
xc2.currentTokenType());
//both @ Alice Smith
toNextTokenOfType(xc1,TokenType.TEXT);
toNextTokenOfType(xc2,TokenType.TEXT);
assertEquals(XmlCursor.TokenType.TEXT,
xc1.currentTokenType());
//these are only equivalent if the cursor is on a TEXT token
assertEquals(xc1.getChars(), xc1.getTextValue());
assertEquals(xc1.getChars(), xc2.getTextValue());
assertTrue(xc1.isAtSamePositionAs(xc2));
xc2.toNextChar(10);
//comparing two cursors in the middle of text
assertEquals(xc2.toPrevChar(4), xc1.toNextChar(4));
assertTrue(xc2.isRightOf(xc1));
assertFalse(xc1.isRightOf(xc2));
assertFalse(xc2.isLeftOf(xc1));
assertFalse(xc1.isAtSamePositionAs(xc2));
assertEquals(1, xc2.comparePosition(xc1));
assertTrue(xc1.isInSameDocument(xc2));
xc1.toNextChar(2);
assertEquals(0, xc2.comparePosition(xc1));
assertEquals(xc1.currentTokenType(), xc2.currentTokenType());
//Comparing the same cursor to itself
xc1.toNextChar(1);
assertFalse(xc1.isRightOf(xc1));
assertEquals(0, xc2.comparePosition(xc2));
assertTrue(xc2.isInSameDocument(xc2));
assertTrue(xc2.isAtSamePositionAs(xc2));
xc2.toPrevToken();
//xc2 on Alice
assertEquals(TokenType.TEXT, xc2.toPrevToken());
//put the bookmark on S*mith
xc1.setBookmark(_theBookmark0);
//moving xml and bookmark to a
// different location
assertTrue(xc1.moveXml(xc3));
xc4 = _theBookmark0.createCursor();
assertNotNull(xc4);
XmlCursor debug=xc4.newCursor();
XmlCursor debug1=xc1.newCursor();
toPrevTokenOfType(debug1,TokenType.START);
assertTrue(xc4.isInSameDocument(xc3));
assertEquals(-1, xc4.comparePosition(xc3));
// assertEquals(TokenType.TEXT, xc3.toPrevToken());
assertEquals(4,xc3.toPrevChar(4));
assertEquals(0, xc4.comparePosition(xc3));
//comparing in two different documents
assertFalse(xc2.isInSameDocument(xc3));
try {
xc4.isLeftOf(xc2);
} finally {
xc1.dispose();
xc2.dispose();
xc3.dispose();
xc4.dispose();
}
}
@Test
public void testLocationATTR() throws Exception {
XmlCursor xc1, xc2;
m_xo = XmlObject.Factory.parse(Common.XML_FOO_5ATTR_TEXT);
xc1 = m_xo.newCursor();
xc2 = m_xo.newCursor();
toNextTokenOfType(xc1, TokenType.ATTR);
toNextTokenOfType(xc2, TokenType.ATTR);
int i = 0;
while (xc2.currentTokenType() == TokenType.ATTR) {
xc2.toNextToken();
++i;
}
assertEquals(5, i);
xc2.toPrevToken();
//moving betweenAttributes. one cursor is at the last ATTR and other is at first ATTR.
while (xc1.isLeftOf(xc2)) {
assertFalse(xc1.isRightOf(xc2));
assertTrue(xc2.isRightOf(xc1));
assertTrue(xc1.isInSameDocument(xc2));
assertFalse(xc2.isAtSamePositionAs(xc1));
assertFalse(xc1.isAtSamePositionAs(xc2));
assertEquals(1, xc2.comparePosition(xc1));
assertEquals(-1, xc1.comparePosition(xc2));
// System.out.println(xc1.currentTokenType() + " " + xc2.currentTokenType());
xc1.toNextToken();
xc2.toPrevToken();
}
assertTrue(xc1.isAtSamePositionAs(xc2));
//inserting and then comparing to make sure cursors move properly.
xc2.insertAttributeWithValue("attr5", "val5");
assertEquals(0, xc1.comparePosition(xc2));
xc2.toPrevToken();
assertEquals("val5", xc2.getTextValue());
xc1.dispose();
xc2.dispose();
}
@Test
public void testLocationTEXTMiddle() throws Exception {
XmlCursor xc1, xc2, xc3;
m_xo = XmlObject.Factory.parse(Common.XML_TEXT_MIDDLE);
xc1 = m_xo.newCursor();
xc2 = m_xo.newCursor();
xc3 = m_xo.newCursor();
// while(xc2.currentTokenType() != TokenType.ENDDOC)
// {
// System.out.println(xc2.currentTokenType());
// xc2.toNextToken();
// }
// moving cursor to right locations. one is in middle of mixed content.
// the others is in middle of text of first node and last node
toNextTokenOfType(xc1, TokenType.TEXT);
toNextTokenOfType(xc2, TokenType.TEXT);
toNextTokenOfType(xc3, TokenType.START);
toNextTokenOfType(xc2, TokenType.TEXT);
xc1.toNextChar(4);
xc2.toNextChar(5);
xc3.toEndToken();
xc3.toPrevToken();
xc3.toPrevChar(3);
//comparing positions
assertEquals(-1, xc2.comparePosition(xc3));
assertTrue(xc2.isRightOf(xc1));
assertTrue(xc1.isInSameDocument(xc2));
assertFalse(xc2.isAtSamePositionAs(xc3));
//moving cursors
xc3.toPrevChar(2);
xc2.toNextChar(1);
//comparing position once again
assertEquals(-1, xc2.comparePosition(xc3));
assertTrue(xc2.isRightOf(xc1));
assertTrue(xc1.isInSameDocument(xc2));
assertFalse(xc2.isAtSamePositionAs(xc3));
//moving and bringing them to identical positions
xc3.toPrevToken();
xc2.toNextChar(2);
assertTrue(xc2.isAtSamePositionAs(xc3));
xc1.dispose();
xc2.dispose();
xc3.dispose();
}
@Test
public void testXmlObjectUsingCursor() throws Exception {
XmlCursor xc1, xc2, xc3;
PurchaseOrderDocument pod = PurchaseOrderDocument.Factory.parse(
JarUtil.getResourceFromJar(Common.TRANXML_FILE_XMLCURSOR_PO));
xc1 = pod.newCursor();
xc2 = pod.newCursor();
xc3 = pod.newCursor();
//moving cursor location so that it comes to zip under shipto
toNextTokenOfType(xc1, TokenType.START);
toNextTokenOfType(xc1, TokenType.START);
toNextTokenOfType(xc2, TokenType.START);
toNextTokenOfType(xc2, TokenType.START);
toNextTokenOfType(xc3, TokenType.START);
toNextTokenOfType(xc3, TokenType.START);
xc1.toEndToken();
xc2.toEndToken();
xc3.toEndToken();
toPrevTokenOfType(xc1, TokenType.TEXT);
toPrevTokenOfType(xc1, TokenType.TEXT);
toPrevTokenOfType(xc2, TokenType.TEXT);
toPrevTokenOfType(xc2, TokenType.TEXT);
toPrevTokenOfType(xc3, TokenType.TEXT);
toPrevTokenOfType(xc3, TokenType.TEXT);
//all cursors are now at: 90952
assertEquals(xc1.getChars(), xc2.getChars(), xc3.getChars());
//at 52
xc2.toNextChar(3);
//after 90952
xc3.toNextChar(5);
assertFalse(xc2.isAtSamePositionAs(xc3));
assertFalse(xc3.isAtSamePositionAs(xc1));
//setting zip value through the object .
// once the set occurs comparing postions of cursors.
PurchaseOrderType pt = pod.getPurchaseOrder();
USAddress usa = pt.getShipTo();
usa.setZip(new BigDecimal(500));
assertEquals(500,usa.getZip().intValue());
//Any cursors in the value of an Element/attr should be positioned
// at the end of the elem/attr after the strong setter
assertTrue(xc2.isAtSamePositionAs(xc3));
assertTrue(xc3.isAtSamePositionAs(xc1));
assertEquals(TokenType.END,xc1.currentTokenType());
// inserting an element through the cursor under zip and then doing
// a set of a valid value through object..
xc1.insertElementWithText("foo", "text");
toPrevTokenOfType(xc1, TokenType.START);
toPrevTokenOfType(xc1, TokenType.START);
//System.out.println("here" + xc1.getTextValue());
toNextTokenOfType(xc1, TokenType.START);
xc1.toNextChar(2);
usa.setZip(new BigDecimal(90852));
assertTrue(xc2.isAtSamePositionAs(xc3));
assertTrue(xc3.isAtSamePositionAs(xc1));
//cursors at the end of element
xc1.toPrevToken();
//assertEquals(5,xc1.toPrevChar(5));
assertEquals("90852", xc1.getChars());
xc1.dispose();
xc2.dispose();
xc3.dispose();
}
public class Bookmark0 extends XmlCursor.XmlBookmark {
public String text;
Bookmark0(String text) {
this.text = text;
}
}
}