diff --git a/org.springframework.oxm/oxm.iml b/org.springframework.oxm/oxm.iml index bd391080d9c..7184997150e 100644 --- a/org.springframework.oxm/oxm.iml +++ b/org.springframework.oxm/oxm.iml @@ -66,17 +66,6 @@ - - - - - - - - - - - diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java index 74ff29b371d..4311d63e74f 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,22 @@ package org.springframework.oxm.castor; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.stream.StreamResult; -import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertTrue; +import org.custommonkey.xmlunit.NamespaceContext; +import org.custommonkey.xmlunit.SimpleNamespaceContext; +import org.custommonkey.xmlunit.XMLUnit; +import org.custommonkey.xmlunit.XpathEngine; +import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -28,11 +39,68 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.oxm.AbstractMarshallerTests; import org.springframework.oxm.Marshaller; +import static org.custommonkey.xmlunit.XMLAssert.*; +import static org.easymock.EasyMock.*; + /** + * Tests the {@link CastorMarshaller} class. + * * @author Arjen Poutsma + * @author Jakub Narloch */ public class CastorMarshallerTests extends AbstractMarshallerTests { + /** + * Represents the expected result that doesn't contain the xml declaration. + */ + private static final String DOCUMENT_EXPECTED_STRING = "" + + "" + + "42"; + + /** + * Represents the expected result that doesn't contain the xml namespaces. + */ + private static final String SUPPRESSED_NAMESPACE_EXPECTED_STRING = + "42"; + + /** + * Represents the expected result with modified root element name. + */ + private static final String ROOT_ELEMENT_EXPECTED_STRING = "" + + "" + + "42"; + + /** + * Represents the expected result with 'xsi:type' attribute. + */ + private static final String XSI_EXPECTED_STRING = "" + + "" + + "test8"; + + /** + * Represents the expected result with suppressed 'xsi:type' attribute. + */ + private static final String SUPPRESSED_XSI_EXPECTED_STRING = "" + + "test8"; + + /** + * Represents the expected result with 'xsi:type' attribute for root element. + */ + private static final String ROOT_WITH_XSI_EXPECTED_STRING = "" + + "" + + "" + + "test8"; + + /** + * Represents the expected result without 'xsi:type' attribute for root element. + */ + private static final String ROOT_WITHOUT_XSI_EXPECTED_STRING = "" + + "" + + "test8"; + @Override protected Marshaller createMarshaller() throws Exception { CastorMarshaller marshaller = new CastorMarshaller(); @@ -77,8 +145,185 @@ public class CastorMarshallerTests extends AbstractMarshallerTests { @Test public void supports() throws Exception { - assertTrue("CastorMarshaller does not support Flights", marshaller.supports(Flights.class)); - assertTrue("CastorMarshaller does not support Flight", marshaller.supports(Flight.class)); + Assert.assertTrue("CastorMarshaller does not support Flights", marshaller.supports(Flights.class)); + Assert.assertTrue("CastorMarshaller does not support Flight", marshaller.supports(Flight.class)); } + /** + * Tests the marshal result when the {@link CastorMarshaller#setSuppressNamespaces(boolean)} is set to + * true. + * + * @throws Exception if any error occurs during test + */ + @Test + public void testSuppressNamespacesTrue() throws Exception { + getCastorMarshaller().setSuppressNamespaces(true); + String result = marshalFlights(); + assertXMLEqual("Marshaller wrote invalid result", SUPPRESSED_NAMESPACE_EXPECTED_STRING, result); + } + + /** + * Tests the marshal result when the {@link CastorMarshaller#setSuppressNamespaces(boolean)} is set to + * false. + * + * @throws Exception if any error occurs during test + */ + @Test + public void testSuppressNamespacesFalse() throws Exception { + getCastorMarshaller().setSuppressNamespaces(false); + String result = marshalFlights(); + assertXMLEqual("Marshaller wrote invalid result", EXPECTED_STRING, result); + } + + @Test + @Ignore("Not working yet") + public void testSuppressXsiTypeTrue() throws Exception { + CastorObject castorObject = createCastorObject(); + + getCastorMarshaller().setSuppressXsiType(true); + getCastorMarshaller().setRootElement("objects"); + String result = marshal(Arrays.asList(castorObject)); + assertXMLEqual("Marshaller wrote invalid result", SUPPRESSED_XSI_EXPECTED_STRING, result); + } + + @Test + @Ignore("Not working yet") + public void testSuppressXsiTypeFalse() throws Exception { + CastorObject castorObject = createCastorObject(); + + getCastorMarshaller().setSuppressXsiType(false); + getCastorMarshaller().setRootElement("objects"); + String result = marshal(Arrays.asList(castorObject)); + assertXMLEqual("Marshaller wrote invalid result", XSI_EXPECTED_STRING, result); + } + + @Test + public void testMarshalAsDocumentTrue() throws Exception { + + getCastorMarshaller().setMarshalAsDocument(true); + String result = marshalFlights(); + assertXMLEqual("Marshaller wrote invalid result", DOCUMENT_EXPECTED_STRING, result); + Assert.assertTrue("Result doesn't contain xml declaration.", + result.contains("")); + } + + @Test + public void testMarshalAsDocumentFalse() throws Exception { + + getCastorMarshaller().setMarshalAsDocument(true); + String result = marshalFlights(); + assertXMLEqual("Marshaller wrote invalid result", EXPECTED_STRING, result); + Assert.assertFalse("Result contains xml declaration.", result.matches("<\\?\\s*xml")); + } + + @Test + public void testRootElement() throws Exception { + + getCastorMarshaller().setRootElement("canceledFlights"); + String result = marshalFlights(); + assertXMLEqual("Marshaller wrote invalid result", ROOT_ELEMENT_EXPECTED_STRING, result); + } + + @Test + public void testNoNamespaceSchemaLocation() throws Exception { + String noNamespaceSchemaLocation = "flights.xsd"; + + getCastorMarshaller().setNoNamespaceSchemaLocation(noNamespaceSchemaLocation); + String result = marshalFlights(); + + assertXpathEvaluatesTo("The xsi:noNamespaceSchemaLocation hasn't been written or has invalid value.", + noNamespaceSchemaLocation, "/tns:flights/@xsi:noNamespaceSchemaLocation", result); + assertXMLEqual("Marshaller wrote invalid result", EXPECTED_STRING, result); + } + + @Test + public void testSchemaLocation() throws Exception { + String schemaLocation = "flights.xsd"; + + getCastorMarshaller().setSchemaLocation(schemaLocation); + String result = marshalFlights(); + + assertXpathEvaluatesTo("The xsi:noNamespaceSchemaLocation hasn't been written or has invalid value.", + schemaLocation, "/tns:flights/@xsi:schemaLocation", result); + assertXMLEqual("Marshaller wrote invalid result", EXPECTED_STRING, result); + } + + @Test + @Ignore("Not working yet") + public void testUseXsiTypeAsRootTrue() throws Exception { + CastorObject castorObject = createCastorObject(); + + getCastorMarshaller().setSuppressXsiType(false); + getCastorMarshaller().setUseXSITypeAtRoot(true); + getCastorMarshaller().setRootElement("objects"); + String result = marshal(Arrays.asList(castorObject)); + assertXMLEqual("Marshaller wrote invalid result", ROOT_WITH_XSI_EXPECTED_STRING, result); + } + + @Test + @Ignore("Not working yet") + public void testUseXsiTypeAsRootFalse() throws Exception { + CastorObject castorObject = createCastorObject(); + + getCastorMarshaller().setSuppressXsiType(false); + getCastorMarshaller().setUseXSITypeAtRoot(false); + getCastorMarshaller().setRootElement("objects"); + String result = marshal(Arrays.asList(castorObject)); + assertXMLEqual("Marshaller wrote invalid result", ROOT_WITHOUT_XSI_EXPECTED_STRING, result); + } + + + private CastorMarshaller getCastorMarshaller() { + return (CastorMarshaller) marshaller; + } + + private String marshal(Object object) throws Exception { + + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + getCastorMarshaller().marshal(object, result); + + return writer.toString(); + } + + private String marshalFlights() throws Exception { + return marshal(flights); + } + + /** + * Asserts the values of xpath expression evaluation is exactly the same as expected value.

The xpath may contain + * the xml namespace prefixes, since namespaces from flight example are being registered. + * + * @param msg the error message that will be used in case of test failure + * @param expected the expected value + * @param xpath the xpath to evaluate + * @param xmlDoc the xml to use + * @throws Exception if any error occurs during xpath evaluation + */ + private void assertXpathEvaluatesTo(String msg, String expected, String xpath, String xmlDoc) throws Exception { + Map namespaces = new HashMap(); + namespaces.put("tns", "http://samples.springframework.org/flight"); + namespaces.put("xsi", "http://www.w3.org/2001/XMLSchema-instance"); + + NamespaceContext ctx = new SimpleNamespaceContext(namespaces); + XpathEngine engine = XMLUnit.newXpathEngine(); + engine.setNamespaceContext(ctx); + + Document doc = XMLUnit.buildControlDocument(xmlDoc); + NodeList node = engine.getMatchingNodes(xpath, doc); + + assertEquals(msg, expected, node.item(0).getNodeValue()); + } + + /** + * Creates a instance of {@link CastorObject} for testing. + * + * @return a instance of {@link CastorObject} + */ + private CastorObject createCastorObject() { + CastorObject castorObject = new CastorObject(); + castorObject.setName("test"); + castorObject.setValue(8); + return castorObject; + } } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorObject.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorObject.java new file mode 100644 index 00000000000..f03e258c066 --- /dev/null +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorObject.java @@ -0,0 +1,33 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * 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.springframework.oxm.castor; + +/** @author Arjen Poutsma */ +public class CastorObject { + + private String name; + + private int value; + + public void setName(String name) { + this.name = name; + } + + public void setValue(int value) { + this.value = value; + } +} diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java index 33bb1a40719..6ef41962f7c 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,18 +21,39 @@ import java.io.IOException; import java.io.StringReader; import javax.xml.transform.stream.StreamSource; -import static org.junit.Assert.*; +import org.junit.Ignore; import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.oxm.AbstractUnmarshallerTests; +import org.springframework.oxm.MarshallingException; import org.springframework.oxm.Unmarshaller; +import static org.junit.Assert.*; + /** + * Tests the {@link CastorMarshaller} class. + * * @author Arjen Poutsma + * @author Jakub Narloch */ public class CastorUnmarshallerTests extends AbstractUnmarshallerTests { + /** + * Represents the xml with additional attribute that is not mapped in Castor config. + */ + protected static final String EXTRA_ATTRIBUTES_STRING = + "" + + "42"; + + /** + * Represents the xml with additional element that is not mapped in Castor config. + */ + protected static final String EXTRA_ELEMENTS_STRING = + "" + + "422011-06-14" + + ""; + @Override protected void testFlights(Object o) { Flights flights = (Flights) o; @@ -89,5 +110,105 @@ public class CastorUnmarshallerTests extends AbstractUnmarshallerTests { assertEquals("Invalid items", 20, (int)item.getQuantity()); } + @Test + public void testWhitespacePreserveTrue() throws Exception { + getCastorUnmarshaller().setWhitespacePreserve(true); + Object result = unmarshalFlights(); + testFlights(result); + } + + @Test + public void testWhitespacePreserveFalse() throws Exception { + + getCastorUnmarshaller().setWhitespacePreserve(false); + Object result = unmarshalFlights(); + testFlights(result); + } + + @Test + public void testIgnoreExtraAttributesTrue() throws Exception { + + getCastorUnmarshaller().setIgnoreExtraAttributes(true); + Object result = unmarshal(EXTRA_ATTRIBUTES_STRING); + testFlights(result); + } + + @Test(expected = MarshallingException.class) + public void testIgnoreExtraAttributesFalse() throws Exception { + + getCastorUnmarshaller().setIgnoreExtraAttributes(false); + unmarshal(EXTRA_ATTRIBUTES_STRING); + } + + @Test + @Ignore("Not working yet") + public void testIgnoreExtraElementsTrue() throws Exception { + + getCastorUnmarshaller().setIgnoreExtraElements(true); + getCastorUnmarshaller().setValidating(false); + Object result = unmarshal(EXTRA_ELEMENTS_STRING); + testFlights(result); + } + + @Test(expected = MarshallingException.class) + public void testIgnoreExtraElementsFalse() throws Exception { + + getCastorUnmarshaller().setIgnoreExtraElements(false); + unmarshal(EXTRA_ELEMENTS_STRING); + } + + @Test + public void testObject() throws Exception { + + Flights flights = new Flights(); + getCastorUnmarshaller().setObject(flights); + Object result = unmarshalFlights(); + + testFlights(result); + assertSame("Result Flights is different object.", flights, result); + } + + @Test + public void testClearCollectionsTrue() throws Exception { + + Flights flights = new Flights(); + flights.setFlight(new Flight[]{new Flight()}); + getCastorUnmarshaller().setObject(flights); + getCastorUnmarshaller().setClearCollections(true); + Object result = unmarshalFlights(); + + assertSame("Result Flights is different object.", flights, result); + assertEquals("Result Flights has incorrect number of Flight.", 1, ((Flights) result).getFlightCount()); + testFlights(result); + } + + @Test + public void testClearCollectionsFalse() throws Exception { + + Flights flights = new Flights(); + flights.setFlight(new Flight[]{new Flight(), null}); + getCastorUnmarshaller().setObject(flights); + getCastorUnmarshaller().setClearCollections(false); + Object result = unmarshalFlights(); + + assertSame("Result Flights is different object.", flights, result); + assertEquals("Result Flights has incorrect number of Flight.", 3, ((Flights) result).getFlightCount()); + assertNull("Flight shouldn't have number.", flights.getFlight(0).getNumber()); + assertNull("Null Flight was expected.", flights.getFlight()[1]); + testFlight(flights.getFlight()[2]); + } + + private CastorMarshaller getCastorUnmarshaller() { + return (CastorMarshaller) unmarshaller; + } + + private Object unmarshalFlights() throws Exception { + return unmarshal(INPUT_STRING); + } + + private Object unmarshal(String xml) throws Exception { + StreamSource source = new StreamSource(new StringReader(xml)); + return unmarshaller.unmarshal(source); + } }