blob: 75f8910fe9d4ce3fcab0a77f0fe9214da11724c6 [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../src/dart/resolution/driver_resolution.dart';
import 'test_support.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonHintCodeTest);
});
}
@reflectiveTest
class NonHintCodeTest extends DriverResolutionTest {
test_issue20904BuggyTypePromotionAtIfJoin_1() async {
// https://code.google.com/p/dart/issues/detail?id=20904
await assertNoErrorsInCode(r'''
f(var message, var dynamic_) {
if (message is Function) {
message = dynamic_;
}
int s = message;
}
''');
}
test_issue20904BuggyTypePromotionAtIfJoin_3() async {
// https://code.google.com/p/dart/issues/detail?id=20904
await assertNoErrorsInCode(r'''
f(var message) {
var dynamic_;
if (message is Function) {
message = dynamic_;
} else {
return;
}
int s = message;
}
''');
}
test_issue20904BuggyTypePromotionAtIfJoin_4() async {
// https://code.google.com/p/dart/issues/detail?id=20904
await assertNoErrorsInCode(r'''
f(var message) {
if (message is Function) {
message = '';
} else {
return;
}
String s = message;
}
''');
}
test_propagatedFieldType() async {
await assertNoErrorsInCode(r'''
class A { }
class X<T> {
final x = new List<T>();
}
class Z {
final X<A> y = new X<A>();
foo() {
y.x.add(new A());
}
}
''');
}
test_proxy_annotation_prefixed() async {
await assertNoErrorsInCode(r'''
library L;
@proxy
class A {}
f(var a) {
a = new A();
a.m();
var x = a.g;
a.s = 1;
var y = a + a;
a++;
++a;
}
''');
}
test_proxy_annotation_prefixed2() async {
await assertNoErrorsInCode(r'''
library L;
@proxy
class A {}
class B {
f(var a) {
a = new A();
a.m();
var x = a.g;
a.s = 1;
var y = a + a;
a++;
++a;
}
}
''');
}
test_proxy_annotation_prefixed3() async {
await assertNoErrorsInCode(r'''
library L;
class B {
f(var a) {
a = new A();
a.m();
var x = a.g;
a.s = 1;
var y = a + a;
a++;
++a;
}
}
@proxy
class A {}
''');
}
test_undefinedMethod_assignmentExpression_inSubtype() async {
await assertNoErrorsInCode(r'''
class A {}
class B extends A {
operator +(B b) {return new B();}
}
f(var a, var a2) {
a = new A();
a2 = new A();
a += a2;
}
''');
}
test_undefinedMethod_dynamic() async {
await assertNoErrorsInCode(r'''
class D<T extends dynamic> {
fieldAccess(T t) => t.abc;
methodAccess(T t) => t.xyz(1, 2, 'three');
}
''');
}
test_undefinedMethod_unionType_all() async {
await assertNoErrorsInCode(r'''
class A {
int m(int x) => 0;
}
class B {
String m() => '0';
}
f(A a, B b) {
var ab;
if (0 < 1) {
ab = a;
} else {
ab = b;
}
ab.m();
}
''');
}
test_undefinedMethod_unionType_some() async {
await assertNoErrorsInCode(r'''
class A {
int m(int x) => 0;
}
class B {}
f(A a, B b) {
var ab;
if (0 < 1) {
ab = a;
} else {
ab = b;
}
ab.m(0);
}
''');
}
}
class PubSuggestionCodeTest extends DriverResolutionTest {
// TODO(brianwilkerson) The tests in this class are not being run, and all but
// the first would fail. We should implement these checks and enable the
// tests.
test_import_package() async {
await assertErrorsInCode('''
import 'package:somepackage/other.dart';
''', [
error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 0, 0),
]);
}
test_import_packageWithDotDot() async {
await assertErrorsInCode('''
import 'package:somepackage/../other.dart';
''', [
error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 0, 0),
error(HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, 0, 0),
]);
}
test_import_packageWithLeadingDotDot() async {
await assertErrorsInCode('''
import 'package:../other.dart';
''', [
error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 0, 0),
error(HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, 0, 0),
]);
}
test_import_referenceIntoLibDirectory() async {
newFile("/myproj/pubspec.yaml", content: "");
newFile("/myproj/lib/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/web/test.dart", "import '../lib/other.dart';", [
error(HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, 0, 0),
]);
}
test_import_referenceIntoLibDirectory_no_pubspec() async {
newFile("/myproj/lib/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/web/test.dart", "import '../lib/other.dart';", []);
}
test_import_referenceOutOfLibDirectory() async {
newFile("/myproj/pubspec.yaml", content: "");
newFile("/myproj/web/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/lib/test.dart", "import '../web/other.dart';", [
error(HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, 0, 0),
]);
}
test_import_referenceOutOfLibDirectory_no_pubspec() async {
newFile("/myproj/web/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/lib/test.dart", "import '../web/other.dart';", []);
}
test_import_valid_inside_lib1() async {
newFile("/myproj/pubspec.yaml", content: "");
newFile("/myproj/lib/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/lib/test.dart", "import 'other.dart';", []);
}
test_import_valid_inside_lib2() async {
newFile("/myproj/pubspec.yaml", content: "");
newFile("/myproj/lib/bar/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/lib/foo/test.dart", "import '../bar/other.dart';", []);
}
test_import_valid_outside_lib() async {
newFile("/myproj/pubspec.yaml", content: "");
newFile("/myproj/web/other.dart", content: "");
await _assertErrorsInCodeInFile(
"/myproj/lib2/test.dart", "import '../web/other.dart';", []);
}
Future<void> _assertErrorsInCodeInFile(
String path, String content, List<ExpectedError> expectedErrors) async {
path = convertPath(path);
newFile(path, content: content);
result = await resolveFile(path);
var errorListener = new GatheringErrorListener();
errorListener.addAll(result.errors);
errorListener.assertErrors(expectedErrors);
}
}