blob: 7ae53af4e59003ae8f1d64a3b899d064cb6f840d [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 scomp.contentType.simple.detailed;
import org.apache.xmlbeans.XmlErrorCodes;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException;
import org.junit.Test;
import scomp.common.BaseCase;
import xbean.scomp.contentType.union.UnionEltDocument;
import xbean.scomp.contentType.union.UnionOfListsDocument;
import xbean.scomp.contentType.union.UnionOfUnionsDocument;
import xbean.scomp.contentType.union.UnionOfUnionsT;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
public class UnionType extends BaseCase {
/**
* should be a bunch of negative cases at compile time
*/
@Test
public void testUnionType() throws Throwable {
UnionEltDocument doc = UnionEltDocument.Factory.newInstance();
assertNull(doc.getUnionElt());
doc.setUnionElt("small");
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
doc.setUnionElt(2);
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
doc.setUnionElt(-2);
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
doc.setUnionElt(5);
assertTrue(!doc.validate(validateOptions));
showErrors();
String[] errExpected = new String[]{
XmlErrorCodes.DATATYPE_VALID$UNION};
assertTrue(compareErrorCodes(errExpected));
}
/**
* valid instance w/ xsi:type hint
*/
@Test
public void testParseInstanceValid() throws Throwable {
String input =
"<UnionElt xmlns=\"http://xbean/scomp/contentType/Union\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
" xsi:type=\"GlobalSimpleT2\">" +
"-2" +
"</UnionElt>";
UnionEltDocument doc = UnionEltDocument.Factory.parse(input);
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
}
/**
* invalid instance w/ xsi:type hint
*/
@Test
public void testParseInstanceInvalid() throws Throwable {
String input =
"<UnionElt xmlns=\"http://xbean/scomp/contentType/Union\"" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
" xsi:type=\"GlobalSimpleT1\">" +
"-2" +
"</UnionElt>";
UnionEltDocument doc = UnionEltDocument.Factory.parse(input);
assertTrue(!doc.validate(validateOptions));
showErrors();
String[] errExpected = new String[]{
XmlErrorCodes.DATATYPE_MIN_EXCLUSIVE_VALID};
assertTrue(compareErrorCodes(errExpected));
}
/**
* Specifiying value for a union that is not part of the consitituent types. The constituent types in this schema
* are enumerations and not basic XmlSchema types and hence get translated into enum types in the XmlObjects
*/
@Test
public void testUnionOfUnions() throws Throwable {
UnionOfUnionsDocument doc = UnionOfUnionsDocument.Factory.newInstance();
doc.setUnionOfUnions("large");
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
UnionOfUnionsT elt = UnionOfUnionsT.Factory.newInstance();
elt.setObjectValue(-3);
doc.xsetUnionOfUnions(elt);
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
doc.setUnionOfUnions("addVal1");
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
doc.setUnionOfUnions("addVal2");
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
doc.setUnionOfUnions("addVal4");
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
// setting a value outside of the union should throw an exception as
// type inside the Xmlobject is an enumeration and has a fixed number of constants in the type
// This will fail irrespective of the setValidateOnSet() option
boolean voeThrown = false;
try
{
doc.setUnionOfUnions("foobar");
assertTrue(!doc.validate(validateOptions));
showErrors();
String[] errExpected = new String[]{"cvc-attribute"};
assertTrue(compareErrorCodes(errExpected));
}
catch (XmlValueOutOfRangeException voe)
{
voeThrown = true;
}
finally
{
if(!voeThrown)
fail("Expected XmlValueOutOfRangeException here");
}
}
// for the above test (testUnionOfUnions), if the value set for the union type is AnyType (in the schema)
// but the Java type defined as say Integer or Date then an Exception should be thrown only if
// validateOnSet XmlOption is set and not otherwise.
@Test
public void UnionOfUnions2()
{
UnionOfUnionsDocument doc = UnionOfUnionsDocument.Factory.newInstance();
doc.setUnionOfUnions("4");
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
}
// now validate with setValidateOnSetoption
XmlOptions optWithValidateOnSet = new XmlOptions();
optWithValidateOnSet.setValidateOnSet();
UnionOfUnionsDocument doc2 = UnionOfUnionsDocument.Factory.newInstance(optWithValidateOnSet);
boolean voeThrown = false;
try {
doc2.setUnionOfUnions("4");
}
catch (XmlValueOutOfRangeException voe) {
voeThrown = true;
}
finally{
if(!voeThrown)
fail("Expected XmlValueOutOfRangeException..");
}
}
/**
* values allolwed here are either a list of (small, med, large, 1-3,-1,-2,-3}
* or (lstsmall, lstmed, lstlarge)
*/
@Test
public void testUnionOfLists() throws Throwable {
UnionOfListsDocument doc = UnionOfListsDocument.Factory.newInstance();
List vals = new ArrayList();
vals.add("small");
vals.add(-1);
vals.add(-2);
vals.add(-3);
vals.add(3);
vals.add("medium");
doc.setUnionOfLists(vals);
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
vals.clear();
vals.add("lstsmall");
vals.add("lstlarge");
doc.setUnionOfLists(vals);
try {
assertTrue(doc.validate(validateOptions));
}
catch (Throwable t) {
showErrors();
throw t;
}
vals.clear();
//mixing and matching should not be allowed
//the list shoudl have exactly one of the 2 union types
vals.add("lstsmall");
vals.add(new Integer(-1));
// if the type in a union and cannot be converted into any of the union types, and in this case
// since the list have enumerations, an exception is expected irrespective of validateOnSet XmlOption
// being set. Refer testUnionOfUnions comment also
boolean voeThrown = false;
try{
doc.setUnionOfLists( vals );
}
catch (XmlValueOutOfRangeException voe){
voeThrown = true;
}
finally{
if(!voeThrown)
fail("Expected XmlValueOutOfRangeException here");
}
}
}