blob: 40a965fb176f2ca6dd69ebd91301f918a9ffa533 [file] [log] [blame]
/*
* Copyright 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.google.dart.tools.ui.internal.text;
import com.google.common.collect.Maps;
import com.google.dart.engine.source.Source;
import com.google.dart.tools.internal.corext.refactoring.util.ReflectionUtils;
import com.google.dart.tools.ui.internal.text.editor.SemanticHighlighting;
import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingManager.HighlightedPosition;
import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingManager.Highlighting;
import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingPresenter;
import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingReconciler;
import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightings;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.ISourceViewer;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Map;
/**
* Test for {@link SemanticHighlightings}.
*/
public class SemanticHighlightingTest extends
com.google.dart.engine.internal.index.AbstractDartTest {
private static final Map<Highlighting, SemanticHighlighting> styleToHighlighting = Maps.newHashMap();
private static final SemanticHighlighting[] highlighters = SemanticHighlightings.getSemanticHighlightings();
private static final Highlighting[] styles = new Highlighting[highlighters.length];
static {
for (int i = 0; i < highlighters.length; i++) {
styles[i] = new Highlighting(null, true);
styleToHighlighting.put(styles[i], highlighters[i]);
}
}
private List<HighlightedPosition> positions;
public void test_annotation() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"const myAnnotation = 0;",
"class MyAnno { const MyAnno(p); }",
"@myAnnotation // marker",
"var topA;",
"@MyAnno(42) // marker",
"var topB;",
"");
assertHasWordPosition(SemanticHighlightings.ANNOTATION, "@myAnnotation // marker");
assertHasWordPosition(SemanticHighlightings.ANNOTATION, "@MyAnno(");
assertHasWordPosition(SemanticHighlightings.ANNOTATION, ") // marker");
}
public void test_builtIn_abstract_class() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"abstract class A {",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "abstract class");
}
public void test_builtIn_as_operator() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" 0 as String;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "as String");
}
public void test_builtIn_as_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" var as = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "as = 0");
}
public void test_builtIn_async_bodyModifier() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() async {",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "async {");
}
public void test_builtIn_asyncStar_bodyModifier() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() async* {",
"}",
"");
assertHasPosition(SemanticHighlightings.BUILT_IN, findOffset("async*"), "async*".length());
}
public void test_builtIn_await_expression() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() async {",
" await 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "await 0");
}
public void test_builtIn_await_forEach() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() async {",
" await for (var e in []) {}",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "await for");
}
public void test_builtIn_const_constructor() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" const A();",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "const A();");
}
public void test_builtIn_dynamic_type() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" dynamic v;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "dynamic v;");
}
public void test_builtIn_dynamic_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int dynamic = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "dynamic = 0;");
}
public void test_builtIn_external_constructor() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" external A();",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "external A();");
}
public void test_builtIn_external_function() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"external f();",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "external f();");
}
public void test_builtIn_external_method() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" external m();",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "external m();");
}
public void test_builtIn_external_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int external = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "external = 0;");
}
public void test_builtIn_factory_constructor() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" factory A() {}",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "factory A() {}");
}
public void test_builtIn_factory_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int factory = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "factory = 0;");
}
public void test_builtIn_get_method() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" get value => 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "get value => 0;");
}
public void test_builtIn_get_method_withReturnType() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" int get value => 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "get value => 0;");
}
public void test_builtIn_get_topLevel() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"get value => 0;",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "get value => 0;");
}
public void test_builtIn_get_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int get = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "get = 0;");
}
public void test_builtIn_implements() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class I {}",
"class A implements I {",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "implements I {");
}
public void test_builtIn_implements_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int implements = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "implements = 0;");
}
public void test_builtIn_native_clause() throws Exception {
verifyNoTestUnitErrors = false;
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A native 'B' {",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "native 'B' {");
}
public void test_builtIn_native_functionBody() throws Exception {
verifyNoTestUnitErrors = false;
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"f() native 'z';",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "native 'z';");
}
public void test_builtIn_on() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class E1 {}",
"class E2 {}",
"main() {",
" try {",
" } on E1 catch (e) {",
" } on E2 catch (e) {",
" }",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "on E1");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "on E2");
}
public void test_builtIn_operator_method() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" operator +(other) => 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "operator +(other) => 0;");
}
public void test_builtIn_operator_method_withReturnType() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" int operator +(other) => 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "operator +(other) => 0;");
}
public void test_builtIn_operator_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int operator = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "operator = 0;");
}
public void test_builtIn_set_method() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" set value(x) {}",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "set value(x)");
}
public void test_builtIn_set_method_withReturnType() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" void set value(x) {}",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "set value(x)");
}
public void test_builtIn_set_topLevel() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"set value(x) {}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "set value(x)");
}
public void test_builtIn_set_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int set = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "set = 0;");
}
public void test_builtIn_static_field() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" static var f = 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "static var f =");
}
public void test_builtIn_static_method() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" static m() {}",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "static m()");
}
public void test_builtIn_syncStar_bodyModifier() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() sync* {",
"}",
"");
assertHasPosition(SemanticHighlightings.BUILT_IN, findOffset("sync*"), "sync*".length());
}
public void test_builtIn_typedef() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"typedef F();",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "typedef F();");
}
public void test_builtIn_typedef_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int typedef = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "typedef = 0;");
}
public void test_builtIn_yield() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() async* {",
" yield 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.BUILT_IN, "yield 0");
}
public void test_builtIn_yieldStar() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() async* {",
" yield* [];",
"}",
"");
assertHasPosition(SemanticHighlightings.BUILT_IN, findOffset("yield* []"), "yield*".length());
}
public void test_class() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" static const ZERO = 0;",
"}",
"main() {",
" A a = new A ();",
" print(A .ZERO);",
"}",
"");
assertHasWordPosition(SemanticHighlightings.CLASS, "A {");
assertHasWordPosition(SemanticHighlightings.CLASS, "A a =");
assertHasWordPosition(SemanticHighlightings.CLASS, "A ();");
assertHasWordPosition(SemanticHighlightings.CLASS, "A .ZERO");
}
public void test_constructor() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" A.name () {}",
"}",
"main() {",
" new A.name ();",
"}",
"");
assertHasWordPosition(SemanticHighlightings.CONSTRUCTOR, "name () {}");
assertHasWordPosition(SemanticHighlightings.CONSTRUCTOR, "name ();");
}
public void test_deprecated() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"@deprecated",
"class A {",
" @deprecated",
" method() {}",
" @deprecated",
" var field;",
" @deprecated",
" get myGet => null;",
" @deprecated",
" set mySet(x) {}",
"}",
"main() {",
" A a;",
" a.method ();",
" a.field ;",
" a.field = 0;",
" a.myGet ;",
" a.mySet = 1;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "A {");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "A a;");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "method ();");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "field ;");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "field =");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "myGet ;");
assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "mySet =");
}
public void test_deprecated_libraryImport() throws Exception {
setFileContent(
"ModernLib.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"library modernLib;",
""));
setFileContent(
"DeprecatedLib.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"@deprecated",
"library deprecatedLib;",
"// const deprecated = 0;",
""));
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"library App;",
"import 'ModernLib.dart';",
"import 'DeprecatedLib.dart';",
"");
String search = "'DeprecatedLib.dart'";
assertHasPosition(SemanticHighlightings.DEPRECATED_ELEMENT, findOffset(search), search.length());
}
public void test_directive_import_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int import = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "import = 0;");
}
public void test_directive_library() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"library MyLib;",
"");
assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "library MyLib;");
}
public void test_directive_library_withDocumentComment() throws Exception {
preparePositions(
"/// filler filler filler filler filler filler filler filler filler filler",
"library MyLib;",
"");
assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "library MyLib;");
}
public void test_directive_part() throws Exception {
setFileContent("utils.dart", "part of app;");
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"library app;",
"part 'utils.dart';",
"");
assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "part 'utils.dart';");
}
public void test_directive_part_variableName() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int part = 0;",
"}",
"");
assertNoWordPosition(SemanticHighlightings.BUILT_IN, "part = 0;");
}
public void test_directive_partOf() throws Exception {
Source libSource = setFileContent(
"App.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"library app;",
"part 'Test.dart';",
""));
Source unitSource = setFileContent(
"Test.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"/**",
" * Some DartDoc",
" */",
"part of app;",
""));
parseTestUnits(libSource, unitSource);
preparePositions();
assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("part of"), "part of".length());
}
public void test_directive_partOf2() throws Exception {
Source libSource = setFileContent(
"App.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"library app;",
"part 'Test.dart';",
""));
Source unitSource = setFileContent(
"Test.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"part of app;",
""));
parseTestUnits(libSource, unitSource);
preparePositions();
assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("part of"), "part of".length());
}
public void test_dynamic() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"f(dynParameter ) {",
" var dynVar = dynParameter ;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.DYNAMIC_TYPE, "dynVar = ");
assertHasWordPosition(SemanticHighlightings.DYNAMIC_TYPE, "dynParameter ;");
}
public void test_field_member() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" int field ;",
" A(this.field ); // in constructor",
"}",
"main() {",
" A a = new A(0);",
" a.field = 0;",
" print(a.field ); // reference",
"}",
"");
assertHasWordPosition(SemanticHighlightings.FIELD, "field ;");
assertHasWordPosition(SemanticHighlightings.FIELD, "field ); // in constructor");
assertHasWordPosition(SemanticHighlightings.FIELD, "field =");
assertHasWordPosition(SemanticHighlightings.FIELD, "field ); // reference");
}
public void test_function() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"f() {}",
"main() {",
" f ();",
" print(f );",
"}",
"");
assertHasWordPosition(SemanticHighlightings.FUNCTION, "f ();");
assertHasWordPosition(SemanticHighlightings.FUNCTION, "f );");
}
public void test_functionTypeAlias() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"typedef String Foo ();",
"main(Foo f) {",
"}",
"");
assertHasWordPosition(SemanticHighlightings.FUNCTION_TYPE_ALIAS, "Foo (");
assertHasWordPosition(SemanticHighlightings.FUNCTION_TYPE_ALIAS, "Foo f)");
}
public void test_getterDeclaration_function() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"get myGetter => 0;",
"main() {",
" print(myGetter );",
"}",
"");
assertHasWordPosition(SemanticHighlightings.GETTER_DECLARATION, "myGetter => 0");
}
public void test_getterDeclaration_member() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" int get prop => 42;",
"}",
"main() {",
" A a = new A();",
" print(a.prop );",
"}",
"");
assertHasWordPosition(SemanticHighlightings.GETTER_DECLARATION, "prop =>");
assertHasWordPosition(SemanticHighlightings.FIELD, "prop );");
}
public void test_importPrefix() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"import 'dart:async' as asy ;",
"main() {",
" asy .Future f = null;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.IMPORT_PREFIX, "asy ;");
assertHasWordPosition(SemanticHighlightings.IMPORT_PREFIX, "asy .Future");
}
public void test_localVariable() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"main() {",
" int v = 0;",
" v = 1;",
" print(v );",
"}",
"");
// declaration
assertHasWordPosition(SemanticHighlightings.LOCAL_VARIABLE_DECLARATION, "v = 0;");
// reference
assertHasWordPosition(SemanticHighlightings.LOCAL_VARIABLE, "v = 1;");
assertHasWordPosition(SemanticHighlightings.LOCAL_VARIABLE, "v );");
}
public void test_method() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" m () {}",
"}",
"main() {",
" A a = new A();",
" a.m ();",
" print(a.m );",
"}",
"");
// declaration
assertHasWordPosition(SemanticHighlightings.METHOD_DECLARATION, "m () {}");
// invocation
assertHasWordPosition(SemanticHighlightings.METHOD, "m ();"); // invocation
// reference
assertHasWordPosition(SemanticHighlightings.METHOD, "m );");
}
public void test_number() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"var vi1 = 12345 ;",
"var vi2 = -23456 ;",
"var vd1 = 123.45 ;",
"var vd2 = -234.56 ;",
"");
assertHasWordPosition(SemanticHighlightings.NUMBER, "12345 ;");
assertHasWordPosition(SemanticHighlightings.NUMBER, "23456 ;");
assertHasWordPosition(SemanticHighlightings.NUMBER, "123.45 ;");
assertHasWordPosition(SemanticHighlightings.NUMBER, "234.56 ;");
}
public void test_parameter() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"f(int p ) {",
" p = 1;",
" print(p );",
"}",
"");
assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p ) {");
assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p = 1;");
assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p );");
}
public void test_parameter_namedArgument() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"f({int p}) {",
"}",
"main() {",
" f(p : 0);",
"}",
"");
assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p : 0);");
}
public void test_setterDeclaration_function() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"set mySetter (x) {}",
"main() {",
" mySetter = 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.SETTER_DECLARATION, "mySetter (x)");
}
public void test_setterDeclaration_member() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" set prop (x) {}",
"}",
"main() {",
" A a = new A();",
" a.prop = 0;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.SETTER_DECLARATION, "prop (x)");
assertHasWordPosition(SemanticHighlightings.FIELD, "prop = 0");
}
public void test_staticField_member() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" static int field = 0;",
"}",
"main() {",
" A.field = 1;",
" print(A.field );",
"}",
"");
assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field = 0;");
assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field = 1;");
assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field );");
}
public void test_staticField_topLevel() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"int field ;",
"main() {",
" field = 0;",
" print(field );",
"}",
"");
assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field ;");
assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field =");
assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field );");
}
public void test_staticMethod() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" static m () {}",
"}",
"main() {",
" A.m ();",
" print(A.m );",
"}",
"");
// declaration
assertHasWordPosition(SemanticHighlightings.STATIC_METHOD_DECLARATION, "m () {}");
// invocation
assertHasWordPosition(SemanticHighlightings.STATIC_METHOD, "m ();");
// reference
assertHasWordPosition(SemanticHighlightings.STATIC_METHOD, "m );");
}
public void test_typeVariable() throws Exception {
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"class MyClass<T > {",
" T value;",
" T foo(T t) => null;",
"}",
"");
assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T > {");
assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T value");
assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T foo");
assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T t)");
}
public void xtest_directive_export() throws Exception {
// Timing out on build-bot; runs fine locally
setFileContent(
"Lib.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"library lib;",
"class A {}",
"class B {}",
"class C {}",
"class D {}"));
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"export 'Lib.dart' show A, B hide C, D;",
"");
assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("export "), "export".length());
assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("show A, B"), "show".length());
assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("hide C, D"), "hide".length());
}
public void xtest_directive_import() throws Exception {
// Timing out on build-bot; runs fine locally
setFileContent(
"Lib.dart",
makeSource(
"// filler filler filler filler filler filler filler filler filler filler",
"library lib;"));
preparePositions(
"// filler filler filler filler filler filler filler filler filler filler",
"import 'Lib.dart';",
"");
assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "import 'Lib.dart';");
}
/**
* Asserts that {@link #positions} contains position with given ID, offset and length.
*/
private void assertHasPosition(String id, int offset, int length) {
for (HighlightedPosition position : positions) {
Highlighting style = position.getHighlighting();
SemanticHighlighting highlighting = styleToHighlighting.get(style);
if (highlighting != null && highlighting.getPreferenceKey().equals(id)
&& position.getOffset() == offset && position.getLength() == length) {
return;
}
}
fail("Position not found: id:" + id + " offset:" + offset + " length:" + length);
}
/**
* Asserts that {@link #positions} contains position with given ID, at offset of "pattern" and
* with length of the first space-separate word.
*/
private void assertHasWordPosition(String id, String pattern) throws Exception {
int offset = findOffset(pattern);
String word = StringUtils.substringBefore(pattern, " ");
assertHasPosition(id, offset, word.length());
}
/**
* Asserts that {@link #positions} has no position with given ID, offset and length.
*/
private void assertNoPosition(String id, int offset, int length) {
for (HighlightedPosition position : positions) {
Highlighting style = position.getHighlighting();
SemanticHighlighting highlighting = styleToHighlighting.get(style);
if (highlighting != null && highlighting.getPreferenceKey().equals(id)
&& position.getOffset() == offset && position.getLength() == length) {
fail("Position not expected id:" + id + " offset:" + offset + " length:" + length);
}
}
}
/**
* Asserts that {@link #positions} has no position with given ID, at offset of "pattern" and with
* length of the first space-separate word.
*/
private void assertNoWordPosition(String id, String pattern) throws Exception {
int offset = findOffset(pattern);
String word = StringUtils.substringBefore(pattern, " ");
assertNoPosition(id, offset, word.length());
}
private void preparePositions() throws Exception {
final IDocument document = new Document(testCode);
SemanticHighlightingReconciler reconciler = new SemanticHighlightingReconciler();
// configure
ReflectionUtils.setField(reconciler, "fSourceViewer", Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class[] {ISourceViewer.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("getDocument")) {
return document;
}
return null;
}
}));
ReflectionUtils.setField(reconciler, "fJobSemanticHighlightings", highlighters);
ReflectionUtils.setField(reconciler, "fJobHighlightings", styles);
ReflectionUtils.setField(reconciler, "fJobPresenter", new SemanticHighlightingPresenter());
// call "reconcilePositions"
ReflectionUtils.invokeMethod(
reconciler,
"reconcilePositions(com.google.dart.engine.ast.CompilationUnit)",
testUnit);
// get result
positions = ReflectionUtils.getFieldObject(reconciler, "fAddedPositions");
// touch "default"
for (HighlightedPosition position : positions) {
Highlighting style = position.getHighlighting();
SemanticHighlighting highlighting = styleToHighlighting.get(style);
highlighting.getDisplayName();
highlighting.isEnabledByDefault();
highlighting.isBoldByDefault();
highlighting.isItalicByDefault();
highlighting.isStrikethroughByDefault();
highlighting.isUnderlineByDefault();
highlighting.getDefaultDefaultTextColor();
highlighting.getDefaultStyle();
highlighting.getDefaultTextColor();
}
}
private void preparePositions(String... lines) throws Exception {
parseTestUnit(lines);
preparePositions();
}
}