selenium-webdriver 2.48.2 → 2.52.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 +57 -0
- package/NOTICE +1 -1
- package/README.md +56 -6
- package/builder.js +375 -358
- package/chrome.js +549 -586
- package/edge.js +378 -0
- package/error.js +597 -5
- package/example/google_search_generator.js +2 -4
- package/example/logging.js +6 -2
- package/executors.js +11 -27
- package/firefox/binary.js +79 -87
- package/firefox/extension.js +10 -18
- package/firefox/index.js +173 -173
- package/firefox/profile.js +220 -240
- package/http/index.js +396 -79
- package/http/util.js +35 -35
- package/ie.js +288 -309
- package/index.js +34 -125
- package/io/exec.js +58 -39
- package/io/index.js +54 -48
- package/lib/actions.js +594 -0
- package/lib/by.js +276 -0
- package/lib/capabilities.js +404 -0
- package/lib/{webdriver/command.js → command.js} +88 -72
- package/lib/{webdriver/button.js → devmode.js} +13 -8
- package/lib/events.js +210 -0
- package/lib/firefox/amd64/libnoblur64.so +0 -0
- package/lib/firefox/i386/libnoblur.so +0 -0
- package/lib/firefox/webdriver.json +5 -1
- package/lib/firefox/webdriver.xpi +0 -0
- package/lib/{webdriver/key.js → input.js} +82 -2
- package/lib/logging.js +668 -0
- package/lib/{webdriver/promise.js → promise.js} +688 -644
- package/lib/session.js +79 -0
- package/lib/{webdriver/serializable.js → symbols.js} +11 -16
- package/lib/test/build.js +4 -4
- package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
- package/lib/test/data/click_tests/overlapping_elements.html +15 -4
- package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
- package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
- package/lib/test/data/readOnlyPage.html +1 -1
- package/lib/test/data/selectPage.html +18 -2
- package/lib/test/fileserver.js +3 -4
- package/lib/test/index.js +7 -3
- package/lib/test/resources.js +1 -1
- package/lib/until.js +428 -0
- package/lib/webdriver.js +2351 -0
- package/net/portprober.js +15 -11
- package/opera.js +295 -314
- package/package.json +6 -5
- package/phantomjs.js +135 -140
- package/proxy.js +6 -4
- package/remote/index.js +229 -221
- package/safari.js +319 -310
- package/test/chrome/options_test.js +11 -9
- package/test/element_finding_test.js +51 -13
- package/test/error_test.js +163 -0
- package/test/execute_script_test.js +1 -1
- package/test/http/http_test.js +317 -55
- package/test/http/util_test.js +25 -23
- package/test/io_test.js +6 -1
- package/test/lib/by_test.js +127 -0
- package/test/lib/capabilities_test.js +84 -0
- package/test/lib/events_test.js +177 -0
- package/test/lib/logging_test.js +272 -0
- package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
- package/test/lib/promise_error_test.js +808 -0
- package/test/lib/promise_flow_test.js +2282 -0
- package/test/lib/promise_generator_test.js +308 -0
- package/test/lib/promise_test.js +996 -0
- package/test/lib/testutil.js +90 -0
- package/test/lib/until_test.js +436 -0
- package/test/lib/webdriver_test.js +2207 -0
- package/test/page_loading_test.js +7 -9
- package/test/stale_element_test.js +2 -2
- package/test/testing/assert_test.js +374 -0
- package/test/testing/index_test.js +9 -11
- package/testing/assert.js +334 -17
- package/testing/index.js +10 -0
- package/_base.js +0 -200
- package/docs/Changes.html +0 -356
- package/docs/class_bot_Error.html +0 -15
- package/docs/class_webdriver_ActionSequence.html +0 -115
- package/docs/class_webdriver_Alert.html +0 -24
- package/docs/class_webdriver_AlertPromise.html +0 -92
- package/docs/class_webdriver_Capabilities.html +0 -60
- package/docs/class_webdriver_Command.html +0 -15
- package/docs/class_webdriver_EventEmitter.html +0 -35
- package/docs/class_webdriver_FileDetector.html +0 -21
- package/docs/class_webdriver_Locator.html +0 -12
- package/docs/class_webdriver_Serializable.html +0 -9
- package/docs/class_webdriver_Session.html +0 -13
- package/docs/class_webdriver_TouchSequence.html +0 -49
- package/docs/class_webdriver_UnhandledAlertError.html +0 -18
- package/docs/class_webdriver_WebDriver.html +0 -313
- package/docs/class_webdriver_WebDriver_Logs.html +0 -15
- package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
- package/docs/class_webdriver_WebDriver_Options.html +0 -41
- package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
- package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
- package/docs/class_webdriver_WebDriver_Window.html +0 -27
- package/docs/class_webdriver_WebElement.html +0 -223
- package/docs/class_webdriver_WebElementPromise.html +0 -274
- package/docs/class_webdriver_http_Executor.html +0 -22
- package/docs/class_webdriver_http_Request.html +0 -12
- package/docs/class_webdriver_http_Response.html +0 -13
- package/docs/class_webdriver_logging_Entry.html +0 -15
- package/docs/class_webdriver_logging_Level.html +0 -55
- package/docs/class_webdriver_logging_LogRecord.html +0 -45
- package/docs/class_webdriver_logging_Logger.html +0 -119
- package/docs/class_webdriver_logging_Preferences.html +0 -8
- package/docs/class_webdriver_promise_CancellationError.html +0 -17
- package/docs/class_webdriver_promise_ControlFlow.html +0 -153
- package/docs/class_webdriver_promise_Deferred.html +0 -84
- package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
- package/docs/class_webdriver_promise_Promise.html +0 -75
- package/docs/class_webdriver_stacktrace_Frame.html +0 -20
- package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
- package/docs/class_webdriver_testing_Assertion.html +0 -99
- package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
- package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
- package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
- package/docs/class_webdriver_until_Condition.html +0 -7
- package/docs/dossier.css +0 -1
- package/docs/dossier.js +0 -86
- package/docs/enum_bot_ErrorCode.html +0 -3
- package/docs/enum_bot_Error_State.html +0 -2
- package/docs/enum_webdriver_Browser.html +0 -2
- package/docs/enum_webdriver_Button.html +0 -2
- package/docs/enum_webdriver_Capability.html +0 -33
- package/docs/enum_webdriver_CommandName.html +0 -3
- package/docs/enum_webdriver_Key.html +0 -12
- package/docs/enum_webdriver_logging_Type.html +0 -6
- package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
- package/docs/index.html +0 -125
- package/docs/interface_webdriver_CommandExecutor.html +0 -9
- package/docs/interface_webdriver_http_Client.html +0 -10
- package/docs/interface_webdriver_promise_Thenable.html +0 -77
- package/docs/module_selenium-webdriver.html +0 -23
- package/docs/module_selenium-webdriver__base.html +0 -23
- package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
- package/docs/module_selenium-webdriver_builder.html +0 -2
- package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
- package/docs/module_selenium-webdriver_chrome.html +0 -90
- package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
- package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
- package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
- package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
- package/docs/module_selenium-webdriver_class_Builder.html +0 -138
- package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
- package/docs/module_selenium-webdriver_class_Command.html +0 -15
- package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
- package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
- package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
- package/docs/module_selenium-webdriver_class_Session.html +0 -13
- package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
- package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
- package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
- package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
- package/docs/module_selenium-webdriver_enum_Button.html +0 -2
- package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
- package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
- package/docs/module_selenium-webdriver_enum_Key.html +0 -12
- package/docs/module_selenium-webdriver_error.html +0 -4
- package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
- package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
- package/docs/module_selenium-webdriver_executors.html +0 -10
- package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
- package/docs/module_selenium-webdriver_firefox.html +0 -68
- package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
- package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
- package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
- package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
- package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
- package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
- package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
- package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
- package/docs/module_selenium-webdriver_http.html +0 -9
- package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
- package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
- package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
- package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
- package/docs/module_selenium-webdriver_http_util.html +0 -17
- package/docs/module_selenium-webdriver_ie.html +0 -11
- package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
- package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
- package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
- package/docs/module_selenium-webdriver_io.html +0 -37
- package/docs/module_selenium-webdriver_io_exec.html +0 -6
- package/docs/module_selenium-webdriver_namespace_By.html +0 -56
- package/docs/module_selenium-webdriver_namespace_error.html +0 -4
- package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
- package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
- package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
- package/docs/module_selenium-webdriver_namespace_until.html +0 -82
- package/docs/module_selenium-webdriver_net.html +0 -7
- package/docs/module_selenium-webdriver_net_portprober.html +0 -12
- package/docs/module_selenium-webdriver_opera.html +0 -62
- package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
- package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
- package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
- package/docs/module_selenium-webdriver_phantomjs.html +0 -2
- package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
- package/docs/module_selenium-webdriver_proxy.html +0 -28
- package/docs/module_selenium-webdriver_remote.html +0 -8
- package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
- package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
- package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
- package/docs/module_selenium-webdriver_safari.html +0 -9
- package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
- package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
- package/docs/module_selenium-webdriver_testing.html +0 -74
- package/docs/module_selenium-webdriver_testing_assert.html +0 -9
- package/docs/namespace_bot.html +0 -4
- package/docs/namespace_bot_json.html +0 -20
- package/docs/namespace_bot_response.html +0 -18
- package/docs/namespace_bot_userAgent.html +0 -33
- package/docs/namespace_webdriver.html +0 -30
- package/docs/namespace_webdriver_By.html +0 -56
- package/docs/namespace_webdriver_http.html +0 -6
- package/docs/namespace_webdriver_logging.html +0 -70
- package/docs/namespace_webdriver_promise.html +0 -688
- package/docs/namespace_webdriver_stacktrace.html +0 -17
- package/docs/namespace_webdriver_testing.html +0 -7
- package/docs/namespace_webdriver_testing_assert.html +0 -9
- package/docs/namespace_webdriver_testing_asserts.html +0 -18
- package/docs/namespace_webdriver_until.html +0 -82
- package/docs/source/_base.js.src.html +0 -1
- package/docs/source/builder.js.src.html +0 -1
- package/docs/source/chrome.js.src.html +0 -1
- package/docs/source/error.js.src.html +0 -1
- package/docs/source/executors.js.src.html +0 -1
- package/docs/source/firefox/binary.js.src.html +0 -1
- package/docs/source/firefox/extension.js.src.html +0 -1
- package/docs/source/firefox/index.js.src.html +0 -1
- package/docs/source/firefox/profile.js.src.html +0 -1
- package/docs/source/http/index.js.src.html +0 -1
- package/docs/source/http/util.js.src.html +0 -1
- package/docs/source/ie.js.src.html +0 -1
- package/docs/source/index.js.src.html +0 -1
- package/docs/source/io/exec.js.src.html +0 -1
- package/docs/source/io/index.js.src.html +0 -1
- package/docs/source/lib/atoms/error.js.src.html +0 -1
- package/docs/source/lib/atoms/json.js.src.html +0 -1
- package/docs/source/lib/atoms/response.js.src.html +0 -1
- package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
- package/docs/source/lib/goog/array/array.js.src.html +0 -1
- package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
- package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
- package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
- package/docs/source/lib/goog/async/run.js.src.html +0 -1
- package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
- package/docs/source/lib/goog/base.js.src.html +0 -1
- package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
- package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
- package/docs/source/lib/goog/debug/error.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
- package/docs/source/lib/goog/deps.js.src.html +0 -1
- package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
- package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
- package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
- package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
- package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
- package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
- package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
- package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
- package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
- package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
- package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
- package/docs/source/lib/goog/events/event.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
- package/docs/source/lib/goog/events/events.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
- package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
- package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
- package/docs/source/lib/goog/events/listener.js.src.html +0 -1
- package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
- package/docs/source/lib/goog/fs/url.js.src.html +0 -1
- package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
- package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
- package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
- package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
- package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
- package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
- package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
- package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
- package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
- package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
- package/docs/source/lib/goog/json/json.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
- package/docs/source/lib/goog/log/log.js.src.html +0 -1
- package/docs/source/lib/goog/math/box.js.src.html +0 -1
- package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
- package/docs/source/lib/goog/math/math.js.src.html +0 -1
- package/docs/source/lib/goog/math/rect.js.src.html +0 -1
- package/docs/source/lib/goog/math/size.js.src.html +0 -1
- package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
- package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
- package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
- package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
- package/docs/source/lib/goog/object/object.js.src.html +0 -1
- package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
- package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
- package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
- package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
- package/docs/source/lib/goog/string/const.js.src.html +0 -1
- package/docs/source/lib/goog/string/string.js.src.html +0 -1
- package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
- package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
- package/docs/source/lib/goog/structs/map.js.src.html +0 -1
- package/docs/source/lib/goog/structs/set.js.src.html +0 -1
- package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
- package/docs/source/lib/goog/style/style.js.src.html +0 -1
- package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
- package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
- package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
- package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
- package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
- package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
- package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
- package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
- package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
- package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
- package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
- package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
- package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
- package/docs/source/lib/webdriver/button.js.src.html +0 -1
- package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
- package/docs/source/lib/webdriver/command.js.src.html +0 -1
- package/docs/source/lib/webdriver/events.js.src.html +0 -1
- package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
- package/docs/source/lib/webdriver/key.js.src.html +0 -1
- package/docs/source/lib/webdriver/locators.js.src.html +0 -1
- package/docs/source/lib/webdriver/logging.js.src.html +0 -1
- package/docs/source/lib/webdriver/promise.js.src.html +0 -1
- package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
- package/docs/source/lib/webdriver/session.js.src.html +0 -1
- package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
- package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
- package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
- package/docs/source/lib/webdriver/until.js.src.html +0 -1
- package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
- package/docs/source/net/index.js.src.html +0 -1
- package/docs/source/net/portprober.js.src.html +0 -1
- package/docs/source/opera.js.src.html +0 -1
- package/docs/source/phantomjs.js.src.html +0 -1
- package/docs/source/proxy.js.src.html +0 -1
- package/docs/source/remote/index.js.src.html +0 -1
- package/docs/source/safari.js.src.html +0 -1
- package/docs/source/testing/assert.js.src.html +0 -1
- package/docs/source/testing/index.js.src.html +0 -1
- package/docs/types.js +0 -1
- package/lib/atoms/error.js +0 -202
- package/lib/atoms/json.js +0 -80
- package/lib/atoms/response.js +0 -110
- package/lib/atoms/userAgent.js +0 -257
- package/lib/goog/LICENSE +0 -176
- package/lib/goog/array/array.js +0 -1654
- package/lib/goog/asserts/asserts.js +0 -365
- package/lib/goog/async/freelist.js +0 -88
- package/lib/goog/async/nexttick.js +0 -241
- package/lib/goog/async/run.js +0 -133
- package/lib/goog/async/workqueue.js +0 -139
- package/lib/goog/base.js +0 -2548
- package/lib/goog/debug/debug.js +0 -653
- package/lib/goog/debug/entrypointregistry.js +0 -158
- package/lib/goog/debug/error.js +0 -63
- package/lib/goog/debug/logbuffer.js +0 -148
- package/lib/goog/debug/logger.js +0 -873
- package/lib/goog/debug/logrecord.js +0 -242
- package/lib/goog/deps.js +0 -151
- package/lib/goog/disposable/disposable.js +0 -307
- package/lib/goog/disposable/idisposable.js +0 -45
- package/lib/goog/dom/browserfeature.js +0 -72
- package/lib/goog/dom/dom.js +0 -2991
- package/lib/goog/dom/nodetype.js +0 -48
- package/lib/goog/dom/safe.js +0 -347
- package/lib/goog/dom/tagname.js +0 -160
- package/lib/goog/dom/tags.js +0 -41
- package/lib/goog/dom/vendor.js +0 -96
- package/lib/goog/events/browserevent.js +0 -400
- package/lib/goog/events/browserfeature.js +0 -85
- package/lib/goog/events/event.js +0 -143
- package/lib/goog/events/eventid.js +0 -47
- package/lib/goog/events/events.js +0 -984
- package/lib/goog/events/eventtarget.js +0 -394
- package/lib/goog/events/eventtype.js +0 -237
- package/lib/goog/events/keycodes.js +0 -427
- package/lib/goog/events/listenable.js +0 -335
- package/lib/goog/events/listener.js +0 -131
- package/lib/goog/events/listenermap.js +0 -308
- package/lib/goog/fs/url.js +0 -109
- package/lib/goog/functions/functions.js +0 -442
- package/lib/goog/html/safehtml.js +0 -757
- package/lib/goog/html/safescript.js +0 -234
- package/lib/goog/html/safestyle.js +0 -442
- package/lib/goog/html/safestylesheet.js +0 -276
- package/lib/goog/html/safeurl.js +0 -398
- package/lib/goog/html/trustedresourceurl.js +0 -224
- package/lib/goog/html/uncheckedconversions.js +0 -232
- package/lib/goog/i18n/bidi.js +0 -908
- package/lib/goog/iter/iter.js +0 -1302
- package/lib/goog/json/json.js +0 -363
- package/lib/goog/labs/testing/assertthat.js +0 -58
- package/lib/goog/labs/testing/logicmatcher.js +0 -212
- package/lib/goog/labs/testing/matcher.js +0 -80
- package/lib/goog/labs/testing/numbermatcher.js +0 -346
- package/lib/goog/labs/testing/objectmatcher.js +0 -317
- package/lib/goog/labs/testing/stringmatcher.js +0 -415
- package/lib/goog/labs/useragent/browser.js +0 -341
- package/lib/goog/labs/useragent/engine.js +0 -160
- package/lib/goog/labs/useragent/platform.js +0 -160
- package/lib/goog/labs/useragent/util.js +0 -148
- package/lib/goog/log/log.js +0 -197
- package/lib/goog/math/box.js +0 -398
- package/lib/goog/math/coordinate.js +0 -268
- package/lib/goog/math/math.js +0 -451
- package/lib/goog/math/rect.js +0 -476
- package/lib/goog/math/size.js +0 -227
- package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
- package/lib/goog/net/xhrlike.js +0 -124
- package/lib/goog/net/xmlhttp.js +0 -246
- package/lib/goog/net/xmlhttpfactory.js +0 -67
- package/lib/goog/object/object.js +0 -686
- package/lib/goog/promise/promise.js +0 -1350
- package/lib/goog/promise/resolver.js +0 -48
- package/lib/goog/promise/thenable.js +0 -126
- package/lib/goog/reflect/reflect.js +0 -77
- package/lib/goog/string/const.js +0 -182
- package/lib/goog/string/string.js +0 -1599
- package/lib/goog/string/typedstring.js +0 -48
- package/lib/goog/structs/collection.js +0 -56
- package/lib/goog/structs/map.js +0 -457
- package/lib/goog/structs/set.js +0 -279
- package/lib/goog/structs/structs.js +0 -354
- package/lib/goog/style/style.js +0 -2037
- package/lib/goog/testing/asserts.js +0 -1278
- package/lib/goog/testing/events/events.js +0 -767
- package/lib/goog/testing/functionmock.js +0 -175
- package/lib/goog/testing/jsunit.js +0 -162
- package/lib/goog/testing/loosemock.js +0 -242
- package/lib/goog/testing/mock.js +0 -645
- package/lib/goog/testing/mockclock.js +0 -606
- package/lib/goog/testing/mockcontrol.js +0 -220
- package/lib/goog/testing/mockinterface.js +0 -45
- package/lib/goog/testing/mockmatchers.js +0 -400
- package/lib/goog/testing/objectpropertystring.js +0 -68
- package/lib/goog/testing/propertyreplacer.js +0 -262
- package/lib/goog/testing/recordfunction.js +0 -215
- package/lib/goog/testing/stacktrace.js +0 -594
- package/lib/goog/testing/strictmock.js +0 -130
- package/lib/goog/testing/testcase.js +0 -1629
- package/lib/goog/testing/testrunner.js +0 -440
- package/lib/goog/uri/uri.js +0 -1524
- package/lib/goog/uri/utils.js +0 -1064
- package/lib/goog/useragent/product.js +0 -183
- package/lib/goog/useragent/product_isversion.js +0 -144
- package/lib/goog/useragent/useragent.js +0 -572
- package/lib/webdriver/actionsequence.js +0 -356
- package/lib/webdriver/builder.js +0 -207
- package/lib/webdriver/capabilities.js +0 -412
- package/lib/webdriver/events.js +0 -179
- package/lib/webdriver/firefoxdomexecutor.js +0 -175
- package/lib/webdriver/http/corsclient.js +0 -133
- package/lib/webdriver/http/http.js +0 -525
- package/lib/webdriver/http/xhrclient.js +0 -67
- package/lib/webdriver/locators.js +0 -257
- package/lib/webdriver/logging.js +0 -347
- package/lib/webdriver/session.js +0 -74
- package/lib/webdriver/stacktrace.js +0 -619
- package/lib/webdriver/test/builder_test.js +0 -53
- package/lib/webdriver/test/capabilities_test.js +0 -72
- package/lib/webdriver/test/events_test.js +0 -203
- package/lib/webdriver/test/http/corsclient_test.js +0 -151
- package/lib/webdriver/test/http/http_test.js +0 -428
- package/lib/webdriver/test/http/xhrclient_test.js +0 -196
- package/lib/webdriver/test/locators_test.js +0 -59
- package/lib/webdriver/test/logging_test.js +0 -85
- package/lib/webdriver/test/promise_error_test.js +0 -892
- package/lib/webdriver/test/promise_flow_test.js +0 -2365
- package/lib/webdriver/test/promise_generator_test.js +0 -323
- package/lib/webdriver/test/promise_test.js +0 -2012
- package/lib/webdriver/test/stacktrace_test.js +0 -480
- package/lib/webdriver/test/test_bootstrap.js +0 -67
- package/lib/webdriver/test/testing/asserts_test.js +0 -117
- package/lib/webdriver/test/testing/client_test.js +0 -88
- package/lib/webdriver/test/testing/testcase_test.js +0 -229
- package/lib/webdriver/test/testutil.js +0 -209
- package/lib/webdriver/test/testutil_test.js +0 -104
- package/lib/webdriver/test/until_test.js +0 -411
- package/lib/webdriver/test/webdriver_generator_test.js +0 -92
- package/lib/webdriver/test/webdriver_test.js +0 -2369
- package/lib/webdriver/testing/asserts.js +0 -487
- package/lib/webdriver/testing/client.js +0 -179
- package/lib/webdriver/testing/jsunit.js +0 -363
- package/lib/webdriver/testing/testcase.js +0 -168
- package/lib/webdriver/testing/window.js +0 -244
- package/lib/webdriver/touchsequence.js +0 -248
- package/lib/webdriver/until.js +0 -412
- package/lib/webdriver/webdriver.js +0 -2511
- package/test/_base_test.js +0 -129
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>mock.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/testing/mock.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2008 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview This file defines base classes used for creating mocks in<tr><td><a id="l17"></a><a href="#l17">17</a><td> * JavaScript. The API was inspired by EasyMock.<tr><td><a id="l18"></a><a href="#l18">18</a><td> *<tr><td><a id="l19"></a><a href="#l19">19</a><td> * The basic API is:<tr><td><a id="l20"></a><a href="#l20">20</a><td> * <ul><tr><td><a id="l21"></a><a href="#l21">21</a><td> * <li>Create an object to be mocked<tr><td><a id="l22"></a><a href="#l22">22</a><td> * <li>Create a mock object, passing in the above object to the constructor<tr><td><a id="l23"></a><a href="#l23">23</a><td> * <li>Set expectations by calling methods on the mock object<tr><td><a id="l24"></a><a href="#l24">24</a><td> * <li>Call $replay() on the mock object<tr><td><a id="l25"></a><a href="#l25">25</a><td> * <li>Pass the mock to code that will make real calls on it<tr><td><a id="l26"></a><a href="#l26">26</a><td> * <li>Call $verify() to make sure that expectations were met<tr><td><a id="l27"></a><a href="#l27">27</a><td> * </ul><tr><td><a id="l28"></a><a href="#l28">28</a><td> *<tr><td><a id="l29"></a><a href="#l29">29</a><td> * For examples, please see the unit tests for LooseMock and StrictMock.<tr><td><a id="l30"></a><a href="#l30">30</a><td> *<tr><td><a id="l31"></a><a href="#l31">31</a><td> * Still TODO<tr><td><a id="l32"></a><a href="#l32">32</a><td> * implement better (and pluggable) argument matching<tr><td><a id="l33"></a><a href="#l33">33</a><td> * Have the exceptions for LooseMock show the number of expected/actual calls<tr><td><a id="l34"></a><a href="#l34">34</a><td> * loose and strict mocks share a lot of code - move it to the base class<tr><td><a id="l35"></a><a href="#l35">35</a><td> *<tr><td><a id="l36"></a><a href="#l36">36</a><td> */<tr><td><a id="l37"></a><a href="#l37">37</a><td><tr><td><a id="l38"></a><a href="#l38">38</a><td>goog.provide('goog.testing.Mock');<tr><td><a id="l39"></a><a href="#l39">39</a><td>goog.provide('goog.testing.MockExpectation');<tr><td><a id="l40"></a><a href="#l40">40</a><td><tr><td><a id="l41"></a><a href="#l41">41</a><td>goog.require('goog.array');<tr><td><a id="l42"></a><a href="#l42">42</a><td>goog.require('goog.object');<tr><td><a id="l43"></a><a href="#l43">43</a><td>goog.require('goog.testing.JsUnitException');<tr><td><a id="l44"></a><a href="#l44">44</a><td>goog.require('goog.testing.MockInterface');<tr><td><a id="l45"></a><a href="#l45">45</a><td>goog.require('goog.testing.mockmatchers');<tr><td><a id="l46"></a><a href="#l46">46</a><td><tr><td><a id="l47"></a><a href="#l47">47</a><td><tr><td><a id="l48"></a><a href="#l48">48</a><td><tr><td><a id="l49"></a><a href="#l49">49</a><td>/**<tr><td><a id="l50"></a><a href="#l50">50</a><td> * This is a class that represents an expectation.<tr><td><a id="l51"></a><a href="#l51">51</a><td> * @param {string} name The name of the method for this expectation.<tr><td><a id="l52"></a><a href="#l52">52</a><td> * @constructor<tr><td><a id="l53"></a><a href="#l53">53</a><td> * @final<tr><td><a id="l54"></a><a href="#l54">54</a><td> */<tr><td><a id="l55"></a><a href="#l55">55</a><td>goog.testing.MockExpectation = function(name) {<tr><td><a id="l56"></a><a href="#l56">56</a><td> /**<tr><td><a id="l57"></a><a href="#l57">57</a><td> * The name of the method that is expected to be called.<tr><td><a id="l58"></a><a href="#l58">58</a><td> * @type {string}<tr><td><a id="l59"></a><a href="#l59">59</a><td> */<tr><td><a id="l60"></a><a href="#l60">60</a><td> this.name = name;<tr><td><a id="l61"></a><a href="#l61">61</a><td><tr><td><a id="l62"></a><a href="#l62">62</a><td> /**<tr><td><a id="l63"></a><a href="#l63">63</a><td> * An array of error messages for expectations not met.<tr><td><a id="l64"></a><a href="#l64">64</a><td> * @type {Array<string>}<tr><td><a id="l65"></a><a href="#l65">65</a><td> */<tr><td><a id="l66"></a><a href="#l66">66</a><td> this.errorMessages = [];<tr><td><a id="l67"></a><a href="#l67">67</a><td>};<tr><td><a id="l68"></a><a href="#l68">68</a><td><tr><td><a id="l69"></a><a href="#l69">69</a><td><tr><td><a id="l70"></a><a href="#l70">70</a><td>/**<tr><td><a id="l71"></a><a href="#l71">71</a><td> * The minimum number of times this method should be called.<tr><td><a id="l72"></a><a href="#l72">72</a><td> * @type {number}<tr><td><a id="l73"></a><a href="#l73">73</a><td> */<tr><td><a id="l74"></a><a href="#l74">74</a><td>goog.testing.MockExpectation.prototype.minCalls = 1;<tr><td><a id="l75"></a><a href="#l75">75</a><td><tr><td><a id="l76"></a><a href="#l76">76</a><td><tr><td><a id="l77"></a><a href="#l77">77</a><td>/**<tr><td><a id="l78"></a><a href="#l78">78</a><td> * The maximum number of times this method should be called.<tr><td><a id="l79"></a><a href="#l79">79</a><td> * @type {number}<tr><td><a id="l80"></a><a href="#l80">80</a><td> */<tr><td><a id="l81"></a><a href="#l81">81</a><td>goog.testing.MockExpectation.prototype.maxCalls = 1;<tr><td><a id="l82"></a><a href="#l82">82</a><td><tr><td><a id="l83"></a><a href="#l83">83</a><td><tr><td><a id="l84"></a><a href="#l84">84</a><td>/**<tr><td><a id="l85"></a><a href="#l85">85</a><td> * The value that this method should return.<tr><td><a id="l86"></a><a href="#l86">86</a><td> * @type {*}<tr><td><a id="l87"></a><a href="#l87">87</a><td> */<tr><td><a id="l88"></a><a href="#l88">88</a><td>goog.testing.MockExpectation.prototype.returnValue;<tr><td><a id="l89"></a><a href="#l89">89</a><td><tr><td><a id="l90"></a><a href="#l90">90</a><td><tr><td><a id="l91"></a><a href="#l91">91</a><td>/**<tr><td><a id="l92"></a><a href="#l92">92</a><td> * The value that will be thrown when the method is called<tr><td><a id="l93"></a><a href="#l93">93</a><td> * @type {*}<tr><td><a id="l94"></a><a href="#l94">94</a><td> */<tr><td><a id="l95"></a><a href="#l95">95</a><td>goog.testing.MockExpectation.prototype.exceptionToThrow;<tr><td><a id="l96"></a><a href="#l96">96</a><td><tr><td><a id="l97"></a><a href="#l97">97</a><td><tr><td><a id="l98"></a><a href="#l98">98</a><td>/**<tr><td><a id="l99"></a><a href="#l99">99</a><td> * The arguments that are expected to be passed to this function<tr><td><a id="l100"></a><a href="#l100">100</a><td> * @type {Array<*>}<tr><td><a id="l101"></a><a href="#l101">101</a><td> */<tr><td><a id="l102"></a><a href="#l102">102</a><td>goog.testing.MockExpectation.prototype.argumentList;<tr><td><a id="l103"></a><a href="#l103">103</a><td><tr><td><a id="l104"></a><a href="#l104">104</a><td><tr><td><a id="l105"></a><a href="#l105">105</a><td>/**<tr><td><a id="l106"></a><a href="#l106">106</a><td> * The number of times this method is called by real code.<tr><td><a id="l107"></a><a href="#l107">107</a><td> * @type {number}<tr><td><a id="l108"></a><a href="#l108">108</a><td> */<tr><td><a id="l109"></a><a href="#l109">109</a><td>goog.testing.MockExpectation.prototype.actualCalls = 0;<tr><td><a id="l110"></a><a href="#l110">110</a><td><tr><td><a id="l111"></a><a href="#l111">111</a><td><tr><td><a id="l112"></a><a href="#l112">112</a><td>/**<tr><td><a id="l113"></a><a href="#l113">113</a><td> * The number of times this method is called during the verification phase.<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @type {number}<tr><td><a id="l115"></a><a href="#l115">115</a><td> */<tr><td><a id="l116"></a><a href="#l116">116</a><td>goog.testing.MockExpectation.prototype.verificationCalls = 0;<tr><td><a id="l117"></a><a href="#l117">117</a><td><tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td>/**<tr><td><a id="l120"></a><a href="#l120">120</a><td> * The function which will be executed when this method is called.<tr><td><a id="l121"></a><a href="#l121">121</a><td> * Method arguments will be passed to this function, and return value<tr><td><a id="l122"></a><a href="#l122">122</a><td> * of this function will be returned by the method.<tr><td><a id="l123"></a><a href="#l123">123</a><td> * @type {Function}<tr><td><a id="l124"></a><a href="#l124">124</a><td> */<tr><td><a id="l125"></a><a href="#l125">125</a><td>goog.testing.MockExpectation.prototype.toDo;<tr><td><a id="l126"></a><a href="#l126">126</a><td><tr><td><a id="l127"></a><a href="#l127">127</a><td><tr><td><a id="l128"></a><a href="#l128">128</a><td>/**<tr><td><a id="l129"></a><a href="#l129">129</a><td> * Allow expectation failures to include messages.<tr><td><a id="l130"></a><a href="#l130">130</a><td> * @param {string} message The failure message.<tr><td><a id="l131"></a><a href="#l131">131</a><td> */<tr><td><a id="l132"></a><a href="#l132">132</a><td>goog.testing.MockExpectation.prototype.addErrorMessage = function(message) {<tr><td><a id="l133"></a><a href="#l133">133</a><td> this.errorMessages.push(message);<tr><td><a id="l134"></a><a href="#l134">134</a><td>};<tr><td><a id="l135"></a><a href="#l135">135</a><td><tr><td><a id="l136"></a><a href="#l136">136</a><td><tr><td><a id="l137"></a><a href="#l137">137</a><td>/**<tr><td><a id="l138"></a><a href="#l138">138</a><td> * Get the error messages seen so far.<tr><td><a id="l139"></a><a href="#l139">139</a><td> * @return {string} Error messages separated by \n.<tr><td><a id="l140"></a><a href="#l140">140</a><td> */<tr><td><a id="l141"></a><a href="#l141">141</a><td>goog.testing.MockExpectation.prototype.getErrorMessage = function() {<tr><td><a id="l142"></a><a href="#l142">142</a><td> return this.errorMessages.join('\n');<tr><td><a id="l143"></a><a href="#l143">143</a><td>};<tr><td><a id="l144"></a><a href="#l144">144</a><td><tr><td><a id="l145"></a><a href="#l145">145</a><td><tr><td><a id="l146"></a><a href="#l146">146</a><td>/**<tr><td><a id="l147"></a><a href="#l147">147</a><td> * Get how many error messages have been seen so far.<tr><td><a id="l148"></a><a href="#l148">148</a><td> * @return {number} Count of error messages.<tr><td><a id="l149"></a><a href="#l149">149</a><td> */<tr><td><a id="l150"></a><a href="#l150">150</a><td>goog.testing.MockExpectation.prototype.getErrorMessageCount = function() {<tr><td><a id="l151"></a><a href="#l151">151</a><td> return this.errorMessages.length;<tr><td><a id="l152"></a><a href="#l152">152</a><td>};<tr><td><a id="l153"></a><a href="#l153">153</a><td><tr><td><a id="l154"></a><a href="#l154">154</a><td><tr><td><a id="l155"></a><a href="#l155">155</a><td><tr><td><a id="l156"></a><a href="#l156">156</a><td>/**<tr><td><a id="l157"></a><a href="#l157">157</a><td> * The base class for a mock object.<tr><td><a id="l158"></a><a href="#l158">158</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a id="l159"></a><a href="#l159">159</a><td> * the constructor of an object to mock.<tr><td><a id="l160"></a><a href="#l160">160</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a id="l161"></a><a href="#l161">161</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a id="l162"></a><a href="#l162">162</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a id="l163"></a><a href="#l163">163</a><td> * a proxy for the target mock should be created.<tr><td><a id="l164"></a><a href="#l164">164</a><td> * @constructor<tr><td><a id="l165"></a><a href="#l165">165</a><td> * @implements {goog.testing.MockInterface}<tr><td><a id="l166"></a><a href="#l166">166</a><td> */<tr><td><a id="l167"></a><a href="#l167">167</a><td>goog.testing.Mock = function(objectToMock, opt_mockStaticMethods,<tr><td><a id="l168"></a><a href="#l168">168</a><td> opt_createProxy) {<tr><td><a id="l169"></a><a href="#l169">169</a><td> if (!goog.isObject(objectToMock) && !goog.isFunction(objectToMock)) {<tr><td><a id="l170"></a><a href="#l170">170</a><td> throw new Error('objectToMock must be an object or constructor.');<tr><td><a id="l171"></a><a href="#l171">171</a><td> }<tr><td><a id="l172"></a><a href="#l172">172</a><td> if (opt_createProxy && !opt_mockStaticMethods &&<tr><td><a id="l173"></a><a href="#l173">173</a><td> goog.isFunction(objectToMock)) {<tr><td><a id="l174"></a><a href="#l174">174</a><td> /**<tr><td><a id="l175"></a><a href="#l175">175</a><td> * @constructor<tr><td><a id="l176"></a><a href="#l176">176</a><td> * @final<tr><td><a id="l177"></a><a href="#l177">177</a><td> */<tr><td><a id="l178"></a><a href="#l178">178</a><td> var tempCtor = function() {};<tr><td><a id="l179"></a><a href="#l179">179</a><td> goog.inherits(tempCtor, objectToMock);<tr><td><a id="l180"></a><a href="#l180">180</a><td> this.$proxy = new tempCtor();<tr><td><a id="l181"></a><a href="#l181">181</a><td> } else if (opt_createProxy && opt_mockStaticMethods &&<tr><td><a id="l182"></a><a href="#l182">182</a><td> goog.isFunction(objectToMock)) {<tr><td><a id="l183"></a><a href="#l183">183</a><td> throw Error('Cannot create a proxy when opt_mockStaticMethods is true');<tr><td><a id="l184"></a><a href="#l184">184</a><td> } else if (opt_createProxy && !goog.isFunction(objectToMock)) {<tr><td><a id="l185"></a><a href="#l185">185</a><td> throw Error('Must have a constructor to create a proxy');<tr><td><a id="l186"></a><a href="#l186">186</a><td> }<tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td> if (goog.isFunction(objectToMock) && !opt_mockStaticMethods) {<tr><td><a id="l189"></a><a href="#l189">189</a><td> this.$initializeFunctions_(objectToMock.prototype);<tr><td><a id="l190"></a><a href="#l190">190</a><td> } else {<tr><td><a id="l191"></a><a href="#l191">191</a><td> this.$initializeFunctions_(objectToMock);<tr><td><a id="l192"></a><a href="#l192">192</a><td> }<tr><td><a id="l193"></a><a href="#l193">193</a><td> this.$argumentListVerifiers_ = {};<tr><td><a id="l194"></a><a href="#l194">194</a><td>};<tr><td><a id="l195"></a><a href="#l195">195</a><td><tr><td><a id="l196"></a><a href="#l196">196</a><td><tr><td><a id="l197"></a><a href="#l197">197</a><td>/**<tr><td><a id="l198"></a><a href="#l198">198</a><td> * Option that may be passed when constructing function, method, and<tr><td><a id="l199"></a><a href="#l199">199</a><td> * constructor mocks. Indicates that the expected calls should be accepted in<tr><td><a id="l200"></a><a href="#l200">200</a><td> * any order.<tr><td><a id="l201"></a><a href="#l201">201</a><td> * @const<tr><td><a id="l202"></a><a href="#l202">202</a><td> * @type {number}<tr><td><a id="l203"></a><a href="#l203">203</a><td> */<tr><td><a id="l204"></a><a href="#l204">204</a><td>goog.testing.Mock.LOOSE = 1;<tr><td><a id="l205"></a><a href="#l205">205</a><td><tr><td><a id="l206"></a><a href="#l206">206</a><td><tr><td><a id="l207"></a><a href="#l207">207</a><td>/**<tr><td><a id="l208"></a><a href="#l208">208</a><td> * Option that may be passed when constructing function, method, and<tr><td><a id="l209"></a><a href="#l209">209</a><td> * constructor mocks. Indicates that the expected calls should be accepted in<tr><td><a id="l210"></a><a href="#l210">210</a><td> * the recorded order only.<tr><td><a id="l211"></a><a href="#l211">211</a><td> * @const<tr><td><a id="l212"></a><a href="#l212">212</a><td> * @type {number}<tr><td><a id="l213"></a><a href="#l213">213</a><td> */<tr><td><a id="l214"></a><a href="#l214">214</a><td>goog.testing.Mock.STRICT = 0;<tr><td><a id="l215"></a><a href="#l215">215</a><td><tr><td><a id="l216"></a><a href="#l216">216</a><td><tr><td><a id="l217"></a><a href="#l217">217</a><td>/**<tr><td><a id="l218"></a><a href="#l218">218</a><td> * This array contains the name of the functions that are part of the base<tr><td><a id="l219"></a><a href="#l219">219</a><td> * Object prototype.<tr><td><a id="l220"></a><a href="#l220">220</a><td> * Basically a copy of goog.object.PROTOTYPE_FIELDS_.<tr><td><a id="l221"></a><a href="#l221">221</a><td> * @const<tr><td><a id="l222"></a><a href="#l222">222</a><td> * @type {!Array<string>}<tr><td><a id="l223"></a><a href="#l223">223</a><td> * @private<tr><td><a id="l224"></a><a href="#l224">224</a><td> */<tr><td><a id="l225"></a><a href="#l225">225</a><td>goog.testing.Mock.PROTOTYPE_FIELDS_ = [<tr><td><a id="l226"></a><a href="#l226">226</a><td> 'constructor',<tr><td><a id="l227"></a><a href="#l227">227</a><td> 'hasOwnProperty',<tr><td><a id="l228"></a><a href="#l228">228</a><td> 'isPrototypeOf',<tr><td><a id="l229"></a><a href="#l229">229</a><td> 'propertyIsEnumerable',<tr><td><a id="l230"></a><a href="#l230">230</a><td> 'toLocaleString',<tr><td><a id="l231"></a><a href="#l231">231</a><td> 'toString',<tr><td><a id="l232"></a><a href="#l232">232</a><td> 'valueOf'<tr><td><a id="l233"></a><a href="#l233">233</a><td>];<tr><td><a id="l234"></a><a href="#l234">234</a><td><tr><td><a id="l235"></a><a href="#l235">235</a><td><tr><td><a id="l236"></a><a href="#l236">236</a><td>/**<tr><td><a id="l237"></a><a href="#l237">237</a><td> * A proxy for the mock. This can be used for dependency injection in lieu of<tr><td><a id="l238"></a><a href="#l238">238</a><td> * the mock if the test requires a strict instanceof check.<tr><td><a id="l239"></a><a href="#l239">239</a><td> * @type {Object}<tr><td><a id="l240"></a><a href="#l240">240</a><td> */<tr><td><a id="l241"></a><a href="#l241">241</a><td>goog.testing.Mock.prototype.$proxy = null;<tr><td><a id="l242"></a><a href="#l242">242</a><td><tr><td><a id="l243"></a><a href="#l243">243</a><td><tr><td><a id="l244"></a><a href="#l244">244</a><td>/**<tr><td><a id="l245"></a><a href="#l245">245</a><td> * Map of argument name to optional argument list verifier function.<tr><td><a id="l246"></a><a href="#l246">246</a><td> * @type {Object}<tr><td><a id="l247"></a><a href="#l247">247</a><td> */<tr><td><a id="l248"></a><a href="#l248">248</a><td>goog.testing.Mock.prototype.$argumentListVerifiers_;<tr><td><a id="l249"></a><a href="#l249">249</a><td><tr><td><a id="l250"></a><a href="#l250">250</a><td><tr><td><a id="l251"></a><a href="#l251">251</a><td>/**<tr><td><a id="l252"></a><a href="#l252">252</a><td> * Whether or not we are in recording mode.<tr><td><a id="l253"></a><a href="#l253">253</a><td> * @type {boolean}<tr><td><a id="l254"></a><a href="#l254">254</a><td> * @private<tr><td><a id="l255"></a><a href="#l255">255</a><td> */<tr><td><a id="l256"></a><a href="#l256">256</a><td>goog.testing.Mock.prototype.$recording_ = true;<tr><td><a id="l257"></a><a href="#l257">257</a><td><tr><td><a id="l258"></a><a href="#l258">258</a><td><tr><td><a id="l259"></a><a href="#l259">259</a><td>/**<tr><td><a id="l260"></a><a href="#l260">260</a><td> * The expectation currently being created. All methods that modify the<tr><td><a id="l261"></a><a href="#l261">261</a><td> * current expectation return the Mock object for easy chaining, so this is<tr><td><a id="l262"></a><a href="#l262">262</a><td> * where we keep track of the expectation that's currently being modified.<tr><td><a id="l263"></a><a href="#l263">263</a><td> * @type {goog.testing.MockExpectation}<tr><td><a id="l264"></a><a href="#l264">264</a><td> * @protected<tr><td><a id="l265"></a><a href="#l265">265</a><td> */<tr><td><a id="l266"></a><a href="#l266">266</a><td>goog.testing.Mock.prototype.$pendingExpectation;<tr><td><a id="l267"></a><a href="#l267">267</a><td><tr><td><a id="l268"></a><a href="#l268">268</a><td><tr><td><a id="l269"></a><a href="#l269">269</a><td>/**<tr><td><a id="l270"></a><a href="#l270">270</a><td> * First exception thrown by this mock; used in $verify.<tr><td><a id="l271"></a><a href="#l271">271</a><td> * @type {Object}<tr><td><a id="l272"></a><a href="#l272">272</a><td> * @private<tr><td><a id="l273"></a><a href="#l273">273</a><td> */<tr><td><a id="l274"></a><a href="#l274">274</a><td>goog.testing.Mock.prototype.$threwException_ = null;<tr><td><a id="l275"></a><a href="#l275">275</a><td><tr><td><a id="l276"></a><a href="#l276">276</a><td><tr><td><a id="l277"></a><a href="#l277">277</a><td>/**<tr><td><a id="l278"></a><a href="#l278">278</a><td> * Initializes the functions on the mock object.<tr><td><a id="l279"></a><a href="#l279">279</a><td> * @param {Object} objectToMock The object being mocked.<tr><td><a id="l280"></a><a href="#l280">280</a><td> * @private<tr><td><a id="l281"></a><a href="#l281">281</a><td> */<tr><td><a id="l282"></a><a href="#l282">282</a><td>goog.testing.Mock.prototype.$initializeFunctions_ = function(objectToMock) {<tr><td><a id="l283"></a><a href="#l283">283</a><td> // Gets the object properties.<tr><td><a id="l284"></a><a href="#l284">284</a><td> var enumerableProperties = goog.object.getKeys(objectToMock);<tr><td><a id="l285"></a><a href="#l285">285</a><td><tr><td><a id="l286"></a><a href="#l286">286</a><td> // The non enumerable properties are added if they override the ones in the<tr><td><a id="l287"></a><a href="#l287">287</a><td> // Object prototype. This is due to the fact that IE8 does not enumerate any<tr><td><a id="l288"></a><a href="#l288">288</a><td> // of the prototype Object functions even when overriden and mocking these is<tr><td><a id="l289"></a><a href="#l289">289</a><td> // sometimes needed.<tr><td><a id="l290"></a><a href="#l290">290</a><td> for (var i = 0; i < goog.testing.Mock.PROTOTYPE_FIELDS_.length; i++) {<tr><td><a id="l291"></a><a href="#l291">291</a><td> var prop = goog.testing.Mock.PROTOTYPE_FIELDS_[i];<tr><td><a id="l292"></a><a href="#l292">292</a><td> // Look at b/6758711 if you're considering adding ALL properties to ALL<tr><td><a id="l293"></a><a href="#l293">293</a><td> // mocks.<tr><td><a id="l294"></a><a href="#l294">294</a><td> if (objectToMock[prop] !== Object.prototype[prop]) {<tr><td><a id="l295"></a><a href="#l295">295</a><td> enumerableProperties.push(prop);<tr><td><a id="l296"></a><a href="#l296">296</a><td> }<tr><td><a id="l297"></a><a href="#l297">297</a><td> }<tr><td><a id="l298"></a><a href="#l298">298</a><td><tr><td><a id="l299"></a><a href="#l299">299</a><td> // Adds the properties to the mock.<tr><td><a id="l300"></a><a href="#l300">300</a><td> for (var i = 0; i < enumerableProperties.length; i++) {<tr><td><a id="l301"></a><a href="#l301">301</a><td> var prop = enumerableProperties[i];<tr><td><a id="l302"></a><a href="#l302">302</a><td> if (typeof objectToMock[prop] == 'function') {<tr><td><a id="l303"></a><a href="#l303">303</a><td> this[prop] = goog.bind(this.$mockMethod, this, prop);<tr><td><a id="l304"></a><a href="#l304">304</a><td> if (this.$proxy) {<tr><td><a id="l305"></a><a href="#l305">305</a><td> this.$proxy[prop] = goog.bind(this.$mockMethod, this, prop);<tr><td><a id="l306"></a><a href="#l306">306</a><td> }<tr><td><a id="l307"></a><a href="#l307">307</a><td> }<tr><td><a id="l308"></a><a href="#l308">308</a><td> }<tr><td><a id="l309"></a><a href="#l309">309</a><td>};<tr><td><a id="l310"></a><a href="#l310">310</a><td><tr><td><a id="l311"></a><a href="#l311">311</a><td><tr><td><a id="l312"></a><a href="#l312">312</a><td>/**<tr><td><a id="l313"></a><a href="#l313">313</a><td> * Registers a verifier function to use when verifying method argument lists.<tr><td><a id="l314"></a><a href="#l314">314</a><td> * @param {string} methodName The name of the method for which the verifierFn<tr><td><a id="l315"></a><a href="#l315">315</a><td> * should be used.<tr><td><a id="l316"></a><a href="#l316">316</a><td> * @param {Function} fn Argument list verifier function. Should take 2 argument<tr><td><a id="l317"></a><a href="#l317">317</a><td> * arrays as arguments, and return true if they are considered equivalent.<tr><td><a id="l318"></a><a href="#l318">318</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l319"></a><a href="#l319">319</a><td> */<tr><td><a id="l320"></a><a href="#l320">320</a><td>goog.testing.Mock.prototype.$registerArgumentListVerifier = function(methodName,<tr><td><a id="l321"></a><a href="#l321">321</a><td> fn) {<tr><td><a id="l322"></a><a href="#l322">322</a><td> this.$argumentListVerifiers_[methodName] = fn;<tr><td><a id="l323"></a><a href="#l323">323</a><td> return this;<tr><td><a id="l324"></a><a href="#l324">324</a><td>};<tr><td><a id="l325"></a><a href="#l325">325</a><td><tr><td><a id="l326"></a><a href="#l326">326</a><td><tr><td><a id="l327"></a><a href="#l327">327</a><td>/**<tr><td><a id="l328"></a><a href="#l328">328</a><td> * The function that replaces all methods on the mock object.<tr><td><a id="l329"></a><a href="#l329">329</a><td> * @param {string} name The name of the method being mocked.<tr><td><a id="l330"></a><a href="#l330">330</a><td> * @return {*} In record mode, returns the mock object. In replay mode, returns<tr><td><a id="l331"></a><a href="#l331">331</a><td> * whatever the creator of the mock set as the return value.<tr><td><a id="l332"></a><a href="#l332">332</a><td> */<tr><td><a id="l333"></a><a href="#l333">333</a><td>goog.testing.Mock.prototype.$mockMethod = function(name) {<tr><td><a id="l334"></a><a href="#l334">334</a><td> try {<tr><td><a id="l335"></a><a href="#l335">335</a><td> // Shift off the name argument so that args contains the arguments to<tr><td><a id="l336"></a><a href="#l336">336</a><td> // the mocked method.<tr><td><a id="l337"></a><a href="#l337">337</a><td> var args = goog.array.slice(arguments, 1);<tr><td><a id="l338"></a><a href="#l338">338</a><td> if (this.$recording_) {<tr><td><a id="l339"></a><a href="#l339">339</a><td> this.$pendingExpectation = new goog.testing.MockExpectation(name);<tr><td><a id="l340"></a><a href="#l340">340</a><td> this.$pendingExpectation.argumentList = args;<tr><td><a id="l341"></a><a href="#l341">341</a><td> this.$recordExpectation();<tr><td><a id="l342"></a><a href="#l342">342</a><td> return this;<tr><td><a id="l343"></a><a href="#l343">343</a><td> } else {<tr><td><a id="l344"></a><a href="#l344">344</a><td> return this.$recordCall(name, args);<tr><td><a id="l345"></a><a href="#l345">345</a><td> }<tr><td><a id="l346"></a><a href="#l346">346</a><td> } catch (ex) {<tr><td><a id="l347"></a><a href="#l347">347</a><td> this.$recordAndThrow(ex);<tr><td><a id="l348"></a><a href="#l348">348</a><td> }<tr><td><a id="l349"></a><a href="#l349">349</a><td>};<tr><td><a id="l350"></a><a href="#l350">350</a><td><tr><td><a id="l351"></a><a href="#l351">351</a><td><tr><td><a id="l352"></a><a href="#l352">352</a><td>/**<tr><td><a id="l353"></a><a href="#l353">353</a><td> * Records the currently pending expectation, intended to be overridden by a<tr><td><a id="l354"></a><a href="#l354">354</a><td> * subclass.<tr><td><a id="l355"></a><a href="#l355">355</a><td> * @protected<tr><td><a id="l356"></a><a href="#l356">356</a><td> */<tr><td><a id="l357"></a><a href="#l357">357</a><td>goog.testing.Mock.prototype.$recordExpectation = function() {};<tr><td><a id="l358"></a><a href="#l358">358</a><td><tr><td><a id="l359"></a><a href="#l359">359</a><td><tr><td><a id="l360"></a><a href="#l360">360</a><td>/**<tr><td><a id="l361"></a><a href="#l361">361</a><td> * Records an actual method call, intended to be overridden by a<tr><td><a id="l362"></a><a href="#l362">362</a><td> * subclass. The subclass must find the pending expectation and return the<tr><td><a id="l363"></a><a href="#l363">363</a><td> * correct value.<tr><td><a id="l364"></a><a href="#l364">364</a><td> * @param {string} name The name of the method being called.<tr><td><a id="l365"></a><a href="#l365">365</a><td> * @param {Array<?>} args The arguments to the method.<tr><td><a id="l366"></a><a href="#l366">366</a><td> * @return {*} The return expected by the mock.<tr><td><a id="l367"></a><a href="#l367">367</a><td> * @protected<tr><td><a id="l368"></a><a href="#l368">368</a><td> */<tr><td><a id="l369"></a><a href="#l369">369</a><td>goog.testing.Mock.prototype.$recordCall = function(name, args) {<tr><td><a id="l370"></a><a href="#l370">370</a><td> return undefined;<tr><td><a id="l371"></a><a href="#l371">371</a><td>};<tr><td><a id="l372"></a><a href="#l372">372</a><td><tr><td><a id="l373"></a><a href="#l373">373</a><td><tr><td><a id="l374"></a><a href="#l374">374</a><td>/**<tr><td><a id="l375"></a><a href="#l375">375</a><td> * If the expectation expects to throw, this method will throw.<tr><td><a id="l376"></a><a href="#l376">376</a><td> * @param {goog.testing.MockExpectation} expectation The expectation.<tr><td><a id="l377"></a><a href="#l377">377</a><td> */<tr><td><a id="l378"></a><a href="#l378">378</a><td>goog.testing.Mock.prototype.$maybeThrow = function(expectation) {<tr><td><a id="l379"></a><a href="#l379">379</a><td> if (typeof expectation.exceptionToThrow != 'undefined') {<tr><td><a id="l380"></a><a href="#l380">380</a><td> throw expectation.exceptionToThrow;<tr><td><a id="l381"></a><a href="#l381">381</a><td> }<tr><td><a id="l382"></a><a href="#l382">382</a><td>};<tr><td><a id="l383"></a><a href="#l383">383</a><td><tr><td><a id="l384"></a><a href="#l384">384</a><td><tr><td><a id="l385"></a><a href="#l385">385</a><td>/**<tr><td><a id="l386"></a><a href="#l386">386</a><td> * If this expectation defines a function to be called,<tr><td><a id="l387"></a><a href="#l387">387</a><td> * it will be called and its result will be returned.<tr><td><a id="l388"></a><a href="#l388">388</a><td> * Otherwise, if the expectation expects to throw, it will throw.<tr><td><a id="l389"></a><a href="#l389">389</a><td> * Otherwise, this method will return defined value.<tr><td><a id="l390"></a><a href="#l390">390</a><td> * @param {goog.testing.MockExpectation} expectation The expectation.<tr><td><a id="l391"></a><a href="#l391">391</a><td> * @param {Array<?>} args The arguments to the method.<tr><td><a id="l392"></a><a href="#l392">392</a><td> * @return {*} The return value expected by the mock.<tr><td><a id="l393"></a><a href="#l393">393</a><td> */<tr><td><a id="l394"></a><a href="#l394">394</a><td>goog.testing.Mock.prototype.$do = function(expectation, args) {<tr><td><a id="l395"></a><a href="#l395">395</a><td> if (typeof expectation.toDo == 'undefined') {<tr><td><a id="l396"></a><a href="#l396">396</a><td> this.$maybeThrow(expectation);<tr><td><a id="l397"></a><a href="#l397">397</a><td> return expectation.returnValue;<tr><td><a id="l398"></a><a href="#l398">398</a><td> } else {<tr><td><a id="l399"></a><a href="#l399">399</a><td> return expectation.toDo.apply(this, args);<tr><td><a id="l400"></a><a href="#l400">400</a><td> }<tr><td><a id="l401"></a><a href="#l401">401</a><td>};<tr><td><a id="l402"></a><a href="#l402">402</a><td><tr><td><a id="l403"></a><a href="#l403">403</a><td><tr><td><a id="l404"></a><a href="#l404">404</a><td>/**<tr><td><a id="l405"></a><a href="#l405">405</a><td> * Specifies a return value for the currently pending expectation.<tr><td><a id="l406"></a><a href="#l406">406</a><td> * @param {*} val The return value.<tr><td><a id="l407"></a><a href="#l407">407</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l408"></a><a href="#l408">408</a><td> */<tr><td><a id="l409"></a><a href="#l409">409</a><td>goog.testing.Mock.prototype.$returns = function(val) {<tr><td><a id="l410"></a><a href="#l410">410</a><td> this.$pendingExpectation.returnValue = val;<tr><td><a id="l411"></a><a href="#l411">411</a><td> return this;<tr><td><a id="l412"></a><a href="#l412">412</a><td>};<tr><td><a id="l413"></a><a href="#l413">413</a><td><tr><td><a id="l414"></a><a href="#l414">414</a><td><tr><td><a id="l415"></a><a href="#l415">415</a><td>/**<tr><td><a id="l416"></a><a href="#l416">416</a><td> * Specifies a value for the currently pending expectation to throw.<tr><td><a id="l417"></a><a href="#l417">417</a><td> * @param {*} val The value to throw.<tr><td><a id="l418"></a><a href="#l418">418</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l419"></a><a href="#l419">419</a><td> */<tr><td><a id="l420"></a><a href="#l420">420</a><td>goog.testing.Mock.prototype.$throws = function(val) {<tr><td><a id="l421"></a><a href="#l421">421</a><td> this.$pendingExpectation.exceptionToThrow = val;<tr><td><a id="l422"></a><a href="#l422">422</a><td> return this;<tr><td><a id="l423"></a><a href="#l423">423</a><td>};<tr><td><a id="l424"></a><a href="#l424">424</a><td><tr><td><a id="l425"></a><a href="#l425">425</a><td><tr><td><a id="l426"></a><a href="#l426">426</a><td>/**<tr><td><a id="l427"></a><a href="#l427">427</a><td> * Specifies a function to call for currently pending expectation.<tr><td><a id="l428"></a><a href="#l428">428</a><td> * Note, that using this method overrides declarations made<tr><td><a id="l429"></a><a href="#l429">429</a><td> * using $returns() and $throws() methods.<tr><td><a id="l430"></a><a href="#l430">430</a><td> * @param {Function} func The function to call.<tr><td><a id="l431"></a><a href="#l431">431</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l432"></a><a href="#l432">432</a><td> */<tr><td><a id="l433"></a><a href="#l433">433</a><td>goog.testing.Mock.prototype.$does = function(func) {<tr><td><a id="l434"></a><a href="#l434">434</a><td> this.$pendingExpectation.toDo = func;<tr><td><a id="l435"></a><a href="#l435">435</a><td> return this;<tr><td><a id="l436"></a><a href="#l436">436</a><td>};<tr><td><a id="l437"></a><a href="#l437">437</a><td><tr><td><a id="l438"></a><a href="#l438">438</a><td><tr><td><a id="l439"></a><a href="#l439">439</a><td>/**<tr><td><a id="l440"></a><a href="#l440">440</a><td> * Allows the expectation to be called 0 or 1 times.<tr><td><a id="l441"></a><a href="#l441">441</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l442"></a><a href="#l442">442</a><td> */<tr><td><a id="l443"></a><a href="#l443">443</a><td>goog.testing.Mock.prototype.$atMostOnce = function() {<tr><td><a id="l444"></a><a href="#l444">444</a><td> this.$pendingExpectation.minCalls = 0;<tr><td><a id="l445"></a><a href="#l445">445</a><td> this.$pendingExpectation.maxCalls = 1;<tr><td><a id="l446"></a><a href="#l446">446</a><td> return this;<tr><td><a id="l447"></a><a href="#l447">447</a><td>};<tr><td><a id="l448"></a><a href="#l448">448</a><td><tr><td><a id="l449"></a><a href="#l449">449</a><td><tr><td><a id="l450"></a><a href="#l450">450</a><td>/**<tr><td><a id="l451"></a><a href="#l451">451</a><td> * Allows the expectation to be called any number of times, as long as it's<tr><td><a id="l452"></a><a href="#l452">452</a><td> * called once.<tr><td><a id="l453"></a><a href="#l453">453</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l454"></a><a href="#l454">454</a><td> */<tr><td><a id="l455"></a><a href="#l455">455</a><td>goog.testing.Mock.prototype.$atLeastOnce = function() {<tr><td><a id="l456"></a><a href="#l456">456</a><td> this.$pendingExpectation.maxCalls = Infinity;<tr><td><a id="l457"></a><a href="#l457">457</a><td> return this;<tr><td><a id="l458"></a><a href="#l458">458</a><td>};<tr><td><a id="l459"></a><a href="#l459">459</a><td><tr><td><a id="l460"></a><a href="#l460">460</a><td><tr><td><a id="l461"></a><a href="#l461">461</a><td>/**<tr><td><a id="l462"></a><a href="#l462">462</a><td> * Allows the expectation to be called exactly once.<tr><td><a id="l463"></a><a href="#l463">463</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l464"></a><a href="#l464">464</a><td> */<tr><td><a id="l465"></a><a href="#l465">465</a><td>goog.testing.Mock.prototype.$once = function() {<tr><td><a id="l466"></a><a href="#l466">466</a><td> this.$pendingExpectation.minCalls = 1;<tr><td><a id="l467"></a><a href="#l467">467</a><td> this.$pendingExpectation.maxCalls = 1;<tr><td><a id="l468"></a><a href="#l468">468</a><td> return this;<tr><td><a id="l469"></a><a href="#l469">469</a><td>};<tr><td><a id="l470"></a><a href="#l470">470</a><td><tr><td><a id="l471"></a><a href="#l471">471</a><td><tr><td><a id="l472"></a><a href="#l472">472</a><td>/**<tr><td><a id="l473"></a><a href="#l473">473</a><td> * Disallows the expectation from being called.<tr><td><a id="l474"></a><a href="#l474">474</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l475"></a><a href="#l475">475</a><td> */<tr><td><a id="l476"></a><a href="#l476">476</a><td>goog.testing.Mock.prototype.$never = function() {<tr><td><a id="l477"></a><a href="#l477">477</a><td> this.$pendingExpectation.minCalls = 0;<tr><td><a id="l478"></a><a href="#l478">478</a><td> this.$pendingExpectation.maxCalls = 0;<tr><td><a id="l479"></a><a href="#l479">479</a><td> return this;<tr><td><a id="l480"></a><a href="#l480">480</a><td>};<tr><td><a id="l481"></a><a href="#l481">481</a><td><tr><td><a id="l482"></a><a href="#l482">482</a><td><tr><td><a id="l483"></a><a href="#l483">483</a><td>/**<tr><td><a id="l484"></a><a href="#l484">484</a><td> * Allows the expectation to be called any number of times.<tr><td><a id="l485"></a><a href="#l485">485</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l486"></a><a href="#l486">486</a><td> */<tr><td><a id="l487"></a><a href="#l487">487</a><td>goog.testing.Mock.prototype.$anyTimes = function() {<tr><td><a id="l488"></a><a href="#l488">488</a><td> this.$pendingExpectation.minCalls = 0;<tr><td><a id="l489"></a><a href="#l489">489</a><td> this.$pendingExpectation.maxCalls = Infinity;<tr><td><a id="l490"></a><a href="#l490">490</a><td> return this;<tr><td><a id="l491"></a><a href="#l491">491</a><td>};<tr><td><a id="l492"></a><a href="#l492">492</a><td><tr><td><a id="l493"></a><a href="#l493">493</a><td><tr><td><a id="l494"></a><a href="#l494">494</a><td>/**<tr><td><a id="l495"></a><a href="#l495">495</a><td> * Specifies the number of times the expectation should be called.<tr><td><a id="l496"></a><a href="#l496">496</a><td> * @param {number} times The number of times this method will be called.<tr><td><a id="l497"></a><a href="#l497">497</a><td> * @return {!goog.testing.Mock} This mock object.<tr><td><a id="l498"></a><a href="#l498">498</a><td> */<tr><td><a id="l499"></a><a href="#l499">499</a><td>goog.testing.Mock.prototype.$times = function(times) {<tr><td><a id="l500"></a><a href="#l500">500</a><td> this.$pendingExpectation.minCalls = times;<tr><td><a id="l501"></a><a href="#l501">501</a><td> this.$pendingExpectation.maxCalls = times;<tr><td><a id="l502"></a><a href="#l502">502</a><td> return this;<tr><td><a id="l503"></a><a href="#l503">503</a><td>};<tr><td><a id="l504"></a><a href="#l504">504</a><td><tr><td><a id="l505"></a><a href="#l505">505</a><td><tr><td><a id="l506"></a><a href="#l506">506</a><td>/**<tr><td><a id="l507"></a><a href="#l507">507</a><td> * Switches from recording to replay mode.<tr><td><a id="l508"></a><a href="#l508">508</a><td> * @override<tr><td><a id="l509"></a><a href="#l509">509</a><td> */<tr><td><a id="l510"></a><a href="#l510">510</a><td>goog.testing.Mock.prototype.$replay = function() {<tr><td><a id="l511"></a><a href="#l511">511</a><td> this.$recording_ = false;<tr><td><a id="l512"></a><a href="#l512">512</a><td>};<tr><td><a id="l513"></a><a href="#l513">513</a><td><tr><td><a id="l514"></a><a href="#l514">514</a><td><tr><td><a id="l515"></a><a href="#l515">515</a><td>/**<tr><td><a id="l516"></a><a href="#l516">516</a><td> * Resets the state of this mock object. This clears all pending expectations<tr><td><a id="l517"></a><a href="#l517">517</a><td> * without verifying, and puts the mock in recording mode.<tr><td><a id="l518"></a><a href="#l518">518</a><td> * @override<tr><td><a id="l519"></a><a href="#l519">519</a><td> */<tr><td><a id="l520"></a><a href="#l520">520</a><td>goog.testing.Mock.prototype.$reset = function() {<tr><td><a id="l521"></a><a href="#l521">521</a><td> this.$recording_ = true;<tr><td><a id="l522"></a><a href="#l522">522</a><td> this.$threwException_ = null;<tr><td><a id="l523"></a><a href="#l523">523</a><td> delete this.$pendingExpectation;<tr><td><a id="l524"></a><a href="#l524">524</a><td>};<tr><td><a id="l525"></a><a href="#l525">525</a><td><tr><td><a id="l526"></a><a href="#l526">526</a><td><tr><td><a id="l527"></a><a href="#l527">527</a><td>/**<tr><td><a id="l528"></a><a href="#l528">528</a><td> * Throws an exception and records that an exception was thrown.<tr><td><a id="l529"></a><a href="#l529">529</a><td> * @param {string} comment A short comment about the exception.<tr><td><a id="l530"></a><a href="#l530">530</a><td> * @param {?string=} opt_message A longer message about the exception.<tr><td><a id="l531"></a><a href="#l531">531</a><td> * @throws {Object} JsUnitException object.<tr><td><a id="l532"></a><a href="#l532">532</a><td> * @protected<tr><td><a id="l533"></a><a href="#l533">533</a><td> */<tr><td><a id="l534"></a><a href="#l534">534</a><td>goog.testing.Mock.prototype.$throwException = function(comment, opt_message) {<tr><td><a id="l535"></a><a href="#l535">535</a><td> this.$recordAndThrow(new goog.testing.JsUnitException(comment, opt_message));<tr><td><a id="l536"></a><a href="#l536">536</a><td>};<tr><td><a id="l537"></a><a href="#l537">537</a><td><tr><td><a id="l538"></a><a href="#l538">538</a><td><tr><td><a id="l539"></a><a href="#l539">539</a><td>/**<tr><td><a id="l540"></a><a href="#l540">540</a><td> * Throws an exception and records that an exception was thrown.<tr><td><a id="l541"></a><a href="#l541">541</a><td> * @param {Object} ex Exception.<tr><td><a id="l542"></a><a href="#l542">542</a><td> * @throws {Object} #ex.<tr><td><a id="l543"></a><a href="#l543">543</a><td> * @protected<tr><td><a id="l544"></a><a href="#l544">544</a><td> */<tr><td><a id="l545"></a><a href="#l545">545</a><td>goog.testing.Mock.prototype.$recordAndThrow = function(ex) {<tr><td><a id="l546"></a><a href="#l546">546</a><td> // If it's an assert exception, record it.<tr><td><a id="l547"></a><a href="#l547">547</a><td> if (ex['isJsUnitException']) {<tr><td><a id="l548"></a><a href="#l548">548</a><td> var testRunner = goog.global['G_testRunner'];<tr><td><a id="l549"></a><a href="#l549">549</a><td> if (testRunner) {<tr><td><a id="l550"></a><a href="#l550">550</a><td> var logTestFailureFunction = testRunner['logTestFailure'];<tr><td><a id="l551"></a><a href="#l551">551</a><td> if (logTestFailureFunction) {<tr><td><a id="l552"></a><a href="#l552">552</a><td> logTestFailureFunction.call(testRunner, ex);<tr><td><a id="l553"></a><a href="#l553">553</a><td> }<tr><td><a id="l554"></a><a href="#l554">554</a><td> }<tr><td><a id="l555"></a><a href="#l555">555</a><td><tr><td><a id="l556"></a><a href="#l556">556</a><td> if (!this.$threwException_) {<tr><td><a id="l557"></a><a href="#l557">557</a><td> // Only remember first exception thrown.<tr><td><a id="l558"></a><a href="#l558">558</a><td> this.$threwException_ = ex;<tr><td><a id="l559"></a><a href="#l559">559</a><td> }<tr><td><a id="l560"></a><a href="#l560">560</a><td> }<tr><td><a id="l561"></a><a href="#l561">561</a><td> throw ex;<tr><td><a id="l562"></a><a href="#l562">562</a><td>};<tr><td><a id="l563"></a><a href="#l563">563</a><td><tr><td><a id="l564"></a><a href="#l564">564</a><td><tr><td><a id="l565"></a><a href="#l565">565</a><td>/**<tr><td><a id="l566"></a><a href="#l566">566</a><td> * Verify that all of the expectations were met. Should be overridden by<tr><td><a id="l567"></a><a href="#l567">567</a><td> * subclasses.<tr><td><a id="l568"></a><a href="#l568">568</a><td> * @override<tr><td><a id="l569"></a><a href="#l569">569</a><td> */<tr><td><a id="l570"></a><a href="#l570">570</a><td>goog.testing.Mock.prototype.$verify = function() {<tr><td><a id="l571"></a><a href="#l571">571</a><td> if (this.$threwException_) {<tr><td><a id="l572"></a><a href="#l572">572</a><td> throw this.$threwException_;<tr><td><a id="l573"></a><a href="#l573">573</a><td> }<tr><td><a id="l574"></a><a href="#l574">574</a><td>};<tr><td><a id="l575"></a><a href="#l575">575</a><td><tr><td><a id="l576"></a><a href="#l576">576</a><td><tr><td><a id="l577"></a><a href="#l577">577</a><td>/**<tr><td><a id="l578"></a><a href="#l578">578</a><td> * Verifies that a method call matches an expectation.<tr><td><a id="l579"></a><a href="#l579">579</a><td> * @param {goog.testing.MockExpectation} expectation The expectation to check.<tr><td><a id="l580"></a><a href="#l580">580</a><td> * @param {string} name The name of the called method.<tr><td><a id="l581"></a><a href="#l581">581</a><td> * @param {Array<*>?} args The arguments passed to the mock.<tr><td><a id="l582"></a><a href="#l582">582</a><td> * @return {boolean} Whether the call matches the expectation.<tr><td><a id="l583"></a><a href="#l583">583</a><td> */<tr><td><a id="l584"></a><a href="#l584">584</a><td>goog.testing.Mock.prototype.$verifyCall = function(expectation, name, args) {<tr><td><a id="l585"></a><a href="#l585">585</a><td> if (expectation.name != name) {<tr><td><a id="l586"></a><a href="#l586">586</a><td> return false;<tr><td><a id="l587"></a><a href="#l587">587</a><td> }<tr><td><a id="l588"></a><a href="#l588">588</a><td> var verifierFn =<tr><td><a id="l589"></a><a href="#l589">589</a><td> this.$argumentListVerifiers_.hasOwnProperty(expectation.name) ?<tr><td><a id="l590"></a><a href="#l590">590</a><td> this.$argumentListVerifiers_[expectation.name] :<tr><td><a id="l591"></a><a href="#l591">591</a><td> goog.testing.mockmatchers.flexibleArrayMatcher;<tr><td><a id="l592"></a><a href="#l592">592</a><td><tr><td><a id="l593"></a><a href="#l593">593</a><td> return verifierFn(expectation.argumentList, args, expectation);<tr><td><a id="l594"></a><a href="#l594">594</a><td>};<tr><td><a id="l595"></a><a href="#l595">595</a><td><tr><td><a id="l596"></a><a href="#l596">596</a><td><tr><td><a id="l597"></a><a href="#l597">597</a><td>/**<tr><td><a id="l598"></a><a href="#l598">598</a><td> * Render the provided argument array to a string to help<tr><td><a id="l599"></a><a href="#l599">599</a><td> * clients with debugging tests.<tr><td><a id="l600"></a><a href="#l600">600</a><td> * @param {Array<*>?} args The arguments passed to the mock.<tr><td><a id="l601"></a><a href="#l601">601</a><td> * @return {string} Human-readable string.<tr><td><a id="l602"></a><a href="#l602">602</a><td> */<tr><td><a id="l603"></a><a href="#l603">603</a><td>goog.testing.Mock.prototype.$argumentsAsString = function(args) {<tr><td><a id="l604"></a><a href="#l604">604</a><td> var retVal = [];<tr><td><a id="l605"></a><a href="#l605">605</a><td> for (var i = 0; i < args.length; i++) {<tr><td><a id="l606"></a><a href="#l606">606</a><td> try {<tr><td><a id="l607"></a><a href="#l607">607</a><td> retVal.push(goog.typeOf(args[i]));<tr><td><a id="l608"></a><a href="#l608">608</a><td> } catch (e) {<tr><td><a id="l609"></a><a href="#l609">609</a><td> retVal.push('[unknown]');<tr><td><a id="l610"></a><a href="#l610">610</a><td> }<tr><td><a id="l611"></a><a href="#l611">611</a><td> }<tr><td><a id="l612"></a><a href="#l612">612</a><td> return '(' + retVal.join(', ') + ')';<tr><td><a id="l613"></a><a href="#l613">613</a><td>};<tr><td><a id="l614"></a><a href="#l614">614</a><td><tr><td><a id="l615"></a><a href="#l615">615</a><td><tr><td><a id="l616"></a><a href="#l616">616</a><td>/**<tr><td><a id="l617"></a><a href="#l617">617</a><td> * Throw an exception based on an incorrect method call.<tr><td><a id="l618"></a><a href="#l618">618</a><td> * @param {string} name Name of method called.<tr><td><a id="l619"></a><a href="#l619">619</a><td> * @param {Array<*>?} args Arguments passed to the mock.<tr><td><a id="l620"></a><a href="#l620">620</a><td> * @param {goog.testing.MockExpectation=} opt_expectation Expected next call,<tr><td><a id="l621"></a><a href="#l621">621</a><td> * if any.<tr><td><a id="l622"></a><a href="#l622">622</a><td> */<tr><td><a id="l623"></a><a href="#l623">623</a><td>goog.testing.Mock.prototype.$throwCallException = function(name, args,<tr><td><a id="l624"></a><a href="#l624">624</a><td> opt_expectation) {<tr><td><a id="l625"></a><a href="#l625">625</a><td> var errorStringBuffer = [];<tr><td><a id="l626"></a><a href="#l626">626</a><td> var actualArgsString = this.$argumentsAsString(args);<tr><td><a id="l627"></a><a href="#l627">627</a><td> var expectedArgsString = opt_expectation ?<tr><td><a id="l628"></a><a href="#l628">628</a><td> this.$argumentsAsString(opt_expectation.argumentList) : '';<tr><td><a id="l629"></a><a href="#l629">629</a><td><tr><td><a id="l630"></a><a href="#l630">630</a><td> if (opt_expectation && opt_expectation.name == name) {<tr><td><a id="l631"></a><a href="#l631">631</a><td> errorStringBuffer.push('Bad arguments to ', name, '().\n',<tr><td><a id="l632"></a><a href="#l632">632</a><td> 'Actual: ', actualArgsString, '\n',<tr><td><a id="l633"></a><a href="#l633">633</a><td> 'Expected: ', expectedArgsString, '\n',<tr><td><a id="l634"></a><a href="#l634">634</a><td> opt_expectation.getErrorMessage());<tr><td><a id="l635"></a><a href="#l635">635</a><td> } else {<tr><td><a id="l636"></a><a href="#l636">636</a><td> errorStringBuffer.push('Unexpected call to ', name,<tr><td><a id="l637"></a><a href="#l637">637</a><td> actualArgsString, '.');<tr><td><a id="l638"></a><a href="#l638">638</a><td> if (opt_expectation) {<tr><td><a id="l639"></a><a href="#l639">639</a><td> errorStringBuffer.push('\nNext expected call was to ',<tr><td><a id="l640"></a><a href="#l640">640</a><td> opt_expectation.name,<tr><td><a id="l641"></a><a href="#l641">641</a><td> expectedArgsString);<tr><td><a id="l642"></a><a href="#l642">642</a><td> }<tr><td><a id="l643"></a><a href="#l643">643</a><td> }<tr><td><a id="l644"></a><a href="#l644">644</a><td> this.$throwException(errorStringBuffer.join(''));<tr><td><a id="l645"></a><a href="#l645">645</a><td>};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>mockclock.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/testing/mockclock.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2007 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview Mock Clock implementation for working with setTimeout,<tr><td><a id="l17"></a><a href="#l17">17</a><td> * setInterval, clearTimeout and clearInterval within unit tests.<tr><td><a id="l18"></a><a href="#l18">18</a><td> *<tr><td><a id="l19"></a><a href="#l19">19</a><td> * Derived from jsUnitMockTimeout.js, contributed to JsUnit by<tr><td><a id="l20"></a><a href="#l20">20</a><td> * Pivotal Computer Systems, www.pivotalsf.com<tr><td><a id="l21"></a><a href="#l21">21</a><td> *<tr><td><a id="l22"></a><a href="#l22">22</a><td> */<tr><td><a id="l23"></a><a href="#l23">23</a><td><tr><td><a id="l24"></a><a href="#l24">24</a><td>goog.provide('goog.testing.MockClock');<tr><td><a id="l25"></a><a href="#l25">25</a><td><tr><td><a id="l26"></a><a href="#l26">26</a><td>goog.require('goog.Disposable');<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.require('goog.async.run');<tr><td><a id="l28"></a><a href="#l28">28</a><td>goog.require('goog.testing.PropertyReplacer');<tr><td><a id="l29"></a><a href="#l29">29</a><td>goog.require('goog.testing.events');<tr><td><a id="l30"></a><a href="#l30">30</a><td>goog.require('goog.testing.events.Event');<tr><td><a id="l31"></a><a href="#l31">31</a><td><tr><td><a id="l32"></a><a href="#l32">32</a><td><tr><td><a id="l33"></a><a href="#l33">33</a><td><tr><td><a id="l34"></a><a href="#l34">34</a><td>/**<tr><td><a id="l35"></a><a href="#l35">35</a><td> * Class for unit testing code that uses setTimeout and clearTimeout.<tr><td><a id="l36"></a><a href="#l36">36</a><td> *<tr><td><a id="l37"></a><a href="#l37">37</a><td> * NOTE: If you are using MockClock to test code that makes use of<tr><td><a id="l38"></a><a href="#l38">38</a><td> * goog.fx.Animation, then you must either:<tr><td><a id="l39"></a><a href="#l39">39</a><td> *<tr><td><a id="l40"></a><a href="#l40">40</a><td> * 1. Install and dispose of the MockClock in setUpPage() and tearDownPage()<tr><td><a id="l41"></a><a href="#l41">41</a><td> * respectively (rather than setUp()/tearDown()).<tr><td><a id="l42"></a><a href="#l42">42</a><td> *<tr><td><a id="l43"></a><a href="#l43">43</a><td> * or<tr><td><a id="l44"></a><a href="#l44">44</a><td> *<tr><td><a id="l45"></a><a href="#l45">45</a><td> * 2. Ensure that every test clears the animation queue by calling<tr><td><a id="l46"></a><a href="#l46">46</a><td> * mockClock.tick(x) at the end of each test function (where `x` is large<tr><td><a id="l47"></a><a href="#l47">47</a><td> * enough to complete all animations).<tr><td><a id="l48"></a><a href="#l48">48</a><td> *<tr><td><a id="l49"></a><a href="#l49">49</a><td> * Otherwise, if any animation is left pending at the time that<tr><td><a id="l50"></a><a href="#l50">50</a><td> * MockClock.dispose() is called, that will permanently prevent any future<tr><td><a id="l51"></a><a href="#l51">51</a><td> * animations from playing on the page.<tr><td><a id="l52"></a><a href="#l52">52</a><td> *<tr><td><a id="l53"></a><a href="#l53">53</a><td> * @param {boolean=} opt_autoInstall Install the MockClock at construction time.<tr><td><a id="l54"></a><a href="#l54">54</a><td> * @constructor<tr><td><a id="l55"></a><a href="#l55">55</a><td> * @extends {goog.Disposable}<tr><td><a id="l56"></a><a href="#l56">56</a><td> * @final<tr><td><a id="l57"></a><a href="#l57">57</a><td> */<tr><td><a id="l58"></a><a href="#l58">58</a><td>goog.testing.MockClock = function(opt_autoInstall) {<tr><td><a id="l59"></a><a href="#l59">59</a><td> goog.Disposable.call(this);<tr><td><a id="l60"></a><a href="#l60">60</a><td><tr><td><a id="l61"></a><a href="#l61">61</a><td> /**<tr><td><a id="l62"></a><a href="#l62">62</a><td> * Reverse-order queue of timers to fire.<tr><td><a id="l63"></a><a href="#l63">63</a><td> *<tr><td><a id="l64"></a><a href="#l64">64</a><td> * The last item of the queue is popped off. Insertion happens from the<tr><td><a id="l65"></a><a href="#l65">65</a><td> * right. For example, the expiration times for each element of the queue<tr><td><a id="l66"></a><a href="#l66">66</a><td> * might be in the order 300, 200, 200.<tr><td><a id="l67"></a><a href="#l67">67</a><td> *<tr><td><a id="l68"></a><a href="#l68">68</a><td> * @type {Array<Object>}<tr><td><a id="l69"></a><a href="#l69">69</a><td> * @private<tr><td><a id="l70"></a><a href="#l70">70</a><td> */<tr><td><a id="l71"></a><a href="#l71">71</a><td> this.queue_ = [];<tr><td><a id="l72"></a><a href="#l72">72</a><td><tr><td><a id="l73"></a><a href="#l73">73</a><td> /**<tr><td><a id="l74"></a><a href="#l74">74</a><td> * Set of timeouts that should be treated as cancelled.<tr><td><a id="l75"></a><a href="#l75">75</a><td> *<tr><td><a id="l76"></a><a href="#l76">76</a><td> * Rather than removing cancelled timers directly from the queue, this set<tr><td><a id="l77"></a><a href="#l77">77</a><td> * simply marks them as deleted so that they can be ignored when their<tr><td><a id="l78"></a><a href="#l78">78</a><td> * turn comes up. The keys are the timeout keys that are cancelled, each<tr><td><a id="l79"></a><a href="#l79">79</a><td> * mapping to true.<tr><td><a id="l80"></a><a href="#l80">80</a><td> *<tr><td><a id="l81"></a><a href="#l81">81</a><td> * @private {Object<number, boolean>}<tr><td><a id="l82"></a><a href="#l82">82</a><td> */<tr><td><a id="l83"></a><a href="#l83">83</a><td> this.deletedKeys_ = {};<tr><td><a id="l84"></a><a href="#l84">84</a><td><tr><td><a id="l85"></a><a href="#l85">85</a><td> if (opt_autoInstall) {<tr><td><a id="l86"></a><a href="#l86">86</a><td> this.install();<tr><td><a id="l87"></a><a href="#l87">87</a><td> }<tr><td><a id="l88"></a><a href="#l88">88</a><td>};<tr><td><a id="l89"></a><a href="#l89">89</a><td>goog.inherits(goog.testing.MockClock, goog.Disposable);<tr><td><a id="l90"></a><a href="#l90">90</a><td><tr><td><a id="l91"></a><a href="#l91">91</a><td><tr><td><a id="l92"></a><a href="#l92">92</a><td>/**<tr><td><a id="l93"></a><a href="#l93">93</a><td> * Default wait timeout for mocking requestAnimationFrame (in milliseconds).<tr><td><a id="l94"></a><a href="#l94">94</a><td> *<tr><td><a id="l95"></a><a href="#l95">95</a><td> * @type {number}<tr><td><a id="l96"></a><a href="#l96">96</a><td> * @const<tr><td><a id="l97"></a><a href="#l97">97</a><td> */<tr><td><a id="l98"></a><a href="#l98">98</a><td>goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT = 20;<tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td><tr><td><a id="l101"></a><a href="#l101">101</a><td>/**<tr><td><a id="l102"></a><a href="#l102">102</a><td> * ID to use for next timeout. Timeout IDs must never be reused, even across<tr><td><a id="l103"></a><a href="#l103">103</a><td> * MockClock instances.<tr><td><a id="l104"></a><a href="#l104">104</a><td> * @public {number}<tr><td><a id="l105"></a><a href="#l105">105</a><td> */<tr><td><a id="l106"></a><a href="#l106">106</a><td>goog.testing.MockClock.nextId = Math.round(Math.random() * 10000);<tr><td><a id="l107"></a><a href="#l107">107</a><td><tr><td><a id="l108"></a><a href="#l108">108</a><td><tr><td><a id="l109"></a><a href="#l109">109</a><td>/**<tr><td><a id="l110"></a><a href="#l110">110</a><td> * Count of the number of timeouts made by this instance.<tr><td><a id="l111"></a><a href="#l111">111</a><td> * @type {number}<tr><td><a id="l112"></a><a href="#l112">112</a><td> * @private<tr><td><a id="l113"></a><a href="#l113">113</a><td> */<tr><td><a id="l114"></a><a href="#l114">114</a><td>goog.testing.MockClock.prototype.timeoutsMade_ = 0;<tr><td><a id="l115"></a><a href="#l115">115</a><td><tr><td><a id="l116"></a><a href="#l116">116</a><td><tr><td><a id="l117"></a><a href="#l117">117</a><td>/**<tr><td><a id="l118"></a><a href="#l118">118</a><td> * PropertyReplacer instance which overwrites and resets setTimeout,<tr><td><a id="l119"></a><a href="#l119">119</a><td> * setInterval, etc. or null if the MockClock is not installed.<tr><td><a id="l120"></a><a href="#l120">120</a><td> * @type {goog.testing.PropertyReplacer}<tr><td><a id="l121"></a><a href="#l121">121</a><td> * @private<tr><td><a id="l122"></a><a href="#l122">122</a><td> */<tr><td><a id="l123"></a><a href="#l123">123</a><td>goog.testing.MockClock.prototype.replacer_ = null;<tr><td><a id="l124"></a><a href="#l124">124</a><td><tr><td><a id="l125"></a><a href="#l125">125</a><td><tr><td><a id="l126"></a><a href="#l126">126</a><td>/**<tr><td><a id="l127"></a><a href="#l127">127</a><td> * The current simulated time in milliseconds.<tr><td><a id="l128"></a><a href="#l128">128</a><td> * @type {number}<tr><td><a id="l129"></a><a href="#l129">129</a><td> * @private<tr><td><a id="l130"></a><a href="#l130">130</a><td> */<tr><td><a id="l131"></a><a href="#l131">131</a><td>goog.testing.MockClock.prototype.nowMillis_ = 0;<tr><td><a id="l132"></a><a href="#l132">132</a><td><tr><td><a id="l133"></a><a href="#l133">133</a><td><tr><td><a id="l134"></a><a href="#l134">134</a><td>/**<tr><td><a id="l135"></a><a href="#l135">135</a><td> * Additional delay between the time a timeout was set to fire, and the time<tr><td><a id="l136"></a><a href="#l136">136</a><td> * it actually fires. Useful for testing workarounds for this Firefox 2 bug:<tr><td><a id="l137"></a><a href="#l137">137</a><td> * https://bugzilla.mozilla.org/show_bug.cgi?id=291386<tr><td><a id="l138"></a><a href="#l138">138</a><td> * May be negative.<tr><td><a id="l139"></a><a href="#l139">139</a><td> * @type {number}<tr><td><a id="l140"></a><a href="#l140">140</a><td> * @private<tr><td><a id="l141"></a><a href="#l141">141</a><td> */<tr><td><a id="l142"></a><a href="#l142">142</a><td>goog.testing.MockClock.prototype.timeoutDelay_ = 0;<tr><td><a id="l143"></a><a href="#l143">143</a><td><tr><td><a id="l144"></a><a href="#l144">144</a><td><tr><td><a id="l145"></a><a href="#l145">145</a><td>/**<tr><td><a id="l146"></a><a href="#l146">146</a><td> * The real set timeout for reference.<tr><td><a id="l147"></a><a href="#l147">147</a><td> * @const @private {!Function}<tr><td><a id="l148"></a><a href="#l148">148</a><td> */<tr><td><a id="l149"></a><a href="#l149">149</a><td>goog.testing.MockClock.REAL_SETTIMEOUT_ = goog.global.setTimeout;<tr><td><a id="l150"></a><a href="#l150">150</a><td><tr><td><a id="l151"></a><a href="#l151">151</a><td><tr><td><a id="l152"></a><a href="#l152">152</a><td>/**<tr><td><a id="l153"></a><a href="#l153">153</a><td> * Installs the MockClock by overriding the global object's implementation of<tr><td><a id="l154"></a><a href="#l154">154</a><td> * setTimeout, setInterval, clearTimeout and clearInterval.<tr><td><a id="l155"></a><a href="#l155">155</a><td> */<tr><td><a id="l156"></a><a href="#l156">156</a><td>goog.testing.MockClock.prototype.install = function() {<tr><td><a id="l157"></a><a href="#l157">157</a><td> if (!this.replacer_) {<tr><td><a id="l158"></a><a href="#l158">158</a><td> if (goog.testing.MockClock.REAL_SETTIMEOUT_ !== goog.global.setTimeout) {<tr><td><a id="l159"></a><a href="#l159">159</a><td> if (typeof console !== 'undefined' && console.warn) {<tr><td><a id="l160"></a><a href="#l160">160</a><td> console.warn('Non default setTimeout detected. ' +<tr><td><a id="l161"></a><a href="#l161">161</a><td> 'Use of multiple MockClock instances or other clock mocking ' +<tr><td><a id="l162"></a><a href="#l162">162</a><td> 'should be avoided due to unspecified behavior and ' +<tr><td><a id="l163"></a><a href="#l163">163</a><td> 'the resulting fragility.');<tr><td><a id="l164"></a><a href="#l164">164</a><td> }<tr><td><a id="l165"></a><a href="#l165">165</a><td> }<tr><td><a id="l166"></a><a href="#l166">166</a><td><tr><td><a id="l167"></a><a href="#l167">167</a><td> var r = this.replacer_ = new goog.testing.PropertyReplacer();<tr><td><a id="l168"></a><a href="#l168">168</a><td> r.set(goog.global, 'setTimeout', goog.bind(this.setTimeout_, this));<tr><td><a id="l169"></a><a href="#l169">169</a><td> r.set(goog.global, 'setInterval', goog.bind(this.setInterval_, this));<tr><td><a id="l170"></a><a href="#l170">170</a><td> r.set(goog.global, 'setImmediate', goog.bind(this.setImmediate_, this));<tr><td><a id="l171"></a><a href="#l171">171</a><td> r.set(goog.global, 'clearTimeout', goog.bind(this.clearTimeout_, this));<tr><td><a id="l172"></a><a href="#l172">172</a><td> r.set(goog.global, 'clearInterval', goog.bind(this.clearInterval_, this));<tr><td><a id="l173"></a><a href="#l173">173</a><td> // goog.Promise uses goog.async.run. In order to be able to test<tr><td><a id="l174"></a><a href="#l174">174</a><td> // Promise-based code, we need to make sure that goog.async.run uses<tr><td><a id="l175"></a><a href="#l175">175</a><td> // nextTick instead of native browser Promises. This means that it will<tr><td><a id="l176"></a><a href="#l176">176</a><td> // default to setImmediate, which is replaced above. Note that we test for<tr><td><a id="l177"></a><a href="#l177">177</a><td> // the presence of goog.async.run.forceNextTick to be resilient to the case<tr><td><a id="l178"></a><a href="#l178">178</a><td> // where tests replace goog.async.run directly.<tr><td><a id="l179"></a><a href="#l179">179</a><td> goog.async.run.forceNextTick && goog.async.run.forceNextTick(<tr><td><a id="l180"></a><a href="#l180">180</a><td> goog.testing.MockClock.REAL_SETTIMEOUT_);<tr><td><a id="l181"></a><a href="#l181">181</a><td><tr><td><a id="l182"></a><a href="#l182">182</a><td> // Replace the requestAnimationFrame functions.<tr><td><a id="l183"></a><a href="#l183">183</a><td> this.replaceRequestAnimationFrame_();<tr><td><a id="l184"></a><a href="#l184">184</a><td><tr><td><a id="l185"></a><a href="#l185">185</a><td> // PropertyReplacer#set can't be called with renameable functions.<tr><td><a id="l186"></a><a href="#l186">186</a><td> this.oldGoogNow_ = goog.now;<tr><td><a id="l187"></a><a href="#l187">187</a><td> goog.now = goog.bind(this.getCurrentTime, this);<tr><td><a id="l188"></a><a href="#l188">188</a><td> }<tr><td><a id="l189"></a><a href="#l189">189</a><td>};<tr><td><a id="l190"></a><a href="#l190">190</a><td><tr><td><a id="l191"></a><a href="#l191">191</a><td><tr><td><a id="l192"></a><a href="#l192">192</a><td>/**<tr><td><a id="l193"></a><a href="#l193">193</a><td> * Installs the mocks for requestAnimationFrame and cancelRequestAnimationFrame.<tr><td><a id="l194"></a><a href="#l194">194</a><td> * @private<tr><td><a id="l195"></a><a href="#l195">195</a><td> */<tr><td><a id="l196"></a><a href="#l196">196</a><td>goog.testing.MockClock.prototype.replaceRequestAnimationFrame_ = function() {<tr><td><a id="l197"></a><a href="#l197">197</a><td> var r = this.replacer_;<tr><td><a id="l198"></a><a href="#l198">198</a><td> var requestFuncs = ['requestAnimationFrame',<tr><td><a id="l199"></a><a href="#l199">199</a><td> 'webkitRequestAnimationFrame',<tr><td><a id="l200"></a><a href="#l200">200</a><td> 'mozRequestAnimationFrame',<tr><td><a id="l201"></a><a href="#l201">201</a><td> 'oRequestAnimationFrame',<tr><td><a id="l202"></a><a href="#l202">202</a><td> 'msRequestAnimationFrame'];<tr><td><a id="l203"></a><a href="#l203">203</a><td><tr><td><a id="l204"></a><a href="#l204">204</a><td> var cancelFuncs = ['cancelAnimationFrame',<tr><td><a id="l205"></a><a href="#l205">205</a><td> 'cancelRequestAnimationFrame',<tr><td><a id="l206"></a><a href="#l206">206</a><td> 'webkitCancelRequestAnimationFrame',<tr><td><a id="l207"></a><a href="#l207">207</a><td> 'mozCancelRequestAnimationFrame',<tr><td><a id="l208"></a><a href="#l208">208</a><td> 'oCancelRequestAnimationFrame',<tr><td><a id="l209"></a><a href="#l209">209</a><td> 'msCancelRequestAnimationFrame'];<tr><td><a id="l210"></a><a href="#l210">210</a><td><tr><td><a id="l211"></a><a href="#l211">211</a><td> for (var i = 0; i < requestFuncs.length; ++i) {<tr><td><a id="l212"></a><a href="#l212">212</a><td> if (goog.global && goog.global[requestFuncs[i]]) {<tr><td><a id="l213"></a><a href="#l213">213</a><td> r.set(goog.global, requestFuncs[i],<tr><td><a id="l214"></a><a href="#l214">214</a><td> goog.bind(this.requestAnimationFrame_, this));<tr><td><a id="l215"></a><a href="#l215">215</a><td> }<tr><td><a id="l216"></a><a href="#l216">216</a><td> }<tr><td><a id="l217"></a><a href="#l217">217</a><td><tr><td><a id="l218"></a><a href="#l218">218</a><td> for (var i = 0; i < cancelFuncs.length; ++i) {<tr><td><a id="l219"></a><a href="#l219">219</a><td> if (goog.global && goog.global[cancelFuncs[i]]) {<tr><td><a id="l220"></a><a href="#l220">220</a><td> r.set(goog.global, cancelFuncs[i],<tr><td><a id="l221"></a><a href="#l221">221</a><td> goog.bind(this.cancelRequestAnimationFrame_, this));<tr><td><a id="l222"></a><a href="#l222">222</a><td> }<tr><td><a id="l223"></a><a href="#l223">223</a><td> }<tr><td><a id="l224"></a><a href="#l224">224</a><td>};<tr><td><a id="l225"></a><a href="#l225">225</a><td><tr><td><a id="l226"></a><a href="#l226">226</a><td><tr><td><a id="l227"></a><a href="#l227">227</a><td>/**<tr><td><a id="l228"></a><a href="#l228">228</a><td> * Removes the MockClock's hooks into the global object's functions and revert<tr><td><a id="l229"></a><a href="#l229">229</a><td> * to their original values.<tr><td><a id="l230"></a><a href="#l230">230</a><td> */<tr><td><a id="l231"></a><a href="#l231">231</a><td>goog.testing.MockClock.prototype.uninstall = function() {<tr><td><a id="l232"></a><a href="#l232">232</a><td> if (this.replacer_) {<tr><td><a id="l233"></a><a href="#l233">233</a><td> this.replacer_.reset();<tr><td><a id="l234"></a><a href="#l234">234</a><td> this.replacer_ = null;<tr><td><a id="l235"></a><a href="#l235">235</a><td> goog.now = this.oldGoogNow_;<tr><td><a id="l236"></a><a href="#l236">236</a><td> }<tr><td><a id="l237"></a><a href="#l237">237</a><td><tr><td><a id="l238"></a><a href="#l238">238</a><td> this.resetAsyncQueue_();<tr><td><a id="l239"></a><a href="#l239">239</a><td>};<tr><td><a id="l240"></a><a href="#l240">240</a><td><tr><td><a id="l241"></a><a href="#l241">241</a><td><tr><td><a id="l242"></a><a href="#l242">242</a><td>/** @override */<tr><td><a id="l243"></a><a href="#l243">243</a><td>goog.testing.MockClock.prototype.disposeInternal = function() {<tr><td><a id="l244"></a><a href="#l244">244</a><td> this.uninstall();<tr><td><a id="l245"></a><a href="#l245">245</a><td> this.queue_ = null;<tr><td><a id="l246"></a><a href="#l246">246</a><td> this.deletedKeys_ = null;<tr><td><a id="l247"></a><a href="#l247">247</a><td> goog.testing.MockClock.superClass_.disposeInternal.call(this);<tr><td><a id="l248"></a><a href="#l248">248</a><td>};<tr><td><a id="l249"></a><a href="#l249">249</a><td><tr><td><a id="l250"></a><a href="#l250">250</a><td><tr><td><a id="l251"></a><a href="#l251">251</a><td>/**<tr><td><a id="l252"></a><a href="#l252">252</a><td> * Resets the MockClock, removing all timeouts that are scheduled and resets<tr><td><a id="l253"></a><a href="#l253">253</a><td> * the fake timer count.<tr><td><a id="l254"></a><a href="#l254">254</a><td> */<tr><td><a id="l255"></a><a href="#l255">255</a><td>goog.testing.MockClock.prototype.reset = function() {<tr><td><a id="l256"></a><a href="#l256">256</a><td> this.queue_ = [];<tr><td><a id="l257"></a><a href="#l257">257</a><td> this.deletedKeys_ = {};<tr><td><a id="l258"></a><a href="#l258">258</a><td> this.nowMillis_ = 0;<tr><td><a id="l259"></a><a href="#l259">259</a><td> this.timeoutsMade_ = 0;<tr><td><a id="l260"></a><a href="#l260">260</a><td> this.timeoutDelay_ = 0;<tr><td><a id="l261"></a><a href="#l261">261</a><td><tr><td><a id="l262"></a><a href="#l262">262</a><td> this.resetAsyncQueue_();<tr><td><a id="l263"></a><a href="#l263">263</a><td>};<tr><td><a id="l264"></a><a href="#l264">264</a><td><tr><td><a id="l265"></a><a href="#l265">265</a><td><tr><td><a id="l266"></a><a href="#l266">266</a><td>/**<tr><td><a id="l267"></a><a href="#l267">267</a><td> * Resets the async queue when this clock resets.<tr><td><a id="l268"></a><a href="#l268">268</a><td> * @private<tr><td><a id="l269"></a><a href="#l269">269</a><td> */<tr><td><a id="l270"></a><a href="#l270">270</a><td>goog.testing.MockClock.prototype.resetAsyncQueue_ = function() {<tr><td><a id="l271"></a><a href="#l271">271</a><td> goog.async.run.resetQueue();<tr><td><a id="l272"></a><a href="#l272">272</a><td>};<tr><td><a id="l273"></a><a href="#l273">273</a><td><tr><td><a id="l274"></a><a href="#l274">274</a><td><tr><td><a id="l275"></a><a href="#l275">275</a><td>/**<tr><td><a id="l276"></a><a href="#l276">276</a><td> * Sets the amount of time between when a timeout is scheduled to fire and when<tr><td><a id="l277"></a><a href="#l277">277</a><td> * it actually fires.<tr><td><a id="l278"></a><a href="#l278">278</a><td> * @param {number} delay The delay in milliseconds. May be negative.<tr><td><a id="l279"></a><a href="#l279">279</a><td> */<tr><td><a id="l280"></a><a href="#l280">280</a><td>goog.testing.MockClock.prototype.setTimeoutDelay = function(delay) {<tr><td><a id="l281"></a><a href="#l281">281</a><td> this.timeoutDelay_ = delay;<tr><td><a id="l282"></a><a href="#l282">282</a><td>};<tr><td><a id="l283"></a><a href="#l283">283</a><td><tr><td><a id="l284"></a><a href="#l284">284</a><td><tr><td><a id="l285"></a><a href="#l285">285</a><td>/**<tr><td><a id="l286"></a><a href="#l286">286</a><td> * @return {number} delay The amount of time between when a timeout is<tr><td><a id="l287"></a><a href="#l287">287</a><td> * scheduled to fire and when it actually fires, in milliseconds. May<tr><td><a id="l288"></a><a href="#l288">288</a><td> * be negative.<tr><td><a id="l289"></a><a href="#l289">289</a><td> */<tr><td><a id="l290"></a><a href="#l290">290</a><td>goog.testing.MockClock.prototype.getTimeoutDelay = function() {<tr><td><a id="l291"></a><a href="#l291">291</a><td> return this.timeoutDelay_;<tr><td><a id="l292"></a><a href="#l292">292</a><td>};<tr><td><a id="l293"></a><a href="#l293">293</a><td><tr><td><a id="l294"></a><a href="#l294">294</a><td><tr><td><a id="l295"></a><a href="#l295">295</a><td>/**<tr><td><a id="l296"></a><a href="#l296">296</a><td> * Increments the MockClock's time by a given number of milliseconds, running<tr><td><a id="l297"></a><a href="#l297">297</a><td> * any functions that are now overdue.<tr><td><a id="l298"></a><a href="#l298">298</a><td> * @param {number=} opt_millis Number of milliseconds to increment the counter.<tr><td><a id="l299"></a><a href="#l299">299</a><td> * If not specified, clock ticks 1 millisecond.<tr><td><a id="l300"></a><a href="#l300">300</a><td> * @return {number} Current mock time in milliseconds.<tr><td><a id="l301"></a><a href="#l301">301</a><td> */<tr><td><a id="l302"></a><a href="#l302">302</a><td>goog.testing.MockClock.prototype.tick = function(opt_millis) {<tr><td><a id="l303"></a><a href="#l303">303</a><td> if (typeof opt_millis != 'number') {<tr><td><a id="l304"></a><a href="#l304">304</a><td> opt_millis = 1;<tr><td><a id="l305"></a><a href="#l305">305</a><td> }<tr><td><a id="l306"></a><a href="#l306">306</a><td> var endTime = this.nowMillis_ + opt_millis;<tr><td><a id="l307"></a><a href="#l307">307</a><td> this.runFunctionsWithinRange_(endTime);<tr><td><a id="l308"></a><a href="#l308">308</a><td> this.nowMillis_ = endTime;<tr><td><a id="l309"></a><a href="#l309">309</a><td> return endTime;<tr><td><a id="l310"></a><a href="#l310">310</a><td>};<tr><td><a id="l311"></a><a href="#l311">311</a><td><tr><td><a id="l312"></a><a href="#l312">312</a><td><tr><td><a id="l313"></a><a href="#l313">313</a><td>/**<tr><td><a id="l314"></a><a href="#l314">314</a><td> * Takes a promise and then ticks the mock clock. If the promise successfully<tr><td><a id="l315"></a><a href="#l315">315</a><td> * resolves, returns the value produced by the promise. If the promise is<tr><td><a id="l316"></a><a href="#l316">316</a><td> * rejected, it throws the rejection as an exception. If the promise is not<tr><td><a id="l317"></a><a href="#l317">317</a><td> * resolved at all, throws an exception.<tr><td><a id="l318"></a><a href="#l318">318</a><td> * Also ticks the general clock by the specified amount.<tr><td><a id="l319"></a><a href="#l319">319</a><td> *<tr><td><a id="l320"></a><a href="#l320">320</a><td> * @param {!goog.Thenable<T>} promise A promise that should be resolved after<tr><td><a id="l321"></a><a href="#l321">321</a><td> * the mockClock is ticked for the given opt_millis.<tr><td><a id="l322"></a><a href="#l322">322</a><td> * @param {number=} opt_millis Number of milliseconds to increment the counter.<tr><td><a id="l323"></a><a href="#l323">323</a><td> * If not specified, clock ticks 1 millisecond.<tr><td><a id="l324"></a><a href="#l324">324</a><td> * @return {T}<tr><td><a id="l325"></a><a href="#l325">325</a><td> * @template T<tr><td><a id="l326"></a><a href="#l326">326</a><td> */<tr><td><a id="l327"></a><a href="#l327">327</a><td>goog.testing.MockClock.prototype.tickPromise = function(promise, opt_millis) {<tr><td><a id="l328"></a><a href="#l328">328</a><td> var value;<tr><td><a id="l329"></a><a href="#l329">329</a><td> var error;<tr><td><a id="l330"></a><a href="#l330">330</a><td> var resolved = false;<tr><td><a id="l331"></a><a href="#l331">331</a><td> promise.then(function(v) {<tr><td><a id="l332"></a><a href="#l332">332</a><td> value = v;<tr><td><a id="l333"></a><a href="#l333">333</a><td> resolved = true;<tr><td><a id="l334"></a><a href="#l334">334</a><td> }, function(e) {<tr><td><a id="l335"></a><a href="#l335">335</a><td> error = e;<tr><td><a id="l336"></a><a href="#l336">336</a><td> resolved = true;<tr><td><a id="l337"></a><a href="#l337">337</a><td> });<tr><td><a id="l338"></a><a href="#l338">338</a><td> this.tick(opt_millis);<tr><td><a id="l339"></a><a href="#l339">339</a><td> if (!resolved) {<tr><td><a id="l340"></a><a href="#l340">340</a><td> throw new Error(<tr><td><a id="l341"></a><a href="#l341">341</a><td> 'Promise was expected to be resolved after mock clock tick.');<tr><td><a id="l342"></a><a href="#l342">342</a><td> }<tr><td><a id="l343"></a><a href="#l343">343</a><td> if (error) {<tr><td><a id="l344"></a><a href="#l344">344</a><td> throw error;<tr><td><a id="l345"></a><a href="#l345">345</a><td> }<tr><td><a id="l346"></a><a href="#l346">346</a><td> return value;<tr><td><a id="l347"></a><a href="#l347">347</a><td>};<tr><td><a id="l348"></a><a href="#l348">348</a><td><tr><td><a id="l349"></a><a href="#l349">349</a><td><tr><td><a id="l350"></a><a href="#l350">350</a><td>/**<tr><td><a id="l351"></a><a href="#l351">351</a><td> * @return {number} The number of timeouts that have been scheduled.<tr><td><a id="l352"></a><a href="#l352">352</a><td> */<tr><td><a id="l353"></a><a href="#l353">353</a><td>goog.testing.MockClock.prototype.getTimeoutsMade = function() {<tr><td><a id="l354"></a><a href="#l354">354</a><td> return this.timeoutsMade_;<tr><td><a id="l355"></a><a href="#l355">355</a><td>};<tr><td><a id="l356"></a><a href="#l356">356</a><td><tr><td><a id="l357"></a><a href="#l357">357</a><td><tr><td><a id="l358"></a><a href="#l358">358</a><td>/**<tr><td><a id="l359"></a><a href="#l359">359</a><td> * @return {number} The MockClock's current time in milliseconds.<tr><td><a id="l360"></a><a href="#l360">360</a><td> */<tr><td><a id="l361"></a><a href="#l361">361</a><td>goog.testing.MockClock.prototype.getCurrentTime = function() {<tr><td><a id="l362"></a><a href="#l362">362</a><td> return this.nowMillis_;<tr><td><a id="l363"></a><a href="#l363">363</a><td>};<tr><td><a id="l364"></a><a href="#l364">364</a><td><tr><td><a id="l365"></a><a href="#l365">365</a><td><tr><td><a id="l366"></a><a href="#l366">366</a><td>/**<tr><td><a id="l367"></a><a href="#l367">367</a><td> * @param {number} timeoutKey The timeout key.<tr><td><a id="l368"></a><a href="#l368">368</a><td> * @return {boolean} Whether the timer has been set and not cleared,<tr><td><a id="l369"></a><a href="#l369">369</a><td> * independent of the timeout's expiration. In other words, the timeout<tr><td><a id="l370"></a><a href="#l370">370</a><td> * could have passed or could be scheduled for the future. Either way,<tr><td><a id="l371"></a><a href="#l371">371</a><td> * this function returns true or false depending only on whether the<tr><td><a id="l372"></a><a href="#l372">372</a><td> * provided timeoutKey represents a timeout that has been set and not<tr><td><a id="l373"></a><a href="#l373">373</a><td> * cleared.<tr><td><a id="l374"></a><a href="#l374">374</a><td> */<tr><td><a id="l375"></a><a href="#l375">375</a><td>goog.testing.MockClock.prototype.isTimeoutSet = function(timeoutKey) {<tr><td><a id="l376"></a><a href="#l376">376</a><td> return timeoutKey < goog.testing.MockClock.nextId &&<tr><td><a id="l377"></a><a href="#l377">377</a><td> timeoutKey >= goog.testing.MockClock.nextId - this.timeoutsMade_ &&<tr><td><a id="l378"></a><a href="#l378">378</a><td> !this.deletedKeys_[timeoutKey];<tr><td><a id="l379"></a><a href="#l379">379</a><td>};<tr><td><a id="l380"></a><a href="#l380">380</a><td><tr><td><a id="l381"></a><a href="#l381">381</a><td><tr><td><a id="l382"></a><a href="#l382">382</a><td>/**<tr><td><a id="l383"></a><a href="#l383">383</a><td> * Runs any function that is scheduled before a certain time. Timeouts can<tr><td><a id="l384"></a><a href="#l384">384</a><td> * be made to fire early or late if timeoutDelay_ is non-0.<tr><td><a id="l385"></a><a href="#l385">385</a><td> * @param {number} endTime The latest time in the range, in milliseconds.<tr><td><a id="l386"></a><a href="#l386">386</a><td> * @private<tr><td><a id="l387"></a><a href="#l387">387</a><td> */<tr><td><a id="l388"></a><a href="#l388">388</a><td>goog.testing.MockClock.prototype.runFunctionsWithinRange_ = function(<tr><td><a id="l389"></a><a href="#l389">389</a><td> endTime) {<tr><td><a id="l390"></a><a href="#l390">390</a><td> var adjustedEndTime = endTime - this.timeoutDelay_;<tr><td><a id="l391"></a><a href="#l391">391</a><td><tr><td><a id="l392"></a><a href="#l392">392</a><td> // Repeatedly pop off the last item since the queue is always sorted.<tr><td><a id="l393"></a><a href="#l393">393</a><td> while (this.queue_ && this.queue_.length &&<tr><td><a id="l394"></a><a href="#l394">394</a><td> this.queue_[this.queue_.length - 1].runAtMillis <= adjustedEndTime) {<tr><td><a id="l395"></a><a href="#l395">395</a><td> var timeout = this.queue_.pop();<tr><td><a id="l396"></a><a href="#l396">396</a><td><tr><td><a id="l397"></a><a href="#l397">397</a><td> if (!(timeout.timeoutKey in this.deletedKeys_)) {<tr><td><a id="l398"></a><a href="#l398">398</a><td> // Only move time forwards.<tr><td><a id="l399"></a><a href="#l399">399</a><td> this.nowMillis_ = Math.max(this.nowMillis_,<tr><td><a id="l400"></a><a href="#l400">400</a><td> timeout.runAtMillis + this.timeoutDelay_);<tr><td><a id="l401"></a><a href="#l401">401</a><td> // Call timeout in global scope and pass the timeout key as the argument.<tr><td><a id="l402"></a><a href="#l402">402</a><td> timeout.funcToCall.call(goog.global, timeout.timeoutKey);<tr><td><a id="l403"></a><a href="#l403">403</a><td> // In case the interval was cleared in the funcToCall<tr><td><a id="l404"></a><a href="#l404">404</a><td> if (timeout.recurring) {<tr><td><a id="l405"></a><a href="#l405">405</a><td> this.scheduleFunction_(<tr><td><a id="l406"></a><a href="#l406">406</a><td> timeout.timeoutKey, timeout.funcToCall, timeout.millis, true);<tr><td><a id="l407"></a><a href="#l407">407</a><td> }<tr><td><a id="l408"></a><a href="#l408">408</a><td> }<tr><td><a id="l409"></a><a href="#l409">409</a><td> }<tr><td><a id="l410"></a><a href="#l410">410</a><td>};<tr><td><a id="l411"></a><a href="#l411">411</a><td><tr><td><a id="l412"></a><a href="#l412">412</a><td><tr><td><a id="l413"></a><a href="#l413">413</a><td>/**<tr><td><a id="l414"></a><a href="#l414">414</a><td> * Schedules a function to be run at a certain time.<tr><td><a id="l415"></a><a href="#l415">415</a><td> * @param {number} timeoutKey The timeout key.<tr><td><a id="l416"></a><a href="#l416">416</a><td> * @param {Function} funcToCall The function to call.<tr><td><a id="l417"></a><a href="#l417">417</a><td> * @param {number} millis The number of milliseconds to call it in.<tr><td><a id="l418"></a><a href="#l418">418</a><td> * @param {boolean} recurring Whether to function call should recur.<tr><td><a id="l419"></a><a href="#l419">419</a><td> * @private<tr><td><a id="l420"></a><a href="#l420">420</a><td> */<tr><td><a id="l421"></a><a href="#l421">421</a><td>goog.testing.MockClock.prototype.scheduleFunction_ = function(<tr><td><a id="l422"></a><a href="#l422">422</a><td> timeoutKey, funcToCall, millis, recurring) {<tr><td><a id="l423"></a><a href="#l423">423</a><td> if (!goog.isFunction(funcToCall)) {<tr><td><a id="l424"></a><a href="#l424">424</a><td> // Early error for debuggability rather than dying in the next .tick()<tr><td><a id="l425"></a><a href="#l425">425</a><td> throw new TypeError('The provided callback must be a function, not a ' +<tr><td><a id="l426"></a><a href="#l426">426</a><td> typeof funcToCall);<tr><td><a id="l427"></a><a href="#l427">427</a><td> }<tr><td><a id="l428"></a><a href="#l428">428</a><td><tr><td><a id="l429"></a><a href="#l429">429</a><td> var timeout = {<tr><td><a id="l430"></a><a href="#l430">430</a><td> runAtMillis: this.nowMillis_ + millis,<tr><td><a id="l431"></a><a href="#l431">431</a><td> funcToCall: funcToCall,<tr><td><a id="l432"></a><a href="#l432">432</a><td> recurring: recurring,<tr><td><a id="l433"></a><a href="#l433">433</a><td> timeoutKey: timeoutKey,<tr><td><a id="l434"></a><a href="#l434">434</a><td> millis: millis<tr><td><a id="l435"></a><a href="#l435">435</a><td> };<tr><td><a id="l436"></a><a href="#l436">436</a><td><tr><td><a id="l437"></a><a href="#l437">437</a><td> goog.testing.MockClock.insert_(timeout, this.queue_);<tr><td><a id="l438"></a><a href="#l438">438</a><td>};<tr><td><a id="l439"></a><a href="#l439">439</a><td><tr><td><a id="l440"></a><a href="#l440">440</a><td><tr><td><a id="l441"></a><a href="#l441">441</a><td>/**<tr><td><a id="l442"></a><a href="#l442">442</a><td> * Inserts a timer descriptor into a descending-order queue.<tr><td><a id="l443"></a><a href="#l443">443</a><td> *<tr><td><a id="l444"></a><a href="#l444">444</a><td> * Later-inserted duplicates appear at lower indices. For example, the<tr><td><a id="l445"></a><a href="#l445">445</a><td> * asterisk in (5,4,*,3,2,1) would be the insertion point for 3.<tr><td><a id="l446"></a><a href="#l446">446</a><td> *<tr><td><a id="l447"></a><a href="#l447">447</a><td> * @param {Object} timeout The timeout to insert, with numerical runAtMillis<tr><td><a id="l448"></a><a href="#l448">448</a><td> * property.<tr><td><a id="l449"></a><a href="#l449">449</a><td> * @param {Array<Object>} queue The queue to insert into, with each element<tr><td><a id="l450"></a><a href="#l450">450</a><td> * having a numerical runAtMillis property.<tr><td><a id="l451"></a><a href="#l451">451</a><td> * @private<tr><td><a id="l452"></a><a href="#l452">452</a><td> */<tr><td><a id="l453"></a><a href="#l453">453</a><td>goog.testing.MockClock.insert_ = function(timeout, queue) {<tr><td><a id="l454"></a><a href="#l454">454</a><td> // Although insertion of N items is quadratic, requiring goog.structs.Heap<tr><td><a id="l455"></a><a href="#l455">455</a><td> // from a unit test will make tests more prone to breakage. Since unit<tr><td><a id="l456"></a><a href="#l456">456</a><td> // tests are normally small, scalability is not a primary issue.<tr><td><a id="l457"></a><a href="#l457">457</a><td><tr><td><a id="l458"></a><a href="#l458">458</a><td> // Find an insertion point. Since the queue is in reverse order (so we<tr><td><a id="l459"></a><a href="#l459">459</a><td> // can pop rather than unshift), and later timers with the same time stamp<tr><td><a id="l460"></a><a href="#l460">460</a><td> // should be executed later, we look for the element strictly greater than<tr><td><a id="l461"></a><a href="#l461">461</a><td> // the one we are inserting.<tr><td><a id="l462"></a><a href="#l462">462</a><td><tr><td><a id="l463"></a><a href="#l463">463</a><td> for (var i = queue.length; i != 0; i--) {<tr><td><a id="l464"></a><a href="#l464">464</a><td> if (queue[i - 1].runAtMillis > timeout.runAtMillis) {<tr><td><a id="l465"></a><a href="#l465">465</a><td> break;<tr><td><a id="l466"></a><a href="#l466">466</a><td> }<tr><td><a id="l467"></a><a href="#l467">467</a><td> queue[i] = queue[i - 1];<tr><td><a id="l468"></a><a href="#l468">468</a><td> }<tr><td><a id="l469"></a><a href="#l469">469</a><td><tr><td><a id="l470"></a><a href="#l470">470</a><td> queue[i] = timeout;<tr><td><a id="l471"></a><a href="#l471">471</a><td>};<tr><td><a id="l472"></a><a href="#l472">472</a><td><tr><td><a id="l473"></a><a href="#l473">473</a><td><tr><td><a id="l474"></a><a href="#l474">474</a><td>/**<tr><td><a id="l475"></a><a href="#l475">475</a><td> * Maximum 32-bit signed integer.<tr><td><a id="l476"></a><a href="#l476">476</a><td> *<tr><td><a id="l477"></a><a href="#l477">477</a><td> * Timeouts over this time return immediately in many browsers, due to integer<tr><td><a id="l478"></a><a href="#l478">478</a><td> * overflow. Such known browsers include Firefox, Chrome, and Safari, but not<tr><td><a id="l479"></a><a href="#l479">479</a><td> * IE.<tr><td><a id="l480"></a><a href="#l480">480</a><td> *<tr><td><a id="l481"></a><a href="#l481">481</a><td> * @type {number}<tr><td><a id="l482"></a><a href="#l482">482</a><td> * @private<tr><td><a id="l483"></a><a href="#l483">483</a><td> */<tr><td><a id="l484"></a><a href="#l484">484</a><td>goog.testing.MockClock.MAX_INT_ = 2147483647;<tr><td><a id="l485"></a><a href="#l485">485</a><td><tr><td><a id="l486"></a><a href="#l486">486</a><td><tr><td><a id="l487"></a><a href="#l487">487</a><td>/**<tr><td><a id="l488"></a><a href="#l488">488</a><td> * Schedules a function to be called after {@code millis} milliseconds.<tr><td><a id="l489"></a><a href="#l489">489</a><td> * Mock implementation for setTimeout.<tr><td><a id="l490"></a><a href="#l490">490</a><td> * @param {Function} funcToCall The function to call.<tr><td><a id="l491"></a><a href="#l491">491</a><td> * @param {number=} opt_millis The number of milliseconds to call it after.<tr><td><a id="l492"></a><a href="#l492">492</a><td> * @return {number} The number of timeouts created.<tr><td><a id="l493"></a><a href="#l493">493</a><td> * @private<tr><td><a id="l494"></a><a href="#l494">494</a><td> */<tr><td><a id="l495"></a><a href="#l495">495</a><td>goog.testing.MockClock.prototype.setTimeout_ = function(<tr><td><a id="l496"></a><a href="#l496">496</a><td> funcToCall, opt_millis) {<tr><td><a id="l497"></a><a href="#l497">497</a><td> var millis = opt_millis || 0;<tr><td><a id="l498"></a><a href="#l498">498</a><td> if (millis > goog.testing.MockClock.MAX_INT_) {<tr><td><a id="l499"></a><a href="#l499">499</a><td> throw Error(<tr><td><a id="l500"></a><a href="#l500">500</a><td> 'Bad timeout value: ' + millis + '. Timeouts over MAX_INT ' +<tr><td><a id="l501"></a><a href="#l501">501</a><td> '(24.8 days) cause timeouts to be fired ' +<tr><td><a id="l502"></a><a href="#l502">502</a><td> 'immediately in most browsers, except for IE.');<tr><td><a id="l503"></a><a href="#l503">503</a><td> }<tr><td><a id="l504"></a><a href="#l504">504</a><td> this.timeoutsMade_++;<tr><td><a id="l505"></a><a href="#l505">505</a><td> this.scheduleFunction_(goog.testing.MockClock.nextId, funcToCall, millis,<tr><td><a id="l506"></a><a href="#l506">506</a><td> false);<tr><td><a id="l507"></a><a href="#l507">507</a><td> return goog.testing.MockClock.nextId++;<tr><td><a id="l508"></a><a href="#l508">508</a><td>};<tr><td><a id="l509"></a><a href="#l509">509</a><td><tr><td><a id="l510"></a><a href="#l510">510</a><td><tr><td><a id="l511"></a><a href="#l511">511</a><td>/**<tr><td><a id="l512"></a><a href="#l512">512</a><td> * Schedules a function to be called every {@code millis} milliseconds.<tr><td><a id="l513"></a><a href="#l513">513</a><td> * Mock implementation for setInterval.<tr><td><a id="l514"></a><a href="#l514">514</a><td> * @param {Function} funcToCall The function to call.<tr><td><a id="l515"></a><a href="#l515">515</a><td> * @param {number=} opt_millis The number of milliseconds between calls.<tr><td><a id="l516"></a><a href="#l516">516</a><td> * @return {number} The number of timeouts created.<tr><td><a id="l517"></a><a href="#l517">517</a><td> * @private<tr><td><a id="l518"></a><a href="#l518">518</a><td> */<tr><td><a id="l519"></a><a href="#l519">519</a><td>goog.testing.MockClock.prototype.setInterval_ =<tr><td><a id="l520"></a><a href="#l520">520</a><td> function(funcToCall, opt_millis) {<tr><td><a id="l521"></a><a href="#l521">521</a><td> var millis = opt_millis || 0;<tr><td><a id="l522"></a><a href="#l522">522</a><td> this.timeoutsMade_++;<tr><td><a id="l523"></a><a href="#l523">523</a><td> this.scheduleFunction_(goog.testing.MockClock.nextId, funcToCall, millis,<tr><td><a id="l524"></a><a href="#l524">524</a><td> true);<tr><td><a id="l525"></a><a href="#l525">525</a><td> return goog.testing.MockClock.nextId++;<tr><td><a id="l526"></a><a href="#l526">526</a><td>};<tr><td><a id="l527"></a><a href="#l527">527</a><td><tr><td><a id="l528"></a><a href="#l528">528</a><td><tr><td><a id="l529"></a><a href="#l529">529</a><td>/**<tr><td><a id="l530"></a><a href="#l530">530</a><td> * Schedules a function to be called when an animation frame is triggered.<tr><td><a id="l531"></a><a href="#l531">531</a><td> * Mock implementation for requestAnimationFrame.<tr><td><a id="l532"></a><a href="#l532">532</a><td> * @param {Function} funcToCall The function to call.<tr><td><a id="l533"></a><a href="#l533">533</a><td> * @return {number} The number of timeouts created.<tr><td><a id="l534"></a><a href="#l534">534</a><td> * @private<tr><td><a id="l535"></a><a href="#l535">535</a><td> */<tr><td><a id="l536"></a><a href="#l536">536</a><td>goog.testing.MockClock.prototype.requestAnimationFrame_ = function(funcToCall) {<tr><td><a id="l537"></a><a href="#l537">537</a><td> return this.setTimeout_(goog.bind(function() {<tr><td><a id="l538"></a><a href="#l538">538</a><td> if (funcToCall) {<tr><td><a id="l539"></a><a href="#l539">539</a><td> funcToCall(this.getCurrentTime());<tr><td><a id="l540"></a><a href="#l540">540</a><td> } else if (goog.global.mozRequestAnimationFrame) {<tr><td><a id="l541"></a><a href="#l541">541</a><td> var event = new goog.testing.events.Event('MozBeforePaint', goog.global);<tr><td><a id="l542"></a><a href="#l542">542</a><td> event['timeStamp'] = this.getCurrentTime();<tr><td><a id="l543"></a><a href="#l543">543</a><td> goog.testing.events.fireBrowserEvent(event);<tr><td><a id="l544"></a><a href="#l544">544</a><td> }<tr><td><a id="l545"></a><a href="#l545">545</a><td> }, this), goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT);<tr><td><a id="l546"></a><a href="#l546">546</a><td>};<tr><td><a id="l547"></a><a href="#l547">547</a><td><tr><td><a id="l548"></a><a href="#l548">548</a><td><tr><td><a id="l549"></a><a href="#l549">549</a><td>/**<tr><td><a id="l550"></a><a href="#l550">550</a><td> * Schedules a function to be called immediately after the current JS<tr><td><a id="l551"></a><a href="#l551">551</a><td> * execution.<tr><td><a id="l552"></a><a href="#l552">552</a><td> * Mock implementation for setImmediate.<tr><td><a id="l553"></a><a href="#l553">553</a><td> * @param {Function} funcToCall The function to call.<tr><td><a id="l554"></a><a href="#l554">554</a><td> * @return {number} The number of timeouts created.<tr><td><a id="l555"></a><a href="#l555">555</a><td> * @private<tr><td><a id="l556"></a><a href="#l556">556</a><td> */<tr><td><a id="l557"></a><a href="#l557">557</a><td>goog.testing.MockClock.prototype.setImmediate_ = function(funcToCall) {<tr><td><a id="l558"></a><a href="#l558">558</a><td> return this.setTimeout_(funcToCall, 0);<tr><td><a id="l559"></a><a href="#l559">559</a><td>};<tr><td><a id="l560"></a><a href="#l560">560</a><td><tr><td><a id="l561"></a><a href="#l561">561</a><td><tr><td><a id="l562"></a><a href="#l562">562</a><td>/**<tr><td><a id="l563"></a><a href="#l563">563</a><td> * Clears a timeout.<tr><td><a id="l564"></a><a href="#l564">564</a><td> * Mock implementation for clearTimeout.<tr><td><a id="l565"></a><a href="#l565">565</a><td> * @param {number} timeoutKey The timeout key to clear.<tr><td><a id="l566"></a><a href="#l566">566</a><td> * @private<tr><td><a id="l567"></a><a href="#l567">567</a><td> */<tr><td><a id="l568"></a><a href="#l568">568</a><td>goog.testing.MockClock.prototype.clearTimeout_ = function(timeoutKey) {<tr><td><a id="l569"></a><a href="#l569">569</a><td> // Some common libraries register static state with timers.<tr><td><a id="l570"></a><a href="#l570">570</a><td> // This is bad. It leads to all sorts of crazy test problems where<tr><td><a id="l571"></a><a href="#l571">571</a><td> // 1) Test A sets up a new mock clock and a static timer.<tr><td><a id="l572"></a><a href="#l572">572</a><td> // 2) Test B sets up a new mock clock, but re-uses the static timer<tr><td><a id="l573"></a><a href="#l573">573</a><td> // from Test A.<tr><td><a id="l574"></a><a href="#l574">574</a><td> // 3) A timeout key from test A gets cleared, breaking a timeout in<tr><td><a id="l575"></a><a href="#l575">575</a><td> // Test B.<tr><td><a id="l576"></a><a href="#l576">576</a><td> //<tr><td><a id="l577"></a><a href="#l577">577</a><td> // For now, we just hackily fail silently if someone tries to clear a timeout<tr><td><a id="l578"></a><a href="#l578">578</a><td> // key before we've allocated it.<tr><td><a id="l579"></a><a href="#l579">579</a><td> // Ideally, we should throw an exception if we see this happening.<tr><td><a id="l580"></a><a href="#l580">580</a><td> if (this.isTimeoutSet(timeoutKey)) {<tr><td><a id="l581"></a><a href="#l581">581</a><td> this.deletedKeys_[timeoutKey] = true;<tr><td><a id="l582"></a><a href="#l582">582</a><td> }<tr><td><a id="l583"></a><a href="#l583">583</a><td>};<tr><td><a id="l584"></a><a href="#l584">584</a><td><tr><td><a id="l585"></a><a href="#l585">585</a><td><tr><td><a id="l586"></a><a href="#l586">586</a><td>/**<tr><td><a id="l587"></a><a href="#l587">587</a><td> * Clears an interval.<tr><td><a id="l588"></a><a href="#l588">588</a><td> * Mock implementation for clearInterval.<tr><td><a id="l589"></a><a href="#l589">589</a><td> * @param {number} timeoutKey The interval key to clear.<tr><td><a id="l590"></a><a href="#l590">590</a><td> * @private<tr><td><a id="l591"></a><a href="#l591">591</a><td> */<tr><td><a id="l592"></a><a href="#l592">592</a><td>goog.testing.MockClock.prototype.clearInterval_ = function(timeoutKey) {<tr><td><a id="l593"></a><a href="#l593">593</a><td> this.clearTimeout_(timeoutKey);<tr><td><a id="l594"></a><a href="#l594">594</a><td>};<tr><td><a id="l595"></a><a href="#l595">595</a><td><tr><td><a id="l596"></a><a href="#l596">596</a><td><tr><td><a id="l597"></a><a href="#l597">597</a><td>/**<tr><td><a id="l598"></a><a href="#l598">598</a><td> * Clears a requestAnimationFrame.<tr><td><a id="l599"></a><a href="#l599">599</a><td> * Mock implementation for cancelRequestAnimationFrame.<tr><td><a id="l600"></a><a href="#l600">600</a><td> * @param {number} timeoutKey The requestAnimationFrame key to clear.<tr><td><a id="l601"></a><a href="#l601">601</a><td> * @private<tr><td><a id="l602"></a><a href="#l602">602</a><td> */<tr><td><a id="l603"></a><a href="#l603">603</a><td>goog.testing.MockClock.prototype.cancelRequestAnimationFrame_ =<tr><td><a id="l604"></a><a href="#l604">604</a><td> function(timeoutKey) {<tr><td><a id="l605"></a><a href="#l605">605</a><td> this.clearTimeout_(timeoutKey);<tr><td><a id="l606"></a><a href="#l606">606</a><td>};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>mockcontrol.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/testing/mockcontrol.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2008 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview A MockControl holds a set of mocks for a particular test.<tr><td><a id="l17"></a><a href="#l17">17</a><td> * It consolidates calls to $replay, $verify, and $tearDown, which simplifies<tr><td><a id="l18"></a><a href="#l18">18</a><td> * the test and helps avoid omissions.<tr><td><a id="l19"></a><a href="#l19">19</a><td> *<tr><td><a id="l20"></a><a href="#l20">20</a><td> * You can create and control a mock:<tr><td><a id="l21"></a><a href="#l21">21</a><td> * var mockFoo = mockControl.addMock(new MyMock(Foo));<tr><td><a id="l22"></a><a href="#l22">22</a><td> *<tr><td><a id="l23"></a><a href="#l23">23</a><td> * MockControl also exposes some convenience functions that create<tr><td><a id="l24"></a><a href="#l24">24</a><td> * controlled mocks for common mocks: StrictMock, LooseMock,<tr><td><a id="l25"></a><a href="#l25">25</a><td> * FunctionMock, MethodMock, and GlobalFunctionMock.<tr><td><a id="l26"></a><a href="#l26">26</a><td> *<tr><td><a id="l27"></a><a href="#l27">27</a><td> */<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td>goog.provide('goog.testing.MockControl');<tr><td><a id="l31"></a><a href="#l31">31</a><td><tr><td><a id="l32"></a><a href="#l32">32</a><td>goog.require('goog.array');<tr><td><a id="l33"></a><a href="#l33">33</a><td>goog.require('goog.testing');<tr><td><a id="l34"></a><a href="#l34">34</a><td>goog.require('goog.testing.LooseMock');<tr><td><a id="l35"></a><a href="#l35">35</a><td>goog.require('goog.testing.StrictMock');<tr><td><a id="l36"></a><a href="#l36">36</a><td><tr><td><a id="l37"></a><a href="#l37">37</a><td><tr><td><a id="l38"></a><a href="#l38">38</a><td><tr><td><a id="l39"></a><a href="#l39">39</a><td>/**<tr><td><a id="l40"></a><a href="#l40">40</a><td> * Controls a set of mocks. Controlled mocks are replayed, verified, and<tr><td><a id="l41"></a><a href="#l41">41</a><td> * cleaned-up at the same time.<tr><td><a id="l42"></a><a href="#l42">42</a><td> * @constructor<tr><td><a id="l43"></a><a href="#l43">43</a><td> */<tr><td><a id="l44"></a><a href="#l44">44</a><td>goog.testing.MockControl = function() {<tr><td><a id="l45"></a><a href="#l45">45</a><td> /**<tr><td><a id="l46"></a><a href="#l46">46</a><td> * The list of mocks being controlled.<tr><td><a id="l47"></a><a href="#l47">47</a><td> * @type {Array<goog.testing.MockInterface>}<tr><td><a id="l48"></a><a href="#l48">48</a><td> * @private<tr><td><a id="l49"></a><a href="#l49">49</a><td> */<tr><td><a id="l50"></a><a href="#l50">50</a><td> this.mocks_ = [];<tr><td><a id="l51"></a><a href="#l51">51</a><td>};<tr><td><a id="l52"></a><a href="#l52">52</a><td><tr><td><a id="l53"></a><a href="#l53">53</a><td><tr><td><a id="l54"></a><a href="#l54">54</a><td>/**<tr><td><a id="l55"></a><a href="#l55">55</a><td> * Takes control of this mock.<tr><td><a id="l56"></a><a href="#l56">56</a><td> * @param {goog.testing.MockInterface} mock Mock to be controlled.<tr><td><a id="l57"></a><a href="#l57">57</a><td> * @return {goog.testing.MockInterface} The same mock passed in,<tr><td><a id="l58"></a><a href="#l58">58</a><td> * for convenience.<tr><td><a id="l59"></a><a href="#l59">59</a><td> */<tr><td><a id="l60"></a><a href="#l60">60</a><td>goog.testing.MockControl.prototype.addMock = function(mock) {<tr><td><a id="l61"></a><a href="#l61">61</a><td> this.mocks_.push(mock);<tr><td><a id="l62"></a><a href="#l62">62</a><td> return mock;<tr><td><a id="l63"></a><a href="#l63">63</a><td>};<tr><td><a id="l64"></a><a href="#l64">64</a><td><tr><td><a id="l65"></a><a href="#l65">65</a><td><tr><td><a id="l66"></a><a href="#l66">66</a><td>/**<tr><td><a id="l67"></a><a href="#l67">67</a><td> * Calls replay on each controlled mock.<tr><td><a id="l68"></a><a href="#l68">68</a><td> */<tr><td><a id="l69"></a><a href="#l69">69</a><td>goog.testing.MockControl.prototype.$replayAll = function() {<tr><td><a id="l70"></a><a href="#l70">70</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a id="l71"></a><a href="#l71">71</a><td> m.$replay();<tr><td><a id="l72"></a><a href="#l72">72</a><td> });<tr><td><a id="l73"></a><a href="#l73">73</a><td>};<tr><td><a id="l74"></a><a href="#l74">74</a><td><tr><td><a id="l75"></a><a href="#l75">75</a><td><tr><td><a id="l76"></a><a href="#l76">76</a><td>/**<tr><td><a id="l77"></a><a href="#l77">77</a><td> * Calls reset on each controlled mock.<tr><td><a id="l78"></a><a href="#l78">78</a><td> */<tr><td><a id="l79"></a><a href="#l79">79</a><td>goog.testing.MockControl.prototype.$resetAll = function() {<tr><td><a id="l80"></a><a href="#l80">80</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a id="l81"></a><a href="#l81">81</a><td> m.$reset();<tr><td><a id="l82"></a><a href="#l82">82</a><td> });<tr><td><a id="l83"></a><a href="#l83">83</a><td>};<tr><td><a id="l84"></a><a href="#l84">84</a><td><tr><td><a id="l85"></a><a href="#l85">85</a><td><tr><td><a id="l86"></a><a href="#l86">86</a><td>/**<tr><td><a id="l87"></a><a href="#l87">87</a><td> * Calls verify on each controlled mock.<tr><td><a id="l88"></a><a href="#l88">88</a><td> */<tr><td><a id="l89"></a><a href="#l89">89</a><td>goog.testing.MockControl.prototype.$verifyAll = function() {<tr><td><a id="l90"></a><a href="#l90">90</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a id="l91"></a><a href="#l91">91</a><td> m.$verify();<tr><td><a id="l92"></a><a href="#l92">92</a><td> });<tr><td><a id="l93"></a><a href="#l93">93</a><td>};<tr><td><a id="l94"></a><a href="#l94">94</a><td><tr><td><a id="l95"></a><a href="#l95">95</a><td><tr><td><a id="l96"></a><a href="#l96">96</a><td>/**<tr><td><a id="l97"></a><a href="#l97">97</a><td> * Calls tearDown on each controlled mock, if necesssary.<tr><td><a id="l98"></a><a href="#l98">98</a><td> */<tr><td><a id="l99"></a><a href="#l99">99</a><td>goog.testing.MockControl.prototype.$tearDown = function() {<tr><td><a id="l100"></a><a href="#l100">100</a><td> goog.array.forEach(this.mocks_, function(m) {<tr><td><a id="l101"></a><a href="#l101">101</a><td> // $tearDown if defined.<tr><td><a id="l102"></a><a href="#l102">102</a><td> if (m.$tearDown) {<tr><td><a id="l103"></a><a href="#l103">103</a><td> m.$tearDown();<tr><td><a id="l104"></a><a href="#l104">104</a><td> }<tr><td><a id="l105"></a><a href="#l105">105</a><td> // TODO(user): Somehow determine if verifyAll should have been called<tr><td><a id="l106"></a><a href="#l106">106</a><td> // but was not.<tr><td><a id="l107"></a><a href="#l107">107</a><td> });<tr><td><a id="l108"></a><a href="#l108">108</a><td>};<tr><td><a id="l109"></a><a href="#l109">109</a><td><tr><td><a id="l110"></a><a href="#l110">110</a><td><tr><td><a id="l111"></a><a href="#l111">111</a><td>/**<tr><td><a id="l112"></a><a href="#l112">112</a><td> * Creates a controlled StrictMock. Passes its arguments through to the<tr><td><a id="l113"></a><a href="#l113">113</a><td> * StrictMock constructor.<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a id="l115"></a><a href="#l115">115</a><td> * the constructor of an object to mock.<tr><td><a id="l116"></a><a href="#l116">116</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a id="l117"></a><a href="#l117">117</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a id="l118"></a><a href="#l118">118</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a id="l119"></a><a href="#l119">119</a><td> * a proxy for the target mock should be created.<tr><td><a id="l120"></a><a href="#l120">120</a><td> * @return {!goog.testing.StrictMock} The mock object.<tr><td><a id="l121"></a><a href="#l121">121</a><td> */<tr><td><a id="l122"></a><a href="#l122">122</a><td>goog.testing.MockControl.prototype.createStrictMock = function(<tr><td><a id="l123"></a><a href="#l123">123</a><td> objectToMock, opt_mockStaticMethods, opt_createProxy) {<tr><td><a id="l124"></a><a href="#l124">124</a><td> var m = new goog.testing.StrictMock(objectToMock, opt_mockStaticMethods,<tr><td><a id="l125"></a><a href="#l125">125</a><td> opt_createProxy);<tr><td><a id="l126"></a><a href="#l126">126</a><td> this.addMock(m);<tr><td><a id="l127"></a><a href="#l127">127</a><td> return m;<tr><td><a id="l128"></a><a href="#l128">128</a><td>};<tr><td><a id="l129"></a><a href="#l129">129</a><td><tr><td><a id="l130"></a><a href="#l130">130</a><td><tr><td><a id="l131"></a><a href="#l131">131</a><td>/**<tr><td><a id="l132"></a><a href="#l132">132</a><td> * Creates a controlled LooseMock. Passes its arguments through to the<tr><td><a id="l133"></a><a href="#l133">133</a><td> * LooseMock constructor.<tr><td><a id="l134"></a><a href="#l134">134</a><td> * @param {Object|Function} objectToMock The object that should be mocked, or<tr><td><a id="l135"></a><a href="#l135">135</a><td> * the constructor of an object to mock.<tr><td><a id="l136"></a><a href="#l136">136</a><td> * @param {boolean=} opt_ignoreUnexpectedCalls Whether to ignore unexpected<tr><td><a id="l137"></a><a href="#l137">137</a><td> * calls.<tr><td><a id="l138"></a><a href="#l138">138</a><td> * @param {boolean=} opt_mockStaticMethods An optional argument denoting that<tr><td><a id="l139"></a><a href="#l139">139</a><td> * a mock should be constructed from the static functions of a class.<tr><td><a id="l140"></a><a href="#l140">140</a><td> * @param {boolean=} opt_createProxy An optional argument denoting that<tr><td><a id="l141"></a><a href="#l141">141</a><td> * a proxy for the target mock should be created.<tr><td><a id="l142"></a><a href="#l142">142</a><td> * @return {!goog.testing.LooseMock} The mock object.<tr><td><a id="l143"></a><a href="#l143">143</a><td> */<tr><td><a id="l144"></a><a href="#l144">144</a><td>goog.testing.MockControl.prototype.createLooseMock = function(<tr><td><a id="l145"></a><a href="#l145">145</a><td> objectToMock, opt_ignoreUnexpectedCalls,<tr><td><a id="l146"></a><a href="#l146">146</a><td> opt_mockStaticMethods, opt_createProxy) {<tr><td><a id="l147"></a><a href="#l147">147</a><td> var m = new goog.testing.LooseMock(objectToMock, opt_ignoreUnexpectedCalls,<tr><td><a id="l148"></a><a href="#l148">148</a><td> opt_mockStaticMethods, opt_createProxy);<tr><td><a id="l149"></a><a href="#l149">149</a><td> this.addMock(m);<tr><td><a id="l150"></a><a href="#l150">150</a><td> return m;<tr><td><a id="l151"></a><a href="#l151">151</a><td>};<tr><td><a id="l152"></a><a href="#l152">152</a><td><tr><td><a id="l153"></a><a href="#l153">153</a><td><tr><td><a id="l154"></a><a href="#l154">154</a><td>/**<tr><td><a id="l155"></a><a href="#l155">155</a><td> * Creates a controlled FunctionMock. Passes its arguments through to the<tr><td><a id="l156"></a><a href="#l156">156</a><td> * FunctionMock constructor.<tr><td><a id="l157"></a><a href="#l157">157</a><td> * @param {string=} opt_functionName The optional name of the function to mock<tr><td><a id="l158"></a><a href="#l158">158</a><td> * set to '[anonymous mocked function]' if not passed in.<tr><td><a id="l159"></a><a href="#l159">159</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a id="l160"></a><a href="#l160">160</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a id="l161"></a><a href="#l161">161</a><td> * @return {goog.testing.MockInterface} The mocked function.<tr><td><a id="l162"></a><a href="#l162">162</a><td> */<tr><td><a id="l163"></a><a href="#l163">163</a><td>goog.testing.MockControl.prototype.createFunctionMock = function(<tr><td><a id="l164"></a><a href="#l164">164</a><td> opt_functionName, opt_strictness) {<tr><td><a id="l165"></a><a href="#l165">165</a><td> var m = goog.testing.createFunctionMock(opt_functionName, opt_strictness);<tr><td><a id="l166"></a><a href="#l166">166</a><td> this.addMock(m);<tr><td><a id="l167"></a><a href="#l167">167</a><td> return m;<tr><td><a id="l168"></a><a href="#l168">168</a><td>};<tr><td><a id="l169"></a><a href="#l169">169</a><td><tr><td><a id="l170"></a><a href="#l170">170</a><td><tr><td><a id="l171"></a><a href="#l171">171</a><td>/**<tr><td><a id="l172"></a><a href="#l172">172</a><td> * Creates a controlled MethodMock. Passes its arguments through to the<tr><td><a id="l173"></a><a href="#l173">173</a><td> * MethodMock constructor.<tr><td><a id="l174"></a><a href="#l174">174</a><td> * @param {Object} scope The scope of the method to be mocked out.<tr><td><a id="l175"></a><a href="#l175">175</a><td> * @param {string} functionName The name of the function we're going to mock.<tr><td><a id="l176"></a><a href="#l176">176</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a id="l177"></a><a href="#l177">177</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a id="l178"></a><a href="#l178">178</a><td> * @return {!goog.testing.MockInterface} The mocked method.<tr><td><a id="l179"></a><a href="#l179">179</a><td> */<tr><td><a id="l180"></a><a href="#l180">180</a><td>goog.testing.MockControl.prototype.createMethodMock = function(<tr><td><a id="l181"></a><a href="#l181">181</a><td> scope, functionName, opt_strictness) {<tr><td><a id="l182"></a><a href="#l182">182</a><td> var m = goog.testing.createMethodMock(scope, functionName, opt_strictness);<tr><td><a id="l183"></a><a href="#l183">183</a><td> this.addMock(m);<tr><td><a id="l184"></a><a href="#l184">184</a><td> return m;<tr><td><a id="l185"></a><a href="#l185">185</a><td>};<tr><td><a id="l186"></a><a href="#l186">186</a><td><tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td>/**<tr><td><a id="l189"></a><a href="#l189">189</a><td> * Creates a controlled MethodMock for a constructor. Passes its arguments<tr><td><a id="l190"></a><a href="#l190">190</a><td> * through to the MethodMock constructor. See<tr><td><a id="l191"></a><a href="#l191">191</a><td> * {@link goog.testing.createConstructorMock} for details.<tr><td><a id="l192"></a><a href="#l192">192</a><td> * @param {Object} scope The scope of the constructor to be mocked out.<tr><td><a id="l193"></a><a href="#l193">193</a><td> * @param {string} constructorName The name of the function we're going to mock.<tr><td><a id="l194"></a><a href="#l194">194</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a id="l195"></a><a href="#l195">195</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a id="l196"></a><a href="#l196">196</a><td> * @return {!goog.testing.MockInterface} The mocked method.<tr><td><a id="l197"></a><a href="#l197">197</a><td> */<tr><td><a id="l198"></a><a href="#l198">198</a><td>goog.testing.MockControl.prototype.createConstructorMock = function(<tr><td><a id="l199"></a><a href="#l199">199</a><td> scope, constructorName, opt_strictness) {<tr><td><a id="l200"></a><a href="#l200">200</a><td> var m = goog.testing.createConstructorMock(scope, constructorName,<tr><td><a id="l201"></a><a href="#l201">201</a><td> opt_strictness);<tr><td><a id="l202"></a><a href="#l202">202</a><td> this.addMock(m);<tr><td><a id="l203"></a><a href="#l203">203</a><td> return m;<tr><td><a id="l204"></a><a href="#l204">204</a><td>};<tr><td><a id="l205"></a><a href="#l205">205</a><td><tr><td><a id="l206"></a><a href="#l206">206</a><td><tr><td><a id="l207"></a><a href="#l207">207</a><td>/**<tr><td><a id="l208"></a><a href="#l208">208</a><td> * Creates a controlled GlobalFunctionMock. Passes its arguments through to the<tr><td><a id="l209"></a><a href="#l209">209</a><td> * GlobalFunctionMock constructor.<tr><td><a id="l210"></a><a href="#l210">210</a><td> * @param {string} functionName The name of the function we're going to mock.<tr><td><a id="l211"></a><a href="#l211">211</a><td> * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or<tr><td><a id="l212"></a><a href="#l212">212</a><td> * goog.testing.Mock.STRICT. The default is STRICT.<tr><td><a id="l213"></a><a href="#l213">213</a><td> * @return {!goog.testing.MockInterface} The mocked function.<tr><td><a id="l214"></a><a href="#l214">214</a><td> */<tr><td><a id="l215"></a><a href="#l215">215</a><td>goog.testing.MockControl.prototype.createGlobalFunctionMock = function(<tr><td><a id="l216"></a><a href="#l216">216</a><td> functionName, opt_strictness) {<tr><td><a id="l217"></a><a href="#l217">217</a><td> var m = goog.testing.createGlobalFunctionMock(functionName, opt_strictness);<tr><td><a id="l218"></a><a href="#l218">218</a><td> this.addMock(m);<tr><td><a id="l219"></a><a href="#l219">219</a><td> return m;<tr><td><a id="l220"></a><a href="#l220">220</a><td>};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>mockinterface.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/testing/mockinterface.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2010 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the "License");<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an "AS-IS" BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview An interface that all mocks should share.<tr><td><a id="l17"></a><a href="#l17">17</a><td> * @author nicksantos@google.com (Nick Santos)<tr><td><a id="l18"></a><a href="#l18">18</a><td> */<tr><td><a id="l19"></a><a href="#l19">19</a><td><tr><td><a id="l20"></a><a href="#l20">20</a><td>goog.provide('goog.testing.MockInterface');<tr><td><a id="l21"></a><a href="#l21">21</a><td><tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td><tr><td><a id="l24"></a><a href="#l24">24</a><td>/** @interface */<tr><td><a id="l25"></a><a href="#l25">25</a><td>goog.testing.MockInterface = function() {};<tr><td><a id="l26"></a><a href="#l26">26</a><td><tr><td><a id="l27"></a><a href="#l27">27</a><td><tr><td><a id="l28"></a><a href="#l28">28</a><td>/**<tr><td><a id="l29"></a><a href="#l29">29</a><td> * Write down all the expected functions that have been called on the<tr><td><a id="l30"></a><a href="#l30">30</a><td> * mock so far. From here on out, future function calls will be<tr><td><a id="l31"></a><a href="#l31">31</a><td> * compared against this list.<tr><td><a id="l32"></a><a href="#l32">32</a><td> */<tr><td><a id="l33"></a><a href="#l33">33</a><td>goog.testing.MockInterface.prototype.$replay = function() {};<tr><td><a id="l34"></a><a href="#l34">34</a><td><tr><td><a id="l35"></a><a href="#l35">35</a><td><tr><td><a id="l36"></a><a href="#l36">36</a><td>/**<tr><td><a id="l37"></a><a href="#l37">37</a><td> * Reset the mock.<tr><td><a id="l38"></a><a href="#l38">38</a><td> */<tr><td><a id="l39"></a><a href="#l39">39</a><td>goog.testing.MockInterface.prototype.$reset = function() {};<tr><td><a id="l40"></a><a href="#l40">40</a><td><tr><td><a id="l41"></a><a href="#l41">41</a><td><tr><td><a id="l42"></a><a href="#l42">42</a><td>/**<tr><td><a id="l43"></a><a href="#l43">43</a><td> * Assert that the expected function calls match the actual calls.<tr><td><a id="l44"></a><a href="#l44">44</a><td> */<tr><td><a id="l45"></a><a href="#l45">45</a><td>goog.testing.MockInterface.prototype.$verify = function() {};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
|