1de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Flags: --expose-debug-as debug
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test the mirror object for objects
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction MirrorRefCache(json_refs) {
323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var tmp = eval('(' + json_refs + ')');
333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.refs_ = [];
343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (var i = 0; i < tmp.length; i++) {
353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    this.refs_[tmp[i].handle] = tmp[i];
363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgMirrorRefCache.prototype.lookup = function(handle) {
403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.refs_[handle];
41160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org};
423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction testObjectMirror(obj, cls_name, ctor_name, hasSpecialProperties) {
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Create mirror and JSON representation.
453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var mirror = debug.MakeMirror(obj);
463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  var serializer = debug.MakeMirrorSerializer();
47b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json = JSON.stringify(serializer.serializeValue(mirror));
48b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var refs = new MirrorRefCache(
49b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      JSON.stringify(serializer.serializeReferencedObjects()));
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check the mirror hierachy.
52de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  assertTrue(mirror instanceof debug.Mirror, 'Unexpected mirror hierarchy');
53de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  assertTrue(mirror instanceof debug.ValueMirror, 'Unexpected mirror hierarchy');
54de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  assertTrue(mirror instanceof debug.ObjectMirror, 'Unexpected mirror hierarchy');
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check the mirror properties.
573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertTrue(mirror.isObject(), 'Unexpected mirror');
583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals('object', mirror.type(), 'Unexpected mirror type');
593291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertFalse(mirror.isPrimitive(), 'Unexpected primitive mirror');
603291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(cls_name, mirror.className(), 'Unexpected mirror class name');
61de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  assertTrue(mirror.constructorFunction() instanceof debug.ObjectMirror, 'Unexpected mirror hierarchy');
623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(ctor_name, mirror.constructorFunction().name(), 'Unexpected constructor function name');
63de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  assertTrue(mirror.protoObject() instanceof debug.Mirror, 'Unexpected mirror hierarchy');
64de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  assertTrue(mirror.prototypeObject() instanceof debug.Mirror, 'Unexpected mirror hierarchy');
653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertFalse(mirror.hasNamedInterceptor(), 'No named interceptor expected');
663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertFalse(mirror.hasIndexedInterceptor(), 'No indexed interceptor expected');
679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  var names = mirror.propertyNames();
69160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  var properties = mirror.properties();
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assertEquals(names.length, properties.length);
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (var i = 0; i < properties.length; i++) {
72de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    assertTrue(properties[i] instanceof debug.Mirror, 'Unexpected mirror hierarchy');
73de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    assertTrue(properties[i] instanceof debug.PropertyMirror, 'Unexpected mirror hierarchy');
743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    assertEquals('property', properties[i].type(), 'Unexpected mirror type');
753291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    assertEquals(names[i], properties[i].name(), 'Unexpected property name');
769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
78de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  var internalProperties = mirror.internalProperties();
79de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  for (var i = 0; i < internalProperties.length; i++) {
80de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    assertTrue(internalProperties[i] instanceof debug.Mirror, 'Unexpected mirror hierarchy');
81de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    assertTrue(internalProperties[i] instanceof debug.InternalPropertyMirror, 'Unexpected mirror hierarchy');
82de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    assertEquals('internalProperty', internalProperties[i].type(), 'Unexpected mirror type');
83de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  }
84de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
853291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (var p in obj) {
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    var property_mirror = mirror.property(p);
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    assertTrue(property_mirror instanceof debug.PropertyMirror);
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    assertEquals(p, property_mirror.name());
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // If the object has some special properties don't test for these.
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (!hasSpecialProperties) {
919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      assertEquals(0, property_mirror.attributes(), property_mirror.name());
929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      assertFalse(property_mirror.isReadOnly());
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      assertTrue(property_mirror.isEnum());
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      assertTrue(property_mirror.canDelete());
959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Parse JSON representation and check.
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  var fromJSON = eval('(' + json + ')');
1003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals('object', fromJSON.type, 'Unexpected mirror type in JSON');
1013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(cls_name, fromJSON.className, 'Unexpected mirror class name in JSON');
1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(mirror.constructorFunction().handle(), fromJSON.constructorFunction.ref, 'Unexpected constructor function handle in JSON');
1033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals('function', refs.lookup(fromJSON.constructorFunction.ref).type, 'Unexpected constructor function type in JSON');
1043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(ctor_name, refs.lookup(fromJSON.constructorFunction.ref).name, 'Unexpected constructor function name in JSON');
1053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(mirror.protoObject().handle(), fromJSON.protoObject.ref, 'Unexpected proto object handle in JSON');
1063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(mirror.protoObject().type(), refs.lookup(fromJSON.protoObject.ref).type, 'Unexpected proto object type in JSON');
1073291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(mirror.prototypeObject().handle(), fromJSON.prototypeObject.ref, 'Unexpected prototype object handle in JSON');
1083291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(mirror.prototypeObject().type(), refs.lookup(fromJSON.prototypeObject.ref).type, 'Unexpected prototype object type in JSON');
1093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(void 0, fromJSON.namedInterceptor, 'No named interceptor expected in JSON');
1103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(void 0, fromJSON.indexedInterceptor, 'No indexed interceptor expected in JSON');
1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check that the serialization contains all properties.
1133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  assertEquals(names.length, fromJSON.properties.length, 'Some properties missing in JSON');
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (var i = 0; i < fromJSON.properties.length; i++) {
1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    var name = fromJSON.properties[i].name;
116b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (typeof name == 'undefined') name = fromJSON.properties[i].index;
1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    var found = false;
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    for (var j = 0; j < names.length; j++) {
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      if (names[j] == name) {
1203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        // Check that serialized handle is correct.
1213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        assertEquals(properties[i].value().handle(), fromJSON.properties[i].ref, 'Unexpected serialized handle');
1223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        // Check that serialized name is correct.
1243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        assertEquals(properties[i].name(), fromJSON.properties[i].name, 'Unexpected serialized name');
1253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        // If property type is normal property type is not serialized.
1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        if (properties[i].propertyType() != debug.PropertyType.Normal) {
1283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org          assertEquals(properties[i].propertyType(), fromJSON.properties[i].propertyType, 'Unexpected serialized property type');
1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        } else {
1303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org          assertTrue(typeof(fromJSON.properties[i].propertyType) === 'undefined', 'Unexpected serialized property type');
1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        }
1323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        // If there are no attributes attributes are not serialized.
1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        if (properties[i].attributes() != debug.PropertyAttribute.None) {
1353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org          assertEquals(properties[i].attributes(), fromJSON.properties[i].attributes, 'Unexpected serialized attributes');
1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        } else {
1373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org          assertTrue(typeof(fromJSON.properties[i].attributes) === 'undefined', 'Unexpected serialized attributes');
1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        }
1393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
140160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org        // Lookup the serialized object from the handle reference.
1413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        var o = refs.lookup(fromJSON.properties[i].ref);
1423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        assertTrue(o != void 0, 'Referenced object is not serialized');
1433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        assertEquals(properties[i].value().type(), o.type, 'Unexpected serialized property type for ' + name);
1453291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        if (properties[i].value().isPrimitive()) {
146160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          if (properties[i].value().type() == "null" ||
147160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org              properties[i].value().type() == "undefined") {
148160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org            // Null and undefined has no value property.
149160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org            assertFalse("value" in o, 'Unexpected value property for ' + name);
150160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org          } else if (properties[i].value().type() == "number" &&
151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                     !isFinite(properties[i].value().value())) {
152160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org            assertEquals(String(properties[i].value().value()), o.value,
153160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org                         'Unexpected serialized property value for ' + name);
154ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          } else {
155ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            assertEquals(properties[i].value().value(), o.value, 'Unexpected serialized property value for ' + name);
156ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          }
1573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        } else if (properties[i].value().isFunction()) {
1583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org          assertEquals(properties[i].value().source(), o.source, 'Unexpected serialized property value for ' + name);
1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        }
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        found = true;
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      }
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
163aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com    assertTrue(found, '"' + name + '" not found (' + json + ')');
1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction Point(x,y) {
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  this.x_ = x;
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  this.y_ = y;
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test a number of different objects.
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror({}, 'Object', 'Object');
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror({'a':1,'b':2}, 'Object', 'Object');
1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror({'1':void 0,'2':null,'f':function pow(x,y){return Math.pow(x,y);}}, 'Object', 'Object');
1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror(new Point(-1.2,2.003), 'Object', 'Point');
1783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgtestObjectMirror(this, 'global', '', true);  // Global object has special properties
179ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestObjectMirror(this.__proto__, 'Object', '');
1809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror([], 'Array', 'Array');
1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror([1,2], 'Array', 'Array');
182de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgtestObjectMirror(Object(17), 'Number', 'Number');
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
184aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com// Test circular references.
185aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.como = {};
186aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.como.o = o;
187aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.comtestObjectMirror(o, 'Object', 'Object');
188aca4968107b0e84a87cee0bad8e5ca21a02e4053christian.plesner.hansen@gmail.com
1899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that non enumerable properties are part of the mirror
1909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comglobal_mirror = debug.MakeMirror(this);
1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('property', global_mirror.property("Math").type());
1929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(global_mirror.property("Math").isEnum(), "Math is enumerable" + global_mirror.property("Math").attributes());
1939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.commath_mirror = global_mirror.property("Math").value();
1959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('property', math_mirror.property("E").type());
1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(math_mirror.property("E").isEnum(), "Math.E is enumerable");
1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertTrue(math_mirror.property("E").isReadOnly());
1989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(math_mirror.property("E").canDelete());
1999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test objects with JavaScript accessors.
2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.como = {}
2023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineGetter__('a', function(){return 'a';});
2033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineSetter__('b', function(){});
2043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineGetter__('c', function(){throw 'c';});
2053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgo.__defineSetter__('c', function(){throw 'c';});
2069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtestObjectMirror(o, 'Object', 'Object');
2079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.commirror = debug.MakeMirror(o);
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// a has getter but no setter.
2093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('a').hasGetter());
2103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('a').hasSetter());
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(debug.PropertyType.Callbacks, mirror.property('a').propertyType());
2123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('a').getter().type());
2133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('undefined', mirror.property('a').setter().type());
2143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){return \'a\';}', mirror.property('a').getter().source());
2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// b has setter but no getter.
2163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('b').hasGetter());
2173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('b').hasSetter());
2189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(debug.PropertyType.Callbacks, mirror.property('b').propertyType());
2193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('undefined', mirror.property('b').getter().type());
2203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('b').setter().type());
2213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){}', mirror.property('b').setter().source());
2223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('b').isException());
2233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// c has both getter and setter. The getter throws an exception.
2243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('c').hasGetter());
2253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('c').hasSetter());
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(debug.PropertyType.Callbacks, mirror.property('c').propertyType());
2273291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('c').getter().type());
2283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function', mirror.property('c').setter().type());
2293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){throw \'c\';}', mirror.property('c').getter().source());
2303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertEquals('function (){throw \'c\';}', mirror.property('c').setter().source());
2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test objects with native accessors.
2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.commirror = debug.MakeMirror(new String('abc'));
2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertTrue(mirror instanceof debug.ObjectMirror);
2353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('length').hasGetter());
2363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertFalse(mirror.property('length').hasSetter());
2373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgassertTrue(mirror.property('length').isNative());
2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('a', mirror.property(0).value().value());
2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('b', mirror.property(1).value().value());
2409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('c', mirror.property(2).value().value());
241de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
242de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org// Test value wrapper internal properties.
243de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgmirror = debug.MakeMirror(Object("Capybara"));
244de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgvar ip = mirror.internalProperties();
245de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(1, ip.length);
246de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("[[PrimitiveValue]]", ip[0].name());
247de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("string", ip[0].value().type());
248de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("Capybara", ip[0].value().value());
249de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
250de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org// Test bound function internal properties.
251de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgmirror = debug.MakeMirror(Number.bind(Array, 2));
252de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgip = mirror.internalProperties();
253de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(3, ip.length);
254de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgvar property_map = {};
255de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgfor (var i = 0; i < ip.length; i++) {
256de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  property_map[ip[i].name()] = ip[i];
257de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org}
258de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertTrue("[[BoundThis]]" in property_map);
259de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("function", property_map["[[BoundThis]]"].value().type());
260de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(Array, property_map["[[BoundThis]]"].value().value());
261de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertTrue("[[TargetFunction]]" in property_map);
262de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("function", property_map["[[TargetFunction]]"].value().type());
263de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(Number, property_map["[[TargetFunction]]"].value().value());
264de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertTrue("[[BoundArgs]]" in property_map);
265de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals("object", property_map["[[BoundArgs]]"].value().type());
266de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgassertEquals(1, property_map["[[BoundArgs]]"].value().value().length);
267