1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright 2014 The Chromium Authors. All rights reserved. 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// Use of this source code is governed by a BSD-style license that can be 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file. 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comvar assert = requireNative('assert'); 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comvar AssertTrue = assert.AssertTrue; 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvar AssertFalse = assert.AssertFalse; 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvar utils = require('utils'); 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comfunction testSuperClass() { 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com function SuperClassImpl() {} 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1318dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com SuperClassImpl.prototype = { 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com attrA: 'aSuper', 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com attrB: 'bSuper', 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com func: function() { return 'func'; }, 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com superFunc: function() { return 'superFunc'; } 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com function SubClassImpl() { 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SuperClassImpl.call(this); 22259210c376700da04d8746df416217d7a78ecff9mike@reedtribe.org } 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SubClassImpl.prototype = { 25259210c376700da04d8746df416217d7a78ecff9mike@reedtribe.org __proto__: SuperClassImpl.prototype, 26ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com attrA: 'aSub', 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com attrC: 'cSub', 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com func: function() { return 'overridden'; }, 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com subFunc: function() { return 'subFunc'; } 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com var SuperClass = utils.expose('SuperClass', 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SuperClassImpl, 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { functions: ['func', 'superFunc'], 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com properties: ['attrA', 'attrB'] }); 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com var SubClass = utils.expose('SubClass', 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SubClassImpl, 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { superclass: SuperClass, 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com functions: ['subFunc'], 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com properties: ['attrC'] }); 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com var supe = new SuperClass(); 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(supe.attrA == 'aSuper'); 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(supe.attrB == 'bSuper'); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertFalse('attrC' in supe); 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(supe.func() == 'func'); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue('superFunc' in supe); 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(supe.superFunc() == 'superFunc'); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertFalse('subFunc' in supe); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(supe instanceof SuperClass); 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com var sub = new SubClass(); 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(sub.attrA == 'aSub'); 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(sub.attrB == 'bSuper'); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(sub.attrC == 'cSub'); 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(sub.func() == 'overridden'); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue(sub.superFunc() == 'superFunc'); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com AssertTrue('subFunc' in sub); 6018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(sub.subFunc() == 'subFunc'); 6118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(sub instanceof SuperClass); 6218dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(sub instanceof SubClass); 6318dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com 6418dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com function SubSubClassImpl() {} 6518dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com SubSubClassImpl.prototype = Object.create(SubClassImpl.prototype); 6618dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com SubSubClassImpl.prototype.subSubFunc = function() { return 'subsub'; } 6718dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com 68ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com var SubSubClass = utils.expose('SubSubClass', 6918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com SubSubClassImpl, 7018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com { superclass: SubClass, 7118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com functions: ['subSubFunc'] }); 7218dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com var subsub = new SubSubClass(); 73259210c376700da04d8746df416217d7a78ecff9mike@reedtribe.org AssertTrue(subsub.attrA == 'aSub'); 74259210c376700da04d8746df416217d7a78ecff9mike@reedtribe.org AssertTrue(subsub.attrB == 'bSuper'); 7518dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub.attrC == 'cSub'); 7618dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub.func() == 'overridden'); 7718dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub.superFunc() == 'superFunc'); 7818dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub.subFunc() == 'subFunc'); 7918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub.subSubFunc() == 'subsub'); 8018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub instanceof SuperClass); 8118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub instanceof SubClass); 8218dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com AssertTrue(subsub instanceof SubSubClass); 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 84 85function fakeApiFunction(shouldSucceed, numberOfResults, callback) { 86 if (shouldSucceed) { 87 var result = []; 88 for (var i = 0; i < numberOfResults; i++) { 89 result.push(i); 90 } 91 $Function.apply(callback, null, result); 92 return; 93 } 94 chrome.runtime.lastError = 'error message'; 95 callback(); 96 chrome.runtime.lastError = null; 97} 98 99function testPromiseNoResult() { 100 utils.promise(fakeApiFunction, true, 0).then(function(result) { 101 AssertTrue(result === undefined); 102 }).catch(function(e) { 103 AssertFalse(True); 104 }); 105} 106 107function testPromiseOneResult() { 108 utils.promise(fakeApiFunction, true, 1).then(function(result) { 109 AssertTrue(result === 0); 110 }).catch(function(e) { 111 AssertFalse(True); 112 }); 113} 114 115function testPromiseTwoResults() { 116 utils.promise(fakeApiFunction, true, 2).then(function(result) { 117 AssertTrue(result.length == 2); 118 AssertTrue(result[0] == 0); 119 AssertTrue(result[1] == 1); 120 }).catch(function(e) { 121 AssertFalse(True); 122 }); 123} 124 125function testPromiseError() { 126 utils.promise(fakeApiFunction, false, 0).then(function(result) { 127 AssertFalse(True); 128 }).catch(function(e) { 129 AssertTrue(e.message == 'error message'); 130 }); 131} 132 133exports.testSuperClass = testSuperClass; 134exports.testPromiseNoResult = testPromiseNoResult; 135exports.testPromiseOneResult = testPromiseOneResult; 136exports.testPromiseTwoResults = testPromiseTwoResults; 137exports.testPromiseError = testPromiseError; 138