package com.jetbrains.lang.dart.documentation;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.lang.dart.DartCodeInsightFixtureTestCase;
import com.jetbrains.lang.dart.ide.documentation.DartDocumentationProvider;
import com.jetbrains.lang.dart.psi.DartComponent;
import com.jetbrains.lang.dart.sdk.DartSdk;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import static com.jetbrains.lang.dart.util.DartPresentableUtil.RIGHT_ARROW;
public class DartDocumentationProviderTest extends DartCodeInsightFixtureTestCase {
private final DartDocumentationProvider myProvider = new DartDocumentationProvider();
private void doTestQuickNavigateInfo(String expectedDoc, String fileContents) {
final int caretOffset = fileContents.indexOf("<caret>");
assertTrue(caretOffset != -1);
final String realContents = fileContents.substring(0, caretOffset) + fileContents.substring(caretOffset + "<caret>".length());
final PsiFile psiFile = myFixture.addFileToProject("test.dart", realContents);
//final DartReference reference = PsiTreeUtil.getParentOfType(psiFile.findElementAt(caretOffset), DartReference.class);
//assertNotNull("reference not found at offset: " + caretOffset, reference);
//final PsiElement element = reference.resolve();
final PsiElement element = PsiTreeUtil.getParentOfType(psiFile.findElementAt(caretOffset), DartComponent.class);
assertNotNull("target element not found at offset " + caretOffset, element);
assertEquals(expectedDoc, myProvider.getQuickNavigateInfo(element, element));
}
private void doTestDocUrl(@NotNull final String expectedUrl, @NotNull final String fileRelPath, @NotNull final String declText) {
final String filePath = DartSdk.getDartSdk(getProject()).getHomePath() + "/lib/" + fileRelPath;
final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(filePath);
final PsiFile psiFile = PsiManager.getInstance(getProject()).findFile(file);
final int caretOffset = psiFile.getText().indexOf(declText);
assertTrue(caretOffset != -1);
final PsiElement element = PsiTreeUtil.getParentOfType(psiFile.findElementAt(caretOffset), DartComponent.class);
assertNotNull("target element not found at offset " + caretOffset, element);
assertSameElements(myProvider.getUrlFor(element, element), Collections.singletonList(expectedUrl));
}
public void testFieldRef() throws Exception {
doTestQuickNavigateInfo("int <b>x</b>", "class A { int <caret>x; foo() => x; }");
}
public void testFunctionRef() throws Exception {
doTestQuickNavigateInfo("<b>f</b>() " + RIGHT_ARROW + " dynamic", "<caret>f(); g() => f();");
}
public void testEnumRef() throws Exception {
doTestQuickNavigateInfo("E <b>E1</b>", "enum E { <caret>E1 } var e = E.E1;");
}
public void testDocUrls() throws Exception {
doTestDocUrl("https://api.dartlang.org/stable/dart-core/int-class.html",
"core/int.dart",
"abstract class int extends num {");
doTestDocUrl("https://api.dartlang.org/stable/dart-core/String/String.fromCharCodes.html",
"core/string.dart",
"external factory String.fromCharCodes(Iterable<int> charCodes,");
doTestDocUrl("https://api.dartlang.org/stable/dart-core/List/List.html",
"core/list.dart",
"external factory List([int length]);");
doTestDocUrl("https://api.dartlang.org/stable/dart-core/int/int.fromEnvironment.html",
"core/int.dart",
"external const factory int.fromEnvironment(String name, {int defaultValue});");
doTestDocUrl("https://api.dartlang.org/stable/dart-math/cos.html",
"math/math.dart",
"external double cos(num x);");
doTestDocUrl("https://api.dartlang.org/stable/dart-core/List/length.html",
"core/list.dart",
"void set length(int newLength);");
}
}