blob: 58b9a10e000ef8173b5f09c43580e576b1c3ab0f [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.html.core.tests.cleanup;
import java.io.IOException;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.wst.html.core.internal.cleanup.HTMLCleanupProcessorImpl;
import org.eclipse.wst.html.core.tests.ProjectUtil;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.cleanup.AbstractStructuredCleanupProcessor;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.utils.StringUtils;
public class TestHTMLCleanupProcessor extends TestCase {
/**
* The name of the project that all of these tests will use
*/
private static final String PROJECT_NAME = "TestHTMLCleanupProcessor";
/**
* The location of the testing files
*/
private static final String PROJECT_FILES = "/testresources/HTMLCleanupProcessor";
/**
* The project that all of the tests use
*/
private static IProject fProject;
/**
* Default constructor
*/
public TestHTMLCleanupProcessor() {
super("Test HTML Cleanup Processor");
}
/**
* Constructor that takes a test name.
*
* @param name The name this test run should have.
*/
public TestHTMLCleanupProcessor(String name) {
super(name);
}
/**
* <p>Use this method to add these tests to a larger test suite so set up
* and tear down can be performed</p>
*
* @return a {@link TestSetup} that will run all of the tests in this class
* with set up and tear down.
*/
public static Test suite() {
TestSuite ts = new TestSuite(TestHTMLCleanupProcessor.class);
return new TestHTMLCleanupProcessorSetup(ts);
}
/**
* <p><b>TEST:</b> collapsing empty tags in an html document</p>
*/
public void testCollapseEmptyTagsHTML()throws Exception {
HTMLCleanupProcessorImpl cleanupProcessor = getProcessorForForEmptyTagsTest();
runTest("test1.html", "test1-expected.html", cleanupProcessor);
}
/**
* <p><b>TEST:</b> collapsing empty tags in an xhtml document</p>
*/
public void testCollapseEmptyTagsXHTML()throws Exception {
HTMLCleanupProcessorImpl cleanupProcessor = getProcessorForForEmptyTagsTest();
runTest("test2.html", "test2-expected.html", cleanupProcessor);
}
/**
* @return a configured {@link HTMLCleanupProcessorImpl} for testing compressing empty tags
*/
private static HTMLCleanupProcessorImpl getProcessorForForEmptyTagsTest() {
HTMLCleanupProcessorImpl cleanupProcessor = new HTMLCleanupProcessorImpl();
cleanupProcessor.getCleanupPreferences().setCompressEmptyElementTags(true);
cleanupProcessor.getCleanupPreferences().setInsertRequiredAttrs(false);
cleanupProcessor.getCleanupPreferences().setInsertMissingTags(true);
cleanupProcessor.getCleanupPreferences().setQuoteAttrValues(false);
cleanupProcessor.getCleanupPreferences().setFormatSource(false);
cleanupProcessor.getCleanupPreferences().setConvertEOLCodes(false);
return cleanupProcessor;
}
/**
* <p>Runs an {@link AbstractStructuredCleanupProcessor} test</p>
*
* @param originalFile file to clean up
* @param expectedResultsFile expected results of cleaning up the original file
* @param configuredCleanupProcessor the processor to use to do the cleaning
*
* @throws Exception tests can throw exceptions now and then
*/
private void runTest(String originalFile, String expectedResultsFile,
AbstractStructuredCleanupProcessor configuredCleanupProcessor) throws Exception {
IStructuredModel model = null;
IStructuredModel expectedModel = null;
try {
model = getModelForEdit(originalFile);
expectedModel = getModelForEdit(expectedResultsFile);
configuredCleanupProcessor.refreshCleanupPreferences = false;
configuredCleanupProcessor.cleanupModel(model);
configuredCleanupProcessor.refreshCleanupPreferences = true;
model.save();
standardizeLineEndings(model.getStructuredDocument());
standardizeLineEndings(expectedModel.getStructuredDocument());
assertEquals("Clean up results did not match expected results",
expectedModel.getStructuredDocument().get(),
model.getStructuredDocument().get());
} finally {
if(model != null) {
model.releaseFromEdit();
}
if(expectedModel != null) {
expectedModel.releaseFromEdit();
}
}
}
/**
* <p>Given a file name in <code>fProject</code> attempts to get a model
* for it, if the file doesn't exist or it can't get the model the test fails.</p>
*
* @param filename
* @return
* @throws CoreException
* @throws IOException
*/
private IStructuredModel getModelForEdit(final String filename) throws IOException, CoreException {
IFile file = fProject.getFile(filename);
assertTrue("Test file " + file + " can not be found", file.exists());
IStructuredModel model = StructuredModelManager.getModelManager().getModelForEdit(file);
assertNotNull("Could not get model for " + file, model);
return model;
}
/**
* <p>Line endings can be an issue when running tests on different OSs.
* This function standardizes the line endings to use <code>\n</code></p>
*
* <p>It will get the text from the given editor, change the line endings,
* and then save the editor</p>
*
* @param editor standardize the line endings of the text presented in this
* editor.
*/
private void standardizeLineEndings(IDocument doc) {
String contents = doc.get();
contents = StringUtils.replace(contents, "\r\n", "\n");
contents = StringUtils.replace(contents, "\r", "\n");
doc.set(contents);
}
/**
* <p>This inner class is used to do set up and tear down before and
* after (respectively) all tests in the inclosing class have run.</p>
*/
private static class TestHTMLCleanupProcessorSetup extends TestSetup {
private static final String WTP_AUTOTEST_NONINTERACTIVE = "wtp.autotest.noninteractive";
private static String previousWTPAutoTestNonInteractivePropValue = null;
/**
* Default constructor
*
* @param test do setup for the given test
*/
public TestHTMLCleanupProcessorSetup(Test test) {
super(test);
}
/**
* <p>This is run once before all of the tests</p>
*
* @see junit.extensions.TestSetup#setUp()
*/
public void setUp() throws Exception {
fProject = ProjectUtil.createProject(PROJECT_NAME, null, null);
ProjectUtil.copyBundleEntriesIntoWorkspace(PROJECT_FILES, PROJECT_NAME);
String noninteractive = System.getProperty(WTP_AUTOTEST_NONINTERACTIVE);
if (noninteractive != null) {
previousWTPAutoTestNonInteractivePropValue = noninteractive;
} else {
previousWTPAutoTestNonInteractivePropValue = "false";
}
System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, "true");
}
/**
* <p>This is run once after all of the tests have been run</p>
*
* @see junit.extensions.TestSetup#tearDown()
*/
public void tearDown() throws Exception {
fProject.delete(true, new NullProgressMonitor());
if (previousWTPAutoTestNonInteractivePropValue != null) {
System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, previousWTPAutoTestNonInteractivePropValue);
}
}
}
}