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

import "package:expect/expect.dart";

// Test for named parameter with the name of a JavaScript property found on
// 'Object'.  For such a NAME, foo.NAME may exist in an empty map, i.e.
//    'toString' in {} --> true.


main() {
  // Test properties found on instances of Object in Chrome 15 and Firefox 6.
  test_constructor();
  test___proto__();
  test___defineGetter__();
  test___defineSetter__();
  test___lookupGetter__();
  test___lookupSetter__();
  test___noSuchMethod__();
  test_hasOwnProperty();
  test_isPrototypeOf();
  test_propertyIsEnumerable();
  test_toSource();
  test_toLocaleString();
  test_toString();
  test_unwatch();
  test_valueOf();
  test_watch();
}

// 'constructor' property.

class TestClass_constructor {
  method({constructor}) => constructor;
  static staticMethod({constructor}) => constructor;
}
globalMethod_constructor({constructor}) => constructor;

test_constructor() {
  var obj = new TestClass_constructor();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(constructor: 0));

  Expect.equals(null, TestClass_constructor.staticMethod());
  Expect.equals(0, TestClass_constructor.staticMethod(constructor: 0));

  Expect.equals(null, globalMethod_constructor());
  Expect.equals(0, globalMethod_constructor(constructor: 0));
}

// '__proto__' property.

class TestClass___proto__ {
  method({__proto__}) => __proto__;
  static staticMethod({__proto__}) => __proto__;
}
globalMethod___proto__({__proto__}) => __proto__;

test___proto__() {
  var obj = new TestClass___proto__();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(__proto__: 0));

  Expect.equals(null, TestClass___proto__.staticMethod());
  Expect.equals(0, TestClass___proto__.staticMethod(__proto__: 0));

  Expect.equals(null, globalMethod___proto__());
  Expect.equals(0, globalMethod___proto__(__proto__: 0));
}

// '__defineGetter__' property.

class TestClass___defineGetter__ {
  method({__defineGetter__}) => __defineGetter__;
  static staticMethod({__defineGetter__}) => __defineGetter__;
}
globalMethod___defineGetter__({__defineGetter__}) => __defineGetter__;

test___defineGetter__() {
  var obj = new TestClass___defineGetter__();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(__defineGetter__: 0));

  Expect.equals(null, TestClass___defineGetter__.staticMethod());
  Expect.equals(0, TestClass___defineGetter__.staticMethod(__defineGetter__: 0));

  Expect.equals(null, globalMethod___defineGetter__());
  Expect.equals(0, globalMethod___defineGetter__(__defineGetter__: 0));
}

// '__defineSetter__' property.

class TestClass___defineSetter__ {
  method({__defineSetter__}) => __defineSetter__;
  static staticMethod({__defineSetter__}) => __defineSetter__;
}
globalMethod___defineSetter__({__defineSetter__}) => __defineSetter__;

test___defineSetter__() {
  var obj = new TestClass___defineSetter__();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(__defineSetter__: 0));

  Expect.equals(null, TestClass___defineSetter__.staticMethod());
  Expect.equals(0, TestClass___defineSetter__.staticMethod(__defineSetter__: 0));

  Expect.equals(null, globalMethod___defineSetter__());
  Expect.equals(0, globalMethod___defineSetter__(__defineSetter__: 0));
}

// '__lookupGetter__' property.

class TestClass___lookupGetter__ {
  method({__lookupGetter__}) => __lookupGetter__;
  static staticMethod({__lookupGetter__}) => __lookupGetter__;
}
globalMethod___lookupGetter__({__lookupGetter__}) => __lookupGetter__;

test___lookupGetter__() {
  var obj = new TestClass___lookupGetter__();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(__lookupGetter__: 0));

  Expect.equals(null, TestClass___lookupGetter__.staticMethod());
  Expect.equals(0, TestClass___lookupGetter__.staticMethod(__lookupGetter__: 0));

  Expect.equals(null, globalMethod___lookupGetter__());
  Expect.equals(0, globalMethod___lookupGetter__(__lookupGetter__: 0));
}

// '__lookupSetter__' property.

class TestClass___lookupSetter__ {
  method({__lookupSetter__}) => __lookupSetter__;
  static staticMethod({__lookupSetter__}) => __lookupSetter__;
}
globalMethod___lookupSetter__({__lookupSetter__}) => __lookupSetter__;

test___lookupSetter__() {
  var obj = new TestClass___lookupSetter__();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(__lookupSetter__: 0));

  Expect.equals(null, TestClass___lookupSetter__.staticMethod());
  Expect.equals(0, TestClass___lookupSetter__.staticMethod(__lookupSetter__: 0));

  Expect.equals(null, globalMethod___lookupSetter__());
  Expect.equals(0, globalMethod___lookupSetter__(__lookupSetter__: 0));
}

// '__noSuchMethod__' property.

class TestClass___noSuchMethod__ {
  method({__noSuchMethod__}) => __noSuchMethod__;
  static staticMethod({__noSuchMethod__}) => __noSuchMethod__;
}
globalMethod___noSuchMethod__({__noSuchMethod__}) => __noSuchMethod__;

test___noSuchMethod__() {
  var obj = new TestClass___noSuchMethod__();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(__noSuchMethod__: 0));

  Expect.equals(null, TestClass___noSuchMethod__.staticMethod());
  Expect.equals(0, TestClass___noSuchMethod__.staticMethod(__noSuchMethod__: 0));

  Expect.equals(null, globalMethod___noSuchMethod__());
  Expect.equals(0, globalMethod___noSuchMethod__(__noSuchMethod__: 0));
}

// 'hasOwnProperty' property.

class TestClass_hasOwnProperty {
  method({hasOwnProperty}) => hasOwnProperty;
  static staticMethod({hasOwnProperty}) => hasOwnProperty;
}
globalMethod_hasOwnProperty({hasOwnProperty}) => hasOwnProperty;

