1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17package validation.jdk8037819;
18
19import javax.xml.namespace.QName;
20import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
21import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
22import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
23import org.testng.annotations.AfterClass;
24import org.testng.annotations.BeforeClass;
25import org.testng.annotations.Test;
26import validation.BaseTest;
27
28public class RootTypeDefinitionTest extends BaseTest {
29    private QName unknownType;
30
31    private QName typeX;
32
33    private QName typeY;
34
35    private QName typeZ;
36
37    private QName typeOtherNamespace;
38
39    private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
40
41    private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
42
43    protected String getXMLDocument() {
44        return "base.xml";
45    }
46
47    protected String getSchemaFile() {
48        return "base.xsd";
49    }
50
51    protected String[] getRelevantErrorIDs() {
52        return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
53    }
54
55    public RootTypeDefinitionTest(String name) {
56        super(name);
57        unknownType = new QName("W");
58        typeX = new QName("X");
59        typeY = new QName("Y");
60        typeZ = new QName("Z");
61        typeOtherNamespace = new QName("xslt.unittests", "W", "unit");
62    }
63
64
65    @BeforeClass
66    protected void setUp() throws Exception {
67        super.setUp();
68    }
69
70    @AfterClass
71    protected void tearDown() throws Exception {
72        super.tearDown();
73    }
74
75    @Test
76    public void testDefault() {
77        try {
78            reset();
79            validateDocument();
80        } catch (Exception e) {
81            fail("Validation failed: " + e.getMessage());
82        }
83
84        checkDefault();
85    }
86
87    @Test
88    public void testSettingNull() {
89        try {
90            reset();
91            fValidator.setProperty(ROOT_TYPE, null);
92            validateDocument();
93        } catch (Exception e) {
94            fail("Validation failed: " + e.getMessage());
95        }
96
97        checkDefault();
98    }
99
100    @Test
101    public void testSettingToUnknownType() {
102        try {
103            reset();
104            fValidator.setProperty(ROOT_TYPE, unknownType);
105            validateDocument();
106        } catch (Exception e) {
107            fail("Validation failed: " + e.getMessage());
108        }
109
110        assertError(UNKNOWN_TYPE_ERROR);
111        checkDefault();
112    }
113
114    @Test
115    public void testSettingToEqualType() {
116        try {
117            reset();
118            fValidator.setProperty(ROOT_TYPE, typeX);
119            validateDocument();
120        } catch (Exception e) {
121            fail("Validation failed: " + e.getMessage());
122        }
123
124        assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
125        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
126                .getValidationAttempted());
127        assertElementNull(fRootNode.getElementDeclaration());
128        assertTypeName("X", fRootNode.getTypeDefinition().getName());
129    }
130
131    @Test
132    public void testSettingToDerivedType() {
133        try {
134            reset();
135            // this is required to make it a valid type Y node
136            ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
137            fValidator.setProperty(ROOT_TYPE, typeY);
138            validateDocument();
139        } catch (Exception e) {
140            fail("Validation failed: " + e.getMessage());
141        }
142
143        assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
144        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
145                .getValidationAttempted());
146        assertElementNull(fRootNode.getElementDeclaration());
147        assertTypeName("Y", fRootNode.getTypeDefinition().getName());
148    }
149
150    @Test
151    public void testSettingToNonDerivedType() {
152        try {
153            reset();
154            fValidator.setProperty(ROOT_TYPE, typeZ);
155            validateDocument();
156        } catch (Exception e) {
157            fail("Validation failed: " + e.getMessage());
158        }
159
160        assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
161        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
162                .getValidationAttempted());
163        assertElementNull(fRootNode.getElementDeclaration());
164        assertTypeName("Z", fRootNode.getTypeDefinition().getName());
165    }
166
167    @Test
168    public void testSettingToOtherSchemaType() {
169        try {
170            reset();
171            ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
172                SchemaSymbols.XSI_SCHEMALOCATION,
173                "xslt.unittests otherNamespace.xsd");
174            fValidator.setProperty(ROOT_TYPE, typeOtherNamespace);
175            validateDocument();
176        } catch (Exception e) {
177            fail("Validation failed: " + e.getMessage());
178        }
179
180        assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
181        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
182                .getValidationAttempted());
183        assertElementNull(fRootNode.getElementDeclaration());
184        assertTypeName("W", fRootNode.getTypeDefinition().getName());
185        assertTypeNamespace("xslt.unittests", fRootNode.getTypeDefinition()
186                .getNamespace());
187    }
188
189    @Test
190    public void testSettingTypeAndXSIType() {
191        try {
192            reset();
193            // this is required to make it a valid type Y node
194            ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
195            ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
196                    SchemaSymbols.XSI_TYPE, "Y");
197            fValidator.setProperty(ROOT_TYPE, typeX);
198            validateDocument();
199        } catch (Exception e) {
200            fail("Validation failed: " + e.getMessage());
201        }
202
203        assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
204        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
205                .getValidationAttempted());
206        assertElementNull(fRootNode.getElementDeclaration());
207        assertTypeName("Y", fRootNode.getTypeDefinition().getName());
208    }
209
210    @Test
211    public void testSettingTypeAndInvalidXSIType() {
212        try {
213            reset();
214            ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
215                    SchemaSymbols.XSI_TYPE, "Z");
216            fValidator.setProperty(ROOT_TYPE, typeX);
217            validateDocument();
218        } catch (Exception e) {
219            fail("Validation failed: " + e.getMessage());
220        }
221
222        assertError(INVALID_DERIVATION_ERROR);
223        assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
224        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
225                .getValidationAttempted());
226        assertElementNull(fRootNode.getElementDeclaration());
227        assertTypeName("Z", fRootNode.getTypeDefinition().getName());
228    }
229
230    private void checkDefault() {
231        assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
232        assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
233                .getValidationAttempted());
234        assertElementName("A", fRootNode.getElementDeclaration().getName());
235        assertTypeName("X", fRootNode.getTypeDefinition().getName());
236    }
237}
238