blob: 206c7af464a1f158867d31e0af430b9e76e84c15 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.jsdt.ui.tests.format;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.jface.text.formatter.FormattingContext;
import org.eclipse.jface.text.formatter.FormattingContextProperties;
import org.eclipse.jface.text.formatter.IContentFormatterExtension;
import org.eclipse.wst.jsdt.core.JavaScriptCore;
import org.eclipse.wst.jsdt.internal.formatter.comment.SingleCommentLine;
import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
import org.eclipse.wst.jsdt.ui.text.IJavaScriptPartitions;
import org.eclipse.wst.jsdt.ui.text.JavaScriptSourceViewerConfiguration;
import org.eclipse.wst.jsdt.ui.text.JavaScriptTextTools;
public class FormattingTests extends TestCase {
public static final String DELIMITER = TextUtilities.getDefaultLineDelimiter(new Document());
protected static final String PREFIX = SingleCommentLine.SINGLE_COMMENT_PREFIX;
/** tools used to set up document for formatting */
private static JavaScriptTextTools fJavaScriptTextTools;
/** context used for formatting */
private static FormattingContext fFormattingContext;
/** formatter used for formatting */
private static IContentFormatterExtension fFormatter;
/**
* <p>
* Default constructor
* <p>
* <p>
* Use {@link #suite()}
* </p>
*
* @see #suite()
*/
public FormattingTests() {
super("Formatting Tests");
}
/**
* <p>
* Constructor that takes a test name.
* </p>
* <p>
* Use {@link #suite()}
* </p>
*
* @param name
* The name this test run should have.
*
* @see #suite()
*/
public FormattingTests(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(FormattingTests.class, "Formatting Tests");
return new FormattingTestsSetup(ts);
}
public void testLongMultipleComments() {
String beforeContents = "//this is a really long comment that will have to be wrapped into multiple lines because it is so very very long"
+ DELIMITER
+ "//this is a really long comment that will have to be wrapped into multiple lines because it is so very very long"
+ DELIMITER;
String afterContents = PREFIX + "this is a really long comment that will have to be wrapped into multiple"
+ DELIMITER + PREFIX + "lines because it is so very very long" + DELIMITER + PREFIX
+ "this is a really long comment that will have to be wrapped into multiple" + DELIMITER + PREFIX
+ "lines because it is so very very long" + DELIMITER;
runFormatTest(beforeContents, afterContents);
}
public void testNestedLongMultipleComments() {
String beforeContents = "dojo.declare(\"myDojo.Test\", [], {"
+ DELIMITER
+ "//this is a really long comment that will have to be wrapped into multiple lines because it is so very very long"
+ DELIMITER
+ "//this is a really long comment that will have to be wrapped into multiple lines because it is so very very long"
+ DELIMITER
+ DELIMITER
+ "//this is a shorter comment"
+ DELIMITER
+ "constructor : function() {"
+ DELIMITER
+ "}"
+ DELIMITER
+ "//this is a really long comment that will have to be wrapped into multiple lines because it is so very very long"
+ DELIMITER + "});";
String afterContents = "dojo.declare(\"myDojo.Test\", [], {" + DELIMITER + "\t" + PREFIX
+ "this is a really long comment that will have to be wrapped into multiple" + DELIMITER + "\t"
+ PREFIX + "lines because it is so very very long" + DELIMITER + "\t" + PREFIX
+ "this is a really long comment that will have to be wrapped into multiple" + DELIMITER + "\t"
+ PREFIX + "lines because it is so very very long" + DELIMITER + DELIMITER + "\t" + PREFIX
+ "this is a shorter comment" + DELIMITER + "\t" + "constructor : function() {" + DELIMITER + "\t"
+ "}" + DELIMITER + PREFIX + "this is a really long comment that will have to be wrapped into multiple"
+ DELIMITER + PREFIX + "lines because it is so very very long" + DELIMITER + "});";
runFormatTest(beforeContents, afterContents);
}
/**
* <p>
* Formats the given <code>beforeContents</code> and compares it to the given
* <code>afterContents</code>
* </p>
*
* @param beforeContents
* format this contents and compare it to the given <code>afterContents</code>
* @param afterContents
* compare this contents to the <code>beforeContents</code> after it has been
* formated
*/
private static void runFormatTest(String beforeContents, String afterContents) {
IDocument toFormat = new Document(beforeContents);
fJavaScriptTextTools.setupJavaDocumentPartitioner(toFormat, IJavaScriptPartitions.JAVA_PARTITIONING);
fFormatter.format(toFormat, fFormattingContext);
assertEquals("The formatted document does not have the expected contents", afterContents, toFormat.get());
}
/**
* <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 FormattingTestsSetup 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 FormattingTestsSetup(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 {
// set up formatting tools
fJavaScriptTextTools = JavaScriptPlugin.getDefault().getJavaTextTools();
JavaScriptSourceViewerConfiguration config = new JavaScriptSourceViewerConfiguration(
fJavaScriptTextTools.getColorManager(), JavaScriptPlugin.getDefault().getCombinedPreferenceStore(),
null, IJavaScriptPartitions.JAVA_PARTITIONING);
fFormatter = (IContentFormatterExtension) config.getContentFormatter(null);
fFormattingContext = new FormattingContext();
fFormattingContext.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, JavaScriptCore.getOptions());
fFormattingContext.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.valueOf(true));
// set non-interactive
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 {
// reset non-interactive
if(previousWTPAutoTestNonInteractivePropValue != null) {
System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, previousWTPAutoTestNonInteractivePropValue);
}
}
}
}