blob: 1cc194acc7ffec2dc75a377b4b87d8bf8a0dc20f [file] [log] [blame]
// Copyright (c) 2012, 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.
// VMOptions=--no_show_internal_names
// Dart test program testing type casts.
// @dart = 2.9
import "package:expect/expect.dart";
checkSecondFunction(String expected, StackTrace stacktrace) {
var topLine = stacktrace.toString().split("\n")[1];
int startPos = topLine.lastIndexOf("/");
int endPos = topLine.lastIndexOf(")");
String subs = topLine.substring(startPos + 1, endPos);
Expect.equals(expected, subs);
}
// Test that the initializer expression gets properly skipped.
bool b = "foo" as bool;
class TypeTest {
static test() {
int result = 0;
try {
var i = "hello" as int; // Throws a TypeError
} catch (error) {
result = 1;
Expect.type<TypeError>(error);
var msg = error.toString();
Expect.isTrue(msg.contains("int")); // dstType
Expect.isTrue(msg.contains("String")); // srcType
checkSecondFunction("type_cast_vm_test.dart:23:23", error.stackTrace);
}
return result;
}
static testSideEffect() {
int result = 0;
int index() {
result++;
return 0;
}
try {
var a = new List<int>(1) as List<int>;
a[0] = 0;
a[index()]++; // Type check succeeds, but does not create side effects.
Expect.equals(1, a[0]);
} catch (error) {
result = 100;
}
return result;
}
static testArgument() {
int result = 0;
int f(int i) {
return i;
}
try {
int i = f("hello" as int); // Throws a TypeError
} catch (error) {
result = 1;
Expect.type<TypeError>(error);
var msg = error.toString();
Expect.isTrue(msg.contains("int")); // dstType
Expect.isTrue(msg.contains("String")); // srcType
checkSecondFunction("type_cast_vm_test.dart:60:25", error.stackTrace);
}
return result;
}
static testReturn() {
int result = 0;
int f(String s) {
return s as int; // Throws a TypeError
}
try {
int i = f("hello");
} catch (error) {
result = 1;
Expect.type<TypeError>(error);
var msg = error.toString();
Expect.isTrue(msg.contains("int")); // dstType
Expect.isTrue(msg.contains("String")); // srcType
checkSecondFunction("type_cast_vm_test.dart:75:16", error.stackTrace);
}
return result;
}
static var field = "hello";
static testField() {
int result = 0;
Expect.equals(5, (field as String).length);
try {
field as int; // Throws a TypeError
} catch (error) {
result = 1;
var msg = error.toString();
Expect.isTrue(msg.contains("int")); // dstType
Expect.isTrue(msg.contains("String")); // srcType
checkSecondFunction("type_cast_vm_test.dart:97:13", error.stackTrace);
}
return result;
}
static testAnyFunction() {
int result = 0;
Function anyFunction;
f() {}
;
anyFunction = f as Function; // No error.
anyFunction = null as Function; // No error.
try {
var i = f as int; // Throws a TypeError if type checks are enabled.
} catch (error) {
result = 1;
var msg = error.toString();
Expect.isTrue(msg.contains("int")); // dstType
Expect.isTrue(msg.contains("() => dynamic")); // srcType
checkSecondFunction("type_cast_vm_test.dart:116:17", error.stackTrace);
}
return result;
}
static testMain() {
Expect.equals(1, test());
Expect.equals(1, testSideEffect());
Expect.equals(1, testArgument());
Expect.equals(1, testReturn());
Expect.equals(1, testField());
Expect.equals(1, testAnyFunction());
}
}
main() {
TypeTest.testMain();
}