blob: 7f97bb915c1151683579f1fbe3c7ea0d9c18bec5 [file] [log] [blame]
// Copyright (c) 2013, 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.
/// TODO(johnniwinther): Currently this only works with the mock compiler.
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import '../helpers/compiler_helper.dart';
const String TEST1 = r"""
var a = [42];
main() {
return a[0];
}
""";
String TEST2(selectorName, args) {
return """
var a = [42];
main() {
a.$selectorName($args);
return a[0];
}
""";
}
const String TEST3 = r"""
var a = new List(42);
main() {
return a[0];
}
""";
const String TEST4 = r"""
var a = new List(0);
main() {
return a[0];
}
""";
const String TEST5 = r"""
var a = [42];
main() {
a.length = 54;
return a[0];
}
""";
// Test that the order in which we visit the methods will not bring
// back a length after it has been disabled.
const String TEST6 = r"""
foo(b) {
var a = [42];
doIt(a);
return a[0];
}
doIt(a) {
a.clear();
foo(a);
}
main() {
foo(null);
}
""";
const String TEST7 = r"""
var a = [42, 54];
main() {
a[0]++;
return a[1];
}
""";
const String TEST8 = r"""
var b = 42;
var a = new List(b);
main() {
return a[1];
}
""";
const String TEST9 = r"""
const b = 42;
var a = new List(b);
main() {
return a[1];
}
""";
checkRangeError(String test, {bool hasRangeError}) async {
String generated = await compileAll(test);
Expect.equals(
hasRangeError,
generated.contains('ioore'),
"Unexpected use of 'hasRangeError' for test:\n$test\n"
"in code\n$generated");
}
main() {
asyncTest(() async {
await checkRangeError(TEST1, hasRangeError: false);
await checkRangeError(TEST2('insert', 'null, null'), hasRangeError: true);
await checkRangeError(TEST2('add', 'null'), hasRangeError: true);
await checkRangeError(TEST2('clear', ''), hasRangeError: true);
await checkRangeError(TEST2('toString', ''), hasRangeError: false);
await checkRangeError(TEST3, hasRangeError: false);
await checkRangeError(TEST4, hasRangeError: true);
await checkRangeError(TEST5, hasRangeError: true);
await checkRangeError(TEST6, hasRangeError: true);
await checkRangeError(TEST7, hasRangeError: false);
await checkRangeError(TEST8, hasRangeError: true);
await checkRangeError(TEST9, hasRangeError: false);
});
}