package com.jetbrains.lang.dart.ide; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.lang.dart.DartCodeInsightFixtureTestCase; import com.jetbrains.lang.dart.ide.template.macro.DartClassNameMacro; import com.jetbrains.lang.dart.ide.template.macro.DartMethodNameMacro; import com.jetbrains.lang.dart.ide.template.macro.DartMethodParametersMacro; import com.jetbrains.lang.dart.ide.template.macro.DartMethodReturnTypeMacro; import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.List; public class DartTemplateMacrosTest extends DartCodeInsightFixtureTestCase { @NotNull private PsiElement findElementAtCaret(@NotNull final String source) { final int caretOffset = source.indexOf("<caret>"); assertTrue(caretOffset != -1); final String contents = source.substring(0, caretOffset) + source.substring(caretOffset + "<caret>".length()); final PsiFile psiFile = myFixture.addFileToProject("test.dart", contents); final PsiElement psiElement = psiFile.findElementAt(caretOffset); assertNotNull(psiElement); return psiElement; } private void assertContainingClassNameEquals(final String className, final String source) { assertEquals(className, new DartClassNameMacro().getContainingClassName(findElementAtCaret(source))); } private void assertContainingFunctionNameEquals(final String functionName, final String source) { assertEquals(functionName, new DartMethodNameMacro().getContainingFunctionName(findElementAtCaret(source))); } private void assertContainingFunctionParameterNamesEqual(final String[] params, final String source) { final List<String> parameterNames = new DartMethodParametersMacro().getContainingMethodParameterNames(findElementAtCaret(source)); if (params == null) { assertNull(parameterNames); return; } assertNotNull(parameterNames); assertContainsElements(Arrays.asList(params), parameterNames); } private void assertContainingFunctionReturnTypeEquals(final String returnType, final String source) { assertEquals(returnType, new DartMethodReturnTypeMacro().getContainingFunctionReturnType(findElementAtCaret(source))); } public void testClassNameMacro0() { assertContainingClassNameEquals(null, "f() { <caret> }"); } public void testClassNameMacro1() { assertContainingClassNameEquals("A", "class A { f() { <caret> } }"); } public void testClassNameMacro2() { assertContainingClassNameEquals("A", "enum A { <caret> }"); } public void testMethodNameMacro0() { assertContainingFunctionNameEquals(null, "class A { <caret> }"); } public void testMethodNameMacro1() { assertContainingFunctionNameEquals("f", "f() { <caret> }"); } public void testMethodNameMacro2() { assertContainingFunctionNameEquals("f", "class A { f() { <caret> } }"); } public void testMethodNameMacro3() { assertContainingFunctionNameEquals("g", "g(f()) => e(() => <caret> null);"); } public void testMethodNameMacro4() { assertContainingFunctionNameEquals("a", "get a => <caret> null;"); } public void testMethodNameMacro5() { assertContainingFunctionNameEquals("b", "class A{ set b(c) {<caret>}}"); } public void testMethodNameMacro6() { assertContainingFunctionNameEquals("A", "class A{ A(c) {<caret>}}"); } public void testMethodNameMacro7() { assertContainingFunctionNameEquals("b", "class A{ A.b(c) {<caret>}}"); } public void testMethodNameMacro8() { assertContainingFunctionNameEquals("b", "class A{ factory A.b(c) {<caret>}}"); } public void testMethodNameMacro9() { assertContainingFunctionNameEquals("inner", "class A{ foo() { inner(){<caret>}}}"); } public void testMethodParametersMacro0() { assertContainingFunctionParameterNamesEqual(null, "class A { <caret> }"); } public void testMethodParametersMacro1() { assertContainingFunctionParameterNamesEqual(new String[]{"a", "b"}, "f(a, b) { <caret> }"); } public void testMethodParametersMacro2() { assertContainingFunctionParameterNamesEqual(new String[]{"a", "b"}, "f(a, {b}) { <caret> }"); } public void testMethodParametersMacro3() { assertContainingFunctionParameterNamesEqual(new String[]{"a", "b"}, "f(a, [b]) { <caret> }"); } public void testMethodParametersMacro4() { assertContainingFunctionParameterNamesEqual(new String[]{}, "f() { <caret> }"); } public void testMethodParametersMacro5() { assertContainingFunctionParameterNamesEqual(new String[]{"a"}, "set f(a) { <caret> }"); } public void testMethodParametersMacro6() { assertContainingFunctionParameterNamesEqual(new String[]{"e"}, "class A{ A.from(this.e) { <caret> }}"); } public void testMethodParametersMacro7() { assertContainingFunctionParameterNamesEqual(new String[]{"c"}, "class A{ factory A.foo(@a b c()) { <caret> }}"); } public void testMethodParametersMacro8() { assertContainingFunctionParameterNamesEqual(new String[]{"q"}, "class A{ A(var q) { <caret> }}"); } public void testMethodParametersMacro9() { assertContainingFunctionParameterNamesEqual(new String[]{"x"}, "class A{ b(var c) { void inner(x){<caret>}}"); } public void testMethodReturnType0() { assertContainingFunctionReturnTypeEquals(null, "f() { <caret> }"); } public void testMethodReturnType1() { assertContainingFunctionReturnTypeEquals("void", "void f() { <caret> }"); } public void testMethodReturnType2() { assertContainingFunctionReturnTypeEquals("int", "class A { int f() { <caret> } }"); } }