blob: 5acdf8b9732d0e76b97836e8ef6bee69bc52522b [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.
// Ensure that objects handled specially by dart2js can be reflected on.
library test.intercepted_object_test;
import 'dart:mirrors';
import 'stringify.dart' show stringify, expect;
import 'intercepted_class_test.dart' show checkClassMirrorMethods;
checkImplements(object, String name) {
ClassMirror cls = reflect(object).type;
checkClassMirrorMethods(cls);
// The VM implements List via a mixin, so check for that.
if (cls.superinterfaces.isEmpty && object is List) {
cls = cls.superclass!.superclass!.mixin;
}
// The VM implements String through an intermediate abstract
// class.
if (cls.superinterfaces.isEmpty && object is String) {
cls = cls.superclass!;
}
// The VM implements int through an intermediate abstract
// class.
if (object is int &&
stringify(cls.superclass!.simpleName) == 's(_IntegerImplementation)') {
cls = cls.superclass!;
}
List<ClassMirror> superinterfaces = cls.superinterfaces;
String symName = 's($name)';
for (ClassMirror superinterface in superinterfaces) {
print(superinterface.simpleName);
if (symName == stringify(superinterface.simpleName)) {
checkClassMirrorMethods(superinterface);
return;
}
}
// A class implements itself, even if not explicitly declared.
if (symName == stringify(cls.simpleName)) {
checkClassMirrorMethods(cls);
return;
}
// TODO(floitsch): use correct fail
expect(name, "super interface not found");
}
main() {
checkImplements('', 'String');
checkImplements(1, 'int');
checkImplements(1.5, 'double');
checkImplements(true, 'bool');
checkImplements(false, 'bool');
checkImplements([], 'List');
}