diff --git a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/AllTests.java b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/AllTests.java
index 39e4a81..f53a148 100644
--- a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/AllTests.java
+++ b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/AllTests.java
@@ -1,7 +1,12 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Red Hat Inc. 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
+ *******************************************************************************/
 package org.eclipse.dltk.ruby.ui.tests;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
 import org.eclipse.dltk.ruby.ui.tests.folding.RubyCommentElementTests;
 import org.eclipse.dltk.ruby.ui.tests.folding.RubyFoldingTest;
 import org.eclipse.dltk.ruby.ui.tests.indenting.RubyAutoIndentStrategyTest;
@@ -10,22 +15,15 @@
 import org.eclipse.dltk.ruby.ui.tests.text.PartitioningTest;
 import org.eclipse.dltk.ruby.ui.tests.text.RubyRequireHyperlinkDetectorTest;
 import org.eclipse.dltk.ruby.ui.tests.text.indenting.IndentingTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
 
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+		RubyAutoIndentStrategyTest.class, PartitioningTest.class, IndentingTest.class, RubyFoldingTest.class,
+		MixinCompleteTests.class, ThreadedUIMixinTests.class, RubyRequireHyperlinkDetectorTest.class,
+		RubyCommentElementTests.class
+})
 public class AllTests {
 
-	public static Test suite() {
-		TestSuite suite = new TestSuite("org.eclipse.dltk.ruby.ui.tests");
-		// $JUnit-BEGIN$
-		suite.addTestSuite(RubyAutoIndentStrategyTest.class);
-		suite.addTestSuite(PartitioningTest.class);
-		suite.addTestSuite(IndentingTest.class);
-		suite.addTestSuite(RubyFoldingTest.class);
-		suite.addTest(MixinCompleteTests.suite());
-		suite.addTest(ThreadedUIMixinTests.suite());
-		suite.addTestSuite(RubyRequireHyperlinkDetectorTest.class);
-		suite.addTest(RubyCommentElementTests.suite());
-		// $JUnit-END$
-		return suite;
-	}
-
 }
diff --git a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/folding/RubyFoldingTest.java b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/folding/RubyFoldingTest.java
index c35130e..398b808 100755
--- a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/folding/RubyFoldingTest.java
+++ b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/folding/RubyFoldingTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2016 IBM Corporation and others.
+ * Copyright (c) 2005, 2017 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
@@ -8,6 +8,8 @@
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ui.tests.folding;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.Map;
 
 import org.eclipse.dltk.ast.ASTNode;
@@ -22,10 +24,10 @@
 import org.eclipse.jface.text.Position;
 import org.eclipse.jface.text.source.Annotation;
 import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.junit.Before;
+import org.junit.Test;
 