test_hasOwnProperty() {
  var obj = new TestClass_hasOwnProperty();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(hasOwnProperty: 0));

  Expect.equals(null, TestClass_hasOwnProperty.staticMethod());
  Expect.equals(0, TestClass_hasOwnProperty.staticMethod(hasOwnProperty: 0));

  Expect.equals(null, globalMethod_hasOwnProperty());
  Expect.equals(0, globalMethod_hasOwnProperty(hasOwnProperty: 0));
}

// 'isPrototypeOf' property.

class TestClass_isPrototypeOf {
  method({isPrototypeOf}) => isPrototypeOf;
  static staticMethod({isPrototypeOf}) => isPrototypeOf;
}
globalMethod_isPrototypeOf({isPrototypeOf}) => isPrototypeOf;

test_isPrototypeOf() {
  var obj = new TestClass_isPrototypeOf();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(isPrototypeOf: 0));

  Expect.equals(null, TestClass_isPrototypeOf.staticMethod());
  Expect.equals(0, TestClass_isPrototypeOf.staticMethod(isPrototypeOf: 0));

  Expect.equals(null, globalMethod_isPrototypeOf());
  Expect.equals(0, globalMethod_isPrototypeOf(isPrototypeOf: 0));
}

// 'propertyIsEnumerable' property.

class TestClass_propertyIsEnumerable {
  method({propertyIsEnumerable}) => propertyIsEnumerable;
  static staticMethod({propertyIsEnumerable}) => propertyIsEnumerable;
}
globalMethod_propertyIsEnumerable({propertyIsEnumerable}) => propertyIsEnumerable;

test_propertyIsEnumerable() {
  var obj = new TestClass_propertyIsEnumerable();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(propertyIsEnumerable: 0));

  Expect.equals(null, TestClass_propertyIsEnumerable.staticMethod());
  Expect.equals(0, TestClass_propertyIsEnumerable.staticMethod(propertyIsEnumerable: 0));

  Expect.equals(null, globalMethod_propertyIsEnumerable());
  Expect.equals(0, globalMethod_propertyIsEnumerable(propertyIsEnumerable: 0));
}

// 'toSource' property.

class TestClass_toSource {
  method({toSource}) => toSource;
  static staticMethod({toSource}) => toSource;
}
globalMethod_toSource({toSource}) => toSource;

test_toSource() {
  var obj = new TestClass_toSource();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(toSource: 0));

  Expect.equals(null, TestClass_toSource.staticMethod());
  Expect.equals(0, TestClass_toSource.staticMethod(toSource: 0));

  Expect.equals(null, globalMethod_toSource());
  Expect.equals(0, globalMethod_toSource(toSource: 0));
}

// 'toLocaleString' property.

class TestClass_toLocaleString {
  method({toLocaleString}) => toLocaleString;
  static staticMethod({toLocaleString}) => toLocaleString;
}
globalMethod_toLocaleString({toLocaleString}) => toLocaleString;

test_toLocaleString() {
  var obj = new TestClass_toLocaleString();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(toLocaleString: 0));

  Expect.equals(null, TestClass_toLocaleString.staticMethod());
  Expect.equals(0, TestClass_toLocaleString.staticMethod(toLocaleString: 0));

  Expect.equals(null, globalMethod_toLocaleString());
  Expect.equals(0, globalMethod_toLocaleString(toLocaleString: 0));
}

// 'toString' property.

class TestClass_toString {
  method({toString}) => toString;
  static staticMethod({toString}) => toString;
}
globalMethod_toString({toString}) => toString;

test_toString() {
  var obj = new TestClass_toString();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(toString: 0));

  Expect.equals(null, TestClass_toString.staticMethod());
  Expect.equals(0, TestClass_toString.staticMethod(toString: 0));

  Expect.equals(null, globalMethod_toString());
  Expect.equals(0, globalMethod_toString(toString: 0));
}

// 'unwatch' property.

class TestClass_unwatch {
  method({unwatch}) => unwatch;
  static staticMethod({unwatch}) => unwatch;
}
globalMethod_unwatch({unwatch}) => unwatch;

test_unwatch() {
  var obj = new TestClass_unwatch();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(unwatch: 0));

  Expect.equals(null, TestClass_unwatch.staticMethod());
  Expect.equals(0, TestClass_unwatch.staticMethod(unwatch: 0));

  Expect.equals(null, globalMethod_unwatch());
  Expect.equals(0, globalMethod_unwatch(unwatch: 0));
}

// 'valueOf' property.

class TestClass_valueOf {
  method({valueOf}) => valueOf;
  static staticMethod({valueOf}) => valueOf;
}
globalMethod_valueOf({valueOf}) => valueOf;

test_valueOf() {
  var obj = new TestClass_valueOf();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(valueOf: 0));

  Expect.equals(null, TestClass_valueOf.staticMethod());
  Expect.equals(0, TestClass_valueOf.staticMethod(valueOf: 0));

  Expect.equals(null, globalMethod_valueOf());
  Expect.equals(0, globalMethod_valueOf(valueOf: 0));
}

// 'watch' property.

class TestClass_watch {
  method({watch}) => watch;
  static staticMethod({watch}) => watch;
}
globalMethod_watch({watch}) => watch;

test_watch() {
  var obj = new TestClass_watch();

  Expect.equals(null, obj.method());
  Expect.equals(0, obj.method(watch: 0));

  Expect.equals(null, TestClass_watch.staticMethod());
  Expect.equals(0, TestClass_watch.staticMethod(watch: 0));

  Expect.equals(null, globalMethod_watch());
  Expect.equals(0, globalMethod_watch(watch: 0));
}
