| /******************************************************************************* |
| * Copyright (c) 2005, 2007 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| |
| *******************************************************************************/ |
| package org.eclipse.dltk.ruby.ui.tests.text.indenting; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.dltk.ruby.internal.ui.RubyPreferenceConstants; |
| import org.eclipse.dltk.ruby.internal.ui.text.IRubyPartitions; |
| import org.eclipse.dltk.ruby.internal.ui.text.RubyAutoEditStrategy; |
| import org.eclipse.dltk.ruby.ui.tests.internal.TestUtils; |
| import org.eclipse.dltk.ui.CodeFormatterConstants; |
| import org.eclipse.dltk.ui.PreferenceConstants; |
| import org.eclipse.jface.preference.PreferenceStore; |
| import org.eclipse.jface.text.DocCmd; |
| import org.eclipse.jface.text.Document; |
| import org.eclipse.jface.text.TextUtilities; |
| import org.eclipse.ui.PlatformUI; |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.rules.TestName; |
| |
| public class IndentingTest { |
| |
| private static final String PATH = "resources/indenting/"; |
| private static final String DELIMITER = TextUtilities |
| .getDefaultLineDelimiter(new Document()); |
| private RubyAutoEditStrategy tabStrategy, spaceStrategy; |
| @Rule |
| public TestName testName = new TestName(); |
| |
| private void waitWorkbenchCreated() throws InterruptedException { |
| for (int i = 0; i < 40; i++) { |
| if (PlatformUI.isWorkbenchRunning()) { |
| return; |
| } |
| Thread.sleep(1000); |
| } |
| throw new RuntimeException( |
| "Workbench did not intitialized during a minute."); |
| } |
| |
| @Before |
| public void setUp() throws Exception { |
| waitWorkbenchCreated(); |
| tabStrategy = createStrategy(true); |
| spaceStrategy = createStrategy(false); |
| } |
| |
| private RubyAutoEditStrategy createStrategy(boolean useTabs) { |
| PreferenceStore store = new PreferenceStore(); |
| RubyPreferenceConstants.initializeDefaultValues(store); |
| store.setValue(CodeFormatterConstants.FORMATTER_TAB_CHAR, |
| (useTabs ? CodeFormatterConstants.TAB |
| : CodeFormatterConstants.SPACE)); |
| store.setValue(PreferenceConstants.EDITOR_CLOSE_BRACES, false); |
| String partitioning = IRubyPartitions.RUBY_PARTITIONING; |
| RubyAutoEditStrategy result = new RubyAutoEditStrategy(partitioning, |
| store); |
| return result; |
| } |
| |
| public void doTest(String data, RubyAutoEditStrategy strategy) |
| throws Exception { |
| final String START_TAG = "#s#"; |
| final String END_TAG = "#e#"; |
| final String NEW_LINE_TAG = "#n#"; |
| final String REPLACE_TAG = "#r#"; |
| String EXPECTED_TAG = "###"; |
| |
| String delim = TextUtilities.determineLineDelimiter(data, DELIMITER); |
| data = data.replaceAll(NEW_LINE_TAG, START_TAG + delim + END_TAG); |
| |
| int startPos = data.indexOf(START_TAG); |
| Assert.isLegal(startPos >= 0); |
| data = data.substring(0, startPos) + data.substring(startPos + START_TAG.length()); |
| |
| int replacePos = data.indexOf(REPLACE_TAG); |
| int insertionStartPos = startPos; |
| if (replacePos >= 0) { |
| Assert.isLegal(replacePos >= startPos); |
| data = data.substring(0, replacePos) |
| + data.substring(replacePos + REPLACE_TAG.length()); |
| insertionStartPos = replacePos; |
| } |
| |
| int endPos = data.indexOf(END_TAG); |
| Assert.isLegal(endPos >= 0); |
| Assert.isLegal(replacePos < 0 || endPos >= replacePos); |
| String insertion = data.substring(insertionStartPos, endPos); |
| data = data.substring(0, insertionStartPos) |
| + data.substring(endPos + END_TAG.length()); |
| |
| int expectedPos = data.indexOf(EXPECTED_TAG); |
| Assert.isLegal(expectedPos >= 0); |
| String expected = data.substring(expectedPos + EXPECTED_TAG.length()); |
| data = data.substring(0, expectedPos); |
| |
| Document doc = new Document(data); |
| TestUtils.installStuff(doc); |
| |
| // remove the leading line break from expected |
| String[] legalLineDelimiters = doc.getLegalLineDelimiters(); |
| int index = TextUtilities.startsWith(legalLineDelimiters, expected); |
| Assert.isLegal(index >= 0); |
| expected = expected.substring(legalLineDelimiters[index].length()); |
| |
| int replaceLength = (replacePos < 0 ? 0 : replacePos - startPos); |
| DocCmd cmd = new DocCmd(startPos, replaceLength, insertion); |
| |
| strategy.customizeDocumentCommand(doc, cmd); |
| if (cmd.doit) { |
| // for (Iterator iter = cmd.getCommandIterator(); iter.hasNext(); ) |
| // { |
| // Object command = iter.next(); |
| // Method method = command.getClass().getMethod("execute", new |
| // Class[] {IDocument.class}); |
| // method.invoke(command, new Object[] {doc}); |
| // } |
| doc.replace(cmd.offset, cmd.length, cmd.text); |
| } |
| |
| assertEquals(expected, doc.get()); |
| } |
| |
| private void magic() throws Exception { |
| String name = testName.getMethodName(); |
| String fileName = name.substring(4, 5).toLowerCase() |
| + name.substring(5) + ".rb"; |
| String data = TestUtils.getData(PATH + fileName); |
| String moreData = data.replaceAll("\t", " "); |
| if (!moreData.equals(data)) |
| doTest(moreData, spaceStrategy); |
| doTest(data, tabStrategy); |
| } |
| |
| @Test |
| public void testNewLineInDef() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testEnterBeforeClass() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testEnterOpensClass() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testIfStatement() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testIfModifier() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testMovingEndToNewLine() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testMovingEndWithWhitespaceToNewLine() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testDeindentingEnd() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testClassNotKeyword() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testNewLineAfterEmptyIndentedLine() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testNewLineInRegularFunction() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testIndentAfterNewLineBeforeParen() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testIndentOnUnclosedParen() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testIndentOnFirstExplicitContinuation() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testIndentOnFirstImplicitContinuation() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testNoIndentOnSubsequentExplicitContinuation() throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testNoIndentOnSubsequentImplicitContinuationAfterExplicitOne() |
| throws Exception { |
| magic(); |
| } |
| |
| @Test |
| public void testNoIndentOnSubsequentImplicitContinuationAfterImplicitOne() |
| throws Exception { |
| magic(); |
| } |
| |
| } |