| /******************************************************************************* |
| * Copyright (c) 2007 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 |
| * David Carver - STAR - Added content Assist check in testIgnoresAttributesOrder |
| *******************************************************************************/ |
| package org.eclipse.wst.xml.core.tests.contentmodel; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| |
| import junit.framework.TestCase; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| 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.modelquery.ModelQueryUtil; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; |
| 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; |
| |
| /** |
| * Tests to ensure that the attributes order is not important when trying to |
| * determine the content model. |
| * |
| * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=198807 |
| */ |
| public class TestAttributesOrder extends TestCase |
| { |
| private boolean isSetup = false; |
| |
| /** |
| * The target project name. |
| */ |
| private final String fProjectName = "AttributesOrder"; //$NON-NLS-N$ |
| |
| /** |
| * The name of the zip file containing the project to import. |
| */ |
| private final String fZipFileName = "attributesordertestfiles.zip"; //$NON-NLS-1$ |
| |
| public TestAttributesOrder() |
| { |
| super("TestAttributesOrder"); |
| } |
| |
| /** |
| * Test used to make sure that the attributes order is not important when |
| * determining the content model for a given XML document. |
| */ |
| public void testIgnoresAttributesOrder() throws IOException, CoreException |
| { |
| // Tests the scenario that used to succeed, where the namespace prefix is |
| // declared before the schemaLocation. |
| |
| IFile file = getFile("PreviouslySucceedingTest.xml"); //$NON-NLS-1$ |
| ensureDocumentHasGrammar(file); |
| |
| // Tests the failing scenario, where the schemaLocation comes first. |
| |
| file = getFile("PreviouslyFailingTest.xml"); //$NON-NLS-1$ |
| ensureDocumentHasGrammar(file); |
| } |
| |
| protected void setUp() throws Exception |
| { |
| super.setUp(); |
| |
| if (!this.isSetup) |
| { |
| doSetup(); |
| this.isSetup = true; |
| } |
| } |
| |
| /** |
| * Sets up the required project in the workspace. |
| * |
| * @throws Exception |
| */ |
| private void doSetup() throws Exception |
| { |
| Location platformLocation = Platform.getInstanceLocation(); |
| |
| ProjectUnzipUtility unzipUtil = new ProjectUnzipUtility(); |
| File zipFile = FileUtil.makeFileFor(ProjectUnzipUtility.PROJECT_ZIPS_FOLDER, fZipFileName, ProjectUnzipUtility.PROJECT_ZIPS_FOLDER); |
| URL platformLocationURL = platformLocation.getURL(); |
| String file = platformLocationURL.getFile(); |
| unzipUtil.unzipAndImport(zipFile, file); |
| unzipUtil.initJavaProject(fProjectName); |
| } |
| |
| /** |
| * Reusable test to make sure the XML model for the given file has a grammar. |
| * |
| * @param file |
| * the file containing the XML document. |
| */ |
| private void ensureDocumentHasGrammar(IFile file) throws IOException, CoreException |
| { |
| IStructuredModel model = null; |
| try |
| { |
| IModelManager modelManager = StructuredModelManager.getModelManager(); |
| model = modelManager.getModelForRead(file); |
| assertNotNull("failure loading model", model); //$NON-NLS-1$ |
| IDOMModel domModel = (IDOMModel) model; |
| IDOMDocument document = domModel.getDocument(); |
| assertNotNull("failure getting document", document); //$NON-NLS-1$ |
| ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document); |
| assertNotNull("ModelQuery is missing", modelQuery); //$NON-NLS-1$ |
| IDOMElement documentElement = (IDOMElement) document.getDocumentElement(); |
| assertNotNull("missing document element", documentElement); //$NON-NLS-1$ |
| CMElementDeclaration cmElementDeclaration = modelQuery.getCMElementDeclaration(documentElement); |
| assertNotNull("No element declaration for" + documentElement.getNodeName() + " ("+documentElement.getNamespaceURI()+")", cmElementDeclaration); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| assertNotNull("No content assist available for" + documentElement.getNodeName() + " (" + documentElement.getNamespaceURI() + ")",modelQuery.getAvailableContent(documentElement, cmElementDeclaration, ModelQuery.INCLUDE_CHILD_NODES)); |
| } |
| finally |
| { |
| if (model != null) |
| { |
| model.releaseFromRead(); |
| } |
| } |
| } |
| |
| /** |
| * Utility to retrieve the IFile for the given file name. The file is expected |
| * to be in the workspace in the project named by {@link #fProjectName}. |
| * |
| * @param fileName |
| * the name of the file to retrieve. |
| * @return an IFile. |
| */ |
| private IFile getFile(String fileName) |
| { |
| IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| IWorkspaceRoot root = workspace.getRoot(); |
| Path path = new Path(fProjectName + "/" + fileName); //$NON-NLS-1$ |
| return root.getFile(path); |
| } |
| } |