package com.aptana.rdt.internal.core.parser.warnings; import org.rubypeople.rdt.core.RubyCore; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import com.aptana.rdt.internal.parser.warnings.SimilarVariableNameVisitor; public class TC_SimilarVariableNameVisitor extends WarningVisitorTest { @Override protected RubyLintVisitor createVisitor(String code) { return new SimilarVariableNameVisitor(code){ @Override protected String getSeverity() { return RubyCore.WARNING; } }; } public void testEmptyHasNoProblems() throws Exception { String code = ""; parse(code); assertEquals(0, numberOfProblems()); } public void testReferToLocalWithSimilarName() throws Exception { String code = "class Ralph\n" + " def name\n" + " local = 1\n" + " puts lcal\n" + " end\n" + "end\n"; parse(code); assertEquals(1, numberOfProblems()); } public void testTranspositionDoesntPushSmallVariablesAboveThreshold() throws Exception { String code = "class Ralph\n" + " def name\n" + " local = 1\n" + " puts lcoal\n" + " end\n" + "end\n"; parse(code); assertEquals(1, numberOfProblems()); } public void testLocalDoesntClashWithInstance() throws Exception { String code = "class Ralph\n" + " def name\n" + " local = 1\n" + " puts @local\n" + " end\n" + "end\n"; parse(code); assertEquals(0, numberOfProblems()); } public void testLocalDoesntClashWithClassVar() throws Exception { String code = "class Ralph\n" + " def name\n" + " localcalifragillistic = 1\n" + " puts @@localcalifragillistic\n" + " end\n" + "end\n"; parse(code); assertEquals(0, numberOfProblems()); } public void testInstanceDoesntClashWithClassVar() throws Exception { String code = "class Ralph\n" + " def name\n" + " @localcalifragillistic = 1\n" + " puts @@localcalifragillistic\n" + " end\n" + "end\n"; parse(code); assertEquals(0, numberOfProblems()); } public void testReallySmallVariablesDontTriggerProblem() throws Exception { String code = "class Ralph\n" + " def name\n" + " @ca = 1\n" + " puts @cb\n" + " end\n" + "end\n"; parse(code); assertEquals(0, numberOfProblems()); } public void testReallySmallClassVariablesDontTriggerProblem() throws Exception { String code = "class Ralph\n" + " def name\n" + " @@a = 1\n" + " puts @@b\n" + " end\n" + "end\n"; parse(code); assertEquals(0, numberOfProblems()); } public void testTooDisimilarNameWontTriggerProblem() throws Exception { String code = "class Ralph\n" + " def name\n" + " local = 1\n" + " puts llal\n" + " end\n" + "end\n"; parse(code); assertEquals(0, numberOfProblems()); } // TODO Also watch for similarity in constant names? public void testReferToInstanceVarWithSimilarName() throws Exception { String code = "class Ralph\n" + " def name\n" + " @local = 1\n" + " puts @lcal\n" + " end\n" + "end\n"; parse(code); assertEquals(1, numberOfProblems()); } public void testReferToClassVarWithSimilarName() throws Exception { String code = "class Ralph\n" + " def self.name\n" + " @@local = 1\n" + " puts @@lcal\n" + " end\n" + "end\n"; parse(code); assertEquals(1, numberOfProblems()); } public void testHandleInstanceVariableToClassScoping() throws Exception { String code = "class Ralph\n" + " def initialize(name)\n" + " @name = name\n" + " end\n" + " def name\n" + " @namee\n" + " end\n" + "end\n"; parse(code); assertEquals(1, numberOfProblems()); } public void testHandleVarsOutsideMethods() throws Exception { String code = "class Ralph\n" + " @@class_var = 1\n" + " def initialize(name)\n" + " @name = name\n" + " end\n" + " def name\n" + " @@class_val\n" + " end\n" + "end\n"; parse(code); assertEquals(1, numberOfProblems()); } }