blob: d37c03616be15c14ad6f97d6e65c654553add730 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xml.core.tests.contentmodel;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryAction;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.core.tests.util.FileUtil;
import org.eclipse.wst.xml.core.tests.util.ProjectUnzipUtility;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class CMValidatorValidationTest extends TestCase {
private final String PROJECT_NAME ="CMValidatorTestProject";
private final String ZIP_FILE_NAME = "CMValidatorTestProject.zip";
protected void setUp() throws Exception {
Location platformLocation = Platform.getInstanceLocation();
ProjectUnzipUtility unzipUtil = new ProjectUnzipUtility();
File zipFile = FileUtil.makeFileFor(ProjectUnzipUtility.PROJECT_ZIPS_FOLDER, ZIP_FILE_NAME, ProjectUnzipUtility.PROJECT_ZIPS_FOLDER);
unzipUtil.unzipAndImport(zipFile, platformLocation.getURL().getFile());
unzipUtil.initJavaProject(PROJECT_NAME);
}
/*
* This test makes use of the following XML schema structure:
*
* root (element)
* |
* +- sequence
* |
* +- a (element)
* | |
* | +- sequence (0 to n)
* | |
* | +- a1 (element)
* |
* +- b (element)
* | |
* | +- sequence
* | |
* | +- b1 (element with occurrences 0 to 2)
* |
* +- choice
* |
* +- c (element)
* |
* +- d (element)
*
* Test document contains only the root element.
* At the root element level, element a is initially available.
* Adding a makes b available. Adding b makes c or d available.
* Adding either c or d makes no nodes available at the root.
* Any arbitrary number of elements a1 can be added to element a.
* Only 2 elements b2 may be added to element b.
*/
public void testGetInsertActions() {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(PROJECT_NAME + "/CMValidatorTestSchema.xml"));
IModelManager modelManager = StructuredModelManager.getModelManager();
try {
IStructuredModel model = modelManager.getModelForRead(file);
Document document = ((IDOMModel) model).getDocument();
Element documentElement = document.getDocumentElement();
// root element has no children, element a should be available
verify(documentElement, new String[]{"a"});
// add element a
Element aElement = document.createElement("a");
documentElement.appendChild(aElement);
// root element contains a; b should be available
verify(documentElement, new String[]{"b"});
// add element b
Element bElement = document.createElement("b");
documentElement.appendChild(bElement);
// root element contains a and b; c and d should be available
verify(documentElement, new String[]{"d", "c"});
// add element c
Element cElement = document.createElement("c");
documentElement.appendChild(cElement);
// root element contains a, b and c; no more elements should be available
verify(documentElement, new String[]{});
// remove c element
documentElement.removeChild(cElement);
// root element contains a and b; c and d should be available
verify(documentElement, new String[]{"d", "c"});
// add element d
Element dElement = document.createElement("d");
documentElement.appendChild(dElement);
// root element contains a, b and d; no more elements should be available
verify(documentElement, new String[]{});
// element a contains no children; element a1 should be available
verify(aElement, new String[]{"a1"});
// add element a1 to a
aElement.appendChild(document.createElement("a1"));
// element a1 is in an unbounded sequence, it should still be available
verify(aElement, new String[]{"a1"});
// element b contains no children; element b1 should be available
verify(bElement, new String[]{"b1"});
// add element b1 to b
bElement.appendChild(document.createElement("b1"));
// element b contains 1 b1 child; another instance of b1 should be available
verify(bElement, new String[]{"b1"});
// add another element b1 to b
bElement.appendChild(document.createElement("b1"));
// b1 can only appear twice, no elements should be available
verify(bElement, new String[]{});
} catch (Exception exception) {exception.printStackTrace();}
}
private void verify(Element parentElement, String[] childElementsAvailable) {
List list = new ArrayList();
ModelQuery modelQuery = ModelQueryUtil.getModelQuery(parentElement.getOwnerDocument());
CMElementDeclaration cmElementDeclaration = modelQuery.getCMElementDeclaration(parentElement);
modelQuery.getInsertActions(parentElement, cmElementDeclaration, -1, ModelQuery.INCLUDE_CHILD_NODES, ModelQuery.VALIDITY_STRICT, list);
assertEquals(childElementsAvailable.length, list.size());
List availableNodeNameList = new ArrayList();
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
availableNodeNameList.add(((ModelQueryAction)iterator.next()).getCMNode().getNodeName());
}
for (int i = 0; i < childElementsAvailable.length; i++) {
if(availableNodeNameList.indexOf(childElementsAvailable[i]) == -1) {
fail();
}
}
}
}