// Copyright (c) 2016, 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.

// Native testing library. Provides support for mock @Native classes and
// collects common imports.


import "package:expect/expect.dart";
import 'dart:_js_helper' show Native;

export "package:expect/expect.dart";
export 'dart:_js_helper' show Creates, Native, JSName, Returns;
export 'dart:_foreign_helper' show JS;

void _setup() native r'''
((function() {
  var toStringResultProperty = "_toStringResult";
  var objectToStringMethod = Object.prototype.toString;

  Object.prototype.toString = function() {
    if (this != null) {
      var constructor = this.constructor;
      if (constructor != null) {
        var result = constructor[toStringResultProperty];
        if (typeof result == "string") return result;
      }
    }
    return objectToStringMethod.call(this);
  }

  // To mock a @Native class with JavaScript constructor `Foo`, add
  //
  //     self.nativeConstructor(Foo);
  //
  // to the JavaScript code.
  self.nativeConstructor = function(constructor, opt_name) {
    var toStringResult = "[object " + (opt_name || constructor.name) + "]";
    constructor[toStringResultProperty] = toStringResult;
  }
})());
''';

void nativeTesting() {
  _setup();
}

@NoInline()
@AssumeDynamic()
confuse(x) => x;
