OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview Library providing basic test framework functionality. | 6 * @fileoverview Library providing basic test framework functionality. |
7 */ | 7 */ |
8 | 8 |
9 /** | 9 /** |
10 * Namespace for |Test|. | 10 * Namespace for |Test|. |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 * @see registerMockGlobals | 191 * @see registerMockGlobals |
192 */ | 192 */ |
193 makeAndRegisterMockGlobals: function(functionNames) { | 193 makeAndRegisterMockGlobals: function(functionNames) { |
194 var MockClass = makeMockClass(functionNames); | 194 var MockClass = makeMockClass(functionNames); |
195 this.mockGlobals = mock(MockClass); | 195 this.mockGlobals = mock(MockClass); |
196 registerMockGlobals(this.mockGlobals, MockClass); | 196 registerMockGlobals(this.mockGlobals, MockClass); |
197 return this.mockGlobals; | 197 return this.mockGlobals; |
198 }, | 198 }, |
199 | 199 |
200 /** | 200 /** |
| 201 * Create a container of mocked standalone functions to handle |
| 202 * '.'-separated |apiNames|, assign it to |this.mockApis|, register its API |
| 203 * overrides and return it. |
| 204 * @return {Mock} Mock handler class. |
| 205 * @see makeMockFunctions |
| 206 * @see registerMockApis |
| 207 */ |
| 208 makeAndRegisterMockApis: function (apiNames) { |
| 209 var apiMockNames = apiNames.map(function(name) { |
| 210 return name.replace(/\./g, '_'); |
| 211 }); |
| 212 |
| 213 this.mockApis = makeMockFunctions(apiMockNames); |
| 214 registerMockApis(this.mockApis); |
| 215 return this.mockApis; |
| 216 }, |
| 217 |
| 218 /** |
| 219 * Create a container of mocked standalone functions to handle |
| 220 * |functionNames|, assign it to |this.mockLocalFunctions| and return it. |
| 221 * @param {!Array.<string>} functionNames |
| 222 * @return {Mock} Mock handler class. |
| 223 * @see makeMockFunctions |
| 224 */ |
| 225 makeMockLocalFunctions: function(functionNames) { |
| 226 this.mockLocalFunctions = makeMockFunctions(functionNames); |
| 227 return this.mockLocalFunctions; |
| 228 }, |
| 229 |
| 230 /** |
201 * Override this method to perform initialization during preload (such as | 231 * Override this method to perform initialization during preload (such as |
202 * creating mocks and registering handlers). | 232 * creating mocks and registering handlers). |
203 * @type {Function} | 233 * @type {Function} |
204 */ | 234 */ |
205 preLoad: function() {}, | 235 preLoad: function() {}, |
206 | 236 |
207 /** | 237 /** |
208 * Override this method to perform tasks before running your test. | 238 * Override this method to perform tasks before running your test. |
209 * @type {Function} | 239 * @type {Function} |
210 */ | 240 */ |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 globalOverrides[name] = { | 529 globalOverrides[name] = { |
500 object: object, | 530 object: object, |
501 callback: callback, | 531 callback: callback, |
502 }; | 532 }; |
503 | 533 |
504 if (!deferGlobalOverrides) | 534 if (!deferGlobalOverrides) |
505 overrideGlobal(name); | 535 overrideGlobal(name); |
506 } | 536 } |
507 | 537 |
508 /** | 538 /** |
| 539 * Registers the mock API call and its function. |
| 540 * @param {string} name The '_'-separated name of the API call. |
| 541 * @param {function(...)} theFunction Mock function for this API call. |
| 542 */ |
| 543 function registerMockApi(name, theFunction) { |
| 544 var path = name.split('_'); |
| 545 |
| 546 var namespace = this; |
| 547 for(var i = 0; i < path.length - 1; i++) { |
| 548 var fieldName = path[i]; |
| 549 if(!namespace[fieldName]) |
| 550 namespace[fieldName] = {}; |
| 551 |
| 552 namespace = namespace[fieldName]; |
| 553 } |
| 554 |
| 555 var fieldName = path[path.length-1]; |
| 556 assertEquals(undefined, namespace[fieldName]); |
| 557 namespace[fieldName] = theFunction; |
| 558 } |
| 559 |
| 560 /** |
509 * Empty function for use in making mocks. | 561 * Empty function for use in making mocks. |
510 * @const | 562 * @const |
511 */ | 563 */ |
512 function emptyFunction() {} | 564 function emptyFunction() {} |
513 | 565 |
514 /** | 566 /** |
515 * Make a mock from the supplied |methodNames| array. | 567 * Make a mock from the supplied |methodNames| array. |
516 * @param {Array.<string>} methodNames Array of names of methods to mock. | 568 * @param {Array.<string>} methodNames Array of names of methods to mock. |
517 * @return {Function} Constructor with prototype filled in with methods | 569 * @return {Function} Constructor with prototype filled in with methods |
518 * matching |methodNames|. | 570 * matching |methodNames|. |
519 */ | 571 */ |
520 function makeMockClass(methodNames) { | 572 function makeMockClass(methodNames) { |
521 function MockConstructor() {} | 573 function MockConstructor() {} |
522 for(var i = 0; i < methodNames.length; i++) | 574 for(var i = 0; i < methodNames.length; i++) |
523 MockConstructor.prototype[methodNames[i]] = emptyFunction; | 575 MockConstructor.prototype[methodNames[i]] = emptyFunction; |
524 return MockConstructor; | 576 return MockConstructor; |
525 } | 577 } |
526 | 578 |
527 /** | 579 /** |
| 580 * Create a new class to handle |functionNames|, add method 'functions()' |
| 581 * that returns a container of standalone functions based on the mock class |
| 582 * members, and return it. |
| 583 * @return {Mock} Mock handler class. |
| 584 */ |
| 585 function makeMockFunctions(functionNames) { |
| 586 var MockClass = makeMockClass(functionNames); |
| 587 var mockFunctions = mock(MockClass); |
| 588 var mockProxy = mockFunctions.proxy(); |
| 589 |
| 590 mockFunctions.functions_ = {}; |
| 591 |
| 592 for (var func in MockClass.prototype) { |
| 593 if (typeof MockClass.prototype[func] === 'function') |
| 594 mockFunctions.functions_[func] = mockProxy[func].bind(mockProxy); |
| 595 } |
| 596 |
| 597 mockFunctions.functions = function () { |
| 598 return this.functions_; |
| 599 }; |
| 600 |
| 601 return mockFunctions; |
| 602 } |
| 603 |
| 604 /** |
528 * Register all methods of {@code mockClass.prototype} as overrides to global | 605 * Register all methods of {@code mockClass.prototype} as overrides to global |
529 * functions of the same name as the method, using the proxy of the | 606 * functions of the same name as the method, using the proxy of the |
530 * |mockObject| to handle the functions. | 607 * |mockObject| to handle the functions. |
531 * @param {Mock4JS.Mock} mockObject The mock to register callbacks against. | 608 * @param {Mock4JS.Mock} mockObject The mock to register callbacks against. |
532 * @param {function(new:Object)} mockClass Constructor for the mocked class. | 609 * @param {function(new:Object)} mockClass Constructor for the mocked class. |
533 * @see registerMockGlobal | 610 * @see registerMockGlobal |
534 */ | 611 */ |
535 function registerMockGlobals(mockObject, mockClass) { | 612 function registerMockGlobals(mockObject, mockClass) { |
536 var mockProxy = mockObject.proxy(); | 613 var mockProxy = mockObject.proxy(); |
537 for (var func in mockClass.prototype) { | 614 for (var func in mockClass.prototype) { |
538 if (typeof mockClass.prototype[func] === 'function') | 615 if (typeof mockClass.prototype[func] === 'function') |
539 registerMockGlobal(func, mockProxy, mockProxy[func]); | 616 registerMockGlobal(func, mockProxy, mockProxy[func]); |
540 } | 617 } |
541 } | 618 } |
542 | 619 |
543 /** | 620 /** |
| 621 * Register all functions in |mockObject.functions()| as global API calls. |
| 622 * @param {Mock4JS.Mock} mockObject The mock to register callbacks against. |
| 623 * @see registerMockApi |
| 624 */ |
| 625 function registerMockApis(mockObject) { |
| 626 var functions = mockObject.functions(); |
| 627 for (var func in functions) { |
| 628 if (typeof functions[func] === 'function') |
| 629 registerMockApi(func, functions[func]); |
| 630 } |
| 631 } |
| 632 |
| 633 /** |
544 * Overrides {@code chrome.send} for routing messages to javascript | 634 * Overrides {@code chrome.send} for routing messages to javascript |
545 * functions. Also falls back to sending with the original chrome object. | 635 * functions. Also falls back to sending with the original chrome object. |
546 * @param {string} messageName The message to route. | 636 * @param {string} messageName The message to route. |
547 */ | 637 */ |
548 function send(messageName) { | 638 function send(messageName) { |
549 var callback = sendCallbacks[messageName]; | 639 var callback = sendCallbacks[messageName]; |
550 if (callback != undefined) | 640 if (callback != undefined) |
551 callback[1].apply(callback[0], Array.prototype.slice.call(arguments, 1)); | 641 callback[1].apply(callback[0], Array.prototype.slice.call(arguments, 1)); |
552 else | 642 else |
553 this.__proto__.send.apply(this.__proto__, arguments); | 643 this.__proto__.send.apply(this.__proto__, arguments); |
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1536 exports.TEST = TEST; | 1626 exports.TEST = TEST; |
1537 exports.TEST_F = TEST_F; | 1627 exports.TEST_F = TEST_F; |
1538 exports.RUNTIME_TEST_F = TEST_F; | 1628 exports.RUNTIME_TEST_F = TEST_F; |
1539 exports.GEN = GEN; | 1629 exports.GEN = GEN; |
1540 exports.GEN_INCLUDE = GEN_INCLUDE; | 1630 exports.GEN_INCLUDE = GEN_INCLUDE; |
1541 exports.WhenTestDone = WhenTestDone; | 1631 exports.WhenTestDone = WhenTestDone; |
1542 | 1632 |
1543 // Import the Mock4JS helpers. | 1633 // Import the Mock4JS helpers. |
1544 Mock4JS.addMockSupport(exports); | 1634 Mock4JS.addMockSupport(exports); |
1545 })(this); | 1635 })(this); |
OLD | NEW |