blob: 5182eef54ce5dcf848d3b0933e8220e4b32f0fd4 [file] [log] [blame]
// Copyright (c) 2014, 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.
// Test that the '--show-package-warnings' option works as intended.
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/commandline_options.dart';
import 'memory_compiler.dart';
/// Error code that creates 1 warning, 1 hint, and 1 info.
const ERROR_CODE = """
m(Object o) {
if (o is String) {
o = o.length;
}
}""";
const SOURCE = const {
'main.dart': """
import 'package:pkg_error1/pkg_error1.dart' as pkg1;
import 'package:pkg_error2/pkg_error2.dart' as pkg2;
import 'package:pkg_noerror/pkg_noerror.dart' as pkg3;
import 'error.dart' as error;
main() {
pkg1.m(null);
pkg2.m(null);
pkg3.m(null);
error.m(null);
}
""",
'error.dart': ERROR_CODE,
'pkg/pkg_error1/pkg_error1.dart': """
import 'package:pkg_error2/pkg_error2.dart' as pkg2;
import 'package:pkg_noerror/pkg_noerror.dart' as pkg3;
$ERROR_CODE
main() {
m(null);
pkg2.m(null);
pkg3.m(null);
}
""",
'pkg/pkg_error2/pkg_error2.dart': """
import 'package:pkg_error1/pkg_error1.dart' as pkg1;
import 'package:pkg_noerror/pkg_noerror.dart' as pkg3;
$ERROR_CODE
main() {
pkg1.m(null);
m(null);
pkg3.m(null);
}
""",
'pkg/pkg_noerror/pkg_noerror.dart': """
import 'package:pkg_error1/pkg_error1.dart' as pkg1;
import 'package:pkg_error2/pkg_error2.dart' as pkg2;
m(o) {}
main() {
pkg1.m(null);
m(null);
pkg2.m(null);
}
""",
'.packages': """
pkg_error1:pkg/pkg_error1/
pkg_error2:pkg/pkg_error2/
pkg_noerror:pkg/pkg_noerror/
"""
};
Future test(Uri entryPoint,
{List<String> showPackageWarnings: null,
int warnings: 0,
int hints: 0,
int infos: 0}) async {
var options = [Flags.analyzeOnly];
if (showPackageWarnings != null) {
if (showPackageWarnings.isEmpty) {
options.add(Flags.showPackageWarnings);
} else {
options
.add('${Flags.showPackageWarnings}=${showPackageWarnings.join(',')}');
}
}
var collector = new DiagnosticCollector();
print('==================================================================');
print('test: $entryPoint showPackageWarnings=$showPackageWarnings');
print('------------------------------------------------------------------');
await runCompiler(
entryPoint: entryPoint,
memorySourceFiles: SOURCE,
options: options,
packageConfig: Uri.parse('memory:.packages'),
diagnosticHandler: collector);
Expect.equals(
0, collector.errors.length, 'Unexpected errors: ${collector.errors}');
Expect.equals(warnings, collector.warnings.length,
'Unexpected warnings: ${collector.warnings}');
checkUriSchemes(collector.warnings);
Expect.equals(
hints, collector.hints.length, 'Unexpected hints: ${collector.hints}');
checkUriSchemes(collector.hints);
Expect.equals(
infos, collector.infos.length, 'Unexpected infos: ${collector.infos}');
checkUriSchemes(collector.infos);
}
void checkUriSchemes(Iterable<CollectedMessage> messages) {
for (CollectedMessage message in messages) {
if (message.uri != null) {
Expect.notEquals('package', message.uri.scheme,
"Unexpected package uri `${message.uri}` in message: $message");
}
}
}
void main() {
asyncTest(() async {
await test(Uri.parse('memory:main.dart'),
showPackageWarnings: [],
// From error.dart, package:pkg_error1 and package:pkg_error2:
warnings: 3,
hints: 3,
infos: 3);
await test(Uri.parse('memory:main.dart'),
showPackageWarnings: ['pkg_error1'],
// From error.dart and package:pkg_error1:
warnings: 2,
hints: 2 + 1 /* from summary */,
infos: 2);
await test(Uri.parse('memory:main.dart'),
showPackageWarnings: ['pkg_error1', 'pkg_error2'],
// From error.dart, package:pkg_error1 and package:pkg_error2:
warnings: 3,
hints: 3,
infos: 3);
await test(Uri.parse('memory:main.dart'),
showPackageWarnings: [],
// From error.dart, package:pkg_error1 and package:pkg_error2:
warnings: 3,
hints: 3,
infos: 3);
await test(Uri.parse('memory:main.dart'),
showPackageWarnings: null,
// From error.dart only:
warnings: 1,
hints: 1 + 2 /* from summary */,
infos: 1);
await test(Uri.parse('package:pkg_error1/pkg_error1.dart'),
showPackageWarnings: [],
// From package:pkg_error1 and package:pkg_error2:
warnings: 2,
hints: 2,
infos: 2);
await test(Uri.parse('package:pkg_error1/pkg_error1.dart'),
showPackageWarnings: null,
// From package:pkg_error1/pkg_error1.dart only:
warnings: 1,
hints: 1 + 1 /* from summary */,
infos: 1);
await test(Uri.parse('package:pkg_noerror/pkg_noerror.dart'),
showPackageWarnings: [],
// From package:pkg_error1 and package:pkg_error2:
warnings: 2,
hints: 2,
infos: 2);
await test(Uri.parse('package:pkg_noerror/pkg_noerror.dart'),
showPackageWarnings: ['pkg_error1'],
// From package:pkg_error1:
warnings: 1,
hints: 1 + 1 /* from summary */,
infos: 1);
await test(Uri.parse('package:pkg_noerror/pkg_noerror.dart'),
showPackageWarnings: null, hints: 2 /* from summary */);
});
}