-import junit.framework.TestCase;
-
-public class RubyFoldingTest extends TestCase {
+public class RubyFoldingTest {
 
 	private class MyRubyASTFoldingStructureProvider extends
 			RubyFoldingStructureProvider {
@@ -79,14 +81,14 @@
 	IPreferenceStore fStore;
 	MyRubyASTFoldingStructureProvider provider;
 
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void setUp() throws Exception {
 		fStore = RubyUITestsPlugin.getDefault().getPreferenceStore();
 		RubyPreferenceConstants.initializeDefaultValues(fStore);
 		provider = new MyRubyASTFoldingStructureProvider();
 	}
 
+	@Test
 	public void test0() throws Exception {
 		fStore.setValue(PreferenceConstants.EDITOR_FOLDING_LINES_LIMIT, 2);
 		String content = "#ab\n#dc\n";
@@ -99,6 +101,7 @@
 		assertEquals(1, result.size());
 	}
 
+	@Test
 	public void test177924a() throws Exception {
 		fStore.setValue(PreferenceConstants.EDITOR_FOLDING_LINES_LIMIT, 2);
 		String content = TestUtils.getData("resources/folding/b177924.rb");
@@ -111,6 +114,7 @@
 		assertEquals(3 + 3, result.size());
 	}
 
+	@Test
 	public void test177924b() throws Exception {
 		fStore.setValue(PreferenceConstants.EDITOR_FOLDING_LINES_LIMIT, 4);
 		String content = TestUtils.getData("resources/folding/b177924.rb");
@@ -123,6 +127,7 @@
 		assertEquals(2 + 3, result.size());
 	}
 
+	@Test
 	public void test193174a() throws Exception {
 		fStore.setValue(PreferenceConstants.EDITOR_FOLDING_LINES_LIMIT, 2);
 		String content = TestUtils.getData("resources/folding/b193174.rb");
@@ -136,6 +141,7 @@
 		assertEquals(27, result.size());
 	}
 
+	@Test
 	public void test193174b() throws Exception {
 		fStore.setValue(PreferenceConstants.EDITOR_FOLDING_LINES_LIMIT, 2);
 		String content = TestUtils.getData("resources/folding/b193174.rb");
@@ -149,6 +155,7 @@
 		assertEquals(73 + 13 + 1, result.size());
 	}
 
+	@Test
 	public void test193174c() throws Exception {
 		fStore.setValue(PreferenceConstants.EDITOR_FOLDING_LINES_LIMIT, 2);
 		String content = TestUtils.getData("resources/folding/b193174.rb");
diff --git a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/indenting/RubyAutoIndentStrategyTest.java b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/indenting/RubyAutoIndentStrategyTest.java
index 4844bd9..c80fe48 100644
--- a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/indenting/RubyAutoIndentStrategyTest.java
+++ b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/indenting/RubyAutoIndentStrategyTest.java
@@ -1,15 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2017 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
  *
- 
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ui.tests.indenting;
 
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
 
 import org.eclipse.dltk.ruby.internal.ui.RubyPreferenceConstants;
 import org.eclipse.dltk.ruby.internal.ui.text.IRubyPartitions;
@@ -21,34 +20,35 @@
 import org.eclipse.jface.text.DocCmd;
 import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.TextUtilities;
+import org.junit.Before;
+import org.junit.Test;
 
 
-public class RubyAutoIndentStrategyTest extends TestCase {
+public class RubyAutoIndentStrategyTest {
 	/*
 	 * Tests with _ in the beginning relies on features, not
 	 * presented now, and may be will be implemented in future
 	 */
-	
+
 	private static final String TAB = "\t";
-	
+
 	private static final String AUTOINDENT = TAB;
-	
+
 	private static final String DUMMY_POSTFIX = "#comment";
 
 	private static String DELIMITER = TextUtilities.getDefaultLineDelimiter(new Document());
 	private static String BLOCK_END = DELIMITER + "end";
-	
+
 
     private RubyAutoEditStrategy strategy;
 	private String doc;
 	private DocCmd docCmd;
 	private String expected;
 	IPreferenceStore fStore;
-	
 
-    @Override
-	protected void setUp() throws Exception {
-        super.setUp();
+
+	@Before
+	public void setUp() throws Exception {
     	fStore = new PreferenceStore();
     	RubyPreferenceConstants.initializeDefaultValues(fStore);
     	fStore.setValue(CodeFormatterConstants.FORMATTER_TAB_CHAR, CodeFormatterConstants.TAB);
@@ -59,52 +59,46 @@
     	strategy = new RubyAutoEditStrategy(fPartitioning, fStore);
     }
 
-    @Override
-	protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    
     public void __testTab() { System.out.println("Tab\n");
 
-        String str = 
-            "        args = [ '-1', '-2',\n"+ 
+        String str =
+            "        args = [ '-1', '-2',\n"+
             "                ";
         DocCmd docCmd = new DocCmd(str.length(), 0, "\t");
         strategy.customizeDocumentCommand(new Document(str), docCmd);
         assertEquals("    ", docCmd.text);
     }
-    
+
     public void _testSpaces() { System.out.println("Spaces\n");
 
         DocCmd docCmd = new DocCmd(0, 0, "\t");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("    ", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "\t\t");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("        ", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "\tabc");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("    abc", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "\tabc\t");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("    abc    ", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, " ");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals(" ", docCmd.text);
     }
-    
+
     public void doTestInsertion(String prefix, String postfix, String inserted, String expected) {
 	    Document doc = new Document(prefix + postfix);
 	    DocCmd docCmd = new DocCmd(prefix.length(), 0, inserted);
 	    strategy.customizeDocumentCommand(doc, docCmd);
 	    assertEquals(expected, docCmd.text);
     }
-    
+
     public void doTestLineReindent(String prefix, String line, String appended, String postfix, String expected) throws Exception {
     	Document doc = new Document(prefix + line + postfix);
     	DocCmd cmd = new DocCmd(prefix.length() + line.length(), 0, appended);
@@ -112,68 +106,77 @@
     	doc.replace(cmd.offset, cmd.length, cmd.text);
     	assertEquals(expected, doc.get());
     }
-    
+
     public void doTestNewLineIndent(String prefix, String postfix, String indent) {
 		doTestInsertion(prefix, postfix, "\n", "\n" + indent);
     }
-    
+
+	@Test
     public void testSimpleNewLine() {
     	String stat1 = "def foo";
     	String stat2 = "puts 'Ruby is cool'";
     	doTestNewLineIndent(stat1 + "\n" + TAB + stat2, DUMMY_POSTFIX, TAB);
     }
-    
+
+	@Test
     public void testIndentedNewLineAfterDef() {
     	String stat1 = "def foo";
     	doTestNewLineIndent(stat1, DUMMY_POSTFIX, AUTOINDENT + DUMMY_POSTFIX + BLOCK_END);
     }
-        
+
+	@Test
     public void testIndentedNewLineAfterIf() {
     	String stat1 = "if a==0";
     	doTestNewLineIndent(stat1, DUMMY_POSTFIX, AUTOINDENT + DUMMY_POSTFIX + BLOCK_END);
     	String stat2 = "def foo" + DELIMITER + "end" + DELIMITER + "if a==0";
     	doTestNewLineIndent(stat2, DUMMY_POSTFIX, AUTOINDENT + DUMMY_POSTFIX + BLOCK_END);
     }
-    
+
     private void doTestBraceDeindent(String opening, String closing) throws Exception {
     	String s1 = "\tputs " + opening + "\n";
     	String s2 = "\t        2+2\n";
-    	doTestLineReindent(s1 + s2, "\t        ", closing, "", 
+    	doTestLineReindent(s1 + s2, "\t        ", closing, "",
     			s1 + s2 + "\t        " + closing);
     }
-    
+
+	@Test
     public void testIndentingOfClosingParenToOpeningOne() throws Exception {
     	doTestBraceDeindent("(", ")");
     }
-    
+
+	@Test
     public void testIndentingOfClosingSquareBraceToOpeningOne() throws Exception {
     	doTestBraceDeindent("[", "]");
     }
-    
+
+	@Test
     public void testIndentingOfClosingCurlyBrace() throws Exception {
     	String s1 = "\t puts {\n";
     	String s2 = "\t\t\t     2+2\n";
-    	doTestLineReindent(s1 + s2, "\t        ", "}", "", 
+    	doTestLineReindent(s1 + s2, "\t        ", "}", "",
     			s1 + s2 + "\t }");
     }
-    
+
+	@Test
     public void testDeindentingOfRdocBegin() throws Exception {
     	String s1 = "\t puts {\n";
     	doTestLineReindent(s1, "\t\t\t=begi", "n", "", s1 + "=begin");
     }
-    
+
+	@Test
     public void testDeindentingOfRdocEnd() throws Exception {
     	String s1 = "\t puts {\n";
     	doTestLineReindent(s1, "\t\t\t=en", "d", "", s1 + "=end");
     }
-    
+
+	@Test
     public void testDeindentOnEnd() throws Exception {
     	String s1 = "\tdef foo\n";
 		String s2 = "\t\tputs\n";
-		doTestLineReindent(s1 + s2, "\t\ten", "d", "", 
+		doTestLineReindent(s1 + s2, "\t\ten", "d", "",
 				s1 + s2 + "\tend");
     }
-    
+
     public void __testNewLineAfterReturn() { System.out.println("NewLineAfterReturn\n");
 
     	String str = "dfdsfd" +
@@ -183,10 +186,10 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-"#ffo".length(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals("\n", docCmd.text);
+
     }
-    
+
     public void __testIgnoreComment() { System.out.println("IgnoreComment\n");
 
     	String str = "" +
@@ -195,10 +198,10 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals("\n", docCmd.text);
+
     }
-    
+
     public void __testIgnoreComment2() { System.out.println("IgnoreComment2\n");
 
     	String str = "" +
@@ -208,10 +211,10 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals("\n", docCmd.text);
+
     }
-    
+
     public void _testNewLineAfterOpeningParWithOtherContents() { System.out.println("NewLineAfterOpeningParWithOtherContents\n");
 
     	String str = "" +
@@ -220,24 +223,24 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n         ", docCmd.text); 
+    	assertEquals("\n         ", docCmd.text);
     }
-    
+
     public void _testNewLineAfterReturn2() { System.out.println("NewLineAfterReturn2\n");
 
         String str = "" +
         "def m1(self):\n" +
         "    return ('foo',";
-                     
-                         
+
+
         final Document doc = new Document(str);
         DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
         strategy.customizeDocumentCommand(doc, docCmd);
-        assertEquals("\n            ", docCmd.text); 
-        
+        assertEquals("\n            ", docCmd.text);
+
     }
-    
-    
+
+
     public void __testMaintainIndent() { System.out.println("MaintainIndent\n");
 
         String str = "" +
@@ -246,15 +249,15 @@
         "        print 'foo'\n" +
         "    print 'bla'"+
         "";
-        
-        
+
+
         final Document doc = new Document(str);
         DocCmd docCmd = new DocCmd(doc.getLength()-"print 'bla'".length(), 0, "\n");
         strategy.customizeDocumentCommand(doc, docCmd);
-        assertEquals("\n    ", docCmd.text); 
-        
+        assertEquals("\n    ", docCmd.text);
+
     }
-    
+
     public void _testMaintainIndent2() { System.out.println("MaintainIndent2\n");
 
     	String str = "" +
@@ -263,18 +266,18 @@
     	"        print 'foo'\n" +
     	"    print 'bla'"+
     	"";
-    	
-    	
+
+
     	final Document doc = new Document(str);
     	int offset = doc.getLength()-"  print 'bla'".length();
 		DocCmd docCmd = new DocCmd(offset, 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n  ", docCmd.text); 
-    	assertEquals(offset+2, docCmd.caretOffset); 
-    	
+    	assertEquals("\n  ", docCmd.text);
+    	assertEquals(offset+2, docCmd.caretOffset);
+
     }
-    
-    
+
+
     public void __testDontChangeCursorOffset() { System.out.println("DontChangeCursorOffset\n");
 
     	String str = "" +
@@ -282,18 +285,18 @@
     	"    if not 1:\n" +
     	"        print    'foo'" +
     	"";
-    	
-    			
+
+
     	final Document doc = new Document(str);
     	int offset = doc.getLength()-"    'foo'".length();
     	DocCmd docCmd = new DocCmd(offset, 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n        ", docCmd.text); 
-    	assertEquals(-1, docCmd.caretOffset); //don't change it 
-    	
+    	assertEquals("\n        ", docCmd.text);
+    	assertEquals(-1, docCmd.caretOffset); //don't change it
+
     }
-    
-    
+
+
     public void __testTabIndentToLevel() { System.out.println("TabIndentToLevel\n");
 
     	String str = "" +
@@ -304,18 +307,18 @@
     	"                  b,\n" +
     	")" +
     	"";
-    	
-    	
+
+
     	final Document doc = new Document(str);
     	int offset = doc.getLength()-"\n                  b,\n)".length();
     	DocCmd docCmd = new DocCmd(offset, 0, "\t");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("                  ", docCmd.text); 
-    	
+    	assertEquals("                  ", docCmd.text);
+
     }
-    
-    
-    
+
+
+
     public void _testTabIndentToLevel2() { System.out.println("TabIndentToLevel2\n");
 
     	String str = "" +
@@ -330,18 +333,18 @@
     	"                          \n" +
     	"" + //we're here (indent to the first level)
     	"";
-    	
-    	
+
+
     	final Document doc = new Document(str);
     	int offset = doc.getLength();
     	DocCmd docCmd = new DocCmd(offset, 0, "\t");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("    ", docCmd.text); 
-    	
+    	assertEquals("    ", docCmd.text);
+
     }
-    
-    
-    
+
+
+
     public void __testTabIndentToLevel3() { System.out.println("TabIndentToLevel3\n");
 
     	String str = "" +
@@ -356,18 +359,18 @@
     	"                          \n" +
     	"    " + //now that we're already in the first level, indent to the current level
     	"";
-    	
-    	
+
+
     	final Document doc = new Document(str);
     	int offset = doc.getLength();
     	DocCmd docCmd = new DocCmd(offset, 0, "\t");
     	strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("                          ", docCmd.text);
     	assertEquals(offset - 4, docCmd.offset);
-    	assertEquals(4, docCmd.length);    	
+    	assertEquals(4, docCmd.length);
     }
-    
-    
+
+
     public void __testNoAutoIndentClosingPar() { System.out.println("NoAutoIndentClosingPar\n");
 
     	String str = "" +
@@ -375,38 +378,38 @@
     	"              what(),\n" + //the next line should be indented to this one, and not to the start of the indent
     	"            )\n" +
     	"";
-    	
-    	
+
+
     	final Document doc = new Document(str);
-    	String s = 
+    	String s =
     		"\n"+
     		"            )\n";
     	DocCmd docCmd = new DocCmd(doc.getLength()-s.length(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n              ", docCmd.text); 
-    	
+    	assertEquals("\n              ", docCmd.text);
+
     }
-    
+
     public void __testNoAutoIndentClosingPar2() { System.out.println("NoAutoIndentClosingPar2\n");
 
     	String str = "" +
     	"newTuple = (\n" +
-    	"              what(),\n" + 
+    	"              what(),\n" +
     	"\n" + //pressing tab in the start of this line will bring us to the 'what()' level.
     	"            )\n" +
     	"";
-    	
-    	
+
+
     	final Document doc = new Document(str);
-    	String s = 
+    	String s =
     		"\n"+
     		"            )\n";
     	DocCmd docCmd = new DocCmd(doc.getLength()-s.length(), 0, "\t");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("              ", docCmd.text); 
-    	
+    	assertEquals("              ", docCmd.text);
+
     }
-    
+
     public void __testNewLineAfterLineWithComment() { System.out.println("NewLineAfterLineWithComment\n");
 
     	String str = "" +
@@ -415,10 +418,10 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals("\n", docCmd.text);
+
     }
-    
+
     public void __testNewLine10() { System.out.println("NewLine10\n");
 
     	String str = "" +
@@ -429,10 +432,10 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n    ", docCmd.text); 
-    	
+    	assertEquals("\n    ", docCmd.text);
+
     }
-    
+
     public void __testNewLine11() { System.out.println("NewLine11\n");
 
     	String str = "" +
@@ -443,11 +446,11 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-"if False: 'foo'".length(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n    ", docCmd.text); 
-    	
+    	assertEquals("\n    ", docCmd.text);
+
     }
-    
-    
+
+
     public void __testNewLine12() { System.out.println("NewLine12\n");
 
     	String str = "" +
@@ -456,9 +459,9 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-"print 'done'".length(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n    ", docCmd.text); 
+    	assertEquals("\n    ", docCmd.text);
     }
-    
+
 
     public void __testNewLine3() { System.out.println("NewLine3\n");
 
@@ -467,12 +470,12 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-4, 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n    ", docCmd.text); 
-    	
+    	assertEquals("\n    ", docCmd.text);
+
     	String expected = "for a in b:    ";
     	assertEquals(expected, doc.get());
     }
-    
+
     public void __testNewLine6() { System.out.println("NewLine6\n");
 
     	String str = "" +
@@ -482,9 +485,9 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
+    	assertEquals("\n", docCmd.text);
     }
-    
+
     public void __testNewLine6a() { System.out.println("NewLine6a\n");
 
     	String str = "" +
@@ -494,9 +497,9 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
+    	assertEquals("\n", docCmd.text);
     }
-    
+
     public void __testNewLine7() { System.out.println("NewLine7\n");
 
         String str = "" +
@@ -508,9 +511,9 @@
         final Document doc = new Document(str);
         DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
         strategy.customizeDocumentCommand(doc, docCmd);
-        assertEquals("\n", docCmd.text); 
+        assertEquals("\n", docCmd.text);
     }
-    
+
     public void __testNewLine8() { System.out.println("NewLine8\n");
 
         String str = "" +
@@ -522,9 +525,9 @@
         final Document doc = new Document(str);
         DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
         strategy.customizeDocumentCommand(doc, docCmd);
-        assertEquals("\n    ", docCmd.text); 
+        assertEquals("\n    ", docCmd.text);
     }
-    
+
     public void __testIndent() { System.out.println("Indent\n");
 
     	String str = "" +
@@ -534,9 +537,9 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-"if foo:".length(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n    ", docCmd.text); 
+    	assertEquals("\n    ", docCmd.text);
     }
-    
+
     public void __testIndentAfterRet() { System.out.println("IndentAfterRet\n");
 
     	String str = "" +
@@ -551,9 +554,9 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n    ", docCmd.text); 
+    	assertEquals("\n    ", docCmd.text);
     }
-    
+
     public void __testIndentAfterRet2() { System.out.println("IndentAfterRet2\n");
 
     	String str = "" +
@@ -568,9 +571,9 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\t");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("    ", docCmd.text); 
+    	assertEquals("    ", docCmd.text);
     }
-    
+
     public void __testNewLine9() { System.out.println("NewLine9\n");
 
         String str = "" +
@@ -580,9 +583,9 @@
         final Document doc = new Document(str);
         DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
         strategy.customizeDocumentCommand(doc, docCmd);
-        assertEquals("\n        ", docCmd.text); 
+        assertEquals("\n        ", docCmd.text);
     }
-    
+
     public void __testNewLine4() { System.out.println("NewLine4\n");
 
     	String str = "" +
@@ -596,11 +599,11 @@
     	"def a():\n" +
     	"    print a" +
     	"";
-    	assertEquals(expected, doc.get()); 
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals(expected, doc.get());
+    	assertEquals("\n", docCmd.text);
+
     }
-    
+
     public void _testNewLine5() { System.out.println("NewLine5\n");
 
     	String str = "" +
@@ -614,10 +617,10 @@
     	"def a():\n" +
     	"    " +
     	"";
-    	assertEquals(expected, doc.get()); 
-    	assertEquals("\n", docCmd.text); 
+    	assertEquals(expected, doc.get());
+    	assertEquals("\n", docCmd.text);
     }
-    
+
     public void __testNewLine() { System.out.println("NewLine\n");
 
     	String str = "createintervention() #create " +
@@ -625,10 +628,10 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals("\n", docCmd.text);
+
     }
-    
+
     public void __testNewLine2() { System.out.println("NewLine2\n");
 
     	String str = "err)" +
@@ -636,11 +639,11 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\n");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("\n", docCmd.text); 
-    	
+    	assertEquals("\n", docCmd.text);
+
     }
-    
-    
+
+
     public void __testTabInComment() { System.out.println("TabInComment\n");
 
     	String str = "#comment" +
@@ -649,9 +652,9 @@
     	DocCmd docCmd = new DocCmd(doc.getLength(), 0, "\t");
     	strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("    ", docCmd.text); // a single tab should go to the correct indent
-    	
+
     }
-    
+
     public void __testIndentingWithTab() { System.out.println("IndentingWithTab\n");
 
     	String str = "class C:\n" +
@@ -662,7 +665,7 @@
 		strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("        ", docCmd.text); // a single tab should go to the correct indent
     }
-    
+
     public void __testIndentingWithTab2() { System.out.println("IndentingWithTab2\n");
 
     	String str = "" +
@@ -674,7 +677,7 @@
     	strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("    ", docCmd.text); // a single tab should go to the correct indent
     }
-    
+
     public void __testIndentingWithTab3() { System.out.println("IndentingWithTab3\n");
 
     	String str = "" +
@@ -687,7 +690,7 @@
     	strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("        ", docCmd.text); // a single tab should go to the correct indent
     }
-    
+
 //    public void __testWithoutSmartIndent() { System.out.println("WithoutSmartIndent\n");
 //    	final TestIndentPrefs prefs = new TestIndentPrefs(true, 4);
 //    	prefs.smartIndentAfterPar = false;
@@ -701,7 +704,7 @@
 //    	strategy.customizeDocumentCommand(doc, docCmd);
 //    	assertEquals("\n        ", docCmd.text); // a single tab should go to the correct indent
 //    }
-    
+
     public void __testIndentingWithTab4() { System.out.println("IndentingWithTab4\n");
 
     	String str = "" +
@@ -715,7 +718,7 @@
     	strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("    ", docCmd.text); // a single tab should go to the correct indent
     }
-    
+
     public void __testIndentingWithTab5() { System.out.println("IndentingWithTab5\n");
 
     	String str = "" +
@@ -729,10 +732,10 @@
     	strategy.customizeDocumentCommand(doc, docCmd);
     	//assertEquals(" ", docCmd.text); // a single tab should go to the correct indent
     	assertEquals ("        ", docCmd.text);
-    	assertEquals ("       ".length(), docCmd.length);    	
+    	assertEquals ("       ".length(), docCmd.length);
     	assertEquals (doc.getLength() - "       ".length(), docCmd.offset);
     }
-    
+
     public void __testIndentingWithTab6() { System.out.println("IndentingWithTab6\n");
 
     	String str = "" +
@@ -745,7 +748,7 @@
     	strategy.customizeDocumentCommand(doc, docCmd);
     	assertEquals("        ", docCmd.text); // a single tab should go to the correct indent
     }
-    
+
     public void __testIndentingWithTab7() { System.out.println("IndentingWithTab7\n");
 
     	String str = "" +
@@ -759,25 +762,25 @@
     	assertEquals("        ", docCmd.text); // a single tab should go to the correct indent
     	assertEquals(2, docCmd.length); // the spaces after the indent should be removed
     }
-    
+
     public void _testTabs() { System.out.println("Tabs\n");
 
         DocCmd docCmd = new DocCmd(0, 0, "\t");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("\t", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "\t\t");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("\t\t", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "\tabc");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("\tabc", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "\tabc\t");
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("\tabc\t", docCmd.text);
-        
+
         docCmd = new DocCmd(0, 0, "    abc"); //paste
         strategy.customizeDocumentCommand(new Document(""), docCmd);
         assertEquals("\tabc", docCmd.text);
@@ -793,7 +796,7 @@
                    "    ";
         assertEquals(expected, docCmd.text);
     }
-    
+
     public void _testCommentsIndent2() { System.out.println("CommentsIndent2\n");
 
         //__test not indent more
@@ -803,7 +806,7 @@
         expected = "\n" +
         "    ";
         assertEquals(expected, docCmd.text);
-        
+
         //test indent more
         doc = "    if False:";
         docCmd = new DocCmd(doc.length(), 0, "\n");
@@ -812,10 +815,10 @@
         "        ";
         assertEquals(expected, docCmd.text);
     }
-    
+
     public void __testIndentLevel3() { System.out.println("IndentLevel3\n");
 
-    	
+
     	String doc = "" +
 		"a = (1, \n" +
 		"  2,"; //should keep this indent, and not go to the opening bracket indent.
@@ -824,10 +827,10 @@
     	String expected = "\n  ";
     	assertEquals(expected, docCmd.text);
     }
-    
+
     public void __testIndentLevel() { System.out.println("IndentLevel\n");
 
-        
+
         String doc = "" +
                 "def m1(): #some comment\n" +
                 "    print foo(a,\n" +
@@ -837,10 +840,10 @@
         String expected = "\n    ";
         assertEquals(expected, docCmd.text);
     }
-    
+
     public void __testIndentLevel2() { System.out.println("IndentLevel2\n");
 
-        
+
         String doc = "" +
         "def m1(): #some comment\n" +
         "    def metfoo(a,\n" +
@@ -850,7 +853,7 @@
         String expected = "\n        ";
         assertEquals(expected, docCmd.text);
     }
-    
+
     public void __testDedent() { System.out.println("Dedent\n");
 
 
@@ -860,7 +863,7 @@
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         String expected = "\n";
         assertEquals(expected, docCmd.text);
-        
+
         //test ending with
         doc = "def m1(): #some comment\n" +
               "    return";
@@ -868,7 +871,7 @@
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "\n";
         assertEquals(expected, docCmd.text);
-        
+
         //test not dedenting
         doc = "def m1(): #some comment\n" +
         "    returnIs10 = 10";
@@ -877,9 +880,9 @@
         expected = "\n"+
         "    ";
         assertEquals(expected, docCmd.text);
-        
+
     }
-    
+
     public void __testIndentSpaces() { System.out.println("IndentSpaces\n");
         //test after class xxx:\n
 
@@ -889,7 +892,7 @@
         String expected = "\n" +
         		          "    ";
         assertEquals(expected, docCmd.text);
-        
+
         //test regular
         doc = "    a = 2";
         docCmd = new DocCmd(doc.length(), 0, "\n");
@@ -907,8 +910,8 @@
                    "     ";
         assertEquals(expected, docCmd.text);
         */
-    }        
-    
+    }
+
     public void _testAfterClosePar1() { System.out.println("AfterClosePar1\n");
 
         String doc = "m = [a,";
@@ -917,9 +920,9 @@
         String expected = "\n" +
         "     ";
         assertEquals(expected, docCmd.text);
-        
+
     }
-    
+
 //    public void __testAfterCloseParOnlyIndent() { System.out.println("AfterCloseParOnlyIndent\n");
 //    	final TestIndentPrefs prefs = new TestIndentPrefs(true, 4);
 //
@@ -930,9 +933,9 @@
 //    	String expected = "\n" +
 //    	"    ";
 //    	assertEquals(expected, docCmd.text);
-//    	
+//
 //    }
-    
+
 //    public void __testAfterCloseParOnlyIndent2() { System.out.println("AfterCloseParOnlyIndent2\n");
 //    	final TestIndentPrefs prefs = new TestIndentPrefs(true, 4);
 //
@@ -945,9 +948,9 @@
 //    	String expected = "\n" +
 //    	"        ";
 //    	assertEquals(expected, docCmd.text);
-//    	
+//
 //    }
-    
+
     public void __testAfterClosePar2() { System.out.println("AfterClosePar2\n");
 
         String doc = "m = [a,\n" +
@@ -957,7 +960,7 @@
         String expected = "\n" +
         "     ";
         assertEquals(expected, docCmd.text);
-        
+
     }
     public void _testAfterClosePar() { System.out.println("AfterClosePar\n");
 
@@ -967,7 +970,7 @@
         String expected = "\n" +
         "         ";
         assertEquals(expected, docCmd.text);
-        
+
 //        doc = "m = [a, otherCall(), ]";
 //        docCmd = new DocCmd(doc.length()-1, 0, "\n"); //right before the last ']'
 //        strategy.customizeDocumentCommand(new Document(doc), docCmd);
@@ -975,7 +978,7 @@
 //        "      ";
 //        assertEquals(expected, docCmd.text);
     }
-    
+
     public void _testIndent2() { System.out.println("Indent2\n");
 
         String doc = "m = [a, otherCall(), ";
@@ -991,7 +994,7 @@
 //        expected = "\n" +
 //        "      ";
 //        assertEquals(expected, docCmd.text);
-        
+
         doc = "def m2(self):\n"+
               "    m1(a, b(), )";
         docCmd = new DocCmd(doc.length()-1, 0, "\n"); //right before the last ')'
@@ -999,20 +1002,20 @@
         expected = "\n" +
               "       ";
         assertEquals(expected, docCmd.text);
-        
+
     }
-    
+
     public void _testIndent3() { System.out.println("Indent3\n");
-        
+
 
         String doc = ""+
-        "properties.create(a = newClass(),"; 
+        "properties.create(a = newClass(),";
         DocCmd docCmd = new DocCmd(doc.length(), 0, "\n");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         String expected = "\n"+
         "                  ";
         assertEquals(expected, docCmd.text);
-        
+
     }
     public void __testIndent3a() { System.out.println("Indent3a\n");
 
@@ -1025,7 +1028,7 @@
     	"                  ";
     	assertEquals(expected, docCmd.text);
     }
-    
+
     public void _testIndent4() { System.out.println("Indent4\n"); //even if it does not end with ',' we should indent in parenthesis
 
     	String doc = ""+
@@ -1037,8 +1040,8 @@
     	"                               ";
     	assertEquals(expected, docCmd.text);
     }
-    
-    public void __testDedent5() { System.out.println("Dedent5\n"); 
+
+    public void __testDedent5() { System.out.println("Dedent5\n");
 
     	String doc = ""+
     	"properties.create(a = newClass(),\n" +
@@ -1050,9 +1053,9 @@
     	"                  ";
     	assertEquals(expected, docCmd.text);
     }
-    
+
 //    public void __testNoSmartIndent() { System.out.println("NoSmartIndent\n");
-//    	
+//
 //    	TestIndentPrefs prefs = new TestIndentPrefs(false, 4, true);
 //    	prefs.smartIndentAfterPar = false;
 //
@@ -1104,16 +1107,16 @@
 //    	String doc = null;
 //    	DocCmd docCmd = null;
 //    	String expected = null;
-//    	
+//
 //    	doc = "class c:\n" +
 //    	"    def met";
 //    	docCmd = new DocCmd(doc.length(), 0, "(");
 //    	strategy.customizeDocumentCommand(new Document(doc), docCmd);
 //    	expected = "():";
 //    	assertEquals(expected, docCmd.text);
-//    	
+//
 //    }
-    
+
     /**
      * Tests automatically adding/replacing brackets, colons, and parentheses.
      * @see PyAutoIndentStrategy
@@ -1125,14 +1128,14 @@
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         String expected = "():";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "class c:\n" +
     		  "    def met";
         docCmd = new DocCmd(doc.length(), 0, "(");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "(self):";
         assertEquals(expected, docCmd.text);
-        
+
         //same as above, but with tabs
         doc = "class c:\n" +
         "\tdef met";
@@ -1140,31 +1143,31 @@
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "(self):";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "class c(object): #";
         docCmd = new DocCmd(doc.length(), 0, "(");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "("; //in comment
         assertEquals(expected, docCmd.text);
-        
+
         doc = "def a";
         docCmd = new DocCmd(doc.length(), 0, "(");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "():";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "a";
         docCmd = new DocCmd(doc.length(), 0, "(");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "()";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "a()";
         docCmd = new DocCmd(doc.length()-1, 0, "(");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = "(";
         assertEquals(expected, docCmd.text);
-		
+
 		// test very simple ':' detection
 		doc = "def something():";
 		docCmd = new DocCmd(doc.length() - 1, 0, ":");
@@ -1181,7 +1184,7 @@
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(32, docCmd.caretOffset);
-		
+
 		// test inputting ':' at the end of a document
 		doc = "class c:\n" +
 				"    def __init__(self)";
@@ -1190,7 +1193,7 @@
 		expected = ":";
 		assertEquals(expected, docCmd.text);
 		assertEquals(31, docCmd.offset);
-		
+
 		// test same as above, but with a comment
 		doc = "class c:\n" +
 				"    def __init__(self): # comment";
@@ -1199,7 +1202,7 @@
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(32, docCmd.caretOffset);
-		
+
 		// test inputting ')' at the end of a document
 		doc = "class c:\n" +
 				"    def __init__(self)";
@@ -1208,7 +1211,7 @@
 		expected = ")";
 		assertEquals(expected, docCmd.text);
 		assertEquals(0, docCmd.caretOffset);
-		
+
 		// test inputting ')' at the end of a document when it should replace a ')'
 		doc = "class c:\n" +
 				"    def __init__(self)";
@@ -1217,16 +1220,16 @@
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(31, docCmd.caretOffset);
-		
+
 		// test inputting ')' in the middle of the document
-		doc = "def __init__(self):\n" + 
+		doc = "def __init__(self):\n" +
 			  "   pass";
 		docCmd = new DocCmd(17, 0, ")");
 		strategy.customizeDocumentCommand(new Document(doc), docCmd);
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(18, docCmd.caretOffset);
-		
+
 		// check very simple braces insertion
 		doc = "()";
 		docCmd = new DocCmd(1, 0, ")");
@@ -1234,7 +1237,7 @@
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(2, docCmd.caretOffset);
-		
+
 		// check simple braces insertion not at end of document
 		doc = "() ";
 		docCmd = new DocCmd(1, 0, ")");
@@ -1242,7 +1245,7 @@
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(2, docCmd.caretOffset);
-		
+
 		// check insertion that should happen even being just before a ')'
 		doc = "(() ";
 		docCmd = new DocCmd(2, 0, ")");
@@ -1250,7 +1253,7 @@
 		expected = ")";
 		assertEquals(expected, docCmd.text);
 		assertEquals(0, docCmd.caretOffset);
-		
+
 		// check same stuff for brackets
 		// check simple braces insertion not at end of document
 		doc = "[] ";
@@ -1259,7 +1262,7 @@
 		expected = "";
 		assertEquals(expected, docCmd.text);
 		assertEquals(2, docCmd.caretOffset);
-		
+
 		// two different kinds of braces next to each other
 		doc = "([)";
 		docCmd = new DocCmd(2, 0, "]");
@@ -1268,7 +1271,7 @@
 		assertEquals(expected, docCmd.text);
 		assertEquals(0, docCmd.caretOffset);
     }
-    
+
     public void __testParens() { System.out.println("Parens\n");
 
     	String str = "isShown() #suite()" +
@@ -1276,11 +1279,11 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-") #suite()".length(), 0, ")");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("", docCmd.text); 
+    	assertEquals("", docCmd.text);
     	assertEquals(9, docCmd.caretOffset);
-    	
+
     }
-    
+
     public void __testParens2() { System.out.println("Parens2\n");
 
     	String str = "isShown() #suite()'" +
@@ -1288,12 +1291,12 @@
     	final Document doc = new Document(str);
     	DocCmd docCmd = new DocCmd(doc.getLength()-") #suite()'".length(), 0, ")");
     	strategy.customizeDocumentCommand(doc, docCmd);
-    	assertEquals("", docCmd.text); 
+    	assertEquals("", docCmd.text);
     	assertEquals(9, docCmd.caretOffset);
-    	
+
     }
 
-    
+
     public void __testElse() { System.out.println("Else\n");
         //first part of test - simple case
 
@@ -1312,10 +1315,10 @@
                 "    print a\n" +
                 "else",
                 doc.get());
-        
+
         //second part of test - should not dedent
 
-        strDoc = 
+        strDoc =
         "if foo:\n" +
         "    if somethingElse:" +
         "        print a\n" +
@@ -1333,9 +1336,9 @@
                 "        print a\n" +
                 "    else",
                 doc.get());
-        
+
     }
-    
+
     public void _testElif() { System.out.println("Elif\n");
     	//first part of test - simple case
 
@@ -1354,10 +1357,10 @@
     			"    print a\n" +
     			"elif",
     			doc.get());
-    	
+
     	//second part of test - should not dedent
 
-    	strDoc = 
+    	strDoc =
     		"if foo:\n" +
     		"    if somethingElse:" +
     		"        print a\n" +
@@ -1375,14 +1378,14 @@
     			"        print a\n" +
     			"    elif",
     			doc.get());
-    	
+
     }
-    
-    
+
+
     public void __testElseInFor() { System.out.println("ElseInFor\n");
         //first part of test - simple case
 
-        String strDoc = 
+        String strDoc =
         "for i in []:\n" +
         "    msg=\"success at %s\" % i\n" +
         "    else" +
@@ -1401,11 +1404,11 @@
                 "",
                 doc.get());
     }
-    
+
     public void __testElseInTry() { System.out.println("ElseInTry\n");
         //first part of test - simple case
 
-        String strDoc = 
+        String strDoc =
             "try:\n" +
             "    print a\n" +
             "except:\n" +
@@ -1426,7 +1429,7 @@
                 "else",
                 doc.get());
     }
-    
+
     public void _testElifWithPar() { System.out.println("ElifWithPar\n");
     	//first part of test - simple case
 
@@ -1445,10 +1448,10 @@
     			"    print a\n" +
     			"elif",
     			doc.get());
-    	
+
     	//second part of test - should not dedent
 
-    	strDoc = 
+    	strDoc =
     		"if foo:\n" +
     		"    if somethingElse:" +
     		"        print a\n" +
@@ -1466,9 +1469,9 @@
     			"        print a\n" +
     			"    elif",
     			doc.get());
-    	
+
     }
-    
+
     public void _testAutoImportStr() { System.out.println("AutoImportStr\n");
 
         String doc = "from xxx";
@@ -1476,31 +1479,31 @@
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         String expected = " import ";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "from xxx import";
         docCmd = new DocCmd(doc.length(), 0, " ");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = " ";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "no from xxx";
         docCmd = new DocCmd(doc.length(), 0, " ");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = " ";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "From xxx";
         docCmd = new DocCmd(doc.length(), 0, " ");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = " ";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "from this space";
         docCmd = new DocCmd(doc.length(), 0, " ");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = " ";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "from";
         docCmd = new DocCmd(doc.length(), 0, " ");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
@@ -1512,22 +1515,23 @@
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = " ";
         assertEquals(expected, docCmd.text);
-        
+
         doc = "from xxx #import yyy";
         docCmd = new DocCmd(8, 0, " ");
         strategy.customizeDocumentCommand(new Document(doc), docCmd);
         expected = " import ";
         assertEquals(expected, docCmd.text);
-        
+
     }
 
+	@Test
     public void testBug186514() throws Exception {
     	String prefix = "class A\n\tdef b\n\tend\n\t";
 		String postfix = "\nend";
 		String inserted = "def test1\nend\n|";
 		String expected = "\tdef test1\n\tend\n\t|";
 		doTestInsertion(prefix, postfix, inserted, expected);
-    }    
-    
+    }
+
 
 }
diff --git a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/PartitioningTest.java b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/PartitioningTest.java
index 942bd3d..0e7f45d 100644
--- a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/PartitioningTest.java
+++ b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/PartitioningTest.java
@@ -1,15 +1,15 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2017 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
  *
- 
+
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ui.tests.text;
 
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
 
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.dltk.ruby.internal.ui.text.IRubyPartitions;
@@ -18,12 +18,9 @@
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITypedRegion;
 import org.eclipse.jface.text.TextUtilities;
+import org.junit.Test;
 
-public class PartitioningTest extends TestCase {
-
-	public PartitioningTest(String name) {
-		super(name);
-	}
+public class PartitioningTest {
 
 	public void doTest(String data, String partition) throws Exception {
 		final String DELIMITER = "#$#";
@@ -57,24 +54,29 @@
 				expected.toString(), actual.toString());
 	}
 
+	@Test
 	public void testCode() throws Exception {
 		doTest("#$#class Foo; end#$#", IDocument.DEFAULT_CONTENT_TYPE);
 	}
 
+	@Test
 	public void testString() throws Exception {
 		doTest("puts #$#\"Hello, world\"#$#, a", IRubyPartitions.RUBY_STRING);
 	}
 
+	@Test
 	public void testPercentStringAfterPuts() throws Exception {
 		doTest("puts #$#%s/foo bar boz/#$# / 2", IRubyPartitions.RUBY_PERCENT_STRING);
 	}
 
+	@Test
 	public void testPercentStringAfterMethodCall() throws Exception {
 		doTest(
 				"def foo(*args); puts(*args); end\nfoo #$#%s/foo bar boz/#$# / 2",
 				IRubyPartitions.RUBY_PERCENT_STRING);
 	}
 
+	@Test
 	public void testPercentOperatorAfterVariable() throws Exception {
 		// XXX: this does not start a string in Ruby, but will be treated as a
 		// string in IDE
@@ -82,11 +84,13 @@
 				IRubyPartitions.RUBY_PERCENT_STRING);
 	}
 
+	@Test
 	public void testPercentDoesStartString() throws Exception {
 		doTest("if a == #$#%s/2/#$# then puts 1 else puts 2 end",
 				IRubyPartitions.RUBY_PERCENT_STRING);
 	}
 
+	@Test
 	public void testPercentDoesNotStartString() throws Exception {
 		// XXX: this does not start a string in Ruby, but will be treated as a
 		// string in IDE
@@ -135,6 +139,7 @@
 				IDocument.DEFAULT_CONTENT_TYPE);
 	}
 
+	@Test
 	public void testBug179488() throws Exception {
 		doTest("class Test\ndef test(x)\nobj = f($'#$#, x)\n"
 				+ "if (obj.class.name == #$#\"Array\") then\n#...\n"
@@ -164,6 +169,7 @@
 				IDocument.DEFAULT_CONTENT_TYPE);
 	}
 
+	@Test
 	public void testBug180370() throws Exception {
 		doTest(
 				"#$## Some metaprogramming to make it rock\n#$#"
diff --git a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/RubyRequireHyperlinkDetectorTest.java b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/RubyRequireHyperlinkDetectorTest.java
index 0bcefc5..c8c32ea 100644
--- a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/RubyRequireHyperlinkDetectorTest.java
+++ b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/RubyRequireHyperlinkDetectorTest.java
@@ -11,18 +11,17 @@
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ui.tests.text;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
 import org.eclipse.dltk.ruby.internal.ui.text.hyperlink.RubyRequireHyperlinkDetector;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.junit.Test;
 
-import junit.framework.TestCase;
-
-public class RubyRequireHyperlinkDetectorTest extends TestCase {
-
-	public RubyRequireHyperlinkDetectorTest(String name) {
-		super(name);
-	}
+public class RubyRequireHyperlinkDetectorTest {
 
 	/**
 	 * @author Alexey
@@ -86,30 +85,37 @@
 				.getHyperlinkText());
 	}
 
+	@Test
 	public void testSingleQuotes() {
 		detect("require 'abc'", 9, 3);
 	}
 
+	@Test
 	public void testDoubleQuotes() {
 		detect("require \"abc\"", 9, 3);
 	}
 
+	@Test
 	public void testManySpaces() {
 		detect(" require  \"abc\"", 11, 3);
 	}
 
+	@Test
 	public void testBracketsSingleQuotes() {
 		detect("require('abc')", 9, 3);
 	}
 
+	@Test
 	public void testBracketsDoubleQuotes() {
 		detect("require(\"abc\")", 9, 3);
 	}
 
+	@Test
 	public void testBracketsAndSpaces() {
 		detect("require( 'abc' )", 10, 3);
 	}
 
+	@Test
 	public void testNoHyperlink() {
 		assertNull(detector.checkLine("require abc"));
 		assertNull(detector.checkLine("require 'abc\""));
diff --git a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/indenting/IndentingTest.java b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/indenting/IndentingTest.java
index 1eb69f4..fad6599 100644
--- a/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/indenting/IndentingTest.java
+++ b/tests/org.eclipse.dltk.ruby.ui.tests/src/org/eclipse/dltk/ruby/ui/tests/text/indenting/IndentingTest.java
@@ -5,11 +5,11 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- 
+
  *******************************************************************************/
 package org.eclipse.dltk.ruby.ui.tests.text.indenting;
 
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
 
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.dltk.ruby.internal.ui.RubyPreferenceConstants;
@@ -23,13 +23,19 @@
 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 extends TestCase {
+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++) {
@@ -42,9 +48,8 @@
 				"Workbench did not intitialized during a minute.");
 	}
 
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void setUp() throws Exception {
 		waitWorkbenchCreated();
 		tabStrategy = createStrategy(true);
 		spaceStrategy = createStrategy(false);
@@ -70,7 +75,7 @@
 		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);
 
@@ -127,7 +132,7 @@
 	}
 
 	private void magic() throws Exception {
-		String name = getName();
+		String name = testName.getMethodName();
 		String fileName = name.substring(4, 5).toLowerCase()
 				+ name.substring(5) + ".rb";
 		String data = TestUtils.getData(PATH + fileName);
@@ -137,75 +142,93 @@
 		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();
