| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.structuralsearch; |
| |
| import com.intellij.dupLocator.equivalence.EquivalenceDescriptorProvider; |
| import com.intellij.idea.Bombed; |
| import org.jetbrains.plugins.groovy.GroovyFileType; |
| |
| import java.util.Calendar; |
| import java.util.List; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| public class GroovyStructuralSearchTest extends StructuralSearchTestCase { |
| |
| public void test1() throws Exception { |
| String s = "def int x = 0;\n" + |
| "def y = 0;\n" + |
| "int z = 10;\n" + |
| "def int x1"; |
| |
| doTest(s, "def $x$ = $value$;", 3, 1); |
| doTest(s, "def $x$", 4, 3); |
| doTest(s, "int $x$", 3, 3); |
| doTest(s, "def $x$ = $value$", 3, 1); |
| doTest(s, "def $x$ = 0", 2, 1); |
| doTest(s, "int $x$ = 0", 1, 1); |
| doTest(s, "int $x$ = $value$", 2, 2); |
| } |
| |
| public void test2() throws Exception { |
| String s = "def void f(int x) {}\n" + |
| "def f(int x) {\n" + |
| " System.out.println(\"hello\");\n" + |
| "}\n" + |
| "def f(def x) {}\n" + |
| "void g(x) {}\n" + |
| "public def void f(def int y) {\n" + |
| " System.out.println(\"hello\");\n" + |
| "}\n" + |
| "def int f() {}"; |
| |
| doTest(s, "def $f$($param$)", 5, 2); |
| doTest(s, "def $f$($param$) {}", 3, 1); |
| doTest(s, "void $f$($param$) {}", 2, 2); |
| doTest(s, "void $f$(def x)", 2, 0); |
| doTest(s, "def $f$(def x)", 4, 1); |
| doTest(s, "void $f$(def $x$)", 3, 0); |
| doTest(s, "void $f$(int $x$)", 2, 2); |
| doTest(s, "def $f$(int $x$)", 3, 1); |
| doTest(s, "def g($param$)", 1, 0); |
| doTest(s, "def '_T1('_T2*)", 6, 2); |
| |
| // a problem with default eq is that ; is not part of statement |
| doTest(s, "def '_T1('_T2*) {'_T3+}", 2, 0); |
| doTest(s, "def '_T1('_T2*) {'_T3*}", 6, 1); |
| } |
| |
| public void test3() throws Exception { |
| String s = "public class C implements I1, I2 {\n" + |
| " void f() {\n" + |
| " def a = 1;\n" + |
| " def int b = 2;\n" + |
| " }\n" + |
| "}"; |
| |
| doTest(s, "class $name$", 1, 1); |
| doTest(s, "class $name$ implements I1, I2", 1, 1); |
| doTest(s, "class $name$ implements $interface$", 1, 0); |
| doTest(s, "class '_T1 implements '_T2*", 1, 1); |
| doTest(s, "class '_T1 implements '_T2+", 1, 1); |
| doTest(s, "class $name$ implements I2, I1", 1, 0); |
| doTest(s, "class C implements I1, I2 {}", 1, 0); |
| doTest(s, "def a = 1;\n def b = 2;", 1, 0); |
| doTest(s, "def a = 1\n def b = 2", 1, 0); |
| } |
| |
| public void test4() throws Exception { |
| String s = "for (a in list) {\n" + |
| " println(\"hello1\");\n" + |
| " println(\"hello2\");\n" + |
| "}"; |
| doTest(s, "for ($a$ in $b$) {\n" + |
| " $st1$;\n" + |
| " $st2$\n" + |
| "}", 1, 0); |
| doTest(s, "for ($a$ in $b$) {\n" + |
| " $st1$;\n" + |
| " $st2$;\n" + |
| "}", 1, 1); |
| doTest(s, "for ($a$ in $b$) {\n" + |
| " $st1$\n" + |
| " $st2$\n" + |
| "}", 1, 0); |
| doTest(s, "for ($a$ in $b$) {\n" + |
| " $st$\n" + |
| "}", 0, 0); |
| doTest(s, "for ($a$ in $b$) {\n" + |
| " '_T*\n" + |
| "}", 1, 0); |
| doTest(s, "for ($a$ in $b$) {\n" + |
| " '_T+\n" + |
| "}", 1, 0); |
| } |
| |
| public void test5() { |
| String s = "class A {\n" + |
| " def f = {\n" + |
| " println('Hello1')\n" + |
| " println('Hello2')\n" + |
| " }\n" + |
| " def f1 = {\n" + |
| " println('Hello')\n" + |
| " }\n" + |
| "}"; |
| doTest(s, "def $name$ = {\n" + |
| " '_T+\n" + |
| "}", 0, 0); |
| final String old = options.getPatternContext(); |
| try { |
| options.setPatternContext(GroovyStructuralSearchProfile.CLASS_CONTEXT); |
| doTest(s, "def $name$ = {\n" + |
| " '_T+\n" + |
| "}", 2, 2); |
| } |
| finally { |
| options.setPatternContext(old); |
| } |
| } |
| |
| private void doTest(String source, |
| String pattern, |
| int expectedOccurences, |
| int expectedWithDefaultEquivalence) { |
| findAndCheck(source, pattern, expectedOccurences); |
| try { |
| EquivalenceDescriptorProvider.ourUseDefaultEquivalence = true; |
| findAndCheck(source, pattern, expectedWithDefaultEquivalence); |
| } |
| finally { |
| EquivalenceDescriptorProvider.ourUseDefaultEquivalence = false; |
| } |
| } |
| |
| private void findAndCheck(String source, String pattern, int expectedOccurences) { |
| testMatcher.clearContext(); |
| final List<MatchResult> matches = |
| findMatches(source, pattern, true, GroovyFileType.GROOVY_FILE_TYPE, null, GroovyFileType.GROOVY_FILE_TYPE, null, false); |
| assertEquals(expectedOccurences, matches.size()); |
| } |
| } |