/******************************************************************************* * Copyright (c) 2013 Red Hat, Inc. * 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: * Red Hat - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.systemtap.ui.ide.test.editors.stp; import static org.junit.Assert.assertEquals; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.DocumentCommand; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.rules.FastPartitioner; import org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPAutoEditStrategy; import org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPPartitionScanner; import org.eclipse.linuxtools.systemtap.ui.ide.test.editors.stp.AbstractAutoEditTest.AutoEditTester; import org.junit.Test; public class STPFormattingTest { /** * A DocumentCommand with public constructor and exec method. */ protected static class TestDocumentCommand extends DocumentCommand { public TestDocumentCommand(int offset, int length, String text) { super(); doit = true; this.text = text; this.offset = offset; this.length = length; owner = null; caretOffset = -1; } /** * @param doc * @return the new caret position. * @throws BadLocationException */ public int exec(IDocument doc) throws BadLocationException { doc.replace(offset, length, text); return caretOffset != -1 ? caretOffset : offset + (text == null ? 0 : text.length()); } } /** * Sets up the document partitioner for the given document for the given partitioning. * * @param document * @param partitioning * @param owner may be null */ private static void setupDocumentPartitioner(IDocument document, String partitioning) { IDocumentPartitioner partitioner = new FastPartitioner(new STPPartitionScanner(), STPPartitionScanner.STP_PARTITION_TYPES); if (document instanceof IDocumentExtension3) { IDocumentExtension3 extension3= (IDocumentExtension3) document; extension3.setDocumentPartitioner(partitioning, partitioner); } else { document.setDocumentPartitioner(partitioner); } partitioner.connect(document); } private static AutoEditTester createAutoEditTester() { IDocument doc = new Document(); setupDocumentPartitioner(doc, STPPartitionScanner.STP_PARTITIONING); AutoEditTester tester = new AutoEditTester(doc, STPPartitionScanner.STP_PARTITIONING); STPAutoEditStrategy s = new STPAutoEditStrategy(STPPartitionScanner.STP_PARTITIONING, null); tester.setAutoEditStrategy(IDocument.DEFAULT_CONTENT_TYPE, s); tester.setAutoEditStrategy(STPPartitionScanner.STP_COMMENT, s); tester.setAutoEditStrategy(STPPartitionScanner.STP_CONDITIONAL, s); tester.setAutoEditStrategy(STPPartitionScanner.STP_STRING, s); return tester; } @Test public void testEndProbeCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ } @Test public void testSquareBracketCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); tester.type("a["); // Verify automatic completion of square brackets assertEquals(1, tester.getCaretLine()); assertEquals(3, tester.getCaretColumn()); assertEquals("\ta[]", tester.getLine()); tester.type("2]"); // Verify we can overwrite the end square-bracket assertEquals(1, tester.getCaretLine()); assertEquals(5, tester.getCaretColumn()); assertEquals("\ta[2]", tester.getLine()); // Verify we don't add square brackets inside a string tester.type("=\"b["); assertEquals(1, tester.getCaretLine()); assertEquals(9, tester.getCaretColumn()); assertEquals("\ta[2]=\"b[\"", tester.getLine()); // Verify we don't add square brackets inside a comment tester.goTo(tester.getCaretLine(), tester.getCaretColumn() + 1); tester.type(" /* a[2"); assertEquals(1, tester.getCaretLine()); assertEquals(17, tester.getCaretColumn()); assertEquals("\ta[2]=\"b[\" /* a[2", tester.getLine()); // Verify we don't add square brackets inside a line comment tester.type(" */ // a[2"); assertEquals(1, tester.getCaretLine()); assertEquals(27, tester.getCaretColumn()); assertEquals("\ta[2]=\"b[\" /* a[2 */ // a[2", tester.getLine()); // Verify we don't add square brackets inside a line comment tester.type("\n# a[2"); assertEquals(2, tester.getCaretLine()); assertEquals(5, tester.getCaretColumn()); assertEquals("# a[2", tester.getLine()); // Verify we don't add square brackets inside a char specifier tester.type("\na[3]='["); assertEquals(3, tester.getCaretLine()); assertEquals(8, tester.getCaretColumn()); assertEquals("\ta[3]='[", tester.getLine()); } @Test public void testBracketCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Verify we don't complete brackets inside a comment tester.type("// if (a == b) {\n"); assertEquals(2, tester.getCaretLine()); assertEquals(1, tester.getCaretColumn()); assertEquals("\t", tester.getLine()); // verify we don't complete brackets inside a comment tester.type("# if (a == b) {\n"); // Verify we can overwrite the end square-bracket assertEquals(3, tester.getCaretLine()); assertEquals(1, tester.getCaretColumn()); assertEquals("\t", tester.getLine()); } @Test public void testQuoteCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); tester.type("a[2]=\""); // Verify automatic completion of quotes assertEquals(1, tester.getCaretLine()); assertEquals(7, tester.getCaretColumn()); assertEquals("\ta[2]=\"\"", tester.getLine()); tester.type("\\\"\""); // Verify we can overwrite the auto end-quote without appending // and escaped quotes can be added inside strings assertEquals(1, tester.getCaretLine()); assertEquals(10, tester.getCaretColumn()); assertEquals("\ta[2]=\"\\\"\"", tester.getLine()); // Verify we don't add quotes inside a comment tester.type(" /* \""); assertEquals(1, tester.getCaretLine()); assertEquals(15, tester.getCaretColumn()); assertEquals("\ta[2]=\"\\\"\" /* \"", tester.getLine()); // Verify we don't add quotes inside a line comment tester.type(" */ // \""); assertEquals(1, tester.getCaretLine()); assertEquals(23, tester.getCaretColumn()); assertEquals("\ta[2]=\"\\\"\" /* \" */ // \"", tester.getLine()); // Verify we don't add quotes inside a line comment tester.type("\n# \""); assertEquals(2, tester.getCaretLine()); assertEquals(3, tester.getCaretColumn()); assertEquals("# \"", tester.getLine()); // Verify we don't add quotes inside a char specifier tester.type("\na[3]='\""); assertEquals(3, tester.getCaretLine()); assertEquals(8, tester.getCaretColumn()); assertEquals("\ta[3]='\"", tester.getLine()); } @Test public void testIfCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("if ("); assertEquals(1, tester.getCaretLine()); assertEquals(5, tester.getCaretColumn()); assertEquals("\tif ()", tester.getLine()); // Verify we can overwrite the closing bracket for if tester.type("a == b)"); assertEquals(1, tester.getCaretLine()); assertEquals(12, tester.getCaretColumn()); assertEquals("\tif (a == b)", tester.getLine()); } @Test public void testElseBracketCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("if (a == 2) {\n"); assertEquals(2, tester.getCaretLine()); assertEquals(2, tester.getCaretColumn()); assertEquals("\tif (a == 2) {", tester.getLine(-1)); assertEquals("\t}", tester.getLine(1)); tester.goTo(3, 2); tester.type(" else {\n"); assertEquals(4, tester.getCaretLine()); assertEquals(2, tester.getCaretColumn()); assertEquals("\t}", tester.getLine(1)); } @Test public void testForCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("for ("); assertEquals(1, tester.getCaretLine()); assertEquals(6, tester.getCaretColumn()); assertEquals("\tfor ()", tester.getLine()); } @Test public void testForBracketCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("for (i = 0; i < 3; ++i) {\n"); assertEquals(2, tester.getCaretLine()); assertEquals(2, tester.getCaretColumn()); assertEquals("\t}", tester.getLine(1)); assertEquals("}", tester.getLine(2)); } @Test public void testWhileCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("while ("); assertEquals(1, tester.getCaretLine()); assertEquals(8, tester.getCaretColumn()); assertEquals("\twhile ()", tester.getLine()); } @Test public void testWhileBracketCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("while (i == 0) {\n"); assertEquals(2, tester.getCaretLine()); assertEquals(2, tester.getCaretColumn()); assertEquals("\t}", tester.getLine(1)); assertEquals("}", tester.getLine(2)); } @Test public void testForeachBracketCompletion() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); // We are located on 2nd line assertEquals(1, tester.getCaretLine()); // Nested location is indented assertEquals(1, tester.getCaretColumn()); // The brace was closed automatically. Note, getLine() gets // line from current position which is on line 1 of doc. assertEquals("}", tester.getLine(1)); //$NON-NLS-1$ tester.type("foreach (n in k+) {\n"); assertEquals(2, tester.getCaretLine()); assertEquals(2, tester.getCaretColumn()); assertEquals("\t}", tester.getLine(1)); assertEquals("}", tester.getLine(2)); } @Test public void testPasteAutoIndent() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); tester.type("probe end {\n"); //$NON-NLS-1$ tester.goTo(1, 0); tester.paste("if (a == b) {\n" + "\tfor (x = 0; x < 3; ++x) {\n" + "\t\tz = 4;\n" + "\t}\n" + "}\n"); //$NON-NLS-1$ tester.goTo(1, 0); assertEquals("\tif (a == b) {", tester.getLine(0)); //$NON-NLS-1$ assertEquals("\t\tfor (x = 0; x < 3; ++x) {", tester.getLine(1)); //$NON-NLS-1$ assertEquals("\t\t\tz = 4;", tester.getLine(2)); //$NON-NLS-1$ assertEquals("\t\t}", tester.getLine(3)); //$NON-NLS-1$ assertEquals("\t}", tester.getLine(4)); //$NON-NLS-1$ } }