package com.aptana.rdt.internal.core.parser.warnings; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.rubypeople.rdt.core.RubyCore; import org.rubypeople.rdt.core.compiler.CategorizedProblem; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import org.rubypeople.rdt.internal.core.parser.warnings.AbstractRubyLintVisitorTestCase; import com.aptana.rdt.IProblem; import com.aptana.rdt.internal.parser.warnings.LocalsMaskingMethodsVisitor; public class LocalsMaskingMethodsVisitorTest extends AbstractRubyLintVisitorTestCase { @Override protected RubyLintVisitor createVisitor(String src) { return new LocalsMaskingMethodsVisitor(src) { @Override protected String getSeverity() { return RubyCore.WARNING; } }; } public void testLocalVariableMatchesMethodName() { String src = "class Cart\n" + " def price\n" + " price = 1" + " end\n" + "end"; List<CategorizedProblem> problems = getProblems(src); assertEquals(1, problems.size()); assertEquals(IProblem.LocalMaskingMethod, problems.get(0).getID()); assertEquals(27, problems.get(0).getSourceStart()); assertEquals(36, problems.get(0).getSourceEnd()); } public void testLocalVariableMatchesAttrAccessor() { String src = "class Cart\n" + " attr_accessor :price\n def method\n" + " price = 1" + " end\n" + "end"; List<CategorizedProblem> problems = getProblems(src); assertEquals(1, problems.size()); assertEquals(IProblem.LocalMaskingMethod, problems.get(0).getID()); assertEquals(51, problems.get(0).getSourceStart()); assertEquals(60, problems.get(0).getSourceEnd()); } public void testAssigningToAttrWithWriterProducesNoWarning() { String src = "class Cart\n" + " attr :price\n def method\n" + " price = 1" + " end\n" + "end"; List<CategorizedProblem> problems = getProblems(src); assertEquals(0, problems.size()); } public void testOnlyWarnsOnFirstAssignmentInScope() { String src = "class Struct\n" + " def size\n" + " @size\n" + " end\n" + " def malloc(size = nil)\n" + " if( !size )\n" + " size = @size\n" + " end\n" + " end\n" + "end"; List<CategorizedProblem> problems = getProblems(src); assertEquals(1, problems.size()); assertEquals(IProblem.LocalMaskingMethod, problems.get(0).getID()); assertEquals(53, problems.get(0).getSourceStart()); assertEquals(63, problems.get(0).getSourceEnd()); } public void testOnlyWarnsOnFirstAssignmentPerScope() { String src = "class Struct\n" + " def size\n" + " @size\n" + " end\n" + " def malloc(size = nil)\n" + " if( !size )\n" + " size = @size\n" + " end\n" + " end\n" + " def other(size = nil)\n" + " if( !size )\n" + " size = @size\n" + " end\n" + " end\n" + "end"; List<CategorizedProblem> problems = getProblems(src); assertEquals(2, problems.size()); // force order by offsets Collections.sort(problems, new Comparator<CategorizedProblem>() { public int compare(CategorizedProblem o1, CategorizedProblem o2) { return o1.getSourceStart() - o2.getSourceStart(); } }); assertEquals(IProblem.LocalMaskingMethod, problems.get(0).getID()); assertEquals(53, problems.get(0).getSourceStart()); assertEquals(63, problems.get(0).getSourceEnd()); assertEquals(IProblem.LocalMaskingMethod, problems.get(1).getID()); assertEquals(126, problems.get(1).getSourceStart()); assertEquals(136, problems.get(1).getSourceEnd()); } }