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