1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --expose-debug-as debug 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test the mirror object for promises. 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction MirrorRefCache(json_refs) { 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var tmp = eval('(' + json_refs + ')'); 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this.refs_ = []; 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < tmp.length; i++) { 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this.refs_[tmp[i].handle] = tmp[i]; 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMirrorRefCache.prototype.lookup = function(handle) { 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this.refs_[handle]; 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction testPromiseMirror(promise, status, value) { 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create mirror and JSON representation. 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var mirror = debug.MakeMirror(promise); 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var serializer = debug.MakeMirrorSerializer(); 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var json = JSON.stringify(serializer.serializeValue(mirror)); 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var refs = new MirrorRefCache( 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSON.stringify(serializer.serializeReferencedObjects())); 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check the mirror hierachy. 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(mirror instanceof debug.Mirror); 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(mirror instanceof debug.ValueMirror); 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(mirror instanceof debug.ObjectMirror); 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(mirror instanceof debug.PromiseMirror); 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check the mirror properties. 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(status, mirror.status()); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(mirror.isPromise()); 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals('promise', mirror.type()); 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertFalse(mirror.isPrimitive()); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals("Object", mirror.className()); 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals("#<Promise>", mirror.toText()); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(promise, mirror.value()); 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(mirror.promiseValue() instanceof debug.Mirror); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(value, mirror.promiseValue().value()); 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Parse JSON representation and check. 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var fromJSON = eval('(' + json + ')'); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals('promise', fromJSON.type); 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals('Object', fromJSON.className); 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals('function', refs.lookup(fromJSON.constructorFunction.ref).type); 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals('Promise', refs.lookup(fromJSON.constructorFunction.ref).name); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(status, fromJSON.status); 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(value, refs.lookup(fromJSON.promiseValue.ref).value); 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test a number of different promises. 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar resolved = new Promise(function(resolve, reject) { resolve() }); 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar rejected = new Promise(function(resolve, reject) { reject() }); 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar pending = new Promise(function(resolve, reject) {}); 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestPromiseMirror(resolved, "resolved", undefined); 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestPromiseMirror(rejected, "rejected", undefined); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestPromiseMirror(pending, "pending", undefined); 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar resolvedv = new Promise(function(resolve, reject) { resolve('resolve') }); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar rejectedv = new Promise(function(resolve, reject) { reject('reject') }); 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar thrownv = new Promise(function(resolve, reject) { throw 'throw' }); 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestPromiseMirror(resolvedv, "resolved", 'resolve'); 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestPromiseMirror(rejectedv, "rejected", 'reject'); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestPromiseMirror(thrownv, "rejected", 'throw'); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test internal properties of different promises. 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m1 = debug.MakeMirror(new Promise( 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function(resolve, reject) { resolve(1) })); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar ip = m1.internalProperties(); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(2, ip.length); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("[[PromiseStatus]]", ip[0].name()); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("[[PromiseValue]]", ip[1].name()); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("resolved", ip[0].value().value()); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, ip[1].value().value()); 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m2 = debug.MakeMirror(new Promise(function(resolve, reject) { reject(2) })); 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochip = m2.internalProperties(); 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("rejected", ip[0].value().value()); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(2, ip[1].value().value()); 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m3 = debug.MakeMirror(new Promise(function(resolve, reject) { })); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochip = m3.internalProperties(); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("pending", ip[0].value().value()); 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("undefined", typeof(ip[1].value().value())); 91