// 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');
}
