OLD | NEW |
(Empty) | |
| 1 'use strict'; |
| 2 |
| 3 /** |
| 4 ResizeTestHelper is a framework to test ResizeObserver |
| 5 notifications. Use it to make assertions about ResizeObserverEntries. |
| 6 This framework is needed because ResizeObservations are |
| 7 delivered asynchronously inside the event loop. |
| 8 |
| 9 It handles timeouts, and queueing of multiple steps in a test. |
| 10 |
| 11 Usage: |
| 12 |
| 13 Use createTest() to create tests. |
| 14 Make assertions inside entries, timeout callbacks. |
| 15 Every test should clean up after itself by calling helper.observer.disconnect(
); |
| 16 Chain tests together with nextTest(), or nextTestRaf() |
| 17 |
| 18 Example: |
| 19 |
| 20 var helper = new ResizeTestHelper(); |
| 21 |
| 22 function test0() { |
| 23 helper.createTest( |
| 24 "test0: test name here", |
| 25 setup => { // setup gets called when test starts |
| 26 helper.observer.observe(t3); |
| 27 }, |
| 28 entries => { // This is ResizeObserver callback |
| 29 // kick off next test by calling nextTestRaf |
| 30 helper.nextTestRaf(); |
| 31 }, |
| 32 timeout => { // timeout gets called on timeout |
| 33 // if timeout happens, and timeout is not defined, test will fail |
| 34 } |
| 35 ); |
| 36 */ |
| 37 |
| 38 function ResizeTestHelper() { |
| 39 this._pendingTests = []; |
| 40 this._observer = new ResizeObserver(this._handleNotification.bind(this)); |
| 41 } |
| 42 ResizeTestHelper.TIMEOUT = 500; |
| 43 |
| 44 ResizeTestHelper.prototype = { |
| 45 |
| 46 // @return ResizeObserver |
| 47 get observer() { |
| 48 return this._observer; |
| 49 }, |
| 50 |
| 51 _handleNotification: function(entries) { |
| 52 if (this._currentTest) { |
| 53 // console.log("notification"); |
| 54 let current = this._currentTest; |
| 55 delete this._currentTest; |
| 56 window.clearTimeout(current.timeoutId); |
| 57 current.test.step(_ => { |
| 58 // console.log("step"); |
| 59 let caughtEx = false; |
| 60 try { |
| 61 current.completion(entries); |
| 62 current.test.done(); |
| 63 } |
| 64 catch(ex) { |
| 65 caughtEx = ex; |
| 66 } |
| 67 if (caughtEx) |
| 68 throw caughtEx; |
| 69 }); |
| 70 } |
| 71 }, |
| 72 _handleTimeout: function() { |
| 73 if (this._currentTest) { |
| 74 let current = this._currentTest; |
| 75 delete this._currentTest; |
| 76 if (current.timeout) { // timeout is not an error |
| 77 current.timeout(); |
| 78 current.test.done(); |
| 79 } |
| 80 else { |
| 81 current.test.step(_ => { |
| 82 assert_unreached("Timed out waiting for notification. (" + ResizeTestH
elper.TIMEOUT + "ms)"); |
| 83 current.test.done(); |
| 84 }); |
| 85 } |
| 86 } |
| 87 }, |
| 88 |
| 89 // Start the next test |
| 90 nextTest: function() { |
| 91 if (this._currentTest) // only one test at a time |
| 92 return; |
| 93 if (this._pendingTests.length > 0) { |
| 94 this._currentTest = this._pendingTests.shift(); |
| 95 // console.log("executing ", this._currentTest.name); |
| 96 this._currentTest.setup(); |
| 97 this._currentTest.timeoutId = this._currentTest.test.step_timeout(this._ha
ndleTimeout.bind(this), ResizeTestHelper.TIMEOUT); |
| 98 } |
| 99 }, |
| 100 |
| 101 // Fires nextTest on rAF. Use it to trigger next test. |
| 102 nextTestRaf: function() { |
| 103 window.requestAnimationFrame( () => this.nextTest() ); |
| 104 }, |
| 105 |
| 106 // Adds new test to _pendingTests. |
| 107 createTest: function(name, setup, completion, timeoutCb) { |
| 108 // console.log('setup ', name); |
| 109 this._pendingTests.push( { |
| 110 name: name, |
| 111 test: async_test(name), |
| 112 setup: setup, |
| 113 completion: completion, |
| 114 timeout: timeoutCb }); |
| 115 } |
| 116 |
| 117 } |
OLD | NEW |