selenium-webdriver 2.43.5 → 2.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.md +20 -0
- package/README.md +8 -13
- package/builder.js +4 -3
- package/docs/class_webdriver_Alert.html +6 -6
- package/docs/class_webdriver_AlertPromise.html +6 -6
- package/docs/class_webdriver_UnhandledAlertError.html +4 -4
- package/docs/class_webdriver_WebDriver.html +39 -37
- package/docs/class_webdriver_WebDriver_Logs.html +3 -3
- package/docs/class_webdriver_WebDriver_Navigation.html +5 -5
- package/docs/class_webdriver_WebDriver_Options.html +9 -9
- package/docs/class_webdriver_WebDriver_TargetLocator.html +6 -6
- package/docs/class_webdriver_WebDriver_Timeouts.html +4 -4
- package/docs/class_webdriver_WebDriver_Window.html +6 -6
- package/docs/class_webdriver_WebElement.html +23 -23
- package/docs/class_webdriver_WebElementPromise.html +22 -22
- package/docs/class_webdriver_promise_CancellationError.html +3 -0
- package/docs/class_webdriver_promise_ControlFlow.html +32 -32
- package/docs/class_webdriver_promise_Deferred.html +7 -8
- package/docs/class_webdriver_promise_Frame_.html +14 -30
- package/docs/class_webdriver_promise_Promise.html +2 -2
- package/docs/class_webdriver_promise_Task_.html +12 -12
- package/docs/class_webdriver_until_Condition.html +3 -0
- package/docs/enum_webdriver_Key.html +1 -1
- package/docs/enum_webdriver_promise_ControlFlow_EventType.html +1 -1
- package/docs/enum_webdriver_promise_Deferred_State_.html +1 -1
- package/docs/index.html +8 -13
- package/docs/interface_webdriver_promise_Thenable.html +8 -10
- package/docs/license.html +1 -1
- package/docs/module_selenium-webdriver.html +2 -2
- package/docs/module_selenium-webdriver__base.html +1 -1
- package/docs/module_selenium-webdriver__base_class_Context.html +1 -1
- package/docs/module_selenium-webdriver_builder.html +1 -1
- package/docs/module_selenium-webdriver_builder_class_Builder.html +1 -1
- package/docs/module_selenium-webdriver_chrome.html +1 -1
- package/docs/module_selenium-webdriver_chrome_class_Driver.html +2 -2
- package/docs/module_selenium-webdriver_chrome_class_Options.html +2 -2
- package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +1 -1
- package/docs/module_selenium-webdriver_error.html +1 -1
- package/docs/module_selenium-webdriver_executors.html +1 -1
- package/docs/module_selenium-webdriver_firefox.html +1 -1
- package/docs/module_selenium-webdriver_firefox_binary.html +1 -1
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +1 -1
- package/docs/module_selenium-webdriver_firefox_class_Driver.html +2 -2
- package/docs/module_selenium-webdriver_firefox_class_Options.html +1 -1
- package/docs/module_selenium-webdriver_firefox_extension.html +1 -1
- package/docs/module_selenium-webdriver_firefox_profile.html +1 -1
- package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +1 -1
- package/docs/module_selenium-webdriver_http.html +1 -1
- package/docs/module_selenium-webdriver_http_class_HttpClient.html +1 -1
- package/docs/module_selenium-webdriver_http_util.html +1 -1
- package/docs/module_selenium-webdriver_io.html +1 -1
- package/docs/module_selenium-webdriver_io_exec.html +1 -1
- package/docs/module_selenium-webdriver_net.html +1 -1
- package/docs/module_selenium-webdriver_net_portprober.html +1 -1
- package/docs/module_selenium-webdriver_phantomjs.html +1 -1
- package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +2 -2
- package/docs/module_selenium-webdriver_proxy.html +1 -1
- package/docs/module_selenium-webdriver_remote.html +1 -1
- package/docs/module_selenium-webdriver_remote_class_DriverService.html +2 -2
- package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +2 -2
- package/docs/module_selenium-webdriver_testing.html +16 -29
- package/docs/module_selenium-webdriver_testing_assert.html +1 -1
- package/docs/namespace_webdriver_promise.html +18 -20
- package/docs/namespace_webdriver_stacktrace.html +15 -15
- package/docs/namespace_webdriver_until.html +32 -0
- package/docs/source/_base.js.src.html +1 -1
- package/docs/source/builder.js.src.html +1 -1
- package/docs/source/chrome.js.src.html +1 -1
- package/docs/source/error.js.src.html +1 -1
- package/docs/source/executors.js.src.html +1 -1
- package/docs/source/firefox/binary.js.src.html +1 -1
- package/docs/source/firefox/extension.js.src.html +1 -1
- package/docs/source/firefox/index.js.src.html +1 -1
- package/docs/source/firefox/profile.js.src.html +1 -1
- package/docs/source/http/index.js.src.html +1 -1
- package/docs/source/http/util.js.src.html +1 -1
- package/docs/source/index.js.src.html +1 -1
- package/docs/source/io/exec.js.src.html +1 -1
- package/docs/source/io/index.js.src.html +1 -1
- package/docs/source/lib/atoms/error.js.src.html +1 -1
- package/docs/source/lib/atoms/json.js.src.html +1 -1
- package/docs/source/lib/atoms/response.js.src.html +1 -1
- package/docs/source/lib/atoms/userAgent.js.src.html +1 -1
- package/docs/source/lib/goog/array/array.js.src.html +1 -1
- package/docs/source/lib/goog/asserts/asserts.js.src.html +1 -1
- package/docs/source/lib/goog/async/nexttick.js.src.html +1 -1
- package/docs/source/lib/goog/async/run.js.src.html +1 -1
- package/docs/source/lib/goog/base.js.src.html +1 -1
- package/docs/source/lib/goog/debug/debug.js.src.html +1 -1
- package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +1 -1
- package/docs/source/lib/goog/debug/error.js.src.html +1 -1
- package/docs/source/lib/goog/debug/logbuffer.js.src.html +1 -1
- package/docs/source/lib/goog/debug/logger.js.src.html +1 -1
- package/docs/source/lib/goog/debug/logrecord.js.src.html +1 -1
- package/docs/source/lib/goog/deps.js.src.html +1 -1
- package/docs/source/lib/goog/disposable/disposable.js.src.html +1 -1
- package/docs/source/lib/goog/disposable/idisposable.js.src.html +1 -1
- package/docs/source/lib/goog/dom/browserfeature.js.src.html +1 -1
- package/docs/source/lib/goog/dom/dom.js.src.html +1 -1
- package/docs/source/lib/goog/dom/nodetype.js.src.html +1 -1
- package/docs/source/lib/goog/dom/tagname.js.src.html +1 -1
- package/docs/source/lib/goog/dom/vendor.js.src.html +1 -1
- package/docs/source/lib/goog/events/browserevent.js.src.html +1 -1
- package/docs/source/lib/goog/events/browserfeature.js.src.html +1 -1
- package/docs/source/lib/goog/events/event.js.src.html +1 -1
- package/docs/source/lib/goog/events/eventid.js.src.html +1 -1
- package/docs/source/lib/goog/events/events.js.src.html +1 -1
- package/docs/source/lib/goog/events/eventtarget.js.src.html +1 -1
- package/docs/source/lib/goog/events/eventtype.js.src.html +1 -1
- package/docs/source/lib/goog/events/keycodes.js.src.html +1 -1
- package/docs/source/lib/goog/events/listenable.js.src.html +1 -1
- package/docs/source/lib/goog/events/listener.js.src.html +1 -1
- package/docs/source/lib/goog/events/listenermap.js.src.html +1 -1
- package/docs/source/lib/goog/functions/functions.js.src.html +1 -1
- package/docs/source/lib/goog/iter/iter.js.src.html +1 -1
- package/docs/source/lib/goog/json/json.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/matcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +1 -1
- package/docs/source/lib/goog/labs/useragent/browser.js.src.html +1 -1
- package/docs/source/lib/goog/labs/useragent/engine.js.src.html +1 -1
- package/docs/source/lib/goog/labs/useragent/util.js.src.html +1 -1
- package/docs/source/lib/goog/math/box.js.src.html +1 -1
- package/docs/source/lib/goog/math/coordinate.js.src.html +1 -1
- package/docs/source/lib/goog/math/math.js.src.html +1 -1
- package/docs/source/lib/goog/math/rect.js.src.html +1 -1
- package/docs/source/lib/goog/math/size.js.src.html +1 -1
- package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +1 -1
- package/docs/source/lib/goog/net/xhrlike.js.src.html +1 -1
- package/docs/source/lib/goog/net/xmlhttp.js.src.html +1 -1
- package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +1 -1
- package/docs/source/lib/goog/object/object.js.src.html +1 -1
- package/docs/source/lib/goog/reflect/reflect.js.src.html +1 -1
- package/docs/source/lib/goog/string/string.js.src.html +1 -1
- package/docs/source/lib/goog/structs/collection.js.src.html +1 -1
- package/docs/source/lib/goog/structs/map.js.src.html +1 -1
- package/docs/source/lib/goog/structs/set.js.src.html +1 -1
- package/docs/source/lib/goog/structs/structs.js.src.html +1 -1
- package/docs/source/lib/goog/style/style.js.src.html +1 -1
- package/docs/source/lib/goog/testing/asserts.js.src.html +1 -1
- package/docs/source/lib/goog/testing/asynctestcase.js.src.html +1 -1
- package/docs/source/lib/goog/testing/events/events.js.src.html +1 -1
- package/docs/source/lib/goog/testing/functionmock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/jsunit.js.src.html +1 -1
- package/docs/source/lib/goog/testing/loosemock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockclock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockcontrol.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockinterface.js.src.html +1 -1
- package/docs/source/lib/goog/testing/mockmatchers.js.src.html +1 -1
- package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +1 -1
- package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +1 -1
- package/docs/source/lib/goog/testing/recordfunction.js.src.html +1 -1
- package/docs/source/lib/goog/testing/stacktrace.js.src.html +1 -1
- package/docs/source/lib/goog/testing/strictmock.js.src.html +1 -1
- package/docs/source/lib/goog/testing/testcase.js.src.html +1 -1
- package/docs/source/lib/goog/testing/testrunner.js.src.html +1 -1
- package/docs/source/lib/goog/testing/watchers.js.src.html +1 -1
- package/docs/source/lib/goog/uri/uri.js.src.html +1 -1
- package/docs/source/lib/goog/uri/utils.js.src.html +1 -1
- package/docs/source/lib/goog/useragent/product.js.src.html +1 -1
- package/docs/source/lib/goog/useragent/product_isversion.js.src.html +1 -1
- package/docs/source/lib/goog/useragent/useragent.js.src.html +1 -1
- package/docs/source/lib/webdriver/abstractbuilder.js.src.html +1 -1
- package/docs/source/lib/webdriver/actionsequence.js.src.html +1 -1
- package/docs/source/lib/webdriver/builder.js.src.html +1 -1
- package/docs/source/lib/webdriver/button.js.src.html +1 -1
- package/docs/source/lib/webdriver/capabilities.js.src.html +1 -1
- package/docs/source/lib/webdriver/command.js.src.html +1 -1
- package/docs/source/lib/webdriver/events.js.src.html +1 -1
- package/docs/source/lib/webdriver/firefoxdomexecutor.js.src.html +1 -1
- package/docs/source/lib/webdriver/http/corsclient.js.src.html +1 -1
- package/docs/source/lib/webdriver/http/http.js.src.html +1 -1
- package/docs/source/lib/webdriver/http/xhrclient.js.src.html +1 -1
- package/docs/source/lib/webdriver/key.js.src.html +1 -1
- package/docs/source/lib/webdriver/locators.js.src.html +1 -1
- package/docs/source/lib/webdriver/logging.js.src.html +1 -1
- package/docs/source/lib/webdriver/process.js.src.html +1 -1
- package/docs/source/lib/webdriver/promise.js.src.html +1 -1
- package/docs/source/lib/webdriver/session.js.src.html +1 -1
- package/docs/source/lib/webdriver/stacktrace.js.src.html +1 -1
- package/docs/source/lib/webdriver/testing/asserts.js.src.html +1 -1
- package/docs/source/lib/webdriver/testing/testcase.js.src.html +1 -1
- package/docs/source/lib/webdriver/until.js.src.html +1 -0
- package/docs/source/lib/webdriver/webdriver.js.src.html +1 -1
- package/docs/source/net/index.js.src.html +1 -1
- package/docs/source/net/portprober.js.src.html +1 -1
- package/docs/source/phantomjs.js.src.html +1 -1
- package/docs/source/proxy.js.src.html +1 -1
- package/docs/source/remote/index.js.src.html +1 -1
- package/docs/source/testing/assert.js.src.html +1 -1
- package/docs/source/testing/index.js.src.html +1 -1
- package/docs/types.js +1 -1
- package/example/google_search.js +9 -17
- package/example/google_search_generator.js +6 -7
- package/example/google_search_test.js +10 -18
- package/example/parallel_flows.js +4 -7
- package/index.js +6 -0
- package/lib/firefox/webdriver.xpi +0 -0
- package/lib/goog/deps.js +7 -5
- package/lib/test/index.js +0 -8
- package/lib/webdriver/promise.js +263 -251
- package/lib/webdriver/stacktrace.js +15 -1
- package/lib/webdriver/test/promise_flow_test.js +82 -76
- package/lib/webdriver/test/promise_test.js +22 -62
- package/lib/webdriver/test/stacktrace_test.js +18 -0
- package/lib/webdriver/test/until_test.js +388 -0
- package/lib/webdriver/test/webdriver_test.js +41 -0
- package/lib/webdriver/until.js +408 -0
- package/lib/webdriver/webdriver.js +91 -29
- package/package.json +2 -2
- package/test/element_finding_test.js +6 -6
- package/test/http/util_test.js +4 -5
- package/test/page_loading_test.js +7 -7
- package/test/stale_element_test.js +2 -10
- package/testing/index.js +9 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>mockclock.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/testing/mockclock.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2007 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview Mock Clock implementation for working with setTimeout,<tr><td><a name="l17" href="#l17">17</a><td> * setInterval, clearTimeout and clearInterval within unit tests.<tr><td><a name="l18" href="#l18">18</a><td> *<tr><td><a name="l19" href="#l19">19</a><td> * Derived from jsUnitMockTimeout.js, contributed to JsUnit by<tr><td><a name="l20" href="#l20">20</a><td> * Pivotal Computer Systems, www.pivotalsf.com<tr><td><a name="l21" href="#l21">21</a><td> *<tr><td><a name="l22" href="#l22">22</a><td> */<tr><td><a name="l23" href="#l23">23</a><td><tr><td><a name="l24" href="#l24">24</a><td>goog.provide('goog.testing.MockClock');<tr><td><a name="l25" href="#l25">25</a><td><tr><td><a name="l26" href="#l26">26</a><td>goog.require('goog.Disposable');<tr><td><a name="l27" href="#l27">27</a><td>goog.require('goog.async.run');<tr><td><a name="l28" href="#l28">28</a><td>goog.require('goog.testing.PropertyReplacer');<tr><td><a name="l29" href="#l29">29</a><td>goog.require('goog.testing.events');<tr><td><a name="l30" href="#l30">30</a><td>goog.require('goog.testing.events.Event');<tr><td><a name="l31" href="#l31">31</a><td>goog.require('goog.testing.watchers');<tr><td><a name="l32" href="#l32">32</a><td><tr><td><a name="l33" href="#l33">33</a><td><tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td>/**<tr><td><a name="l36" href="#l36">36</a><td> * Class for unit testing code that uses setTimeout and clearTimeout.<tr><td><a name="l37" href="#l37">37</a><td> *<tr><td><a name="l38" href="#l38">38</a><td> * NOTE: If you are using MockClock to test code that makes use of<tr><td><a name="l39" href="#l39">39</a><td> * goog.fx.Animation, then you must either:<tr><td><a name="l40" href="#l40">40</a><td> *<tr><td><a name="l41" href="#l41">41</a><td> * 1. Install and dispose of the MockClock in setUpPage() and tearDownPage()<tr><td><a name="l42" href="#l42">42</a><td> * respectively (rather than setUp()/tearDown()).<tr><td><a name="l43" href="#l43">43</a><td> *<tr><td><a name="l44" href="#l44">44</a><td> * or<tr><td><a name="l45" href="#l45">45</a><td> *<tr><td><a name="l46" href="#l46">46</a><td> * 2. Ensure that every test clears the animation queue by calling<tr><td><a name="l47" href="#l47">47</a><td> * mockClock.tick(x) at the end of each test function (where `x` is large<tr><td><a name="l48" href="#l48">48</a><td> * enough to complete all animations).<tr><td><a name="l49" href="#l49">49</a><td> *<tr><td><a name="l50" href="#l50">50</a><td> * Otherwise, if any animation is left pending at the time that<tr><td><a name="l51" href="#l51">51</a><td> * MockClock.dispose() is called, that will permanently prevent any future<tr><td><a name="l52" href="#l52">52</a><td> * animations from playing on the page.<tr><td><a name="l53" href="#l53">53</a><td> *<tr><td><a name="l54" href="#l54">54</a><td> * @param {boolean=} opt_autoInstall Install the MockClock at construction time.<tr><td><a name="l55" href="#l55">55</a><td> * @constructor<tr><td><a name="l56" href="#l56">56</a><td> * @extends {goog.Disposable}<tr><td><a name="l57" href="#l57">57</a><td> * @final<tr><td><a name="l58" href="#l58">58</a><td> */<tr><td><a name="l59" href="#l59">59</a><td>goog.testing.MockClock = function(opt_autoInstall) {<tr><td><a name="l60" href="#l60">60</a><td> goog.Disposable.call(this);<tr><td><a name="l61" href="#l61">61</a><td><tr><td><a name="l62" href="#l62">62</a><td> /**<tr><td><a name="l63" href="#l63">63</a><td> * Reverse-order queue of timers to fire.<tr><td><a name="l64" href="#l64">64</a><td> *<tr><td><a name="l65" href="#l65">65</a><td> * The last item of the queue is popped off. Insertion happens from the<tr><td><a name="l66" href="#l66">66</a><td> * right. For example, the expiration times for each element of the queue<tr><td><a name="l67" href="#l67">67</a><td> * might be in the order 300, 200, 200.<tr><td><a name="l68" href="#l68">68</a><td> *<tr><td><a name="l69" href="#l69">69</a><td> * @type {Array.<Object>}<tr><td><a name="l70" href="#l70">70</a><td> * @private<tr><td><a name="l71" href="#l71">71</a><td> */<tr><td><a name="l72" href="#l72">72</a><td> this.queue_ = [];<tr><td><a name="l73" href="#l73">73</a><td><tr><td><a name="l74" href="#l74">74</a><td> /**<tr><td><a name="l75" href="#l75">75</a><td> * Set of timeouts that should be treated as cancelled.<tr><td><a name="l76" href="#l76">76</a><td> *<tr><td><a name="l77" href="#l77">77</a><td> * Rather than removing cancelled timers directly from the queue, this set<tr><td><a name="l78" href="#l78">78</a><td> * simply marks them as deleted so that they can be ignored when their<tr><td><a name="l79" href="#l79">79</a><td> * turn comes up. The keys are the timeout keys that are cancelled, each<tr><td><a name="l80" href="#l80">80</a><td> * mapping to true.<tr><td><a name="l81" href="#l81">81</a><td> *<tr><td><a name="l82" href="#l82">82</a><td> * @type {Object}<tr><td><a name="l83" href="#l83">83</a><td> * @private<tr><td><a name="l84" href="#l84">84</a><td> */<tr><td><a name="l85" href="#l85">85</a><td> this.deletedKeys_ = {};<tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td> if (opt_autoInstall) {<tr><td><a name="l88" href="#l88">88</a><td> this.install();<tr><td><a name="l89" href="#l89">89</a><td> }<tr><td><a name="l90" href="#l90">90</a><td>};<tr><td><a name="l91" href="#l91">91</a><td>goog.inherits(goog.testing.MockClock, goog.Disposable);<tr><td><a name="l92" href="#l92">92</a><td><tr><td><a name="l93" href="#l93">93</a><td><tr><td><a name="l94" href="#l94">94</a><td>/**<tr><td><a name="l95" href="#l95">95</a><td> * Default wait timeout for mocking requestAnimationFrame (in milliseconds).<tr><td><a name="l96" href="#l96">96</a><td> *<tr><td><a name="l97" href="#l97">97</a><td> * @type {number}<tr><td><a name="l98" href="#l98">98</a><td> * @const<tr><td><a name="l99" href="#l99">99</a><td> */<tr><td><a name="l100" href="#l100">100</a><td>goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT = 20;<tr><td><a name="l101" href="#l101">101</a><td><tr><td><a name="l102" href="#l102">102</a><td><tr><td><a name="l103" href="#l103">103</a><td>/**<tr><td><a name="l104" href="#l104">104</a><td> * Count of the number of timeouts made.<tr><td><a name="l105" href="#l105">105</a><td> * @type {number}<tr><td><a name="l106" href="#l106">106</a><td> * @private<tr><td><a name="l107" href="#l107">107</a><td> */<tr><td><a name="l108" href="#l108">108</a><td>goog.testing.MockClock.prototype.timeoutsMade_ = 0;<tr><td><a name="l109" href="#l109">109</a><td><tr><td><a name="l110" href="#l110">110</a><td><tr><td><a name="l111" href="#l111">111</a><td>/**<tr><td><a name="l112" href="#l112">112</a><td> * PropertyReplacer instance which overwrites and resets setTimeout,<tr><td><a name="l113" href="#l113">113</a><td> * setInterval, etc. or null if the MockClock is not installed.<tr><td><a name="l114" href="#l114">114</a><td> * @type {goog.testing.PropertyReplacer}<tr><td><a name="l115" href="#l115">115</a><td> * @private<tr><td><a name="l116" href="#l116">116</a><td> */<tr><td><a name="l117" href="#l117">117</a><td>goog.testing.MockClock.prototype.replacer_ = null;<tr><td><a name="l118" href="#l118">118</a><td><tr><td><a name="l119" href="#l119">119</a><td><tr><td><a name="l120" href="#l120">120</a><td>/**<tr><td><a name="l121" href="#l121">121</a><td> * Map of deleted keys. These keys represents keys that were deleted in a<tr><td><a name="l122" href="#l122">122</a><td> * clearInterval, timeoutid -> object.<tr><td><a name="l123" href="#l123">123</a><td> * @type {Object}<tr><td><a name="l124" href="#l124">124</a><td> * @private<tr><td><a name="l125" href="#l125">125</a><td> */<tr><td><a name="l126" href="#l126">126</a><td>goog.testing.MockClock.prototype.deletedKeys_ = null;<tr><td><a name="l127" href="#l127">127</a><td><tr><td><a name="l128" href="#l128">128</a><td><tr><td><a name="l129" href="#l129">129</a><td>/**<tr><td><a name="l130" href="#l130">130</a><td> * The current simulated time in milliseconds.<tr><td><a name="l131" href="#l131">131</a><td> * @type {number}<tr><td><a name="l132" href="#l132">132</a><td> * @private<tr><td><a name="l133" href="#l133">133</a><td> */<tr><td><a name="l134" href="#l134">134</a><td>goog.testing.MockClock.prototype.nowMillis_ = 0;<tr><td><a name="l135" href="#l135">135</a><td><tr><td><a name="l136" href="#l136">136</a><td><tr><td><a name="l137" href="#l137">137</a><td>/**<tr><td><a name="l138" href="#l138">138</a><td> * Additional delay between the time a timeout was set to fire, and the time<tr><td><a name="l139" href="#l139">139</a><td> * it actually fires. Useful for testing workarounds for this Firefox 2 bug:<tr><td><a name="l140" href="#l140">140</a><td> * https://bugzilla.mozilla.org/show_bug.cgi?id=291386<tr><td><a name="l141" href="#l141">141</a><td> * May be negative.<tr><td><a name="l142" href="#l142">142</a><td> * @type {number}<tr><td><a name="l143" href="#l143">143</a><td> * @private<tr><td><a name="l144" href="#l144">144</a><td> */<tr><td><a name="l145" href="#l145">145</a><td>goog.testing.MockClock.prototype.timeoutDelay_ = 0;<tr><td><a name="l146" href="#l146">146</a><td><tr><td><a name="l147" href="#l147">147</a><td><tr><td><a name="l148" href="#l148">148</a><td>/**<tr><td><a name="l149" href="#l149">149</a><td> * Installs the MockClock by overriding the global object's implementation of<tr><td><a name="l150" href="#l150">150</a><td> * setTimeout, setInterval, clearTimeout and clearInterval.<tr><td><a name="l151" href="#l151">151</a><td> */<tr><td><a name="l152" href="#l152">152</a><td>goog.testing.MockClock.prototype.install = function() {<tr><td><a name="l153" href="#l153">153</a><td> if (!this.replacer_) {<tr><td><a name="l154" href="#l154">154</a><td> var r = this.replacer_ = new goog.testing.PropertyReplacer();<tr><td><a name="l155" href="#l155">155</a><td> r.set(goog.global, 'setTimeout', goog.bind(this.setTimeout_, this));<tr><td><a name="l156" href="#l156">156</a><td> r.set(goog.global, 'setInterval', goog.bind(this.setInterval_, this));<tr><td><a name="l157" href="#l157">157</a><td> r.set(goog.global, 'setImmediate', goog.bind(this.setImmediate_, this));<tr><td><a name="l158" href="#l158">158</a><td> r.set(goog.global, 'clearTimeout', goog.bind(this.clearTimeout_, this));<tr><td><a name="l159" href="#l159">159</a><td> r.set(goog.global, 'clearInterval', goog.bind(this.clearInterval_, this));<tr><td><a name="l160" href="#l160">160</a><td> // goog.Promise uses goog.async.run. In order to be able to test<tr><td><a name="l161" href="#l161">161</a><td> // Promise-based code, we need to make sure that goog.async.run uses<tr><td><a name="l162" href="#l162">162</a><td> // nextTick instead of native browser Promises. This means that it will<tr><td><a name="l163" href="#l163">163</a><td> // default to setImmediate, which is replaced above. Note that we test for<tr><td><a name="l164" href="#l164">164</a><td> // the presence of goog.async.run.forceNextTick to be resilient to the case<tr><td><a name="l165" href="#l165">165</a><td> // where tests replace goog.async.run directly.<tr><td><a name="l166" href="#l166">166</a><td> goog.async.run.forceNextTick && goog.async.run.forceNextTick();<tr><td><a name="l167" href="#l167">167</a><td><tr><td><a name="l168" href="#l168">168</a><td> // Replace the requestAnimationFrame functions.<tr><td><a name="l169" href="#l169">169</a><td> this.replaceRequestAnimationFrame_();<tr><td><a name="l170" href="#l170">170</a><td><tr><td><a name="l171" href="#l171">171</a><td> // PropertyReplacer#set can't be called with renameable functions.<tr><td><a name="l172" href="#l172">172</a><td> this.oldGoogNow_ = goog.now;<tr><td><a name="l173" href="#l173">173</a><td> goog.now = goog.bind(this.getCurrentTime, this);<tr><td><a name="l174" href="#l174">174</a><td> }<tr><td><a name="l175" href="#l175">175</a><td>};<tr><td><a name="l176" href="#l176">176</a><td><tr><td><a name="l177" href="#l177">177</a><td><tr><td><a name="l178" href="#l178">178</a><td>/**<tr><td><a name="l179" href="#l179">179</a><td> * Installs the mocks for requestAnimationFrame and cancelRequestAnimationFrame.<tr><td><a name="l180" href="#l180">180</a><td> * @private<tr><td><a name="l181" href="#l181">181</a><td> */<tr><td><a name="l182" href="#l182">182</a><td>goog.testing.MockClock.prototype.replaceRequestAnimationFrame_ = function() {<tr><td><a name="l183" href="#l183">183</a><td> var r = this.replacer_;<tr><td><a name="l184" href="#l184">184</a><td> var requestFuncs = ['requestAnimationFrame',<tr><td><a name="l185" href="#l185">185</a><td> 'webkitRequestAnimationFrame',<tr><td><a name="l186" href="#l186">186</a><td> 'mozRequestAnimationFrame',<tr><td><a name="l187" href="#l187">187</a><td> 'oRequestAnimationFrame',<tr><td><a name="l188" href="#l188">188</a><td> 'msRequestAnimationFrame'];<tr><td><a name="l189" href="#l189">189</a><td><tr><td><a name="l190" href="#l190">190</a><td> var cancelFuncs = ['cancelRequestAnimationFrame',<tr><td><a name="l191" href="#l191">191</a><td> 'webkitCancelRequestAnimationFrame',<tr><td><a name="l192" href="#l192">192</a><td> 'mozCancelRequestAnimationFrame',<tr><td><a name="l193" href="#l193">193</a><td> 'oCancelRequestAnimationFrame',<tr><td><a name="l194" href="#l194">194</a><td> 'msCancelRequestAnimationFrame'];<tr><td><a name="l195" href="#l195">195</a><td><tr><td><a name="l196" href="#l196">196</a><td> for (var i = 0; i < requestFuncs.length; ++i) {<tr><td><a name="l197" href="#l197">197</a><td> if (goog.global && goog.global[requestFuncs[i]]) {<tr><td><a name="l198" href="#l198">198</a><td> r.set(goog.global, requestFuncs[i],<tr><td><a name="l199" href="#l199">199</a><td> goog.bind(this.requestAnimationFrame_, this));<tr><td><a name="l200" href="#l200">200</a><td> }<tr><td><a name="l201" href="#l201">201</a><td> }<tr><td><a name="l202" href="#l202">202</a><td><tr><td><a name="l203" href="#l203">203</a><td> for (var i = 0; i < cancelFuncs.length; ++i) {<tr><td><a name="l204" href="#l204">204</a><td> if (goog.global && goog.global[cancelFuncs[i]]) {<tr><td><a name="l205" href="#l205">205</a><td> r.set(goog.global, cancelFuncs[i],<tr><td><a name="l206" href="#l206">206</a><td> goog.bind(this.cancelRequestAnimationFrame_, this));<tr><td><a name="l207" href="#l207">207</a><td> }<tr><td><a name="l208" href="#l208">208</a><td> }<tr><td><a name="l209" href="#l209">209</a><td>};<tr><td><a name="l210" href="#l210">210</a><td><tr><td><a name="l211" href="#l211">211</a><td><tr><td><a name="l212" href="#l212">212</a><td>/**<tr><td><a name="l213" href="#l213">213</a><td> * Removes the MockClock's hooks into the global object's functions and revert<tr><td><a name="l214" href="#l214">214</a><td> * to their original values.<tr><td><a name="l215" href="#l215">215</a><td> */<tr><td><a name="l216" href="#l216">216</a><td>goog.testing.MockClock.prototype.uninstall = function() {<tr><td><a name="l217" href="#l217">217</a><td> if (this.replacer_) {<tr><td><a name="l218" href="#l218">218</a><td> this.replacer_.reset();<tr><td><a name="l219" href="#l219">219</a><td> this.replacer_ = null;<tr><td><a name="l220" href="#l220">220</a><td> goog.now = this.oldGoogNow_;<tr><td><a name="l221" href="#l221">221</a><td> }<tr><td><a name="l222" href="#l222">222</a><td><tr><td><a name="l223" href="#l223">223</a><td> this.fireResetEvent();<tr><td><a name="l224" href="#l224">224</a><td>};<tr><td><a name="l225" href="#l225">225</a><td><tr><td><a name="l226" href="#l226">226</a><td><tr><td><a name="l227" href="#l227">227</a><td>/** @override */<tr><td><a name="l228" href="#l228">228</a><td>goog.testing.MockClock.prototype.disposeInternal = function() {<tr><td><a name="l229" href="#l229">229</a><td> this.uninstall();<tr><td><a name="l230" href="#l230">230</a><td> this.queue_ = null;<tr><td><a name="l231" href="#l231">231</a><td> this.deletedKeys_ = null;<tr><td><a name="l232" href="#l232">232</a><td> goog.testing.MockClock.superClass_.disposeInternal.call(this);<tr><td><a name="l233" href="#l233">233</a><td>};<tr><td><a name="l234" href="#l234">234</a><td><tr><td><a name="l235" href="#l235">235</a><td><tr><td><a name="l236" href="#l236">236</a><td>/**<tr><td><a name="l237" href="#l237">237</a><td> * Resets the MockClock, removing all timeouts that are scheduled and resets<tr><td><a name="l238" href="#l238">238</a><td> * the fake timer count.<tr><td><a name="l239" href="#l239">239</a><td> */<tr><td><a name="l240" href="#l240">240</a><td>goog.testing.MockClock.prototype.reset = function() {<tr><td><a name="l241" href="#l241">241</a><td> this.queue_ = [];<tr><td><a name="l242" href="#l242">242</a><td> this.deletedKeys_ = {};<tr><td><a name="l243" href="#l243">243</a><td> this.nowMillis_ = 0;<tr><td><a name="l244" href="#l244">244</a><td> this.timeoutsMade_ = 0;<tr><td><a name="l245" href="#l245">245</a><td> this.timeoutDelay_ = 0;<tr><td><a name="l246" href="#l246">246</a><td><tr><td><a name="l247" href="#l247">247</a><td> this.fireResetEvent();<tr><td><a name="l248" href="#l248">248</a><td>};<tr><td><a name="l249" href="#l249">249</a><td><tr><td><a name="l250" href="#l250">250</a><td><tr><td><a name="l251" href="#l251">251</a><td>/**<tr><td><a name="l252" href="#l252">252</a><td> * Signals that the mock clock has been reset, allowing objects that<tr><td><a name="l253" href="#l253">253</a><td> * maintain their own internal state to reset.<tr><td><a name="l254" href="#l254">254</a><td> */<tr><td><a name="l255" href="#l255">255</a><td>goog.testing.MockClock.prototype.fireResetEvent = function() {<tr><td><a name="l256" href="#l256">256</a><td> goog.testing.watchers.signalClockReset();<tr><td><a name="l257" href="#l257">257</a><td>};<tr><td><a name="l258" href="#l258">258</a><td><tr><td><a name="l259" href="#l259">259</a><td><tr><td><a name="l260" href="#l260">260</a><td>/**<tr><td><a name="l261" href="#l261">261</a><td> * Sets the amount of time between when a timeout is scheduled to fire and when<tr><td><a name="l262" href="#l262">262</a><td> * it actually fires.<tr><td><a name="l263" href="#l263">263</a><td> * @param {number} delay The delay in milliseconds. May be negative.<tr><td><a name="l264" href="#l264">264</a><td> */<tr><td><a name="l265" href="#l265">265</a><td>goog.testing.MockClock.prototype.setTimeoutDelay = function(delay) {<tr><td><a name="l266" href="#l266">266</a><td> this.timeoutDelay_ = delay;<tr><td><a name="l267" href="#l267">267</a><td>};<tr><td><a name="l268" href="#l268">268</a><td><tr><td><a name="l269" href="#l269">269</a><td><tr><td><a name="l270" href="#l270">270</a><td>/**<tr><td><a name="l271" href="#l271">271</a><td> * @return {number} delay The amount of time between when a timeout is<tr><td><a name="l272" href="#l272">272</a><td> * scheduled to fire and when it actually fires, in milliseconds. May<tr><td><a name="l273" href="#l273">273</a><td> * be negative.<tr><td><a name="l274" href="#l274">274</a><td> */<tr><td><a name="l275" href="#l275">275</a><td>goog.testing.MockClock.prototype.getTimeoutDelay = function() {<tr><td><a name="l276" href="#l276">276</a><td> return this.timeoutDelay_;<tr><td><a name="l277" href="#l277">277</a><td>};<tr><td><a name="l278" href="#l278">278</a><td><tr><td><a name="l279" href="#l279">279</a><td><tr><td><a name="l280" href="#l280">280</a><td>/**<tr><td><a name="l281" href="#l281">281</a><td> * Increments the MockClock's time by a given number of milliseconds, running<tr><td><a name="l282" href="#l282">282</a><td> * any functions that are now overdue.<tr><td><a name="l283" href="#l283">283</a><td> * @param {number=} opt_millis Number of milliseconds to increment the counter.<tr><td><a name="l284" href="#l284">284</a><td> * If not specified, clock ticks 1 millisecond.<tr><td><a name="l285" href="#l285">285</a><td> * @return {number} Current mock time in milliseconds.<tr><td><a name="l286" href="#l286">286</a><td> */<tr><td><a name="l287" href="#l287">287</a><td>goog.testing.MockClock.prototype.tick = function(opt_millis) {<tr><td><a name="l288" href="#l288">288</a><td> if (typeof opt_millis != 'number') {<tr><td><a name="l289" href="#l289">289</a><td> opt_millis = 1;<tr><td><a name="l290" href="#l290">290</a><td> }<tr><td><a name="l291" href="#l291">291</a><td> var endTime = this.nowMillis_ + opt_millis;<tr><td><a name="l292" href="#l292">292</a><td> this.runFunctionsWithinRange_(endTime);<tr><td><a name="l293" href="#l293">293</a><td> this.nowMillis_ = endTime;<tr><td><a name="l294" href="#l294">294</a><td> return endTime;<tr><td><a name="l295" href="#l295">295</a><td>};<tr><td><a name="l296" href="#l296">296</a><td><tr><td><a name="l297" href="#l297">297</a><td><tr><td><a name="l298" href="#l298">298</a><td>/**<tr><td><a name="l299" href="#l299">299</a><td> * @return {number} The number of timeouts that have been scheduled.<tr><td><a name="l300" href="#l300">300</a><td> */<tr><td><a name="l301" href="#l301">301</a><td>goog.testing.MockClock.prototype.getTimeoutsMade = function() {<tr><td><a name="l302" href="#l302">302</a><td> return this.timeoutsMade_;<tr><td><a name="l303" href="#l303">303</a><td>};<tr><td><a name="l304" href="#l304">304</a><td><tr><td><a name="l305" href="#l305">305</a><td><tr><td><a name="l306" href="#l306">306</a><td>/**<tr><td><a name="l307" href="#l307">307</a><td> * @return {number} The MockClock's current time in milliseconds.<tr><td><a name="l308" href="#l308">308</a><td> */<tr><td><a name="l309" href="#l309">309</a><td>goog.testing.MockClock.prototype.getCurrentTime = function() {<tr><td><a name="l310" href="#l310">310</a><td> return this.nowMillis_;<tr><td><a name="l311" href="#l311">311</a><td>};<tr><td><a name="l312" href="#l312">312</a><td><tr><td><a name="l313" href="#l313">313</a><td><tr><td><a name="l314" href="#l314">314</a><td>/**<tr><td><a name="l315" href="#l315">315</a><td> * @param {number} timeoutKey The timeout key.<tr><td><a name="l316" href="#l316">316</a><td> * @return {boolean} Whether the timer has been set and not cleared,<tr><td><a name="l317" href="#l317">317</a><td> * independent of the timeout's expiration. In other words, the timeout<tr><td><a name="l318" href="#l318">318</a><td> * could have passed or could be scheduled for the future. Either way,<tr><td><a name="l319" href="#l319">319</a><td> * this function returns true or false depending only on whether the<tr><td><a name="l320" href="#l320">320</a><td> * provided timeoutKey represents a timeout that has been set and not<tr><td><a name="l321" href="#l321">321</a><td> * cleared.<tr><td><a name="l322" href="#l322">322</a><td> */<tr><td><a name="l323" href="#l323">323</a><td>goog.testing.MockClock.prototype.isTimeoutSet = function(timeoutKey) {<tr><td><a name="l324" href="#l324">324</a><td> return timeoutKey <= this.timeoutsMade_ && !this.deletedKeys_[timeoutKey];<tr><td><a name="l325" href="#l325">325</a><td>};<tr><td><a name="l326" href="#l326">326</a><td><tr><td><a name="l327" href="#l327">327</a><td><tr><td><a name="l328" href="#l328">328</a><td>/**<tr><td><a name="l329" href="#l329">329</a><td> * Runs any function that is scheduled before a certain time. Timeouts can<tr><td><a name="l330" href="#l330">330</a><td> * be made to fire early or late if timeoutDelay_ is non-0.<tr><td><a name="l331" href="#l331">331</a><td> * @param {number} endTime The latest time in the range, in milliseconds.<tr><td><a name="l332" href="#l332">332</a><td> * @private<tr><td><a name="l333" href="#l333">333</a><td> */<tr><td><a name="l334" href="#l334">334</a><td>goog.testing.MockClock.prototype.runFunctionsWithinRange_ = function(<tr><td><a name="l335" href="#l335">335</a><td> endTime) {<tr><td><a name="l336" href="#l336">336</a><td> var adjustedEndTime = endTime - this.timeoutDelay_;<tr><td><a name="l337" href="#l337">337</a><td><tr><td><a name="l338" href="#l338">338</a><td> // Repeatedly pop off the last item since the queue is always sorted.<tr><td><a name="l339" href="#l339">339</a><td> while (this.queue_ && this.queue_.length &&<tr><td><a name="l340" href="#l340">340</a><td> this.queue_[this.queue_.length - 1].runAtMillis <= adjustedEndTime) {<tr><td><a name="l341" href="#l341">341</a><td> var timeout = this.queue_.pop();<tr><td><a name="l342" href="#l342">342</a><td><tr><td><a name="l343" href="#l343">343</a><td> if (!(timeout.timeoutKey in this.deletedKeys_)) {<tr><td><a name="l344" href="#l344">344</a><td> // Only move time forwards.<tr><td><a name="l345" href="#l345">345</a><td> this.nowMillis_ = Math.max(this.nowMillis_,<tr><td><a name="l346" href="#l346">346</a><td> timeout.runAtMillis + this.timeoutDelay_);<tr><td><a name="l347" href="#l347">347</a><td> // Call timeout in global scope and pass the timeout key as the argument.<tr><td><a name="l348" href="#l348">348</a><td> timeout.funcToCall.call(goog.global, timeout.timeoutKey);<tr><td><a name="l349" href="#l349">349</a><td> // In case the interval was cleared in the funcToCall<tr><td><a name="l350" href="#l350">350</a><td> if (timeout.recurring) {<tr><td><a name="l351" href="#l351">351</a><td> this.scheduleFunction_(<tr><td><a name="l352" href="#l352">352</a><td> timeout.timeoutKey, timeout.funcToCall, timeout.millis, true);<tr><td><a name="l353" href="#l353">353</a><td> }<tr><td><a name="l354" href="#l354">354</a><td> }<tr><td><a name="l355" href="#l355">355</a><td> }<tr><td><a name="l356" href="#l356">356</a><td>};<tr><td><a name="l357" href="#l357">357</a><td><tr><td><a name="l358" href="#l358">358</a><td><tr><td><a name="l359" href="#l359">359</a><td>/**<tr><td><a name="l360" href="#l360">360</a><td> * Schedules a function to be run at a certain time.<tr><td><a name="l361" href="#l361">361</a><td> * @param {number} timeoutKey The timeout key.<tr><td><a name="l362" href="#l362">362</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l363" href="#l363">363</a><td> * @param {number} millis The number of milliseconds to call it in.<tr><td><a name="l364" href="#l364">364</a><td> * @param {boolean} recurring Whether to function call should recur.<tr><td><a name="l365" href="#l365">365</a><td> * @private<tr><td><a name="l366" href="#l366">366</a><td> */<tr><td><a name="l367" href="#l367">367</a><td>goog.testing.MockClock.prototype.scheduleFunction_ = function(<tr><td><a name="l368" href="#l368">368</a><td> timeoutKey, funcToCall, millis, recurring) {<tr><td><a name="l369" href="#l369">369</a><td> if (!goog.isFunction(funcToCall)) {<tr><td><a name="l370" href="#l370">370</a><td> // Early error for debuggability rather than dying in the next .tick()<tr><td><a name="l371" href="#l371">371</a><td> throw new TypeError('The provided callback must be a function, not a ' +<tr><td><a name="l372" href="#l372">372</a><td> typeof funcToCall);<tr><td><a name="l373" href="#l373">373</a><td> }<tr><td><a name="l374" href="#l374">374</a><td><tr><td><a name="l375" href="#l375">375</a><td> var timeout = {<tr><td><a name="l376" href="#l376">376</a><td> runAtMillis: this.nowMillis_ + millis,<tr><td><a name="l377" href="#l377">377</a><td> funcToCall: funcToCall,<tr><td><a name="l378" href="#l378">378</a><td> recurring: recurring,<tr><td><a name="l379" href="#l379">379</a><td> timeoutKey: timeoutKey,<tr><td><a name="l380" href="#l380">380</a><td> millis: millis<tr><td><a name="l381" href="#l381">381</a><td> };<tr><td><a name="l382" href="#l382">382</a><td><tr><td><a name="l383" href="#l383">383</a><td> goog.testing.MockClock.insert_(timeout, this.queue_);<tr><td><a name="l384" href="#l384">384</a><td>};<tr><td><a name="l385" href="#l385">385</a><td><tr><td><a name="l386" href="#l386">386</a><td><tr><td><a name="l387" href="#l387">387</a><td>/**<tr><td><a name="l388" href="#l388">388</a><td> * Inserts a timer descriptor into a descending-order queue.<tr><td><a name="l389" href="#l389">389</a><td> *<tr><td><a name="l390" href="#l390">390</a><td> * Later-inserted duplicates appear at lower indices. For example, the<tr><td><a name="l391" href="#l391">391</a><td> * asterisk in (5,4,*,3,2,1) would be the insertion point for 3.<tr><td><a name="l392" href="#l392">392</a><td> *<tr><td><a name="l393" href="#l393">393</a><td> * @param {Object} timeout The timeout to insert, with numerical runAtMillis<tr><td><a name="l394" href="#l394">394</a><td> * property.<tr><td><a name="l395" href="#l395">395</a><td> * @param {Array.<Object>} queue The queue to insert into, with each element<tr><td><a name="l396" href="#l396">396</a><td> * having a numerical runAtMillis property.<tr><td><a name="l397" href="#l397">397</a><td> * @private<tr><td><a name="l398" href="#l398">398</a><td> */<tr><td><a name="l399" href="#l399">399</a><td>goog.testing.MockClock.insert_ = function(timeout, queue) {<tr><td><a name="l400" href="#l400">400</a><td> // Although insertion of N items is quadratic, requiring goog.structs.Heap<tr><td><a name="l401" href="#l401">401</a><td> // from a unit test will make tests more prone to breakage. Since unit<tr><td><a name="l402" href="#l402">402</a><td> // tests are normally small, scalability is not a primary issue.<tr><td><a name="l403" href="#l403">403</a><td><tr><td><a name="l404" href="#l404">404</a><td> // Find an insertion point. Since the queue is in reverse order (so we<tr><td><a name="l405" href="#l405">405</a><td> // can pop rather than unshift), and later timers with the same time stamp<tr><td><a name="l406" href="#l406">406</a><td> // should be executed later, we look for the element strictly greater than<tr><td><a name="l407" href="#l407">407</a><td> // the one we are inserting.<tr><td><a name="l408" href="#l408">408</a><td><tr><td><a name="l409" href="#l409">409</a><td> for (var i = queue.length; i != 0; i--) {<tr><td><a name="l410" href="#l410">410</a><td> if (queue[i - 1].runAtMillis > timeout.runAtMillis) {<tr><td><a name="l411" href="#l411">411</a><td> break;<tr><td><a name="l412" href="#l412">412</a><td> }<tr><td><a name="l413" href="#l413">413</a><td> queue[i] = queue[i - 1];<tr><td><a name="l414" href="#l414">414</a><td> }<tr><td><a name="l415" href="#l415">415</a><td><tr><td><a name="l416" href="#l416">416</a><td> queue[i] = timeout;<tr><td><a name="l417" href="#l417">417</a><td>};<tr><td><a name="l418" href="#l418">418</a><td><tr><td><a name="l419" href="#l419">419</a><td><tr><td><a name="l420" href="#l420">420</a><td>/**<tr><td><a name="l421" href="#l421">421</a><td> * Maximum 32-bit signed integer.<tr><td><a name="l422" href="#l422">422</a><td> *<tr><td><a name="l423" href="#l423">423</a><td> * Timeouts over this time return immediately in many browsers, due to integer<tr><td><a name="l424" href="#l424">424</a><td> * overflow. Such known browsers include Firefox, Chrome, and Safari, but not<tr><td><a name="l425" href="#l425">425</a><td> * IE.<tr><td><a name="l426" href="#l426">426</a><td> *<tr><td><a name="l427" href="#l427">427</a><td> * @type {number}<tr><td><a name="l428" href="#l428">428</a><td> * @private<tr><td><a name="l429" href="#l429">429</a><td> */<tr><td><a name="l430" href="#l430">430</a><td>goog.testing.MockClock.MAX_INT_ = 2147483647;<tr><td><a name="l431" href="#l431">431</a><td><tr><td><a name="l432" href="#l432">432</a><td><tr><td><a name="l433" href="#l433">433</a><td>/**<tr><td><a name="l434" href="#l434">434</a><td> * Schedules a function to be called after {@code millis} milliseconds.<tr><td><a name="l435" href="#l435">435</a><td> * Mock implementation for setTimeout.<tr><td><a name="l436" href="#l436">436</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l437" href="#l437">437</a><td> * @param {number} millis The number of milliseconds to call it after.<tr><td><a name="l438" href="#l438">438</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l439" href="#l439">439</a><td> * @private<tr><td><a name="l440" href="#l440">440</a><td> */<tr><td><a name="l441" href="#l441">441</a><td>goog.testing.MockClock.prototype.setTimeout_ = function(funcToCall, millis) {<tr><td><a name="l442" href="#l442">442</a><td> if (millis > goog.testing.MockClock.MAX_INT_) {<tr><td><a name="l443" href="#l443">443</a><td> throw Error(<tr><td><a name="l444" href="#l444">444</a><td> 'Bad timeout value: ' + millis + '. Timeouts over MAX_INT ' +<tr><td><a name="l445" href="#l445">445</a><td> '(24.8 days) cause timeouts to be fired ' +<tr><td><a name="l446" href="#l446">446</a><td> 'immediately in most browsers, except for IE.');<tr><td><a name="l447" href="#l447">447</a><td> }<tr><td><a name="l448" href="#l448">448</a><td> this.timeoutsMade_ = this.timeoutsMade_ + 1;<tr><td><a name="l449" href="#l449">449</a><td> this.scheduleFunction_(this.timeoutsMade_, funcToCall, millis, false);<tr><td><a name="l450" href="#l450">450</a><td> return this.timeoutsMade_;<tr><td><a name="l451" href="#l451">451</a><td>};<tr><td><a name="l452" href="#l452">452</a><td><tr><td><a name="l453" href="#l453">453</a><td><tr><td><a name="l454" href="#l454">454</a><td>/**<tr><td><a name="l455" href="#l455">455</a><td> * Schedules a function to be called every {@code millis} milliseconds.<tr><td><a name="l456" href="#l456">456</a><td> * Mock implementation for setInterval.<tr><td><a name="l457" href="#l457">457</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l458" href="#l458">458</a><td> * @param {number} millis The number of milliseconds between calls.<tr><td><a name="l459" href="#l459">459</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l460" href="#l460">460</a><td> * @private<tr><td><a name="l461" href="#l461">461</a><td> */<tr><td><a name="l462" href="#l462">462</a><td>goog.testing.MockClock.prototype.setInterval_ = function(funcToCall, millis) {<tr><td><a name="l463" href="#l463">463</a><td> this.timeoutsMade_ = this.timeoutsMade_ + 1;<tr><td><a name="l464" href="#l464">464</a><td> this.scheduleFunction_(this.timeoutsMade_, funcToCall, millis, true);<tr><td><a name="l465" href="#l465">465</a><td> return this.timeoutsMade_;<tr><td><a name="l466" href="#l466">466</a><td>};<tr><td><a name="l467" href="#l467">467</a><td><tr><td><a name="l468" href="#l468">468</a><td><tr><td><a name="l469" href="#l469">469</a><td>/**<tr><td><a name="l470" href="#l470">470</a><td> * Schedules a function to be called when an animation frame is triggered.<tr><td><a name="l471" href="#l471">471</a><td> * Mock implementation for requestAnimationFrame.<tr><td><a name="l472" href="#l472">472</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l473" href="#l473">473</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l474" href="#l474">474</a><td> * @private<tr><td><a name="l475" href="#l475">475</a><td> */<tr><td><a name="l476" href="#l476">476</a><td>goog.testing.MockClock.prototype.requestAnimationFrame_ = function(funcToCall) {<tr><td><a name="l477" href="#l477">477</a><td> return this.setTimeout_(goog.bind(function() {<tr><td><a name="l478" href="#l478">478</a><td> if (funcToCall) {<tr><td><a name="l479" href="#l479">479</a><td> funcToCall(this.getCurrentTime());<tr><td><a name="l480" href="#l480">480</a><td> } else if (goog.global.mozRequestAnimationFrame) {<tr><td><a name="l481" href="#l481">481</a><td> var event = new goog.testing.events.Event('MozBeforePaint', goog.global);<tr><td><a name="l482" href="#l482">482</a><td> event['timeStamp'] = this.getCurrentTime();<tr><td><a name="l483" href="#l483">483</a><td> goog.testing.events.fireBrowserEvent(event);<tr><td><a name="l484" href="#l484">484</a><td> }<tr><td><a name="l485" href="#l485">485</a><td> }, this), goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT);<tr><td><a name="l486" href="#l486">486</a><td>};<tr><td><a name="l487" href="#l487">487</a><td><tr><td><a name="l488" href="#l488">488</a><td><tr><td><a name="l489" href="#l489">489</a><td>/**<tr><td><a name="l490" href="#l490">490</a><td> * Schedules a function to be called immediately after the current JS<tr><td><a name="l491" href="#l491">491</a><td> * execution.<tr><td><a name="l492" href="#l492">492</a><td> * Mock implementation for setImmediate.<tr><td><a name="l493" href="#l493">493</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l494" href="#l494">494</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l495" href="#l495">495</a><td> * @private<tr><td><a name="l496" href="#l496">496</a><td> */<tr><td><a name="l497" href="#l497">497</a><td>goog.testing.MockClock.prototype.setImmediate_ = function(funcToCall) {<tr><td><a name="l498" href="#l498">498</a><td> return this.setTimeout_(funcToCall, 0);<tr><td><a name="l499" href="#l499">499</a><td>};<tr><td><a name="l500" href="#l500">500</a><td><tr><td><a name="l501" href="#l501">501</a><td><tr><td><a name="l502" href="#l502">502</a><td>/**<tr><td><a name="l503" href="#l503">503</a><td> * Clears a timeout.<tr><td><a name="l504" href="#l504">504</a><td> * Mock implementation for clearTimeout.<tr><td><a name="l505" href="#l505">505</a><td> * @param {number} timeoutKey The timeout key to clear.<tr><td><a name="l506" href="#l506">506</a><td> * @private<tr><td><a name="l507" href="#l507">507</a><td> */<tr><td><a name="l508" href="#l508">508</a><td>goog.testing.MockClock.prototype.clearTimeout_ = function(timeoutKey) {<tr><td><a name="l509" href="#l509">509</a><td> // Some common libraries register static state with timers.<tr><td><a name="l510" href="#l510">510</a><td> // This is bad. It leads to all sorts of crazy test problems where<tr><td><a name="l511" href="#l511">511</a><td> // 1) Test A sets up a new mock clock and a static timer.<tr><td><a name="l512" href="#l512">512</a><td> // 2) Test B sets up a new mock clock, but re-uses the static timer<tr><td><a name="l513" href="#l513">513</a><td> // from Test A.<tr><td><a name="l514" href="#l514">514</a><td> // 3) A timeout key from test A gets cleared, breaking a timeout in<tr><td><a name="l515" href="#l515">515</a><td> // Test B.<tr><td><a name="l516" href="#l516">516</a><td> //<tr><td><a name="l517" href="#l517">517</a><td> // For now, we just hackily fail silently if someone tries to clear a timeout<tr><td><a name="l518" href="#l518">518</a><td> // key before we've allocated it.<tr><td><a name="l519" href="#l519">519</a><td> // Ideally, we should throw an exception if we see this happening.<tr><td><a name="l520" href="#l520">520</a><td> //<tr><td><a name="l521" href="#l521">521</a><td> // TODO(user): We might also try allocating timeout ids from a global<tr><td><a name="l522" href="#l522">522</a><td> // pool rather than a local pool.<tr><td><a name="l523" href="#l523">523</a><td> if (this.isTimeoutSet(timeoutKey)) {<tr><td><a name="l524" href="#l524">524</a><td> this.deletedKeys_[timeoutKey] = true;<tr><td><a name="l525" href="#l525">525</a><td> }<tr><td><a name="l526" href="#l526">526</a><td>};<tr><td><a name="l527" href="#l527">527</a><td><tr><td><a name="l528" href="#l528">528</a><td><tr><td><a name="l529" href="#l529">529</a><td>/**<tr><td><a name="l530" href="#l530">530</a><td> * Clears an interval.<tr><td><a name="l531" href="#l531">531</a><td> * Mock implementation for clearInterval.<tr><td><a name="l532" href="#l532">532</a><td> * @param {number} timeoutKey The interval key to clear.<tr><td><a name="l533" href="#l533">533</a><td> * @private<tr><td><a name="l534" href="#l534">534</a><td> */<tr><td><a name="l535" href="#l535">535</a><td>goog.testing.MockClock.prototype.clearInterval_ = function(timeoutKey) {<tr><td><a name="l536" href="#l536">536</a><td> this.clearTimeout_(timeoutKey);<tr><td><a name="l537" href="#l537">537</a><td>};<tr><td><a name="l538" href="#l538">538</a><td><tr><td><a name="l539" href="#l539">539</a><td><tr><td><a name="l540" href="#l540">540</a><td>/**<tr><td><a name="l541" href="#l541">541</a><td> * Clears a requestAnimationFrame.<tr><td><a name="l542" href="#l542">542</a><td> * Mock implementation for cancelRequestAnimationFrame.<tr><td><a name="l543" href="#l543">543</a><td> * @param {number} timeoutKey The requestAnimationFrame key to clear.<tr><td><a name="l544" href="#l544">544</a><td> * @private<tr><td><a name="l545" href="#l545">545</a><td> */<tr><td><a name="l546" href="#l546">546</a><td>goog.testing.MockClock.prototype.cancelRequestAnimationFrame_ =<tr><td><a name="l547" href="#l547">547</a><td> function(timeoutKey) {<tr><td><a name="l548" href="#l548">548</a><td> this.clearTimeout_(timeoutKey);<tr><td><a name="l549" href="#l549">549</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
1
|
+
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>mockclock.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/testing/mockclock.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2007 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview Mock Clock implementation for working with setTimeout,<tr><td><a name="l17" href="#l17">17</a><td> * setInterval, clearTimeout and clearInterval within unit tests.<tr><td><a name="l18" href="#l18">18</a><td> *<tr><td><a name="l19" href="#l19">19</a><td> * Derived from jsUnitMockTimeout.js, contributed to JsUnit by<tr><td><a name="l20" href="#l20">20</a><td> * Pivotal Computer Systems, www.pivotalsf.com<tr><td><a name="l21" href="#l21">21</a><td> *<tr><td><a name="l22" href="#l22">22</a><td> */<tr><td><a name="l23" href="#l23">23</a><td><tr><td><a name="l24" href="#l24">24</a><td>goog.provide('goog.testing.MockClock');<tr><td><a name="l25" href="#l25">25</a><td><tr><td><a name="l26" href="#l26">26</a><td>goog.require('goog.Disposable');<tr><td><a name="l27" href="#l27">27</a><td>goog.require('goog.async.run');<tr><td><a name="l28" href="#l28">28</a><td>goog.require('goog.testing.PropertyReplacer');<tr><td><a name="l29" href="#l29">29</a><td>goog.require('goog.testing.events');<tr><td><a name="l30" href="#l30">30</a><td>goog.require('goog.testing.events.Event');<tr><td><a name="l31" href="#l31">31</a><td>goog.require('goog.testing.watchers');<tr><td><a name="l32" href="#l32">32</a><td><tr><td><a name="l33" href="#l33">33</a><td><tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td>/**<tr><td><a name="l36" href="#l36">36</a><td> * Class for unit testing code that uses setTimeout and clearTimeout.<tr><td><a name="l37" href="#l37">37</a><td> *<tr><td><a name="l38" href="#l38">38</a><td> * NOTE: If you are using MockClock to test code that makes use of<tr><td><a name="l39" href="#l39">39</a><td> * goog.fx.Animation, then you must either:<tr><td><a name="l40" href="#l40">40</a><td> *<tr><td><a name="l41" href="#l41">41</a><td> * 1. Install and dispose of the MockClock in setUpPage() and tearDownPage()<tr><td><a name="l42" href="#l42">42</a><td> * respectively (rather than setUp()/tearDown()).<tr><td><a name="l43" href="#l43">43</a><td> *<tr><td><a name="l44" href="#l44">44</a><td> * or<tr><td><a name="l45" href="#l45">45</a><td> *<tr><td><a name="l46" href="#l46">46</a><td> * 2. Ensure that every test clears the animation queue by calling<tr><td><a name="l47" href="#l47">47</a><td> * mockClock.tick(x) at the end of each test function (where `x` is large<tr><td><a name="l48" href="#l48">48</a><td> * enough to complete all animations).<tr><td><a name="l49" href="#l49">49</a><td> *<tr><td><a name="l50" href="#l50">50</a><td> * Otherwise, if any animation is left pending at the time that<tr><td><a name="l51" href="#l51">51</a><td> * MockClock.dispose() is called, that will permanently prevent any future<tr><td><a name="l52" href="#l52">52</a><td> * animations from playing on the page.<tr><td><a name="l53" href="#l53">53</a><td> *<tr><td><a name="l54" href="#l54">54</a><td> * @param {boolean=} opt_autoInstall Install the MockClock at construction time.<tr><td><a name="l55" href="#l55">55</a><td> * @constructor<tr><td><a name="l56" href="#l56">56</a><td> * @extends {goog.Disposable}<tr><td><a name="l57" href="#l57">57</a><td> * @final<tr><td><a name="l58" href="#l58">58</a><td> */<tr><td><a name="l59" href="#l59">59</a><td>goog.testing.MockClock = function(opt_autoInstall) {<tr><td><a name="l60" href="#l60">60</a><td> goog.Disposable.call(this);<tr><td><a name="l61" href="#l61">61</a><td><tr><td><a name="l62" href="#l62">62</a><td> /**<tr><td><a name="l63" href="#l63">63</a><td> * Reverse-order queue of timers to fire.<tr><td><a name="l64" href="#l64">64</a><td> *<tr><td><a name="l65" href="#l65">65</a><td> * The last item of the queue is popped off. Insertion happens from the<tr><td><a name="l66" href="#l66">66</a><td> * right. For example, the expiration times for each element of the queue<tr><td><a name="l67" href="#l67">67</a><td> * might be in the order 300, 200, 200.<tr><td><a name="l68" href="#l68">68</a><td> *<tr><td><a name="l69" href="#l69">69</a><td> * @type {Array.<Object>}<tr><td><a name="l70" href="#l70">70</a><td> * @private<tr><td><a name="l71" href="#l71">71</a><td> */<tr><td><a name="l72" href="#l72">72</a><td> this.queue_ = [];<tr><td><a name="l73" href="#l73">73</a><td><tr><td><a name="l74" href="#l74">74</a><td> /**<tr><td><a name="l75" href="#l75">75</a><td> * Set of timeouts that should be treated as cancelled.<tr><td><a name="l76" href="#l76">76</a><td> *<tr><td><a name="l77" href="#l77">77</a><td> * Rather than removing cancelled timers directly from the queue, this set<tr><td><a name="l78" href="#l78">78</a><td> * simply marks them as deleted so that they can be ignored when their<tr><td><a name="l79" href="#l79">79</a><td> * turn comes up. The keys are the timeout keys that are cancelled, each<tr><td><a name="l80" href="#l80">80</a><td> * mapping to true.<tr><td><a name="l81" href="#l81">81</a><td> *<tr><td><a name="l82" href="#l82">82</a><td> * @type {Object}<tr><td><a name="l83" href="#l83">83</a><td> * @private<tr><td><a name="l84" href="#l84">84</a><td> */<tr><td><a name="l85" href="#l85">85</a><td> this.deletedKeys_ = {};<tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td> if (opt_autoInstall) {<tr><td><a name="l88" href="#l88">88</a><td> this.install();<tr><td><a name="l89" href="#l89">89</a><td> }<tr><td><a name="l90" href="#l90">90</a><td>};<tr><td><a name="l91" href="#l91">91</a><td>goog.inherits(goog.testing.MockClock, goog.Disposable);<tr><td><a name="l92" href="#l92">92</a><td><tr><td><a name="l93" href="#l93">93</a><td><tr><td><a name="l94" href="#l94">94</a><td>/**<tr><td><a name="l95" href="#l95">95</a><td> * Default wait timeout for mocking requestAnimationFrame (in milliseconds).<tr><td><a name="l96" href="#l96">96</a><td> *<tr><td><a name="l97" href="#l97">97</a><td> * @type {number}<tr><td><a name="l98" href="#l98">98</a><td> * @const<tr><td><a name="l99" href="#l99">99</a><td> */<tr><td><a name="l100" href="#l100">100</a><td>goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT = 20;<tr><td><a name="l101" href="#l101">101</a><td><tr><td><a name="l102" href="#l102">102</a><td><tr><td><a name="l103" href="#l103">103</a><td>/**<tr><td><a name="l104" href="#l104">104</a><td> * Count of the number of timeouts made.<tr><td><a name="l105" href="#l105">105</a><td> * @type {number}<tr><td><a name="l106" href="#l106">106</a><td> * @private<tr><td><a name="l107" href="#l107">107</a><td> */<tr><td><a name="l108" href="#l108">108</a><td>goog.testing.MockClock.prototype.timeoutsMade_ = 0;<tr><td><a name="l109" href="#l109">109</a><td><tr><td><a name="l110" href="#l110">110</a><td><tr><td><a name="l111" href="#l111">111</a><td>/**<tr><td><a name="l112" href="#l112">112</a><td> * PropertyReplacer instance which overwrites and resets setTimeout,<tr><td><a name="l113" href="#l113">113</a><td> * setInterval, etc. or null if the MockClock is not installed.<tr><td><a name="l114" href="#l114">114</a><td> * @type {goog.testing.PropertyReplacer}<tr><td><a name="l115" href="#l115">115</a><td> * @private<tr><td><a name="l116" href="#l116">116</a><td> */<tr><td><a name="l117" href="#l117">117</a><td>goog.testing.MockClock.prototype.replacer_ = null;<tr><td><a name="l118" href="#l118">118</a><td><tr><td><a name="l119" href="#l119">119</a><td><tr><td><a name="l120" href="#l120">120</a><td>/**<tr><td><a name="l121" href="#l121">121</a><td> * Map of deleted keys. These keys represents keys that were deleted in a<tr><td><a name="l122" href="#l122">122</a><td> * clearInterval, timeoutid -> object.<tr><td><a name="l123" href="#l123">123</a><td> * @type {Object}<tr><td><a name="l124" href="#l124">124</a><td> * @private<tr><td><a name="l125" href="#l125">125</a><td> */<tr><td><a name="l126" href="#l126">126</a><td>goog.testing.MockClock.prototype.deletedKeys_ = null;<tr><td><a name="l127" href="#l127">127</a><td><tr><td><a name="l128" href="#l128">128</a><td><tr><td><a name="l129" href="#l129">129</a><td>/**<tr><td><a name="l130" href="#l130">130</a><td> * The current simulated time in milliseconds.<tr><td><a name="l131" href="#l131">131</a><td> * @type {number}<tr><td><a name="l132" href="#l132">132</a><td> * @private<tr><td><a name="l133" href="#l133">133</a><td> */<tr><td><a name="l134" href="#l134">134</a><td>goog.testing.MockClock.prototype.nowMillis_ = 0;<tr><td><a name="l135" href="#l135">135</a><td><tr><td><a name="l136" href="#l136">136</a><td><tr><td><a name="l137" href="#l137">137</a><td>/**<tr><td><a name="l138" href="#l138">138</a><td> * Additional delay between the time a timeout was set to fire, and the time<tr><td><a name="l139" href="#l139">139</a><td> * it actually fires. Useful for testing workarounds for this Firefox 2 bug:<tr><td><a name="l140" href="#l140">140</a><td> * https://bugzilla.mozilla.org/show_bug.cgi?id=291386<tr><td><a name="l141" href="#l141">141</a><td> * May be negative.<tr><td><a name="l142" href="#l142">142</a><td> * @type {number}<tr><td><a name="l143" href="#l143">143</a><td> * @private<tr><td><a name="l144" href="#l144">144</a><td> */<tr><td><a name="l145" href="#l145">145</a><td>goog.testing.MockClock.prototype.timeoutDelay_ = 0;<tr><td><a name="l146" href="#l146">146</a><td><tr><td><a name="l147" href="#l147">147</a><td><tr><td><a name="l148" href="#l148">148</a><td>/**<tr><td><a name="l149" href="#l149">149</a><td> * Installs the MockClock by overriding the global object's implementation of<tr><td><a name="l150" href="#l150">150</a><td> * setTimeout, setInterval, clearTimeout and clearInterval.<tr><td><a name="l151" href="#l151">151</a><td> */<tr><td><a name="l152" href="#l152">152</a><td>goog.testing.MockClock.prototype.install = function() {<tr><td><a name="l153" href="#l153">153</a><td> if (!this.replacer_) {<tr><td><a name="l154" href="#l154">154</a><td> var r = this.replacer_ = new goog.testing.PropertyReplacer();<tr><td><a name="l155" href="#l155">155</a><td> r.set(goog.global, 'setTimeout', goog.bind(this.setTimeout_, this));<tr><td><a name="l156" href="#l156">156</a><td> r.set(goog.global, 'setInterval', goog.bind(this.setInterval_, this));<tr><td><a name="l157" href="#l157">157</a><td> r.set(goog.global, 'setImmediate', goog.bind(this.setImmediate_, this));<tr><td><a name="l158" href="#l158">158</a><td> r.set(goog.global, 'clearTimeout', goog.bind(this.clearTimeout_, this));<tr><td><a name="l159" href="#l159">159</a><td> r.set(goog.global, 'clearInterval', goog.bind(this.clearInterval_, this));<tr><td><a name="l160" href="#l160">160</a><td> // goog.Promise uses goog.async.run. In order to be able to test<tr><td><a name="l161" href="#l161">161</a><td> // Promise-based code, we need to make sure that goog.async.run uses<tr><td><a name="l162" href="#l162">162</a><td> // nextTick instead of native browser Promises. This means that it will<tr><td><a name="l163" href="#l163">163</a><td> // default to setImmediate, which is replaced above. Note that we test for<tr><td><a name="l164" href="#l164">164</a><td> // the presence of goog.async.run.forceNextTick to be resilient to the case<tr><td><a name="l165" href="#l165">165</a><td> // where tests replace goog.async.run directly.<tr><td><a name="l166" href="#l166">166</a><td> goog.async.run.forceNextTick && goog.async.run.forceNextTick();<tr><td><a name="l167" href="#l167">167</a><td><tr><td><a name="l168" href="#l168">168</a><td> // Replace the requestAnimationFrame functions.<tr><td><a name="l169" href="#l169">169</a><td> this.replaceRequestAnimationFrame_();<tr><td><a name="l170" href="#l170">170</a><td><tr><td><a name="l171" href="#l171">171</a><td> // PropertyReplacer#set can't be called with renameable functions.<tr><td><a name="l172" href="#l172">172</a><td> this.oldGoogNow_ = goog.now;<tr><td><a name="l173" href="#l173">173</a><td> goog.now = goog.bind(this.getCurrentTime, this);<tr><td><a name="l174" href="#l174">174</a><td> }<tr><td><a name="l175" href="#l175">175</a><td>};<tr><td><a name="l176" href="#l176">176</a><td><tr><td><a name="l177" href="#l177">177</a><td><tr><td><a name="l178" href="#l178">178</a><td>/**<tr><td><a name="l179" href="#l179">179</a><td> * Installs the mocks for requestAnimationFrame and cancelRequestAnimationFrame.<tr><td><a name="l180" href="#l180">180</a><td> * @private<tr><td><a name="l181" href="#l181">181</a><td> */<tr><td><a name="l182" href="#l182">182</a><td>goog.testing.MockClock.prototype.replaceRequestAnimationFrame_ = function() {<tr><td><a name="l183" href="#l183">183</a><td> var r = this.replacer_;<tr><td><a name="l184" href="#l184">184</a><td> var requestFuncs = ['requestAnimationFrame',<tr><td><a name="l185" href="#l185">185</a><td> 'webkitRequestAnimationFrame',<tr><td><a name="l186" href="#l186">186</a><td> 'mozRequestAnimationFrame',<tr><td><a name="l187" href="#l187">187</a><td> 'oRequestAnimationFrame',<tr><td><a name="l188" href="#l188">188</a><td> 'msRequestAnimationFrame'];<tr><td><a name="l189" href="#l189">189</a><td><tr><td><a name="l190" href="#l190">190</a><td> var cancelFuncs = ['cancelRequestAnimationFrame',<tr><td><a name="l191" href="#l191">191</a><td> 'webkitCancelRequestAnimationFrame',<tr><td><a name="l192" href="#l192">192</a><td> 'mozCancelRequestAnimationFrame',<tr><td><a name="l193" href="#l193">193</a><td> 'oCancelRequestAnimationFrame',<tr><td><a name="l194" href="#l194">194</a><td> 'msCancelRequestAnimationFrame'];<tr><td><a name="l195" href="#l195">195</a><td><tr><td><a name="l196" href="#l196">196</a><td> for (var i = 0; i < requestFuncs.length; ++i) {<tr><td><a name="l197" href="#l197">197</a><td> if (goog.global && goog.global[requestFuncs[i]]) {<tr><td><a name="l198" href="#l198">198</a><td> r.set(goog.global, requestFuncs[i],<tr><td><a name="l199" href="#l199">199</a><td> goog.bind(this.requestAnimationFrame_, this));<tr><td><a name="l200" href="#l200">200</a><td> }<tr><td><a name="l201" href="#l201">201</a><td> }<tr><td><a name="l202" href="#l202">202</a><td><tr><td><a name="l203" href="#l203">203</a><td> for (var i = 0; i < cancelFuncs.length; ++i) {<tr><td><a name="l204" href="#l204">204</a><td> if (goog.global && goog.global[cancelFuncs[i]]) {<tr><td><a name="l205" href="#l205">205</a><td> r.set(goog.global, cancelFuncs[i],<tr><td><a name="l206" href="#l206">206</a><td> goog.bind(this.cancelRequestAnimationFrame_, this));<tr><td><a name="l207" href="#l207">207</a><td> }<tr><td><a name="l208" href="#l208">208</a><td> }<tr><td><a name="l209" href="#l209">209</a><td>};<tr><td><a name="l210" href="#l210">210</a><td><tr><td><a name="l211" href="#l211">211</a><td><tr><td><a name="l212" href="#l212">212</a><td>/**<tr><td><a name="l213" href="#l213">213</a><td> * Removes the MockClock's hooks into the global object's functions and revert<tr><td><a name="l214" href="#l214">214</a><td> * to their original values.<tr><td><a name="l215" href="#l215">215</a><td> */<tr><td><a name="l216" href="#l216">216</a><td>goog.testing.MockClock.prototype.uninstall = function() {<tr><td><a name="l217" href="#l217">217</a><td> if (this.replacer_) {<tr><td><a name="l218" href="#l218">218</a><td> this.replacer_.reset();<tr><td><a name="l219" href="#l219">219</a><td> this.replacer_ = null;<tr><td><a name="l220" href="#l220">220</a><td> goog.now = this.oldGoogNow_;<tr><td><a name="l221" href="#l221">221</a><td> }<tr><td><a name="l222" href="#l222">222</a><td><tr><td><a name="l223" href="#l223">223</a><td> this.fireResetEvent();<tr><td><a name="l224" href="#l224">224</a><td>};<tr><td><a name="l225" href="#l225">225</a><td><tr><td><a name="l226" href="#l226">226</a><td><tr><td><a name="l227" href="#l227">227</a><td>/** @override */<tr><td><a name="l228" href="#l228">228</a><td>goog.testing.MockClock.prototype.disposeInternal = function() {<tr><td><a name="l229" href="#l229">229</a><td> this.uninstall();<tr><td><a name="l230" href="#l230">230</a><td> this.queue_ = null;<tr><td><a name="l231" href="#l231">231</a><td> this.deletedKeys_ = null;<tr><td><a name="l232" href="#l232">232</a><td> goog.testing.MockClock.superClass_.disposeInternal.call(this);<tr><td><a name="l233" href="#l233">233</a><td>};<tr><td><a name="l234" href="#l234">234</a><td><tr><td><a name="l235" href="#l235">235</a><td><tr><td><a name="l236" href="#l236">236</a><td>/**<tr><td><a name="l237" href="#l237">237</a><td> * Resets the MockClock, removing all timeouts that are scheduled and resets<tr><td><a name="l238" href="#l238">238</a><td> * the fake timer count.<tr><td><a name="l239" href="#l239">239</a><td> */<tr><td><a name="l240" href="#l240">240</a><td>goog.testing.MockClock.prototype.reset = function() {<tr><td><a name="l241" href="#l241">241</a><td> this.queue_ = [];<tr><td><a name="l242" href="#l242">242</a><td> this.deletedKeys_ = {};<tr><td><a name="l243" href="#l243">243</a><td> this.nowMillis_ = 0;<tr><td><a name="l244" href="#l244">244</a><td> this.timeoutsMade_ = 0;<tr><td><a name="l245" href="#l245">245</a><td> this.timeoutDelay_ = 0;<tr><td><a name="l246" href="#l246">246</a><td><tr><td><a name="l247" href="#l247">247</a><td> this.fireResetEvent();<tr><td><a name="l248" href="#l248">248</a><td>};<tr><td><a name="l249" href="#l249">249</a><td><tr><td><a name="l250" href="#l250">250</a><td><tr><td><a name="l251" href="#l251">251</a><td>/**<tr><td><a name="l252" href="#l252">252</a><td> * Signals that the mock clock has been reset, allowing objects that<tr><td><a name="l253" href="#l253">253</a><td> * maintain their own internal state to reset.<tr><td><a name="l254" href="#l254">254</a><td> */<tr><td><a name="l255" href="#l255">255</a><td>goog.testing.MockClock.prototype.fireResetEvent = function() {<tr><td><a name="l256" href="#l256">256</a><td> goog.testing.watchers.signalClockReset();<tr><td><a name="l257" href="#l257">257</a><td>};<tr><td><a name="l258" href="#l258">258</a><td><tr><td><a name="l259" href="#l259">259</a><td><tr><td><a name="l260" href="#l260">260</a><td>/**<tr><td><a name="l261" href="#l261">261</a><td> * Sets the amount of time between when a timeout is scheduled to fire and when<tr><td><a name="l262" href="#l262">262</a><td> * it actually fires.<tr><td><a name="l263" href="#l263">263</a><td> * @param {number} delay The delay in milliseconds. May be negative.<tr><td><a name="l264" href="#l264">264</a><td> */<tr><td><a name="l265" href="#l265">265</a><td>goog.testing.MockClock.prototype.setTimeoutDelay = function(delay) {<tr><td><a name="l266" href="#l266">266</a><td> this.timeoutDelay_ = delay;<tr><td><a name="l267" href="#l267">267</a><td>};<tr><td><a name="l268" href="#l268">268</a><td><tr><td><a name="l269" href="#l269">269</a><td><tr><td><a name="l270" href="#l270">270</a><td>/**<tr><td><a name="l271" href="#l271">271</a><td> * @return {number} delay The amount of time between when a timeout is<tr><td><a name="l272" href="#l272">272</a><td> * scheduled to fire and when it actually fires, in milliseconds. May<tr><td><a name="l273" href="#l273">273</a><td> * be negative.<tr><td><a name="l274" href="#l274">274</a><td> */<tr><td><a name="l275" href="#l275">275</a><td>goog.testing.MockClock.prototype.getTimeoutDelay = function() {<tr><td><a name="l276" href="#l276">276</a><td> return this.timeoutDelay_;<tr><td><a name="l277" href="#l277">277</a><td>};<tr><td><a name="l278" href="#l278">278</a><td><tr><td><a name="l279" href="#l279">279</a><td><tr><td><a name="l280" href="#l280">280</a><td>/**<tr><td><a name="l281" href="#l281">281</a><td> * Increments the MockClock's time by a given number of milliseconds, running<tr><td><a name="l282" href="#l282">282</a><td> * any functions that are now overdue.<tr><td><a name="l283" href="#l283">283</a><td> * @param {number=} opt_millis Number of milliseconds to increment the counter.<tr><td><a name="l284" href="#l284">284</a><td> * If not specified, clock ticks 1 millisecond.<tr><td><a name="l285" href="#l285">285</a><td> * @return {number} Current mock time in milliseconds.<tr><td><a name="l286" href="#l286">286</a><td> */<tr><td><a name="l287" href="#l287">287</a><td>goog.testing.MockClock.prototype.tick = function(opt_millis) {<tr><td><a name="l288" href="#l288">288</a><td> if (typeof opt_millis != 'number') {<tr><td><a name="l289" href="#l289">289</a><td> opt_millis = 1;<tr><td><a name="l290" href="#l290">290</a><td> }<tr><td><a name="l291" href="#l291">291</a><td> var endTime = this.nowMillis_ + opt_millis;<tr><td><a name="l292" href="#l292">292</a><td> this.runFunctionsWithinRange_(endTime);<tr><td><a name="l293" href="#l293">293</a><td> this.nowMillis_ = endTime;<tr><td><a name="l294" href="#l294">294</a><td> return endTime;<tr><td><a name="l295" href="#l295">295</a><td>};<tr><td><a name="l296" href="#l296">296</a><td><tr><td><a name="l297" href="#l297">297</a><td><tr><td><a name="l298" href="#l298">298</a><td>/**<tr><td><a name="l299" href="#l299">299</a><td> * @return {number} The number of timeouts that have been scheduled.<tr><td><a name="l300" href="#l300">300</a><td> */<tr><td><a name="l301" href="#l301">301</a><td>goog.testing.MockClock.prototype.getTimeoutsMade = function() {<tr><td><a name="l302" href="#l302">302</a><td> return this.timeoutsMade_;<tr><td><a name="l303" href="#l303">303</a><td>};<tr><td><a name="l304" href="#l304">304</a><td><tr><td><a name="l305" href="#l305">305</a><td><tr><td><a name="l306" href="#l306">306</a><td>/**<tr><td><a name="l307" href="#l307">307</a><td> * @return {number} The MockClock's current time in milliseconds.<tr><td><a name="l308" href="#l308">308</a><td> */<tr><td><a name="l309" href="#l309">309</a><td>goog.testing.MockClock.prototype.getCurrentTime = function() {<tr><td><a name="l310" href="#l310">310</a><td> return this.nowMillis_;<tr><td><a name="l311" href="#l311">311</a><td>};<tr><td><a name="l312" href="#l312">312</a><td><tr><td><a name="l313" href="#l313">313</a><td><tr><td><a name="l314" href="#l314">314</a><td>/**<tr><td><a name="l315" href="#l315">315</a><td> * @param {number} timeoutKey The timeout key.<tr><td><a name="l316" href="#l316">316</a><td> * @return {boolean} Whether the timer has been set and not cleared,<tr><td><a name="l317" href="#l317">317</a><td> * independent of the timeout's expiration. In other words, the timeout<tr><td><a name="l318" href="#l318">318</a><td> * could have passed or could be scheduled for the future. Either way,<tr><td><a name="l319" href="#l319">319</a><td> * this function returns true or false depending only on whether the<tr><td><a name="l320" href="#l320">320</a><td> * provided timeoutKey represents a timeout that has been set and not<tr><td><a name="l321" href="#l321">321</a><td> * cleared.<tr><td><a name="l322" href="#l322">322</a><td> */<tr><td><a name="l323" href="#l323">323</a><td>goog.testing.MockClock.prototype.isTimeoutSet = function(timeoutKey) {<tr><td><a name="l324" href="#l324">324</a><td> return timeoutKey <= this.timeoutsMade_ && !this.deletedKeys_[timeoutKey];<tr><td><a name="l325" href="#l325">325</a><td>};<tr><td><a name="l326" href="#l326">326</a><td><tr><td><a name="l327" href="#l327">327</a><td><tr><td><a name="l328" href="#l328">328</a><td>/**<tr><td><a name="l329" href="#l329">329</a><td> * Runs any function that is scheduled before a certain time. Timeouts can<tr><td><a name="l330" href="#l330">330</a><td> * be made to fire early or late if timeoutDelay_ is non-0.<tr><td><a name="l331" href="#l331">331</a><td> * @param {number} endTime The latest time in the range, in milliseconds.<tr><td><a name="l332" href="#l332">332</a><td> * @private<tr><td><a name="l333" href="#l333">333</a><td> */<tr><td><a name="l334" href="#l334">334</a><td>goog.testing.MockClock.prototype.runFunctionsWithinRange_ = function(<tr><td><a name="l335" href="#l335">335</a><td> endTime) {<tr><td><a name="l336" href="#l336">336</a><td> var adjustedEndTime = endTime - this.timeoutDelay_;<tr><td><a name="l337" href="#l337">337</a><td><tr><td><a name="l338" href="#l338">338</a><td> // Repeatedly pop off the last item since the queue is always sorted.<tr><td><a name="l339" href="#l339">339</a><td> while (this.queue_ && this.queue_.length &&<tr><td><a name="l340" href="#l340">340</a><td> this.queue_[this.queue_.length - 1].runAtMillis <= adjustedEndTime) {<tr><td><a name="l341" href="#l341">341</a><td> var timeout = this.queue_.pop();<tr><td><a name="l342" href="#l342">342</a><td><tr><td><a name="l343" href="#l343">343</a><td> if (!(timeout.timeoutKey in this.deletedKeys_)) {<tr><td><a name="l344" href="#l344">344</a><td> // Only move time forwards.<tr><td><a name="l345" href="#l345">345</a><td> this.nowMillis_ = Math.max(this.nowMillis_,<tr><td><a name="l346" href="#l346">346</a><td> timeout.runAtMillis + this.timeoutDelay_);<tr><td><a name="l347" href="#l347">347</a><td> // Call timeout in global scope and pass the timeout key as the argument.<tr><td><a name="l348" href="#l348">348</a><td> timeout.funcToCall.call(goog.global, timeout.timeoutKey);<tr><td><a name="l349" href="#l349">349</a><td> // In case the interval was cleared in the funcToCall<tr><td><a name="l350" href="#l350">350</a><td> if (timeout.recurring) {<tr><td><a name="l351" href="#l351">351</a><td> this.scheduleFunction_(<tr><td><a name="l352" href="#l352">352</a><td> timeout.timeoutKey, timeout.funcToCall, timeout.millis, true);<tr><td><a name="l353" href="#l353">353</a><td> }<tr><td><a name="l354" href="#l354">354</a><td> }<tr><td><a name="l355" href="#l355">355</a><td> }<tr><td><a name="l356" href="#l356">356</a><td>};<tr><td><a name="l357" href="#l357">357</a><td><tr><td><a name="l358" href="#l358">358</a><td><tr><td><a name="l359" href="#l359">359</a><td>/**<tr><td><a name="l360" href="#l360">360</a><td> * Schedules a function to be run at a certain time.<tr><td><a name="l361" href="#l361">361</a><td> * @param {number} timeoutKey The timeout key.<tr><td><a name="l362" href="#l362">362</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l363" href="#l363">363</a><td> * @param {number} millis The number of milliseconds to call it in.<tr><td><a name="l364" href="#l364">364</a><td> * @param {boolean} recurring Whether to function call should recur.<tr><td><a name="l365" href="#l365">365</a><td> * @private<tr><td><a name="l366" href="#l366">366</a><td> */<tr><td><a name="l367" href="#l367">367</a><td>goog.testing.MockClock.prototype.scheduleFunction_ = function(<tr><td><a name="l368" href="#l368">368</a><td> timeoutKey, funcToCall, millis, recurring) {<tr><td><a name="l369" href="#l369">369</a><td> if (!goog.isFunction(funcToCall)) {<tr><td><a name="l370" href="#l370">370</a><td> // Early error for debuggability rather than dying in the next .tick()<tr><td><a name="l371" href="#l371">371</a><td> throw new TypeError('The provided callback must be a function, not a ' +<tr><td><a name="l372" href="#l372">372</a><td> typeof funcToCall);<tr><td><a name="l373" href="#l373">373</a><td> }<tr><td><a name="l374" href="#l374">374</a><td><tr><td><a name="l375" href="#l375">375</a><td> var timeout = {<tr><td><a name="l376" href="#l376">376</a><td> runAtMillis: this.nowMillis_ + millis,<tr><td><a name="l377" href="#l377">377</a><td> funcToCall: funcToCall,<tr><td><a name="l378" href="#l378">378</a><td> recurring: recurring,<tr><td><a name="l379" href="#l379">379</a><td> timeoutKey: timeoutKey,<tr><td><a name="l380" href="#l380">380</a><td> millis: millis<tr><td><a name="l381" href="#l381">381</a><td> };<tr><td><a name="l382" href="#l382">382</a><td><tr><td><a name="l383" href="#l383">383</a><td> goog.testing.MockClock.insert_(timeout, this.queue_);<tr><td><a name="l384" href="#l384">384</a><td>};<tr><td><a name="l385" href="#l385">385</a><td><tr><td><a name="l386" href="#l386">386</a><td><tr><td><a name="l387" href="#l387">387</a><td>/**<tr><td><a name="l388" href="#l388">388</a><td> * Inserts a timer descriptor into a descending-order queue.<tr><td><a name="l389" href="#l389">389</a><td> *<tr><td><a name="l390" href="#l390">390</a><td> * Later-inserted duplicates appear at lower indices. For example, the<tr><td><a name="l391" href="#l391">391</a><td> * asterisk in (5,4,*,3,2,1) would be the insertion point for 3.<tr><td><a name="l392" href="#l392">392</a><td> *<tr><td><a name="l393" href="#l393">393</a><td> * @param {Object} timeout The timeout to insert, with numerical runAtMillis<tr><td><a name="l394" href="#l394">394</a><td> * property.<tr><td><a name="l395" href="#l395">395</a><td> * @param {Array.<Object>} queue The queue to insert into, with each element<tr><td><a name="l396" href="#l396">396</a><td> * having a numerical runAtMillis property.<tr><td><a name="l397" href="#l397">397</a><td> * @private<tr><td><a name="l398" href="#l398">398</a><td> */<tr><td><a name="l399" href="#l399">399</a><td>goog.testing.MockClock.insert_ = function(timeout, queue) {<tr><td><a name="l400" href="#l400">400</a><td> // Although insertion of N items is quadratic, requiring goog.structs.Heap<tr><td><a name="l401" href="#l401">401</a><td> // from a unit test will make tests more prone to breakage. Since unit<tr><td><a name="l402" href="#l402">402</a><td> // tests are normally small, scalability is not a primary issue.<tr><td><a name="l403" href="#l403">403</a><td><tr><td><a name="l404" href="#l404">404</a><td> // Find an insertion point. Since the queue is in reverse order (so we<tr><td><a name="l405" href="#l405">405</a><td> // can pop rather than unshift), and later timers with the same time stamp<tr><td><a name="l406" href="#l406">406</a><td> // should be executed later, we look for the element strictly greater than<tr><td><a name="l407" href="#l407">407</a><td> // the one we are inserting.<tr><td><a name="l408" href="#l408">408</a><td><tr><td><a name="l409" href="#l409">409</a><td> for (var i = queue.length; i != 0; i--) {<tr><td><a name="l410" href="#l410">410</a><td> if (queue[i - 1].runAtMillis > timeout.runAtMillis) {<tr><td><a name="l411" href="#l411">411</a><td> break;<tr><td><a name="l412" href="#l412">412</a><td> }<tr><td><a name="l413" href="#l413">413</a><td> queue[i] = queue[i - 1];<tr><td><a name="l414" href="#l414">414</a><td> }<tr><td><a name="l415" href="#l415">415</a><td><tr><td><a name="l416" href="#l416">416</a><td> queue[i] = timeout;<tr><td><a name="l417" href="#l417">417</a><td>};<tr><td><a name="l418" href="#l418">418</a><td><tr><td><a name="l419" href="#l419">419</a><td><tr><td><a name="l420" href="#l420">420</a><td>/**<tr><td><a name="l421" href="#l421">421</a><td> * Maximum 32-bit signed integer.<tr><td><a name="l422" href="#l422">422</a><td> *<tr><td><a name="l423" href="#l423">423</a><td> * Timeouts over this time return immediately in many browsers, due to integer<tr><td><a name="l424" href="#l424">424</a><td> * overflow. Such known browsers include Firefox, Chrome, and Safari, but not<tr><td><a name="l425" href="#l425">425</a><td> * IE.<tr><td><a name="l426" href="#l426">426</a><td> *<tr><td><a name="l427" href="#l427">427</a><td> * @type {number}<tr><td><a name="l428" href="#l428">428</a><td> * @private<tr><td><a name="l429" href="#l429">429</a><td> */<tr><td><a name="l430" href="#l430">430</a><td>goog.testing.MockClock.MAX_INT_ = 2147483647;<tr><td><a name="l431" href="#l431">431</a><td><tr><td><a name="l432" href="#l432">432</a><td><tr><td><a name="l433" href="#l433">433</a><td>/**<tr><td><a name="l434" href="#l434">434</a><td> * Schedules a function to be called after {@code millis} milliseconds.<tr><td><a name="l435" href="#l435">435</a><td> * Mock implementation for setTimeout.<tr><td><a name="l436" href="#l436">436</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l437" href="#l437">437</a><td> * @param {number} millis The number of milliseconds to call it after.<tr><td><a name="l438" href="#l438">438</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l439" href="#l439">439</a><td> * @private<tr><td><a name="l440" href="#l440">440</a><td> */<tr><td><a name="l441" href="#l441">441</a><td>goog.testing.MockClock.prototype.setTimeout_ = function(funcToCall, millis) {<tr><td><a name="l442" href="#l442">442</a><td> if (millis > goog.testing.MockClock.MAX_INT_) {<tr><td><a name="l443" href="#l443">443</a><td> throw Error(<tr><td><a name="l444" href="#l444">444</a><td> 'Bad timeout value: ' + millis + '. Timeouts over MAX_INT ' +<tr><td><a name="l445" href="#l445">445</a><td> '(24.8 days) cause timeouts to be fired ' +<tr><td><a name="l446" href="#l446">446</a><td> 'immediately in most browsers, except for IE.');<tr><td><a name="l447" href="#l447">447</a><td> }<tr><td><a name="l448" href="#l448">448</a><td> this.timeoutsMade_ = this.timeoutsMade_ + 1;<tr><td><a name="l449" href="#l449">449</a><td> this.scheduleFunction_(this.timeoutsMade_, funcToCall, millis, false);<tr><td><a name="l450" href="#l450">450</a><td> return this.timeoutsMade_;<tr><td><a name="l451" href="#l451">451</a><td>};<tr><td><a name="l452" href="#l452">452</a><td><tr><td><a name="l453" href="#l453">453</a><td><tr><td><a name="l454" href="#l454">454</a><td>/**<tr><td><a name="l455" href="#l455">455</a><td> * Schedules a function to be called every {@code millis} milliseconds.<tr><td><a name="l456" href="#l456">456</a><td> * Mock implementation for setInterval.<tr><td><a name="l457" href="#l457">457</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l458" href="#l458">458</a><td> * @param {number} millis The number of milliseconds between calls.<tr><td><a name="l459" href="#l459">459</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l460" href="#l460">460</a><td> * @private<tr><td><a name="l461" href="#l461">461</a><td> */<tr><td><a name="l462" href="#l462">462</a><td>goog.testing.MockClock.prototype.setInterval_ = function(funcToCall, millis) {<tr><td><a name="l463" href="#l463">463</a><td> this.timeoutsMade_ = this.timeoutsMade_ + 1;<tr><td><a name="l464" href="#l464">464</a><td> this.scheduleFunction_(this.timeoutsMade_, funcToCall, millis, true);<tr><td><a name="l465" href="#l465">465</a><td> return this.timeoutsMade_;<tr><td><a name="l466" href="#l466">466</a><td>};<tr><td><a name="l467" href="#l467">467</a><td><tr><td><a name="l468" href="#l468">468</a><td><tr><td><a name="l469" href="#l469">469</a><td>/**<tr><td><a name="l470" href="#l470">470</a><td> * Schedules a function to be called when an animation frame is triggered.<tr><td><a name="l471" href="#l471">471</a><td> * Mock implementation for requestAnimationFrame.<tr><td><a name="l472" href="#l472">472</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l473" href="#l473">473</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l474" href="#l474">474</a><td> * @private<tr><td><a name="l475" href="#l475">475</a><td> */<tr><td><a name="l476" href="#l476">476</a><td>goog.testing.MockClock.prototype.requestAnimationFrame_ = function(funcToCall) {<tr><td><a name="l477" href="#l477">477</a><td> return this.setTimeout_(goog.bind(function() {<tr><td><a name="l478" href="#l478">478</a><td> if (funcToCall) {<tr><td><a name="l479" href="#l479">479</a><td> funcToCall(this.getCurrentTime());<tr><td><a name="l480" href="#l480">480</a><td> } else if (goog.global.mozRequestAnimationFrame) {<tr><td><a name="l481" href="#l481">481</a><td> var event = new goog.testing.events.Event('MozBeforePaint', goog.global);<tr><td><a name="l482" href="#l482">482</a><td> event['timeStamp'] = this.getCurrentTime();<tr><td><a name="l483" href="#l483">483</a><td> goog.testing.events.fireBrowserEvent(event);<tr><td><a name="l484" href="#l484">484</a><td> }<tr><td><a name="l485" href="#l485">485</a><td> }, this), goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT);<tr><td><a name="l486" href="#l486">486</a><td>};<tr><td><a name="l487" href="#l487">487</a><td><tr><td><a name="l488" href="#l488">488</a><td><tr><td><a name="l489" href="#l489">489</a><td>/**<tr><td><a name="l490" href="#l490">490</a><td> * Schedules a function to be called immediately after the current JS<tr><td><a name="l491" href="#l491">491</a><td> * execution.<tr><td><a name="l492" href="#l492">492</a><td> * Mock implementation for setImmediate.<tr><td><a name="l493" href="#l493">493</a><td> * @param {Function} funcToCall The function to call.<tr><td><a name="l494" href="#l494">494</a><td> * @return {number} The number of timeouts created.<tr><td><a name="l495" href="#l495">495</a><td> * @private<tr><td><a name="l496" href="#l496">496</a><td> */<tr><td><a name="l497" href="#l497">497</a><td>goog.testing.MockClock.prototype.setImmediate_ = function(funcToCall) {<tr><td><a name="l498" href="#l498">498</a><td> return this.setTimeout_(funcToCall, 0);<tr><td><a name="l499" href="#l499">499</a><td>};<tr><td><a name="l500" href="#l500">500</a><td><tr><td><a name="l501" href="#l501">501</a><td><tr><td><a name="l502" href="#l502">502</a><td>/**<tr><td><a name="l503" href="#l503">503</a><td> * Clears a timeout.<tr><td><a name="l504" href="#l504">504</a><td> * Mock implementation for clearTimeout.<tr><td><a name="l505" href="#l505">505</a><td> * @param {number} timeoutKey The timeout key to clear.<tr><td><a name="l506" href="#l506">506</a><td> * @private<tr><td><a name="l507" href="#l507">507</a><td> */<tr><td><a name="l508" href="#l508">508</a><td>goog.testing.MockClock.prototype.clearTimeout_ = function(timeoutKey) {<tr><td><a name="l509" href="#l509">509</a><td> // Some common libraries register static state with timers.<tr><td><a name="l510" href="#l510">510</a><td> // This is bad. It leads to all sorts of crazy test problems where<tr><td><a name="l511" href="#l511">511</a><td> // 1) Test A sets up a new mock clock and a static timer.<tr><td><a name="l512" href="#l512">512</a><td> // 2) Test B sets up a new mock clock, but re-uses the static timer<tr><td><a name="l513" href="#l513">513</a><td> // from Test A.<tr><td><a name="l514" href="#l514">514</a><td> // 3) A timeout key from test A gets cleared, breaking a timeout in<tr><td><a name="l515" href="#l515">515</a><td> // Test B.<tr><td><a name="l516" href="#l516">516</a><td> //<tr><td><a name="l517" href="#l517">517</a><td> // For now, we just hackily fail silently if someone tries to clear a timeout<tr><td><a name="l518" href="#l518">518</a><td> // key before we've allocated it.<tr><td><a name="l519" href="#l519">519</a><td> // Ideally, we should throw an exception if we see this happening.<tr><td><a name="l520" href="#l520">520</a><td> //<tr><td><a name="l521" href="#l521">521</a><td> // TODO(user): We might also try allocating timeout ids from a global<tr><td><a name="l522" href="#l522">522</a><td> // pool rather than a local pool.<tr><td><a name="l523" href="#l523">523</a><td> if (this.isTimeoutSet(timeoutKey)) {<tr><td><a name="l524" href="#l524">524</a><td> this.deletedKeys_[timeoutKey] = true;<tr><td><a name="l525" href="#l525">525</a><td> }<tr><td><a name="l526" href="#l526">526</a><td>};<tr><td><a name="l527" href="#l527">527</a><td><tr><td><a name="l528" href="#l528">528</a><td><tr><td><a name="l529" href="#l529">529</a><td>/**<tr><td><a name="l530" href="#l530">530</a><td> * Clears an interval.<tr><td><a name="l531" href="#l531">531</a><td> * Mock implementation for clearInterval.<tr><td><a name="l532" href="#l532">532</a><td> * @param {number} timeoutKey The interval key to clear.<tr><td><a name="l533" href="#l533">533</a><td> * @private<tr><td><a name="l534" href="#l534">534</a><td> */<tr><td><a name="l535" href="#l535">535</a><td>goog.testing.MockClock.prototype.clearInterval_ = function(timeoutKey) {<tr><td><a name="l536" href="#l536">536</a><td> this.clearTimeout_(timeoutKey);<tr><td><a name="l537" href="#l537">537</a><td>};<tr><td><a name="l538" href="#l538">538</a><td><tr><td><a name="l539" href="#l539">539</a><td><tr><td><a name="l540" href="#l540">540</a><td>/**<tr><td><a name="l541" href="#l541">541</a><td> * Clears a requestAnimationFrame.<tr><td><a name="l542" href="#l542">542</a><td> * Mock implementation for cancelRequestAnimationFrame.<tr><td><a name="l543" href="#l543">543</a><td> * @param {number} timeoutKey The requestAnimationFrame key to clear.<tr><td><a name="l544" href="#l544">544</a><td> * @private<tr><td><a name="l545" href="#l545">545</a><td> */<tr><td><a name="l546" href="#l546">546</a><td>goog.testing.MockClock.prototype.cancelRequestAnimationFrame_ =<tr><td><a name="l547" href="#l547">547</a><td> function(timeoutKey) {<tr><td><a name="l548" href="#l548">548</a><td> this.clearTimeout_(timeoutKey);<tr><td><a name="l549" href="#l549">549</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>mockcontrol.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/testing/mockcontrol.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2008 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview A MockControl holds a set of mocks for a particular test.<tr><td><a name="l17" href="#l17">17</a><td> * It consolidates calls to $replay, $verify, and $tearDown, which simplifies<tr><td><a name="l18" href="#l18">18</a><td> * the test and helps avoid omissions.<tr><td><a name="l19" href="#l19">19</a><td> *<tr><td><a name="l20" href="#l20">20</a><td> * You can create and control a mock:<tr><td><a name="l21" href="#l21">21</a><td> * var mockFoo = mockControl.addMock(new MyMock(Foo));<tr><td><a name="l22" href="#l22">22</a><td> *<tr><td><a name="l23" href="#l23">23</a><td> * MockControl also exposes some convenience functions that create<tr><td><a name="l24" href="#l24">24</a><td> * controlled mocks for common mocks: StrictMock, LooseMock,<tr><td><a name="l25" href="#l25">25</a><td> * FunctionMock, MethodMock, and GlobalFunctionMock.<tr><td><a name="l26" href="#l26">26</a><td> *<tr><td><a name="l27" href="#l27">27</a><td> */<tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td>goog.provide('goog.testing.MockControl');<tr><td><a name="l31" href="#l31">31</a><td><tr><td><a name="l32" href="#l32">32</a><td>goog.require('goog.array');<tr><td><a name="l33" href="#l33">33</a><td>goog.require('goog.testing');<tr><td><a name="l34" href="#l34">34</a><td>goog.require('goog.testing.LooseMock');<tr><td><a name="l35" href="#l35">35</a><td>goog.require('goog.testing.StrictMock');<tr><td><a name="l36" href="#l36">36</a><td><tr><td><a name="l37" href="#l37">37</a><td><tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td>/**<tr><td><a name="l40" href="#l40">40</a><td> * Controls a set of mocks. Controlled mocks are replayed, verified, and<tr><td><a name="l41" href="#l41">41</a><td> * cleaned-up at the same time.<tr><td><a name="l42" href="#l42">42</a><td> * @constructor<tr><td><a name="l43" href="#l43">43</a><td> */<tr><td><a name="l44" href="#l44">44</a><td>goog.testing.MockControl = function() {<tr><td><a name="l45" href="#l45">45</a><td> /**<tr><td><a name="l46" href="#l46">46</a><td> * The list of mocks being controlled.<tr><td><a name="l47" href="#l47">47</a><td> * @type {Array.<goog.testing.MockInterface>}<tr><td><a name="l48" href="#l48">48</a><td> * @private<tr><td><a name="l49" href="#l49">49</a><td> */<tr><td><a name="l50" href="#l50">50</a><td> this.mocks_ = [];<tr><td><a name="l51" href="#l51">51</a><td>};<tr><td><a name="l52" href="#l52">52</a><td><tr><td><a name="l53" href="#l53">53</a><td><tr><td><a name="l54" href="#l54">54</a><td>/**<tr><td><a name="l55" href="#l55">55</a><td> * Takes control of this mock.<tr><td><a name="l56" href="#l56">56</a><td> * @param {goog.testing.MockInterface} mock Mock to be controlled.<tr><td><a name="l57" href="#l57">57</a><td> * @return {goog.testing.MockInterface} The same mock passed in,<tr><td><a name="l58" href="#l58">58</a><td> * for convenience.<tr><td><a name="l59" href="#l59">59</a><td> */<tr><td><a name="l60" href="#l60">60</a><td>goog.testing.MockControl.prototype.addMock = function(mock) {<tr><td><a name="l61" href="#l61">61</a><td> this.mocks_.push(mock);<tr><td><a name="l62" href="#l62">62</a><td> return mock;<tr><td><a name="l63" href="#l63">63</a><td>};<tr><td><a name="l64" href="#l64">64</a><td><tr><td><a name="l65" href="#l65">65</a><td><tr><td><a name="l66" href="#l66">66</a><td>/**<tr><td><a name="l67" href="#l67">67</a><td> * Calls replay on each controlled mock.<tr><td><a name="l68" href="#l68">68</a><td> */<tr><td><a name="l69" href="#l69">69</a><td>goog.testing.MockControl.prototype.$replayAll = function() {<tr><td><a name="l70" href="#l70">70</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l71" href="#l71">71</a><td> m.$replay();<tr><td><a name="l72" href="#l72">72</a><td> });<tr><td><a name="l73" href="#l73">73</a><td>};<tr><td><a name="l74" href="#l74">74</a><td><tr><td><a name="l75" href="#l75">75</a><td><tr><td><a name="l76" href="#l76">76</a><td>/**<tr><td><a name="l77" href="#l77">77</a><td> * Calls reset on each controlled mock.<tr><td><a name="l78" href="#l78">78</a><td> */<tr><td><a name="l79" href="#l79">79</a><td>goog.testing.MockControl.prototype.$resetAll = function() {<tr><td><a name="l80" href="#l80">80</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l81" href="#l81">81</a><td> m.$reset();<tr><td><a name="l82" href="#l82">82</a><td> });<tr><td><a name="l83" href="#l83">83</a><td>};<tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td><tr><td><a name="l86" href="#l86">86</a><td>/**<tr><td><a name="l87" href="#l87">87</a><td> * Calls verify on each controlled mock.<tr><td><a name="l88" href="#l88">88</a><td> */<tr><td><a name="l89" href="#l89">89</a><td>goog.testing.MockControl.prototype.$verifyAll = function() {<tr><td><a name="l90" href="#l90">90</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l91" href="#l91">91</a><td> m.$verify();<tr><td><a name="l92" href="#l92">92</a><td> });<tr><td><a name="l93" href="#l93">93</a><td>};<tr><td><a name="l94" href="#l94">94</a><td><tr><td><a name="l95" href="#l95">95</a><td><tr><td><a name="l96" href="#l96">96</a><td>/**<tr><td><a name="l97" href="#l97">97</a><td> * Calls tearDown on each controlled mock, if necesssary.<tr><td><a name="l98" href="#l98">98</a><td> */<tr><td><a name="l99" href="#l99">99</a><td>goog.testing.MockControl.prototype.$tearDown = function() {<tr><td><a name="l100" href="#l100">100</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l101" href="#l101">101</a><td> // $tearDown if defined.<tr><td><a name="l102" href="#l102">102</a><td> if (m.$tearDown) {<tr><td><a name="l103" href="#l103">103</a><td> m.$tearDown();<tr><td><a name="l104" href="#l104">104</a><td> }<tr><td><a name="l105" href="#l105">105</a><td> // TODO(user): Somehow determine if verifyAll should have been called<tr><td><a name="l106" href="#l106">106</a><td> // but was not.<tr><td><a name="l107" href="#l107">107</a><td> });<tr><td><a name="l108" href="#l108">108</a><td>};<tr><td><a name="l109" href="#l109">109</a><td><tr><td><a name="l110" href="#l110">110</a><td><tr><td><a name="l111" href="#l111">111</a><td>/**<tr><td><a name="l112" href="#l112">112</a><td> * Creates a controlled StrictMock. Passes its arguments through to the<tr><td><a name="l113" href="#l113">113</a><td> * StrictMock constructor.<tr><td><a name="l114" href="#l114">114</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a name="l115" href="#l115">115</a><td> * the constructor of an object to mock.<tr><td><a name="l116" href="#l116">116</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a name="l117" href="#l117">117</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a name="l118" href="#l118">118</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a name="l119" href="#l119">119</a><td> * a proxy for the target mock should be created.<tr><td><a name="l120" href="#l120">120</a><td> * @return {!goog.testing.StrictMock} The mock object.<tr><td><a name="l121" href="#l121">121</a><td> */<tr><td><a name="l122" href="#l122">122</a><td>goog.testing.MockControl.prototype.createStrictMock = function(<tr><td><a name="l123" href="#l123">123</a><td> objectToMock, opt_mockStaticMethods, opt_createProxy) {<tr><td><a name="l124" href="#l124">124</a><td> var m = new goog.testing.StrictMock(objectToMock, opt_mockStaticMethods,<tr><td><a name="l125" href="#l125">125</a><td> opt_createProxy);<tr><td><a name="l126" href="#l126">126</a><td> this.addMock(m);<tr><td><a name="l127" href="#l127">127</a><td> return m;<tr><td><a name="l128" href="#l128">128</a><td>};<tr><td><a name="l129" href="#l129">129</a><td><tr><td><a name="l130" href="#l130">130</a><td><tr><td><a name="l131" href="#l131">131</a><td>/**<tr><td><a name="l132" href="#l132">132</a><td> * Creates a controlled LooseMock. Passes its arguments through to the<tr><td><a name="l133" href="#l133">133</a><td> * LooseMock constructor.<tr><td><a name="l134" href="#l134">134</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a name="l135" href="#l135">135</a><td> * the constructor of an object to mock.<tr><td><a name="l136" href="#l136">136</a><td> * @param {boolean=} opt_ignoreUnexpectedCalls Whether to ignore unexpected<tr><td><a name="l137" href="#l137">137</a><td> * calls.<tr><td><a name="l138" href="#l138">138</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a name="l139" href="#l139">139</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a name="l140" href="#l140">140</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a name="l141" href="#l141">141</a><td> * a proxy for the target mock should be created.<tr><td><a name="l142" href="#l142">142</a><td> * @return {!goog.testing.LooseMock} The mock object.<tr><td><a name="l143" href="#l143">143</a><td> */<tr><td><a name="l144" href="#l144">144</a><td>goog.testing.MockControl.prototype.createLooseMock = function(<tr><td><a name="l145" href="#l145">145</a><td> objectToMock, opt_ignoreUnexpectedCalls,<tr><td><a name="l146" href="#l146">146</a><td> opt_mockStaticMethods, opt_createProxy) {<tr><td><a name="l147" href="#l147">147</a><td> var m = new goog.testing.LooseMock(objectToMock, opt_ignoreUnexpectedCalls,<tr><td><a name="l148" href="#l148">148</a><td> opt_mockStaticMethods, opt_createProxy);<tr><td><a name="l149" href="#l149">149</a><td> this.addMock(m);<tr><td><a name="l150" href="#l150">150</a><td> return m;<tr><td><a name="l151" href="#l151">151</a><td>};<tr><td><a name="l152" href="#l152">152</a><td><tr><td><a name="l153" href="#l153">153</a><td><tr><td><a name="l154" href="#l154">154</a><td>/**<tr><td><a name="l155" href="#l155">155</a><td> * Creates a controlled FunctionMock. Passes its arguments through to the<tr><td><a name="l156" href="#l156">156</a><td> * FunctionMock constructor.<tr><td><a name="l157" href="#l157">157</a><td> * @param {string=} opt_functionName The optional name of the function to mock<tr><td><a name="l158" href="#l158">158</a><td> * set to '[anonymous mocked function]' if not passed in.<tr><td><a name="l159" href="#l159">159</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l160" href="#l160">160</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l161" href="#l161">161</a><td> * @return {goog.testing.MockInterface} The mocked function.<tr><td><a name="l162" href="#l162">162</a><td> */<tr><td><a name="l163" href="#l163">163</a><td>goog.testing.MockControl.prototype.createFunctionMock = function(<tr><td><a name="l164" href="#l164">164</a><td> opt_functionName, opt_strictness) {<tr><td><a name="l165" href="#l165">165</a><td> var m = goog.testing.createFunctionMock(opt_functionName, opt_strictness);<tr><td><a name="l166" href="#l166">166</a><td> this.addMock(m);<tr><td><a name="l167" href="#l167">167</a><td> return m;<tr><td><a name="l168" href="#l168">168</a><td>};<tr><td><a name="l169" href="#l169">169</a><td><tr><td><a name="l170" href="#l170">170</a><td><tr><td><a name="l171" href="#l171">171</a><td>/**<tr><td><a name="l172" href="#l172">172</a><td> * Creates a controlled MethodMock. Passes its arguments through to the<tr><td><a name="l173" href="#l173">173</a><td> * MethodMock constructor.<tr><td><a name="l174" href="#l174">174</a><td> * @param {Object} scope The scope of the method to be mocked out.<tr><td><a name="l175" href="#l175">175</a><td> * @param {string} functionName The name of the function we're going to mock.<tr><td><a name="l176" href="#l176">176</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l177" href="#l177">177</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l178" href="#l178">178</a><td> * @return {!goog.testing.MockInterface} The mocked method.<tr><td><a name="l179" href="#l179">179</a><td> */<tr><td><a name="l180" href="#l180">180</a><td>goog.testing.MockControl.prototype.createMethodMock = function(<tr><td><a name="l181" href="#l181">181</a><td> scope, functionName, opt_strictness) {<tr><td><a name="l182" href="#l182">182</a><td> var m = goog.testing.createMethodMock(scope, functionName, opt_strictness);<tr><td><a name="l183" href="#l183">183</a><td> this.addMock(m);<tr><td><a name="l184" href="#l184">184</a><td> return m;<tr><td><a name="l185" href="#l185">185</a><td>};<tr><td><a name="l186" href="#l186">186</a><td><tr><td><a name="l187" href="#l187">187</a><td><tr><td><a name="l188" href="#l188">188</a><td>/**<tr><td><a name="l189" href="#l189">189</a><td> * Creates a controlled MethodMock for a constructor. Passes its arguments<tr><td><a name="l190" href="#l190">190</a><td> * through to the MethodMock constructor. See<tr><td><a name="l191" href="#l191">191</a><td> * {@link goog.testing.createConstructorMock} for details.<tr><td><a name="l192" href="#l192">192</a><td> * @param {Object} scope The scope of the constructor to be mocked out.<tr><td><a name="l193" href="#l193">193</a><td> * @param {string} constructorName The name of the function we're going to mock.<tr><td><a name="l194" href="#l194">194</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l195" href="#l195">195</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l196" href="#l196">196</a><td> * @return {!goog.testing.MockInterface} The mocked method.<tr><td><a name="l197" href="#l197">197</a><td> */<tr><td><a name="l198" href="#l198">198</a><td>goog.testing.MockControl.prototype.createConstructorMock = function(<tr><td><a name="l199" href="#l199">199</a><td> scope, constructorName, opt_strictness) {<tr><td><a name="l200" href="#l200">200</a><td> var m = goog.testing.createConstructorMock(scope, constructorName,<tr><td><a name="l201" href="#l201">201</a><td> opt_strictness);<tr><td><a name="l202" href="#l202">202</a><td> this.addMock(m);<tr><td><a name="l203" href="#l203">203</a><td> return m;<tr><td><a name="l204" href="#l204">204</a><td>};<tr><td><a name="l205" href="#l205">205</a><td><tr><td><a name="l206" href="#l206">206</a><td><tr><td><a name="l207" href="#l207">207</a><td>/**<tr><td><a name="l208" href="#l208">208</a><td> * Creates a controlled GlobalFunctionMock. Passes its arguments through to the<tr><td><a name="l209" href="#l209">209</a><td> * GlobalFunctionMock constructor.<tr><td><a name="l210" href="#l210">210</a><td> * @param {string} functionName The name of the function we're going to mock.<tr><td><a name="l211" href="#l211">211</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l212" href="#l212">212</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l213" href="#l213">213</a><td> * @return {goog.testing.MockInterface} The mocked function.<tr><td><a name="l214" href="#l214">214</a><td> */<tr><td><a name="l215" href="#l215">215</a><td>goog.testing.MockControl.prototype.createGlobalFunctionMock = function(<tr><td><a name="l216" href="#l216">216</a><td> functionName, opt_strictness) {<tr><td><a name="l217" href="#l217">217</a><td> var m = goog.testing.createGlobalFunctionMock(functionName, opt_strictness);<tr><td><a name="l218" href="#l218">218</a><td> this.addMock(m);<tr><td><a name="l219" href="#l219">219</a><td> return m;<tr><td><a name="l220" href="#l220">220</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
1
|
+
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>mockcontrol.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/testing/mockcontrol.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2008 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview A MockControl holds a set of mocks for a particular test.<tr><td><a name="l17" href="#l17">17</a><td> * It consolidates calls to $replay, $verify, and $tearDown, which simplifies<tr><td><a name="l18" href="#l18">18</a><td> * the test and helps avoid omissions.<tr><td><a name="l19" href="#l19">19</a><td> *<tr><td><a name="l20" href="#l20">20</a><td> * You can create and control a mock:<tr><td><a name="l21" href="#l21">21</a><td> * var mockFoo = mockControl.addMock(new MyMock(Foo));<tr><td><a name="l22" href="#l22">22</a><td> *<tr><td><a name="l23" href="#l23">23</a><td> * MockControl also exposes some convenience functions that create<tr><td><a name="l24" href="#l24">24</a><td> * controlled mocks for common mocks: StrictMock, LooseMock,<tr><td><a name="l25" href="#l25">25</a><td> * FunctionMock, MethodMock, and GlobalFunctionMock.<tr><td><a name="l26" href="#l26">26</a><td> *<tr><td><a name="l27" href="#l27">27</a><td> */<tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td>goog.provide('goog.testing.MockControl');<tr><td><a name="l31" href="#l31">31</a><td><tr><td><a name="l32" href="#l32">32</a><td>goog.require('goog.array');<tr><td><a name="l33" href="#l33">33</a><td>goog.require('goog.testing');<tr><td><a name="l34" href="#l34">34</a><td>goog.require('goog.testing.LooseMock');<tr><td><a name="l35" href="#l35">35</a><td>goog.require('goog.testing.StrictMock');<tr><td><a name="l36" href="#l36">36</a><td><tr><td><a name="l37" href="#l37">37</a><td><tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td>/**<tr><td><a name="l40" href="#l40">40</a><td> * Controls a set of mocks. Controlled mocks are replayed, verified, and<tr><td><a name="l41" href="#l41">41</a><td> * cleaned-up at the same time.<tr><td><a name="l42" href="#l42">42</a><td> * @constructor<tr><td><a name="l43" href="#l43">43</a><td> */<tr><td><a name="l44" href="#l44">44</a><td>goog.testing.MockControl = function() {<tr><td><a name="l45" href="#l45">45</a><td> /**<tr><td><a name="l46" href="#l46">46</a><td> * The list of mocks being controlled.<tr><td><a name="l47" href="#l47">47</a><td> * @type {Array.<goog.testing.MockInterface>}<tr><td><a name="l48" href="#l48">48</a><td> * @private<tr><td><a name="l49" href="#l49">49</a><td> */<tr><td><a name="l50" href="#l50">50</a><td> this.mocks_ = [];<tr><td><a name="l51" href="#l51">51</a><td>};<tr><td><a name="l52" href="#l52">52</a><td><tr><td><a name="l53" href="#l53">53</a><td><tr><td><a name="l54" href="#l54">54</a><td>/**<tr><td><a name="l55" href="#l55">55</a><td> * Takes control of this mock.<tr><td><a name="l56" href="#l56">56</a><td> * @param {goog.testing.MockInterface} mock Mock to be controlled.<tr><td><a name="l57" href="#l57">57</a><td> * @return {goog.testing.MockInterface} The same mock passed in,<tr><td><a name="l58" href="#l58">58</a><td> * for convenience.<tr><td><a name="l59" href="#l59">59</a><td> */<tr><td><a name="l60" href="#l60">60</a><td>goog.testing.MockControl.prototype.addMock = function(mock) {<tr><td><a name="l61" href="#l61">61</a><td> this.mocks_.push(mock);<tr><td><a name="l62" href="#l62">62</a><td> return mock;<tr><td><a name="l63" href="#l63">63</a><td>};<tr><td><a name="l64" href="#l64">64</a><td><tr><td><a name="l65" href="#l65">65</a><td><tr><td><a name="l66" href="#l66">66</a><td>/**<tr><td><a name="l67" href="#l67">67</a><td> * Calls replay on each controlled mock.<tr><td><a name="l68" href="#l68">68</a><td> */<tr><td><a name="l69" href="#l69">69</a><td>goog.testing.MockControl.prototype.$replayAll = function() {<tr><td><a name="l70" href="#l70">70</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l71" href="#l71">71</a><td> m.$replay();<tr><td><a name="l72" href="#l72">72</a><td> });<tr><td><a name="l73" href="#l73">73</a><td>};<tr><td><a name="l74" href="#l74">74</a><td><tr><td><a name="l75" href="#l75">75</a><td><tr><td><a name="l76" href="#l76">76</a><td>/**<tr><td><a name="l77" href="#l77">77</a><td> * Calls reset on each controlled mock.<tr><td><a name="l78" href="#l78">78</a><td> */<tr><td><a name="l79" href="#l79">79</a><td>goog.testing.MockControl.prototype.$resetAll = function() {<tr><td><a name="l80" href="#l80">80</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l81" href="#l81">81</a><td> m.$reset();<tr><td><a name="l82" href="#l82">82</a><td> });<tr><td><a name="l83" href="#l83">83</a><td>};<tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td><tr><td><a name="l86" href="#l86">86</a><td>/**<tr><td><a name="l87" href="#l87">87</a><td> * Calls verify on each controlled mock.<tr><td><a name="l88" href="#l88">88</a><td> */<tr><td><a name="l89" href="#l89">89</a><td>goog.testing.MockControl.prototype.$verifyAll = function() {<tr><td><a name="l90" href="#l90">90</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l91" href="#l91">91</a><td> m.$verify();<tr><td><a name="l92" href="#l92">92</a><td> });<tr><td><a name="l93" href="#l93">93</a><td>};<tr><td><a name="l94" href="#l94">94</a><td><tr><td><a name="l95" href="#l95">95</a><td><tr><td><a name="l96" href="#l96">96</a><td>/**<tr><td><a name="l97" href="#l97">97</a><td> * Calls tearDown on each controlled mock, if necesssary.<tr><td><a name="l98" href="#l98">98</a><td> */<tr><td><a name="l99" href="#l99">99</a><td>goog.testing.MockControl.prototype.$tearDown = function() {<tr><td><a name="l100" href="#l100">100</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a name="l101" href="#l101">101</a><td> // $tearDown if defined.<tr><td><a name="l102" href="#l102">102</a><td> if (m.$tearDown) {<tr><td><a name="l103" href="#l103">103</a><td> m.$tearDown();<tr><td><a name="l104" href="#l104">104</a><td> }<tr><td><a name="l105" href="#l105">105</a><td> // TODO(user): Somehow determine if verifyAll should have been called<tr><td><a name="l106" href="#l106">106</a><td> // but was not.<tr><td><a name="l107" href="#l107">107</a><td> });<tr><td><a name="l108" href="#l108">108</a><td>};<tr><td><a name="l109" href="#l109">109</a><td><tr><td><a name="l110" href="#l110">110</a><td><tr><td><a name="l111" href="#l111">111</a><td>/**<tr><td><a name="l112" href="#l112">112</a><td> * Creates a controlled StrictMock. Passes its arguments through to the<tr><td><a name="l113" href="#l113">113</a><td> * StrictMock constructor.<tr><td><a name="l114" href="#l114">114</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a name="l115" href="#l115">115</a><td> * the constructor of an object to mock.<tr><td><a name="l116" href="#l116">116</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a name="l117" href="#l117">117</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a name="l118" href="#l118">118</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a name="l119" href="#l119">119</a><td> * a proxy for the target mock should be created.<tr><td><a name="l120" href="#l120">120</a><td> * @return {!goog.testing.StrictMock} The mock object.<tr><td><a name="l121" href="#l121">121</a><td> */<tr><td><a name="l122" href="#l122">122</a><td>goog.testing.MockControl.prototype.createStrictMock = function(<tr><td><a name="l123" href="#l123">123</a><td> objectToMock, opt_mockStaticMethods, opt_createProxy) {<tr><td><a name="l124" href="#l124">124</a><td> var m = new goog.testing.StrictMock(objectToMock, opt_mockStaticMethods,<tr><td><a name="l125" href="#l125">125</a><td> opt_createProxy);<tr><td><a name="l126" href="#l126">126</a><td> this.addMock(m);<tr><td><a name="l127" href="#l127">127</a><td> return m;<tr><td><a name="l128" href="#l128">128</a><td>};<tr><td><a name="l129" href="#l129">129</a><td><tr><td><a name="l130" href="#l130">130</a><td><tr><td><a name="l131" href="#l131">131</a><td>/**<tr><td><a name="l132" href="#l132">132</a><td> * Creates a controlled LooseMock. Passes its arguments through to the<tr><td><a name="l133" href="#l133">133</a><td> * LooseMock constructor.<tr><td><a name="l134" href="#l134">134</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a name="l135" href="#l135">135</a><td> * the constructor of an object to mock.<tr><td><a name="l136" href="#l136">136</a><td> * @param {boolean=} opt_ignoreUnexpectedCalls Whether to ignore unexpected<tr><td><a name="l137" href="#l137">137</a><td> * calls.<tr><td><a name="l138" href="#l138">138</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a name="l139" href="#l139">139</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a name="l140" href="#l140">140</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a name="l141" href="#l141">141</a><td> * a proxy for the target mock should be created.<tr><td><a name="l142" href="#l142">142</a><td> * @return {!goog.testing.LooseMock} The mock object.<tr><td><a name="l143" href="#l143">143</a><td> */<tr><td><a name="l144" href="#l144">144</a><td>goog.testing.MockControl.prototype.createLooseMock = function(<tr><td><a name="l145" href="#l145">145</a><td> objectToMock, opt_ignoreUnexpectedCalls,<tr><td><a name="l146" href="#l146">146</a><td> opt_mockStaticMethods, opt_createProxy) {<tr><td><a name="l147" href="#l147">147</a><td> var m = new goog.testing.LooseMock(objectToMock, opt_ignoreUnexpectedCalls,<tr><td><a name="l148" href="#l148">148</a><td> opt_mockStaticMethods, opt_createProxy);<tr><td><a name="l149" href="#l149">149</a><td> this.addMock(m);<tr><td><a name="l150" href="#l150">150</a><td> return m;<tr><td><a name="l151" href="#l151">151</a><td>};<tr><td><a name="l152" href="#l152">152</a><td><tr><td><a name="l153" href="#l153">153</a><td><tr><td><a name="l154" href="#l154">154</a><td>/**<tr><td><a name="l155" href="#l155">155</a><td> * Creates a controlled FunctionMock. Passes its arguments through to the<tr><td><a name="l156" href="#l156">156</a><td> * FunctionMock constructor.<tr><td><a name="l157" href="#l157">157</a><td> * @param {string=} opt_functionName The optional name of the function to mock<tr><td><a name="l158" href="#l158">158</a><td> * set to '[anonymous mocked function]' if not passed in.<tr><td><a name="l159" href="#l159">159</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l160" href="#l160">160</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l161" href="#l161">161</a><td> * @return {goog.testing.MockInterface} The mocked function.<tr><td><a name="l162" href="#l162">162</a><td> */<tr><td><a name="l163" href="#l163">163</a><td>goog.testing.MockControl.prototype.createFunctionMock = function(<tr><td><a name="l164" href="#l164">164</a><td> opt_functionName, opt_strictness) {<tr><td><a name="l165" href="#l165">165</a><td> var m = goog.testing.createFunctionMock(opt_functionName, opt_strictness);<tr><td><a name="l166" href="#l166">166</a><td> this.addMock(m);<tr><td><a name="l167" href="#l167">167</a><td> return m;<tr><td><a name="l168" href="#l168">168</a><td>};<tr><td><a name="l169" href="#l169">169</a><td><tr><td><a name="l170" href="#l170">170</a><td><tr><td><a name="l171" href="#l171">171</a><td>/**<tr><td><a name="l172" href="#l172">172</a><td> * Creates a controlled MethodMock. Passes its arguments through to the<tr><td><a name="l173" href="#l173">173</a><td> * MethodMock constructor.<tr><td><a name="l174" href="#l174">174</a><td> * @param {Object} scope The scope of the method to be mocked out.<tr><td><a name="l175" href="#l175">175</a><td> * @param {string} functionName The name of the function we're going to mock.<tr><td><a name="l176" href="#l176">176</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l177" href="#l177">177</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l178" href="#l178">178</a><td> * @return {!goog.testing.MockInterface} The mocked method.<tr><td><a name="l179" href="#l179">179</a><td> */<tr><td><a name="l180" href="#l180">180</a><td>goog.testing.MockControl.prototype.createMethodMock = function(<tr><td><a name="l181" href="#l181">181</a><td> scope, functionName, opt_strictness) {<tr><td><a name="l182" href="#l182">182</a><td> var m = goog.testing.createMethodMock(scope, functionName, opt_strictness);<tr><td><a name="l183" href="#l183">183</a><td> this.addMock(m);<tr><td><a name="l184" href="#l184">184</a><td> return m;<tr><td><a name="l185" href="#l185">185</a><td>};<tr><td><a name="l186" href="#l186">186</a><td><tr><td><a name="l187" href="#l187">187</a><td><tr><td><a name="l188" href="#l188">188</a><td>/**<tr><td><a name="l189" href="#l189">189</a><td> * Creates a controlled MethodMock for a constructor. Passes its arguments<tr><td><a name="l190" href="#l190">190</a><td> * through to the MethodMock constructor. See<tr><td><a name="l191" href="#l191">191</a><td> * {@link goog.testing.createConstructorMock} for details.<tr><td><a name="l192" href="#l192">192</a><td> * @param {Object} scope The scope of the constructor to be mocked out.<tr><td><a name="l193" href="#l193">193</a><td> * @param {string} constructorName The name of the function we're going to mock.<tr><td><a name="l194" href="#l194">194</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l195" href="#l195">195</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l196" href="#l196">196</a><td> * @return {!goog.testing.MockInterface} The mocked method.<tr><td><a name="l197" href="#l197">197</a><td> */<tr><td><a name="l198" href="#l198">198</a><td>goog.testing.MockControl.prototype.createConstructorMock = function(<tr><td><a name="l199" href="#l199">199</a><td> scope, constructorName, opt_strictness) {<tr><td><a name="l200" href="#l200">200</a><td> var m = goog.testing.createConstructorMock(scope, constructorName,<tr><td><a name="l201" href="#l201">201</a><td> opt_strictness);<tr><td><a name="l202" href="#l202">202</a><td> this.addMock(m);<tr><td><a name="l203" href="#l203">203</a><td> return m;<tr><td><a name="l204" href="#l204">204</a><td>};<tr><td><a name="l205" href="#l205">205</a><td><tr><td><a name="l206" href="#l206">206</a><td><tr><td><a name="l207" href="#l207">207</a><td>/**<tr><td><a name="l208" href="#l208">208</a><td> * Creates a controlled GlobalFunctionMock. Passes its arguments through to the<tr><td><a name="l209" href="#l209">209</a><td> * GlobalFunctionMock constructor.<tr><td><a name="l210" href="#l210">210</a><td> * @param {string} functionName The name of the function we're going to mock.<tr><td><a name="l211" href="#l211">211</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a name="l212" href="#l212">212</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a name="l213" href="#l213">213</a><td> * @return {goog.testing.MockInterface} The mocked function.<tr><td><a name="l214" href="#l214">214</a><td> */<tr><td><a name="l215" href="#l215">215</a><td>goog.testing.MockControl.prototype.createGlobalFunctionMock = function(<tr><td><a name="l216" href="#l216">216</a><td> functionName, opt_strictness) {<tr><td><a name="l217" href="#l217">217</a><td> var m = goog.testing.createGlobalFunctionMock(functionName, opt_strictness);<tr><td><a name="l218" href="#l218">218</a><td> this.addMock(m);<tr><td><a name="l219" href="#l219">219</a><td> return m;<tr><td><a name="l220" href="#l220">220</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>mockinterface.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/testing/mockinterface.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2010 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview An interface that all mocks should share.<tr><td><a name="l17" href="#l17">17</a><td> * @author nicksantos@google.com (Nick Santos)<tr><td><a name="l18" href="#l18">18</a><td> */<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>goog.provide('goog.testing.MockInterface');<tr><td><a name="l21" href="#l21">21</a><td><tr><td><a name="l22" href="#l22">22</a><td><tr><td><a name="l23" href="#l23">23</a><td><tr><td><a name="l24" href="#l24">24</a><td>/** @interface */<tr><td><a name="l25" href="#l25">25</a><td>goog.testing.MockInterface = function() {};<tr><td><a name="l26" href="#l26">26</a><td><tr><td><a name="l27" href="#l27">27</a><td><tr><td><a name="l28" href="#l28">28</a><td>/**<tr><td><a name="l29" href="#l29">29</a><td> * Write down all the expected functions that have been called on the<tr><td><a name="l30" href="#l30">30</a><td> * mock so far. From here on out, future function calls will be<tr><td><a name="l31" href="#l31">31</a><td> * compared against this list.<tr><td><a name="l32" href="#l32">32</a><td> */<tr><td><a name="l33" href="#l33">33</a><td>goog.testing.MockInterface.prototype.$replay = function() {};<tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td><tr><td><a name="l36" href="#l36">36</a><td>/**<tr><td><a name="l37" href="#l37">37</a><td> * Reset the mock.<tr><td><a name="l38" href="#l38">38</a><td> */<tr><td><a name="l39" href="#l39">39</a><td>goog.testing.MockInterface.prototype.$reset = function() {};<tr><td><a name="l40" href="#l40">40</a><td><tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td>/**<tr><td><a name="l43" href="#l43">43</a><td> * Assert that the expected function calls match the actual calls.<tr><td><a name="l44" href="#l44">44</a><td> */<tr><td><a name="l45" href="#l45">45</a><td>goog.testing.MockInterface.prototype.$verify = function() {};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
1
|
+
<!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>mockinterface.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/testing/mockinterface.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2010 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview An interface that all mocks should share.<tr><td><a name="l17" href="#l17">17</a><td> * @author nicksantos@google.com (Nick Santos)<tr><td><a name="l18" href="#l18">18</a><td> */<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>goog.provide('goog.testing.MockInterface');<tr><td><a name="l21" href="#l21">21</a><td><tr><td><a name="l22" href="#l22">22</a><td><tr><td><a name="l23" href="#l23">23</a><td><tr><td><a name="l24" href="#l24">24</a><td>/** @interface */<tr><td><a name="l25" href="#l25">25</a><td>goog.testing.MockInterface = function() {};<tr><td><a name="l26" href="#l26">26</a><td><tr><td><a name="l27" href="#l27">27</a><td><tr><td><a name="l28" href="#l28">28</a><td>/**<tr><td><a name="l29" href="#l29">29</a><td> * Write down all the expected functions that have been called on the<tr><td><a name="l30" href="#l30">30</a><td> * mock so far. From here on out, future function calls will be<tr><td><a name="l31" href="#l31">31</a><td> * compared against this list.<tr><td><a name="l32" href="#l32">32</a><td> */<tr><td><a name="l33" href="#l33">33</a><td>goog.testing.MockInterface.prototype.$replay = function() {};<tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td><tr><td><a name="l36" href="#l36">36</a><td>/**<tr><td><a name="l37" href="#l37">37</a><td> * Reset the mock.<tr><td><a name="l38" href="#l38">38</a><td> */<tr><td><a name="l39" href="#l39">39</a><td>goog.testing.MockInterface.prototype.$reset = function() {};<tr><td><a name="l40" href="#l40">40</a><td><tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td>/**<tr><td><a name="l43" href="#l43">43</a><td> * Assert that the expected function calls match the actual calls.<tr><td><a name="l44" href="#l44">44</a><td> */<tr><td><a name="l45" href="#l45">45</a><td>goog.testing.MockInterface.prototype.$verify = function() {};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|