1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5var assert = requireNative('assert'); 6var AssertTrue = assert.AssertTrue; 7var AssertFalse = assert.AssertFalse; 8var utils = require('utils'); 9 10function testSuperClass() { 11 function SuperClassImpl() {} 12 13 SuperClassImpl.prototype = { 14 attrA: 'aSuper', 15 attrB: 'bSuper', 16 func: function() { return 'func'; }, 17 superFunc: function() { return 'superFunc'; } 18 }; 19 20 function SubClassImpl() { 21 SuperClassImpl.call(this); 22 } 23 24 SubClassImpl.prototype = { 25 __proto__: SuperClassImpl.prototype, 26 attrA: 'aSub', 27 attrC: 'cSub', 28 func: function() { return 'overridden'; }, 29 subFunc: function() { return 'subFunc'; } 30 }; 31 32 var SuperClass = utils.expose('SuperClass', 33 SuperClassImpl, 34 { functions: ['func', 'superFunc'], 35 properties: ['attrA', 'attrB'] }); 36 37 var SubClass = utils.expose('SubClass', 38 SubClassImpl, 39 { superclass: SuperClass, 40 functions: ['subFunc'], 41 properties: ['attrC'] }); 42 43 var supe = new SuperClass(); 44 AssertTrue(supe.attrA == 'aSuper'); 45 AssertTrue(supe.attrB == 'bSuper'); 46 AssertFalse('attrC' in supe); 47 AssertTrue(supe.func() == 'func'); 48 AssertTrue('superFunc' in supe); 49 AssertTrue(supe.superFunc() == 'superFunc'); 50 AssertFalse('subFunc' in supe); 51 AssertTrue(supe instanceof SuperClass); 52 53 var sub = new SubClass(); 54 AssertTrue(sub.attrA == 'aSub'); 55 AssertTrue(sub.attrB == 'bSuper'); 56 AssertTrue(sub.attrC == 'cSub'); 57 AssertTrue(sub.func() == 'overridden'); 58 AssertTrue(sub.superFunc() == 'superFunc'); 59 AssertTrue('subFunc' in sub); 60 AssertTrue(sub.subFunc() == 'subFunc'); 61 AssertTrue(sub instanceof SuperClass); 62 AssertTrue(sub instanceof SubClass); 63 64 function SubSubClassImpl() {} 65 SubSubClassImpl.prototype = Object.create(SubClassImpl.prototype); 66 SubSubClassImpl.prototype.subSubFunc = function() { return 'subsub'; } 67 68 var SubSubClass = utils.expose('SubSubClass', 69 SubSubClassImpl, 70 { superclass: SubClass, 71 functions: ['subSubFunc'] }); 72 var subsub = new SubSubClass(); 73 AssertTrue(subsub.attrA == 'aSub'); 74 AssertTrue(subsub.attrB == 'bSuper'); 75 AssertTrue(subsub.attrC == 'cSub'); 76 AssertTrue(subsub.func() == 'overridden'); 77 AssertTrue(subsub.superFunc() == 'superFunc'); 78 AssertTrue(subsub.subFunc() == 'subFunc'); 79 AssertTrue(subsub.subSubFunc() == 'subsub'); 80 AssertTrue(subsub instanceof SuperClass); 81 AssertTrue(subsub instanceof SubClass); 82 AssertTrue(subsub instanceof SubSubClass); 83} 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