--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/8037819/RootTypeDefinitionTest.java Fri Aug 29 11:59:34 2014 -0700
@@ -0,0 +1,235 @@
+/*
+ * 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.
+ */
+
+import javax.xml.namespace.QName;
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class RootTypeDefinitionTest extends BaseTest {
+ private QName unknownType;
+
+ private QName typeX;
+
+ private QName typeY;
+
+ private QName typeZ;
+
+ private QName typeOtherNamespace;
+
+ private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
+
+ private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
+
+ protected String getXMLDocument() {
+ return "base.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
+ }
+
+ public RootTypeDefinitionTest(String name) {
+ super(name);
+ unknownType = new QName("W");
+ typeX = new QName("X");
+ typeY = new QName("Y");
+ typeZ = new QName("Z");
+ typeOtherNamespace = new QName("xslt.unittests", "W", "unit");
+ }
+
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefault() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSettingNull() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, null);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSettingToUnknownType() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, unknownType);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertError(UNKNOWN_TYPE_ERROR);
+ checkDefault();
+ }
+
+ @Test
+ public void testSettingToEqualType() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, typeX);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingToDerivedType() {
+ try {
+ reset();
+ // this is required to make it a valid type Y node
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
+ fValidator.setProperty(ROOT_TYPE, typeY);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingToNonDerivedType() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, typeZ);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Z", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingToOtherSchemaType() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
+ SchemaSymbols.XSI_SCHEMALOCATION,
+ "xslt.unittests otherNamespace.xsd");
+ fValidator.setProperty(ROOT_TYPE, typeOtherNamespace);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("W", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespace("xslt.unittests", fRootNode.getTypeDefinition()
+ .getNamespace());
+ }
+
+ @Test
+ public void testSettingTypeAndXSIType() {
+ try {
+ reset();
+ // this is required to make it a valid type Y node
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
+ SchemaSymbols.XSI_TYPE, "Y");
+ fValidator.setProperty(ROOT_TYPE, typeX);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingTypeAndInvalidXSIType() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
+ SchemaSymbols.XSI_TYPE, "Z");
+ fValidator.setProperty(ROOT_TYPE, typeX);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertError(INVALID_DERIVATION_ERROR);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Z", fRootNode.getTypeDefinition().getName());
+ }
+
+ private void checkDefault() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+}