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