selenium-webdriver 2.47.0 → 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 +96 -0
- package/NOTICE +1 -1
- package/README.md +57 -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 +80 -114
- package/firefox/extension.js +10 -19
- package/firefox/index.js +175 -171
- package/firefox/profile.js +221 -239
- package/http/index.js +396 -77
- 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} +89 -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 +6 -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/promise.js +3093 -0
- package/lib/safari/client.js +697 -659
- package/lib/session.js +79 -0
- package/{test/promise_aplus_test.js → lib/symbols.js} +15 -25
- package/lib/test/build.js +4 -4
- package/lib/test/data/click_tests/disappearing_element.html +62 -0
- package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
- package/lib/test/data/click_tests/overlapping_elements.html +70 -0
- 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 +3 -1
- package/lib/test/data/selectPage.html +18 -2
- package/lib/test/data/simpleTest.html +1 -0
- package/lib/test/fileserver.js +3 -4
- package/lib/test/index.js +13 -4
- 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 +234 -219
- 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/firefox/firefox_test.js +24 -0
- package/test/http/http_test.js +354 -43
- 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/lib/promise_aplus_test.js +74 -0
- 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 -317
- 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 -91
- 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 -216
- package/docs/class_webdriver_WebElementPromise.html +0 -266
- 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 -18
- package/docs/class_webdriver_promise_ControlFlow.html +0 -109
- package/docs/class_webdriver_promise_Deferred.html +0 -84
- package/docs/class_webdriver_promise_Promise.html +0 -74
- 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 -123
- 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 -216
- package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -266
- 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 -67
- package/docs/module_selenium-webdriver_firefox_binary.html +0 -4
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -21
- package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -21
- 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 -162
- 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 -40
- 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 -165
- 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/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/testing/watchers.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 -1655
- 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 -139
- package/lib/goog/async/workqueue.js +0 -139
- package/lib/goog/base.js +0 -2547
- 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 -2995
- 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 -42
- package/lib/goog/dom/vendor.js +0 -96
- package/lib/goog/events/browserevent.js +0 -386
- 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 -233
- package/lib/goog/events/keycodes.js +0 -420
- 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 -105
- package/lib/goog/functions/functions.js +0 -332
- package/lib/goog/html/safehtml.js +0 -756
- 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 -431
- package/lib/goog/html/trustedresourceurl.js +0 -224
- package/lib/goog/html/uncheckedconversions.js +0 -231
- package/lib/goog/i18n/bidi.js +0 -908
- package/lib/goog/iter/iter.js +0 -1305
- package/lib/goog/json/json.js +0 -365
- 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 -327
- 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/math/box.js +0 -389
- 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 -1310
- package/lib/goog/promise/resolver.js +0 -48
- package/lib/goog/promise/thenable.js +0 -126
- package/lib/goog/reflect/reflect.js +0 -78
- package/lib/goog/string/const.js +0 -182
- package/lib/goog/string/string.js +0 -1565
- package/lib/goog/string/typedstring.js +0 -48
- package/lib/goog/structs/collection.js +0 -56
- package/lib/goog/structs/map.js +0 -456
- package/lib/goog/structs/set.js +0 -279
- package/lib/goog/structs/structs.js +0 -354
- package/lib/goog/style/style.js +0 -2054
- package/lib/goog/testing/asserts.js +0 -1265
- package/lib/goog/testing/events/events.js +0 -727
- package/lib/goog/testing/functionmock.js +0 -176
- 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 -617
- 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 -245
- 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 -1569
- package/lib/goog/testing/testrunner.js +0 -440
- package/lib/goog/testing/watchers.js +0 -46
- package/lib/goog/uri/uri.js +0 -1507
- package/lib/goog/uri/utils.js +0 -1116
- package/lib/goog/useragent/product.js +0 -175
- package/lib/goog/useragent/product_isversion.js +0 -143
- package/lib/goog/useragent/useragent.js +0 -538
- package/lib/webdriver/actionsequence.js +0 -356
- package/lib/webdriver/builder.js +0 -208
- package/lib/webdriver/capabilities.js +0 -411
- 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 -523
- 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/promise.js +0 -2609
- package/lib/webdriver/serializable.js +0 -41
- 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 -719
- package/lib/webdriver/test/promise_flow_test.js +0 -1957
- package/lib/webdriver/test/promise_generator_test.js +0 -251
- package/lib/webdriver/test/promise_test.js +0 -1981
- 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 -2492
- 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>testcase.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/testcase.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 A class representing a set of test functions to be run.<tr><td><a id="l17"></a><a href="#l17">17</a><td> *<tr><td><a id="l18"></a><a href="#l18">18</a><td> * Testing code should not have dependencies outside of goog.testing so as to<tr><td><a id="l19"></a><a href="#l19">19</a><td> * reduce the chance of masking missing dependencies.<tr><td><a id="l20"></a><a href="#l20">20</a><td> *<tr><td><a id="l21"></a><a href="#l21">21</a><td> * This file does not compile correctly with --collapse_properties. Use<tr><td><a id="l22"></a><a href="#l22">22</a><td> * --property_renaming=ALL_UNQUOTED instead.<tr><td><a id="l23"></a><a href="#l23">23</a><td> *<tr><td><a id="l24"></a><a href="#l24">24</a><td> */<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.provide('goog.testing.TestCase');<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.provide('goog.testing.TestCase.Error');<tr><td><a id="l28"></a><a href="#l28">28</a><td>goog.provide('goog.testing.TestCase.Order');<tr><td><a id="l29"></a><a href="#l29">29</a><td>goog.provide('goog.testing.TestCase.Result');<tr><td><a id="l30"></a><a href="#l30">30</a><td>goog.provide('goog.testing.TestCase.Test');<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>goog.require('goog.Promise');<tr><td><a id="l34"></a><a href="#l34">34</a><td>goog.require('goog.Thenable');<tr><td><a id="l35"></a><a href="#l35">35</a><td>goog.require('goog.asserts');<tr><td><a id="l36"></a><a href="#l36">36</a><td>goog.require('goog.dom.TagName');<tr><td><a id="l37"></a><a href="#l37">37</a><td>goog.require('goog.object');<tr><td><a id="l38"></a><a href="#l38">38</a><td>goog.require('goog.testing.asserts');<tr><td><a id="l39"></a><a href="#l39">39</a><td>goog.require('goog.testing.stacktrace');<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>/**<tr><td><a id="l44"></a><a href="#l44">44</a><td> * A class representing a JsUnit test case. A TestCase is made up of a number<tr><td><a id="l45"></a><a href="#l45">45</a><td> * of test functions which can be run. Individual test cases can override the<tr><td><a id="l46"></a><a href="#l46">46</a><td> * following functions to set up their test environment:<tr><td><a id="l47"></a><a href="#l47">47</a><td> * - runTests - completely override the test's runner<tr><td><a id="l48"></a><a href="#l48">48</a><td> * - setUpPage - called before any of the test functions are run<tr><td><a id="l49"></a><a href="#l49">49</a><td> * - tearDownPage - called after all tests are finished<tr><td><a id="l50"></a><a href="#l50">50</a><td> * - setUp - called before each of the test functions<tr><td><a id="l51"></a><a href="#l51">51</a><td> * - tearDown - called after each of the test functions<tr><td><a id="l52"></a><a href="#l52">52</a><td> * - shouldRunTests - called before a test run, all tests are skipped if it<tr><td><a id="l53"></a><a href="#l53">53</a><td> * returns false. Can be used to disable tests on browsers<tr><td><a id="l54"></a><a href="#l54">54</a><td> * where they aren't expected to pass.<tr><td><a id="l55"></a><a href="#l55">55</a><td> *<tr><td><a id="l56"></a><a href="#l56">56</a><td> * Use {@link #autoDiscoverLifecycle} and {@link #autoDiscoverTests}<tr><td><a id="l57"></a><a href="#l57">57</a><td> *<tr><td><a id="l58"></a><a href="#l58">58</a><td> * @param {string=} opt_name The name of the test case, defaults to<tr><td><a id="l59"></a><a href="#l59">59</a><td> * 'Untitled Test Case'.<tr><td><a id="l60"></a><a href="#l60">60</a><td> * @constructor<tr><td><a id="l61"></a><a href="#l61">61</a><td> */<tr><td><a id="l62"></a><a href="#l62">62</a><td>goog.testing.TestCase = function(opt_name) {<tr><td><a id="l63"></a><a href="#l63">63</a><td> /**<tr><td><a id="l64"></a><a href="#l64">64</a><td> * A name for the test case.<tr><td><a id="l65"></a><a href="#l65">65</a><td> * @type {string}<tr><td><a id="l66"></a><a href="#l66">66</a><td> * @private<tr><td><a id="l67"></a><a href="#l67">67</a><td> */<tr><td><a id="l68"></a><a href="#l68">68</a><td> this.name_ = opt_name || 'Untitled Test Case';<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> * Array of test functions that can be executed.<tr><td><a id="l72"></a><a href="#l72">72</a><td> * @type {!Array<!goog.testing.TestCase.Test>}<tr><td><a id="l73"></a><a href="#l73">73</a><td> * @private<tr><td><a id="l74"></a><a href="#l74">74</a><td> */<tr><td><a id="l75"></a><a href="#l75">75</a><td> this.tests_ = [];<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> * Set of test names and/or indices to execute, or null if all tests should<tr><td><a id="l79"></a><a href="#l79">79</a><td> * be executed.<tr><td><a id="l80"></a><a href="#l80">80</a><td> *<tr><td><a id="l81"></a><a href="#l81">81</a><td> * Indices are included to allow automation tools to run a subset of the<tr><td><a id="l82"></a><a href="#l82">82</a><td> * tests without knowing the exact contents of the test file.<tr><td><a id="l83"></a><a href="#l83">83</a><td> *<tr><td><a id="l84"></a><a href="#l84">84</a><td> * Indices should only be used with SORTED ordering.<tr><td><a id="l85"></a><a href="#l85">85</a><td> *<tr><td><a id="l86"></a><a href="#l86">86</a><td> * Example valid values:<tr><td><a id="l87"></a><a href="#l87">87</a><td> * <ul><tr><td><a id="l88"></a><a href="#l88">88</a><td> * <li>[testName]<tr><td><a id="l89"></a><a href="#l89">89</a><td> * <li>[testName1, testName2]<tr><td><a id="l90"></a><a href="#l90">90</a><td> * <li>[2] - will run the 3rd test in the order specified<tr><td><a id="l91"></a><a href="#l91">91</a><td> * <li>[1,3,5]<tr><td><a id="l92"></a><a href="#l92">92</a><td> * <li>[testName1, testName2, 3, 5] - will work<tr><td><a id="l93"></a><a href="#l93">93</a><td> * <ul><tr><td><a id="l94"></a><a href="#l94">94</a><td> * @type {Object}<tr><td><a id="l95"></a><a href="#l95">95</a><td> * @private<tr><td><a id="l96"></a><a href="#l96">96</a><td> */<tr><td><a id="l97"></a><a href="#l97">97</a><td> this.testsToRun_ = null;<tr><td><a id="l98"></a><a href="#l98">98</a><td><tr><td><a id="l99"></a><a href="#l99">99</a><td> /**<tr><td><a id="l100"></a><a href="#l100">100</a><td> * The order to run the auto-discovered tests in.<tr><td><a id="l101"></a><a href="#l101">101</a><td> * @type {string}<tr><td><a id="l102"></a><a href="#l102">102</a><td> */<tr><td><a id="l103"></a><a href="#l103">103</a><td> this.order = goog.testing.TestCase.Order.SORTED;<tr><td><a id="l104"></a><a href="#l104">104</a><td><tr><td><a id="l105"></a><a href="#l105">105</a><td> /** @private {function(!goog.testing.TestCase.Result)} */<tr><td><a id="l106"></a><a href="#l106">106</a><td> this.runNextTestCallback_ = goog.nullFunction;<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> * The number of {@link runNextTest_} frames currently on the stack.<tr><td><a id="l110"></a><a href="#l110">110</a><td> * When this exceeds {@link MAX_STACK_DEPTH_}, test execution is rescheduled<tr><td><a id="l111"></a><a href="#l111">111</a><td> * for a later tick of the event loop.<tr><td><a id="l112"></a><a href="#l112">112</a><td> * @see {finishTestInvocation_}<tr><td><a id="l113"></a><a href="#l113">113</a><td> * @private {number}<tr><td><a id="l114"></a><a href="#l114">114</a><td> */<tr><td><a id="l115"></a><a href="#l115">115</a><td> this.depth_ = 0;<tr><td><a id="l116"></a><a href="#l116">116</a><td><tr><td><a id="l117"></a><a href="#l117">117</a><td> /** @private {goog.testing.TestCase.Test} */<tr><td><a id="l118"></a><a href="#l118">118</a><td> this.curTest_ = null;<tr><td><a id="l119"></a><a href="#l119">119</a><td><tr><td><a id="l120"></a><a href="#l120">120</a><td> /**<tr><td><a id="l121"></a><a href="#l121">121</a><td> * Object used to encapsulate the test results.<tr><td><a id="l122"></a><a href="#l122">122</a><td> * @type {!goog.testing.TestCase.Result}<tr><td><a id="l123"></a><a href="#l123">123</a><td> * @protected<tr><td><a id="l124"></a><a href="#l124">124</a><td> * @suppress {underscore|visibility}<tr><td><a id="l125"></a><a href="#l125">125</a><td> */<tr><td><a id="l126"></a><a href="#l126">126</a><td> this.result_ = new goog.testing.TestCase.Result(this);<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><tr><td><a id="l130"></a><a href="#l130">130</a><td>/**<tr><td><a id="l131"></a><a href="#l131">131</a><td> * The order to run the auto-discovered tests.<tr><td><a id="l132"></a><a href="#l132">132</a><td> * @enum {string}<tr><td><a id="l133"></a><a href="#l133">133</a><td> */<tr><td><a id="l134"></a><a href="#l134">134</a><td>goog.testing.TestCase.Order = {<tr><td><a id="l135"></a><a href="#l135">135</a><td> /**<tr><td><a id="l136"></a><a href="#l136">136</a><td> * This is browser dependent and known to be different in FF and Safari<tr><td><a id="l137"></a><a href="#l137">137</a><td> * compared to others.<tr><td><a id="l138"></a><a href="#l138">138</a><td> */<tr><td><a id="l139"></a><a href="#l139">139</a><td> NATURAL: 'natural',<tr><td><a id="l140"></a><a href="#l140">140</a><td><tr><td><a id="l141"></a><a href="#l141">141</a><td> /** Random order. */<tr><td><a id="l142"></a><a href="#l142">142</a><td> RANDOM: 'random',<tr><td><a id="l143"></a><a href="#l143">143</a><td><tr><td><a id="l144"></a><a href="#l144">144</a><td> /** Sorted based on the name. */<tr><td><a id="l145"></a><a href="#l145">145</a><td> SORTED: 'sorted'<tr><td><a id="l146"></a><a href="#l146">146</a><td>};<tr><td><a id="l147"></a><a href="#l147">147</a><td><tr><td><a id="l148"></a><a href="#l148">148</a><td><tr><td><a id="l149"></a><a href="#l149">149</a><td>/**<tr><td><a id="l150"></a><a href="#l150">150</a><td> * @return {string} The name of the test.<tr><td><a id="l151"></a><a href="#l151">151</a><td> */<tr><td><a id="l152"></a><a href="#l152">152</a><td>goog.testing.TestCase.prototype.getName = function() {<tr><td><a id="l153"></a><a href="#l153">153</a><td> return this.name_;<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>/**<tr><td><a id="l158"></a><a href="#l158">158</a><td> * The maximum amount of time in milliseconds that the test case can take<tr><td><a id="l159"></a><a href="#l159">159</a><td> * before it is forced to yield and reschedule. This prevents the test runner<tr><td><a id="l160"></a><a href="#l160">160</a><td> * from blocking the browser and potentially hurting the test harness.<tr><td><a id="l161"></a><a href="#l161">161</a><td> * @type {number}<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.TestCase.maxRunTime = 200;<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> * The maximum number of {@link runNextTest_} frames that can be on the stack<tr><td><a id="l168"></a><a href="#l168">168</a><td> * before the test case is forced to yield and reschedule. Although modern<tr><td><a id="l169"></a><a href="#l169">169</a><td> * browsers can handle thousands of stack frames, this is set conservatively<tr><td><a id="l170"></a><a href="#l170">170</a><td> * because maximum stack depth has never been standardized, and engine-specific<tr><td><a id="l171"></a><a href="#l171">171</a><td> * techniques like tail cail optimization can affect the exact depth.<tr><td><a id="l172"></a><a href="#l172">172</a><td> * @private @const<tr><td><a id="l173"></a><a href="#l173">173</a><td> */<tr><td><a id="l174"></a><a href="#l174">174</a><td>goog.testing.TestCase.MAX_STACK_DEPTH_ = 100;<tr><td><a id="l175"></a><a href="#l175">175</a><td><tr><td><a id="l176"></a><a href="#l176">176</a><td><tr><td><a id="l177"></a><a href="#l177">177</a><td>/**<tr><td><a id="l178"></a><a href="#l178">178</a><td> * Save a reference to {@code window.setTimeout}, so any code that overrides the<tr><td><a id="l179"></a><a href="#l179">179</a><td> * default behavior (the MockClock, for example) doesn't affect our runner.<tr><td><a id="l180"></a><a href="#l180">180</a><td> * @type {function((Function|string), number=, *=): number}<tr><td><a id="l181"></a><a href="#l181">181</a><td> * @private<tr><td><a id="l182"></a><a href="#l182">182</a><td> */<tr><td><a id="l183"></a><a href="#l183">183</a><td>goog.testing.TestCase.protectedSetTimeout_ = goog.global.setTimeout;<tr><td><a id="l184"></a><a href="#l184">184</a><td><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> * Save a reference to {@code window.clearTimeout}, so any code that overrides<tr><td><a id="l188"></a><a href="#l188">188</a><td> * the default behavior (e.g. MockClock) doesn't affect our runner.<tr><td><a id="l189"></a><a href="#l189">189</a><td> * @type {function((null|number|undefined)): void}<tr><td><a id="l190"></a><a href="#l190">190</a><td> * @private<tr><td><a id="l191"></a><a href="#l191">191</a><td> */<tr><td><a id="l192"></a><a href="#l192">192</a><td>goog.testing.TestCase.protectedClearTimeout_ = goog.global.clearTimeout;<tr><td><a id="l193"></a><a href="#l193">193</a><td><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> * Save a reference to {@code window.Date}, so any code that overrides<tr><td><a id="l197"></a><a href="#l197">197</a><td> * the default behavior doesn't affect our runner.<tr><td><a id="l198"></a><a href="#l198">198</a><td> * @type {function(new: Date)}<tr><td><a id="l199"></a><a href="#l199">199</a><td> * @private<tr><td><a id="l200"></a><a href="#l200">200</a><td> */<tr><td><a id="l201"></a><a href="#l201">201</a><td>goog.testing.TestCase.protectedDate_ = Date;<tr><td><a id="l202"></a><a href="#l202">202</a><td><tr><td><a id="l203"></a><a href="#l203">203</a><td><tr><td><a id="l204"></a><a href="#l204">204</a><td>/**<tr><td><a id="l205"></a><a href="#l205">205</a><td> * Saved string referencing goog.global.setTimeout's string serialization. IE<tr><td><a id="l206"></a><a href="#l206">206</a><td> * sometimes fails to uphold equality for setTimeout, but the string version<tr><td><a id="l207"></a><a href="#l207">207</a><td> * stays the same.<tr><td><a id="l208"></a><a href="#l208">208</a><td> * @type {string}<tr><td><a id="l209"></a><a href="#l209">209</a><td> * @private<tr><td><a id="l210"></a><a href="#l210">210</a><td> */<tr><td><a id="l211"></a><a href="#l211">211</a><td>goog.testing.TestCase.setTimeoutAsString_ = String(goog.global.setTimeout);<tr><td><a id="l212"></a><a href="#l212">212</a><td><tr><td><a id="l213"></a><a href="#l213">213</a><td><tr><td><a id="l214"></a><a href="#l214">214</a><td>/**<tr><td><a id="l215"></a><a href="#l215">215</a><td> * TODO(user) replace this with prototype.currentTest.<tr><td><a id="l216"></a><a href="#l216">216</a><td> * Name of the current test that is running, or null if none is running.<tr><td><a id="l217"></a><a href="#l217">217</a><td> * @type {?string}<tr><td><a id="l218"></a><a href="#l218">218</a><td> */<tr><td><a id="l219"></a><a href="#l219">219</a><td>goog.testing.TestCase.currentTestName = null;<tr><td><a id="l220"></a><a href="#l220">220</a><td><tr><td><a id="l221"></a><a href="#l221">221</a><td><tr><td><a id="l222"></a><a href="#l222">222</a><td>/**<tr><td><a id="l223"></a><a href="#l223">223</a><td> * Avoid a dependency on goog.userAgent and keep our own reference of whether<tr><td><a id="l224"></a><a href="#l224">224</a><td> * the browser is IE.<tr><td><a id="l225"></a><a href="#l225">225</a><td> * @type {boolean}<tr><td><a id="l226"></a><a href="#l226">226</a><td> */<tr><td><a id="l227"></a><a href="#l227">227</a><td>goog.testing.TestCase.IS_IE = typeof opera == 'undefined' &&<tr><td><a id="l228"></a><a href="#l228">228</a><td> !!goog.global.navigator &&<tr><td><a id="l229"></a><a href="#l229">229</a><td> goog.global.navigator.userAgent.indexOf('MSIE') != -1;<tr><td><a id="l230"></a><a href="#l230">230</a><td><tr><td><a id="l231"></a><a href="#l231">231</a><td><tr><td><a id="l232"></a><a href="#l232">232</a><td>/**<tr><td><a id="l233"></a><a href="#l233">233</a><td> * Exception object that was detected before a test runs.<tr><td><a id="l234"></a><a href="#l234">234</a><td> * @type {*}<tr><td><a id="l235"></a><a href="#l235">235</a><td> * @protected<tr><td><a id="l236"></a><a href="#l236">236</a><td> */<tr><td><a id="l237"></a><a href="#l237">237</a><td>goog.testing.TestCase.prototype.exceptionBeforeTest;<tr><td><a id="l238"></a><a href="#l238">238</a><td><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> * Whether the test case has ever tried to execute.<tr><td><a id="l242"></a><a href="#l242">242</a><td> * @type {boolean}<tr><td><a id="l243"></a><a href="#l243">243</a><td> */<tr><td><a id="l244"></a><a href="#l244">244</a><td>goog.testing.TestCase.prototype.started = false;<tr><td><a id="l245"></a><a href="#l245">245</a><td><tr><td><a id="l246"></a><a href="#l246">246</a><td><tr><td><a id="l247"></a><a href="#l247">247</a><td>/**<tr><td><a id="l248"></a><a href="#l248">248</a><td> * Whether the test case is running.<tr><td><a id="l249"></a><a href="#l249">249</a><td> * @type {boolean}<tr><td><a id="l250"></a><a href="#l250">250</a><td> */<tr><td><a id="l251"></a><a href="#l251">251</a><td>goog.testing.TestCase.prototype.running = false;<tr><td><a id="l252"></a><a href="#l252">252</a><td><tr><td><a id="l253"></a><a href="#l253">253</a><td><tr><td><a id="l254"></a><a href="#l254">254</a><td>/**<tr><td><a id="l255"></a><a href="#l255">255</a><td> * Timestamp for when the test was started.<tr><td><a id="l256"></a><a href="#l256">256</a><td> * @type {number}<tr><td><a id="l257"></a><a href="#l257">257</a><td> * @private<tr><td><a id="l258"></a><a href="#l258">258</a><td> */<tr><td><a id="l259"></a><a href="#l259">259</a><td>goog.testing.TestCase.prototype.startTime_ = 0;<tr><td><a id="l260"></a><a href="#l260">260</a><td><tr><td><a id="l261"></a><a href="#l261">261</a><td><tr><td><a id="l262"></a><a href="#l262">262</a><td>/**<tr><td><a id="l263"></a><a href="#l263">263</a><td> * Time since the last batch of tests was started, if batchTime exceeds<tr><td><a id="l264"></a><a href="#l264">264</a><td> * {@link #maxRunTime} a timeout will be used to stop the tests blocking the<tr><td><a id="l265"></a><a href="#l265">265</a><td> * browser and a new batch will be started.<tr><td><a id="l266"></a><a href="#l266">266</a><td> * @type {number}<tr><td><a id="l267"></a><a href="#l267">267</a><td> * @private<tr><td><a id="l268"></a><a href="#l268">268</a><td> */<tr><td><a id="l269"></a><a href="#l269">269</a><td>goog.testing.TestCase.prototype.batchTime_ = 0;<tr><td><a id="l270"></a><a href="#l270">270</a><td><tr><td><a id="l271"></a><a href="#l271">271</a><td><tr><td><a id="l272"></a><a href="#l272">272</a><td>/**<tr><td><a id="l273"></a><a href="#l273">273</a><td> * Pointer to the current test.<tr><td><a id="l274"></a><a href="#l274">274</a><td> * @type {number}<tr><td><a id="l275"></a><a href="#l275">275</a><td> * @private<tr><td><a id="l276"></a><a href="#l276">276</a><td> */<tr><td><a id="l277"></a><a href="#l277">277</a><td>goog.testing.TestCase.prototype.currentTestPointer_ = 0;<tr><td><a id="l278"></a><a href="#l278">278</a><td><tr><td><a id="l279"></a><a href="#l279">279</a><td><tr><td><a id="l280"></a><a href="#l280">280</a><td>/**<tr><td><a id="l281"></a><a href="#l281">281</a><td> * Optional callback that will be executed when the test has finalized.<tr><td><a id="l282"></a><a href="#l282">282</a><td> * @type {Function}<tr><td><a id="l283"></a><a href="#l283">283</a><td> * @private<tr><td><a id="l284"></a><a href="#l284">284</a><td> */<tr><td><a id="l285"></a><a href="#l285">285</a><td>goog.testing.TestCase.prototype.onCompleteCallback_ = null;<tr><td><a id="l286"></a><a href="#l286">286</a><td><tr><td><a id="l287"></a><a href="#l287">287</a><td><tr><td><a id="l288"></a><a href="#l288">288</a><td>/**<tr><td><a id="l289"></a><a href="#l289">289</a><td> * Adds a new test to the test case.<tr><td><a id="l290"></a><a href="#l290">290</a><td> * @param {goog.testing.TestCase.Test} test The test to add.<tr><td><a id="l291"></a><a href="#l291">291</a><td> */<tr><td><a id="l292"></a><a href="#l292">292</a><td>goog.testing.TestCase.prototype.add = function(test) {<tr><td><a id="l293"></a><a href="#l293">293</a><td> if (this.started) {<tr><td><a id="l294"></a><a href="#l294">294</a><td> throw Error('Tests cannot be added after execute() has been called. ' +<tr><td><a id="l295"></a><a href="#l295">295</a><td> 'Test: ' + test.name);<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> this.tests_.push(test);<tr><td><a id="l299"></a><a href="#l299">299</a><td>};<tr><td><a id="l300"></a><a href="#l300">300</a><td><tr><td><a id="l301"></a><a href="#l301">301</a><td><tr><td><a id="l302"></a><a href="#l302">302</a><td>/**<tr><td><a id="l303"></a><a href="#l303">303</a><td> * Creates and adds a new test.<tr><td><a id="l304"></a><a href="#l304">304</a><td> *<tr><td><a id="l305"></a><a href="#l305">305</a><td> * Convenience function to make syntax less awkward when not using automatic<tr><td><a id="l306"></a><a href="#l306">306</a><td> * test discovery.<tr><td><a id="l307"></a><a href="#l307">307</a><td> *<tr><td><a id="l308"></a><a href="#l308">308</a><td> * @param {string} name The test name.<tr><td><a id="l309"></a><a href="#l309">309</a><td> * @param {!Function} ref Reference to the test function.<tr><td><a id="l310"></a><a href="#l310">310</a><td> * @param {!Object=} opt_scope Optional scope that the test function should be<tr><td><a id="l311"></a><a href="#l311">311</a><td> * called in.<tr><td><a id="l312"></a><a href="#l312">312</a><td> */<tr><td><a id="l313"></a><a href="#l313">313</a><td>goog.testing.TestCase.prototype.addNewTest = function(name, ref, opt_scope) {<tr><td><a id="l314"></a><a href="#l314">314</a><td> var test = new goog.testing.TestCase.Test(name, ref, opt_scope || this);<tr><td><a id="l315"></a><a href="#l315">315</a><td> this.add(test);<tr><td><a id="l316"></a><a href="#l316">316</a><td>};<tr><td><a id="l317"></a><a href="#l317">317</a><td><tr><td><a id="l318"></a><a href="#l318">318</a><td><tr><td><a id="l319"></a><a href="#l319">319</a><td>/**<tr><td><a id="l320"></a><a href="#l320">320</a><td> * Sets the tests.<tr><td><a id="l321"></a><a href="#l321">321</a><td> * @param {!Array<goog.testing.TestCase.Test>} tests A new test array.<tr><td><a id="l322"></a><a href="#l322">322</a><td> * @protected<tr><td><a id="l323"></a><a href="#l323">323</a><td> */<tr><td><a id="l324"></a><a href="#l324">324</a><td>goog.testing.TestCase.prototype.setTests = function(tests) {<tr><td><a id="l325"></a><a href="#l325">325</a><td> this.tests_ = tests;<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><tr><td><a id="l329"></a><a href="#l329">329</a><td>/**<tr><td><a id="l330"></a><a href="#l330">330</a><td> * Gets the tests.<tr><td><a id="l331"></a><a href="#l331">331</a><td> * @return {!Array<goog.testing.TestCase.Test>} The test array.<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.TestCase.prototype.getTests = function() {<tr><td><a id="l334"></a><a href="#l334">334</a><td> return this.tests_;<tr><td><a id="l335"></a><a href="#l335">335</a><td>};<tr><td><a id="l336"></a><a href="#l336">336</a><td><tr><td><a id="l337"></a><a href="#l337">337</a><td><tr><td><a id="l338"></a><a href="#l338">338</a><td>/**<tr><td><a id="l339"></a><a href="#l339">339</a><td> * Returns the number of tests contained in the test case.<tr><td><a id="l340"></a><a href="#l340">340</a><td> * @return {number} The number of tests.<tr><td><a id="l341"></a><a href="#l341">341</a><td> */<tr><td><a id="l342"></a><a href="#l342">342</a><td>goog.testing.TestCase.prototype.getCount = function() {<tr><td><a id="l343"></a><a href="#l343">343</a><td> return this.tests_.length;<tr><td><a id="l344"></a><a href="#l344">344</a><td>};<tr><td><a id="l345"></a><a href="#l345">345</a><td><tr><td><a id="l346"></a><a href="#l346">346</a><td><tr><td><a id="l347"></a><a href="#l347">347</a><td>/**<tr><td><a id="l348"></a><a href="#l348">348</a><td> * Returns the number of tests actually run in the test case, i.e. subtracting<tr><td><a id="l349"></a><a href="#l349">349</a><td> * any which are skipped.<tr><td><a id="l350"></a><a href="#l350">350</a><td> * @return {number} The number of un-ignored tests.<tr><td><a id="l351"></a><a href="#l351">351</a><td> */<tr><td><a id="l352"></a><a href="#l352">352</a><td>goog.testing.TestCase.prototype.getActuallyRunCount = function() {<tr><td><a id="l353"></a><a href="#l353">353</a><td> return this.testsToRun_ ? goog.object.getCount(this.testsToRun_) : 0;<tr><td><a id="l354"></a><a href="#l354">354</a><td>};<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> * Returns the current test and increments the pointer.<tr><td><a id="l359"></a><a href="#l359">359</a><td> * @return {goog.testing.TestCase.Test} The current test case.<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.TestCase.prototype.next = function() {<tr><td><a id="l362"></a><a href="#l362">362</a><td> var test;<tr><td><a id="l363"></a><a href="#l363">363</a><td> while ((test = this.tests_[this.currentTestPointer_++])) {<tr><td><a id="l364"></a><a href="#l364">364</a><td> if (!this.testsToRun_ || this.testsToRun_[test.name] ||<tr><td><a id="l365"></a><a href="#l365">365</a><td> this.testsToRun_[this.currentTestPointer_ - 1]) {<tr><td><a id="l366"></a><a href="#l366">366</a><td> return test;<tr><td><a id="l367"></a><a href="#l367">367</a><td> }<tr><td><a id="l368"></a><a href="#l368">368</a><td> }<tr><td><a id="l369"></a><a href="#l369">369</a><td> return null;<tr><td><a id="l370"></a><a href="#l370">370</a><td>};<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> * Resets the test case pointer, so that next returns the first test.<tr><td><a id="l375"></a><a href="#l375">375</a><td> */<tr><td><a id="l376"></a><a href="#l376">376</a><td>goog.testing.TestCase.prototype.reset = function() {<tr><td><a id="l377"></a><a href="#l377">377</a><td> this.currentTestPointer_ = 0;<tr><td><a id="l378"></a><a href="#l378">378</a><td> this.result_ = new goog.testing.TestCase.Result(this);<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> * Sets the callback function that should be executed when the tests have<tr><td><a id="l384"></a><a href="#l384">384</a><td> * completed.<tr><td><a id="l385"></a><a href="#l385">385</a><td> * @param {Function} fn The callback function.<tr><td><a id="l386"></a><a href="#l386">386</a><td> */<tr><td><a id="l387"></a><a href="#l387">387</a><td>goog.testing.TestCase.prototype.setCompletedCallback = function(fn) {<tr><td><a id="l388"></a><a href="#l388">388</a><td> this.onCompleteCallback_ = fn;<tr><td><a id="l389"></a><a href="#l389">389</a><td>};<tr><td><a id="l390"></a><a href="#l390">390</a><td><tr><td><a id="l391"></a><a href="#l391">391</a><td><tr><td><a id="l392"></a><a href="#l392">392</a><td>/**<tr><td><a id="l393"></a><a href="#l393">393</a><td> * @param {goog.testing.TestCase.Order} order The sort order for running tests.<tr><td><a id="l394"></a><a href="#l394">394</a><td> */<tr><td><a id="l395"></a><a href="#l395">395</a><td>goog.testing.TestCase.prototype.setOrder = function(order) {<tr><td><a id="l396"></a><a href="#l396">396</a><td> this.order = order;<tr><td><a id="l397"></a><a href="#l397">397</a><td>};<tr><td><a id="l398"></a><a href="#l398">398</a><td><tr><td><a id="l399"></a><a href="#l399">399</a><td><tr><td><a id="l400"></a><a href="#l400">400</a><td>/**<tr><td><a id="l401"></a><a href="#l401">401</a><td> * @param {Object<string, boolean>} testsToRun Set of tests to run. Entries in<tr><td><a id="l402"></a><a href="#l402">402</a><td> * the set may be test names, like "testFoo", or numeric indicies. Only<tr><td><a id="l403"></a><a href="#l403">403</a><td> * tests identified by name or by index will be executed.<tr><td><a id="l404"></a><a href="#l404">404</a><td> */<tr><td><a id="l405"></a><a href="#l405">405</a><td>goog.testing.TestCase.prototype.setTestsToRun = function(testsToRun) {<tr><td><a id="l406"></a><a href="#l406">406</a><td> this.testsToRun_ = testsToRun;<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> * Can be overridden in test classes to indicate whether the tests in a case<tr><td><a id="l412"></a><a href="#l412">412</a><td> * should be run in that particular situation. For example, this could be used<tr><td><a id="l413"></a><a href="#l413">413</a><td> * to stop tests running in a particular browser, where browser support for<tr><td><a id="l414"></a><a href="#l414">414</a><td> * the class under test was absent.<tr><td><a id="l415"></a><a href="#l415">415</a><td> * @return {boolean} Whether any of the tests in the case should be run.<tr><td><a id="l416"></a><a href="#l416">416</a><td> */<tr><td><a id="l417"></a><a href="#l417">417</a><td>goog.testing.TestCase.prototype.shouldRunTests = function() {<tr><td><a id="l418"></a><a href="#l418">418</a><td> return true;<tr><td><a id="l419"></a><a href="#l419">419</a><td>};<tr><td><a id="l420"></a><a href="#l420">420</a><td><tr><td><a id="l421"></a><a href="#l421">421</a><td><tr><td><a id="l422"></a><a href="#l422">422</a><td>/**<tr><td><a id="l423"></a><a href="#l423">423</a><td> * Executes the tests, yielding asynchronously if execution time exceeds<tr><td><a id="l424"></a><a href="#l424">424</a><td> * {@link maxRunTime}. There is no guarantee that the test case has finished<tr><td><a id="l425"></a><a href="#l425">425</a><td> * once this method has returned. To be notified when the test case<tr><td><a id="l426"></a><a href="#l426">426</a><td> * has finished, use {@link #setCompletedCallback} or<tr><td><a id="l427"></a><a href="#l427">427</a><td> * {@link #runTestsReturningPromise}.<tr><td><a id="l428"></a><a href="#l428">428</a><td> */<tr><td><a id="l429"></a><a href="#l429">429</a><td>goog.testing.TestCase.prototype.execute = function() {<tr><td><a id="l430"></a><a href="#l430">430</a><td> if (!this.prepareForRun_()) {<tr><td><a id="l431"></a><a href="#l431">431</a><td> return;<tr><td><a id="l432"></a><a href="#l432">432</a><td> }<tr><td><a id="l433"></a><a href="#l433">433</a><td> this.log('Starting tests: ' + this.name_);<tr><td><a id="l434"></a><a href="#l434">434</a><td> this.cycleTests();<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><tr><td><a id="l438"></a><a href="#l438">438</a><td>/**<tr><td><a id="l439"></a><a href="#l439">439</a><td> * Sets up the internal state of the test case for a run.<tr><td><a id="l440"></a><a href="#l440">440</a><td> * @return {boolean} If false, preparation failed because the test case<tr><td><a id="l441"></a><a href="#l441">441</a><td> * is not supposed to run in the present environment.<tr><td><a id="l442"></a><a href="#l442">442</a><td> * @private<tr><td><a id="l443"></a><a href="#l443">443</a><td> */<tr><td><a id="l444"></a><a href="#l444">444</a><td>goog.testing.TestCase.prototype.prepareForRun_ = function() {<tr><td><a id="l445"></a><a href="#l445">445</a><td> this.started = true;<tr><td><a id="l446"></a><a href="#l446">446</a><td> this.reset();<tr><td><a id="l447"></a><a href="#l447">447</a><td> this.startTime_ = this.now();<tr><td><a id="l448"></a><a href="#l448">448</a><td> this.running = true;<tr><td><a id="l449"></a><a href="#l449">449</a><td> this.result_.totalCount = this.getCount();<tr><td><a id="l450"></a><a href="#l450">450</a><td> if (!this.shouldRunTests()) {<tr><td><a id="l451"></a><a href="#l451">451</a><td> this.log('shouldRunTests() returned false, skipping these tests.');<tr><td><a id="l452"></a><a href="#l452">452</a><td> this.result_.testSuppressed = true;<tr><td><a id="l453"></a><a href="#l453">453</a><td> this.finalize();<tr><td><a id="l454"></a><a href="#l454">454</a><td> return false;<tr><td><a id="l455"></a><a href="#l455">455</a><td> }<tr><td><a id="l456"></a><a href="#l456">456</a><td> return true;<tr><td><a id="l457"></a><a href="#l457">457</a><td>};<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> * Finalizes the test case, called when the tests have finished executing.<tr><td><a id="l462"></a><a href="#l462">462</a><td> */<tr><td><a id="l463"></a><a href="#l463">463</a><td>goog.testing.TestCase.prototype.finalize = function() {<tr><td><a id="l464"></a><a href="#l464">464</a><td> this.saveMessage('Done');<tr><td><a id="l465"></a><a href="#l465">465</a><td><tr><td><a id="l466"></a><a href="#l466">466</a><td> this.tearDownPage();<tr><td><a id="l467"></a><a href="#l467">467</a><td><tr><td><a id="l468"></a><a href="#l468">468</a><td> var restoredSetTimeout =<tr><td><a id="l469"></a><a href="#l469">469</a><td> goog.testing.TestCase.protectedSetTimeout_ == goog.global.setTimeout &&<tr><td><a id="l470"></a><a href="#l470">470</a><td> goog.testing.TestCase.protectedClearTimeout_ == goog.global.clearTimeout;<tr><td><a id="l471"></a><a href="#l471">471</a><td> if (!restoredSetTimeout && goog.testing.TestCase.IS_IE &&<tr><td><a id="l472"></a><a href="#l472">472</a><td> String(goog.global.setTimeout) ==<tr><td><a id="l473"></a><a href="#l473">473</a><td> goog.testing.TestCase.setTimeoutAsString_) {<tr><td><a id="l474"></a><a href="#l474">474</a><td> // In strange cases, IE's value of setTimeout *appears* to change, but<tr><td><a id="l475"></a><a href="#l475">475</a><td> // the string representation stays stable.<tr><td><a id="l476"></a><a href="#l476">476</a><td> restoredSetTimeout = true;<tr><td><a id="l477"></a><a href="#l477">477</a><td> }<tr><td><a id="l478"></a><a href="#l478">478</a><td><tr><td><a id="l479"></a><a href="#l479">479</a><td> if (!restoredSetTimeout) {<tr><td><a id="l480"></a><a href="#l480">480</a><td> var message = 'ERROR: Test did not restore setTimeout and clearTimeout';<tr><td><a id="l481"></a><a href="#l481">481</a><td> this.saveMessage(message);<tr><td><a id="l482"></a><a href="#l482">482</a><td> var err = new goog.testing.TestCase.Error(this.name_, message);<tr><td><a id="l483"></a><a href="#l483">483</a><td> this.result_.errors.push(err);<tr><td><a id="l484"></a><a href="#l484">484</a><td> }<tr><td><a id="l485"></a><a href="#l485">485</a><td> goog.global.clearTimeout = goog.testing.TestCase.protectedClearTimeout_;<tr><td><a id="l486"></a><a href="#l486">486</a><td> goog.global.setTimeout = goog.testing.TestCase.protectedSetTimeout_;<tr><td><a id="l487"></a><a href="#l487">487</a><td> this.endTime_ = this.now();<tr><td><a id="l488"></a><a href="#l488">488</a><td> this.running = false;<tr><td><a id="l489"></a><a href="#l489">489</a><td> this.result_.runTime = this.endTime_ - this.startTime_;<tr><td><a id="l490"></a><a href="#l490">490</a><td> this.result_.numFilesLoaded = this.countNumFilesLoaded_();<tr><td><a id="l491"></a><a href="#l491">491</a><td> this.result_.complete = true;<tr><td><a id="l492"></a><a href="#l492">492</a><td><tr><td><a id="l493"></a><a href="#l493">493</a><td> this.log(this.result_.getSummary());<tr><td><a id="l494"></a><a href="#l494">494</a><td> if (this.result_.isSuccess()) {<tr><td><a id="l495"></a><a href="#l495">495</a><td> this.log('Tests complete');<tr><td><a id="l496"></a><a href="#l496">496</a><td> } else {<tr><td><a id="l497"></a><a href="#l497">497</a><td> this.log('Tests Failed');<tr><td><a id="l498"></a><a href="#l498">498</a><td> }<tr><td><a id="l499"></a><a href="#l499">499</a><td> if (this.onCompleteCallback_) {<tr><td><a id="l500"></a><a href="#l500">500</a><td> var fn = this.onCompleteCallback_;<tr><td><a id="l501"></a><a href="#l501">501</a><td> // Execute's the completed callback in the context of the global object.<tr><td><a id="l502"></a><a href="#l502">502</a><td> fn();<tr><td><a id="l503"></a><a href="#l503">503</a><td> this.onCompleteCallback_ = null;<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><tr><td><a id="l508"></a><a href="#l508">508</a><td>/**<tr><td><a id="l509"></a><a href="#l509">509</a><td> * Saves a message to the result set.<tr><td><a id="l510"></a><a href="#l510">510</a><td> * @param {string} message The message to save.<tr><td><a id="l511"></a><a href="#l511">511</a><td> */<tr><td><a id="l512"></a><a href="#l512">512</a><td>goog.testing.TestCase.prototype.saveMessage = function(message) {<tr><td><a id="l513"></a><a href="#l513">513</a><td> this.result_.messages.push(this.getTimeStamp_() + ' ' + message);<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><tr><td><a id="l517"></a><a href="#l517">517</a><td>/**<tr><td><a id="l518"></a><a href="#l518">518</a><td> * @return {boolean} Whether the test case is running inside the multi test<tr><td><a id="l519"></a><a href="#l519">519</a><td> * runner.<tr><td><a id="l520"></a><a href="#l520">520</a><td> */<tr><td><a id="l521"></a><a href="#l521">521</a><td>goog.testing.TestCase.prototype.isInsideMultiTestRunner = function() {<tr><td><a id="l522"></a><a href="#l522">522</a><td> var top = goog.global['top'];<tr><td><a id="l523"></a><a href="#l523">523</a><td> return top && typeof top['_allTests'] != 'undefined';<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> * Logs an object to the console, if available.<tr><td><a id="l529"></a><a href="#l529">529</a><td> * @param {*} val The value to log. Will be ToString'd.<tr><td><a id="l530"></a><a href="#l530">530</a><td> */<tr><td><a id="l531"></a><a href="#l531">531</a><td>goog.testing.TestCase.prototype.log = function(val) {<tr><td><a id="l532"></a><a href="#l532">532</a><td> if (!this.isInsideMultiTestRunner() && goog.global.console) {<tr><td><a id="l533"></a><a href="#l533">533</a><td> if (typeof val == 'string') {<tr><td><a id="l534"></a><a href="#l534">534</a><td> val = this.getTimeStamp_() + ' : ' + val;<tr><td><a id="l535"></a><a href="#l535">535</a><td> }<tr><td><a id="l536"></a><a href="#l536">536</a><td> if (val instanceof Error && val.stack) {<tr><td><a id="l537"></a><a href="#l537">537</a><td> // Chrome does console.log asynchronously in a different process<tr><td><a id="l538"></a><a href="#l538">538</a><td> // (http://code.google.com/p/chromium/issues/detail?id=50316).<tr><td><a id="l539"></a><a href="#l539">539</a><td> // This is an acute problem for Errors, which almost never survive.<tr><td><a id="l540"></a><a href="#l540">540</a><td> // Grab references to the immutable strings so they survive.<tr><td><a id="l541"></a><a href="#l541">541</a><td> goog.global.console.log(val, val.message, val.stack);<tr><td><a id="l542"></a><a href="#l542">542</a><td> // TODO(gboyer): Consider for Chrome cloning any object if we can ensure<tr><td><a id="l543"></a><a href="#l543">543</a><td> // there are no circular references.<tr><td><a id="l544"></a><a href="#l544">544</a><td> } else {<tr><td><a id="l545"></a><a href="#l545">545</a><td> goog.global.console.log(val);<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><tr><td><a id="l551"></a><a href="#l551">551</a><td>/**<tr><td><a id="l552"></a><a href="#l552">552</a><td> * @return {boolean} Whether the test was a success.<tr><td><a id="l553"></a><a href="#l553">553</a><td> */<tr><td><a id="l554"></a><a href="#l554">554</a><td>goog.testing.TestCase.prototype.isSuccess = function() {<tr><td><a id="l555"></a><a href="#l555">555</a><td> return !!this.result_ && this.result_.isSuccess();<tr><td><a id="l556"></a><a href="#l556">556</a><td>};<tr><td><a id="l557"></a><a href="#l557">557</a><td><tr><td><a id="l558"></a><a href="#l558">558</a><td><tr><td><a id="l559"></a><a href="#l559">559</a><td>/**<tr><td><a id="l560"></a><a href="#l560">560</a><td> * Returns a string detailing the results from the test.<tr><td><a id="l561"></a><a href="#l561">561</a><td> * @param {boolean=} opt_verbose If true results will include data about all<tr><td><a id="l562"></a><a href="#l562">562</a><td> * tests, not just what failed.<tr><td><a id="l563"></a><a href="#l563">563</a><td> * @return {string} The results from the test.<tr><td><a id="l564"></a><a href="#l564">564</a><td> */<tr><td><a id="l565"></a><a href="#l565">565</a><td>goog.testing.TestCase.prototype.getReport = function(opt_verbose) {<tr><td><a id="l566"></a><a href="#l566">566</a><td> var rv = [];<tr><td><a id="l567"></a><a href="#l567">567</a><td><tr><td><a id="l568"></a><a href="#l568">568</a><td> if (this.running) {<tr><td><a id="l569"></a><a href="#l569">569</a><td> rv.push(this.name_ + ' [RUNNING]');<tr><td><a id="l570"></a><a href="#l570">570</a><td> } else {<tr><td><a id="l571"></a><a href="#l571">571</a><td> var label = this.result_.isSuccess() ? 'PASSED' : 'FAILED';<tr><td><a id="l572"></a><a href="#l572">572</a><td> rv.push(this.name_ + ' [' + label + ']');<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> if (goog.global.location) {<tr><td><a id="l576"></a><a href="#l576">576</a><td> rv.push(this.trimPath_(goog.global.location.href));<tr><td><a id="l577"></a><a href="#l577">577</a><td> }<tr><td><a id="l578"></a><a href="#l578">578</a><td><tr><td><a id="l579"></a><a href="#l579">579</a><td> rv.push(this.result_.getSummary());<tr><td><a id="l580"></a><a href="#l580">580</a><td><tr><td><a id="l581"></a><a href="#l581">581</a><td> if (opt_verbose) {<tr><td><a id="l582"></a><a href="#l582">582</a><td> rv.push('.', this.result_.messages.join('\n'));<tr><td><a id="l583"></a><a href="#l583">583</a><td> } else if (!this.result_.isSuccess()) {<tr><td><a id="l584"></a><a href="#l584">584</a><td> rv.push(this.result_.errors.join('\n'));<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> rv.push(' ');<tr><td><a id="l588"></a><a href="#l588">588</a><td><tr><td><a id="l589"></a><a href="#l589">589</a><td> return rv.join('\n');<tr><td><a id="l590"></a><a href="#l590">590</a><td>};<tr><td><a id="l591"></a><a href="#l591">591</a><td><tr><td><a id="l592"></a><a href="#l592">592</a><td><tr><td><a id="l593"></a><a href="#l593">593</a><td>/**<tr><td><a id="l594"></a><a href="#l594">594</a><td> * Returns the test results.<tr><td><a id="l595"></a><a href="#l595">595</a><td> * @return {!goog.testing.TestCase.Result}<tr><td><a id="l596"></a><a href="#l596">596</a><td> * @package<tr><td><a id="l597"></a><a href="#l597">597</a><td> */<tr><td><a id="l598"></a><a href="#l598">598</a><td>goog.testing.TestCase.prototype.getResult = function() {<tr><td><a id="l599"></a><a href="#l599">599</a><td> return this.result_;<tr><td><a id="l600"></a><a href="#l600">600</a><td>};<tr><td><a id="l601"></a><a href="#l601">601</a><td><tr><td><a id="l602"></a><a href="#l602">602</a><td><tr><td><a id="l603"></a><a href="#l603">603</a><td>/**<tr><td><a id="l604"></a><a href="#l604">604</a><td> * Returns the amount of time it took for the test to run.<tr><td><a id="l605"></a><a href="#l605">605</a><td> * @return {number} The run time, in milliseconds.<tr><td><a id="l606"></a><a href="#l606">606</a><td> */<tr><td><a id="l607"></a><a href="#l607">607</a><td>goog.testing.TestCase.prototype.getRunTime = function() {<tr><td><a id="l608"></a><a href="#l608">608</a><td> return this.result_.runTime;<tr><td><a id="l609"></a><a href="#l609">609</a><td>};<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>/**<tr><td><a id="l613"></a><a href="#l613">613</a><td> * Returns the number of script files that were loaded in order to run the test.<tr><td><a id="l614"></a><a href="#l614">614</a><td> * @return {number} The number of script files.<tr><td><a id="l615"></a><a href="#l615">615</a><td> */<tr><td><a id="l616"></a><a href="#l616">616</a><td>goog.testing.TestCase.prototype.getNumFilesLoaded = function() {<tr><td><a id="l617"></a><a href="#l617">617</a><td> return this.result_.numFilesLoaded;<tr><td><a id="l618"></a><a href="#l618">618</a><td>};<tr><td><a id="l619"></a><a href="#l619">619</a><td><tr><td><a id="l620"></a><a href="#l620">620</a><td><tr><td><a id="l621"></a><a href="#l621">621</a><td>/**<tr><td><a id="l622"></a><a href="#l622">622</a><td> * Returns the test results object: a map from test names to a list of test<tr><td><a id="l623"></a><a href="#l623">623</a><td> * failures (if any exist).<tr><td><a id="l624"></a><a href="#l624">624</a><td> * @return {!Object<string, !Array<string>>} Tests results object.<tr><td><a id="l625"></a><a href="#l625">625</a><td> */<tr><td><a id="l626"></a><a href="#l626">626</a><td>goog.testing.TestCase.prototype.getTestResults = function() {<tr><td><a id="l627"></a><a href="#l627">627</a><td> return this.result_.resultsByName;<tr><td><a id="l628"></a><a href="#l628">628</a><td>};<tr><td><a id="l629"></a><a href="#l629">629</a><td><tr><td><a id="l630"></a><a href="#l630">630</a><td><tr><td><a id="l631"></a><a href="#l631">631</a><td>/**<tr><td><a id="l632"></a><a href="#l632">632</a><td> * Executes each of the tests, yielding asynchronously if execution time<tr><td><a id="l633"></a><a href="#l633">633</a><td> * exceeds {@link #maxRunTime}. There is no guarantee that the test case<tr><td><a id="l634"></a><a href="#l634">634</a><td> * has finished execution once this method has returned.<tr><td><a id="l635"></a><a href="#l635">635</a><td> * To be notified when the test case has finished execution, use<tr><td><a id="l636"></a><a href="#l636">636</a><td> * {@link #setCompletedCallback} or {@link #runTestsReturningPromise}.<tr><td><a id="l637"></a><a href="#l637">637</a><td> *<tr><td><a id="l638"></a><a href="#l638">638</a><td> * Overridable by the individual test case. This allows test cases to defer<tr><td><a id="l639"></a><a href="#l639">639</a><td> * when the test is actually started. If overridden, finalize must be called<tr><td><a id="l640"></a><a href="#l640">640</a><td> * by the test to indicate it has finished.<tr><td><a id="l641"></a><a href="#l641">641</a><td> */<tr><td><a id="l642"></a><a href="#l642">642</a><td>goog.testing.TestCase.prototype.runTests = function() {<tr><td><a id="l643"></a><a href="#l643">643</a><td> try {<tr><td><a id="l644"></a><a href="#l644">644</a><td> this.setUpPage();<tr><td><a id="l645"></a><a href="#l645">645</a><td> } catch (e) {<tr><td><a id="l646"></a><a href="#l646">646</a><td> this.exceptionBeforeTest = e;<tr><td><a id="l647"></a><a href="#l647">647</a><td> }<tr><td><a id="l648"></a><a href="#l648">648</a><td> this.execute();<tr><td><a id="l649"></a><a href="#l649">649</a><td>};<tr><td><a id="l650"></a><a href="#l650">650</a><td><tr><td><a id="l651"></a><a href="#l651">651</a><td><tr><td><a id="l652"></a><a href="#l652">652</a><td>/**<tr><td><a id="l653"></a><a href="#l653">653</a><td> * Executes each of the tests, returning a promise that resolves with the<tr><td><a id="l654"></a><a href="#l654">654</a><td> * test results once they are done running.<tr><td><a id="l655"></a><a href="#l655">655</a><td> * @return {!IThenable.<!goog.testing.TestCase.Result>}<tr><td><a id="l656"></a><a href="#l656">656</a><td> * @final<tr><td><a id="l657"></a><a href="#l657">657</a><td> * @package<tr><td><a id="l658"></a><a href="#l658">658</a><td> */<tr><td><a id="l659"></a><a href="#l659">659</a><td>goog.testing.TestCase.prototype.runTestsReturningPromise = function() {<tr><td><a id="l660"></a><a href="#l660">660</a><td> try {<tr><td><a id="l661"></a><a href="#l661">661</a><td> this.setUpPage();<tr><td><a id="l662"></a><a href="#l662">662</a><td> } catch (e) {<tr><td><a id="l663"></a><a href="#l663">663</a><td> this.exceptionBeforeTest = e;<tr><td><a id="l664"></a><a href="#l664">664</a><td> }<tr><td><a id="l665"></a><a href="#l665">665</a><td> if (!this.prepareForRun_()) {<tr><td><a id="l666"></a><a href="#l666">666</a><td> return goog.Promise.resolve(this.result_);<tr><td><a id="l667"></a><a href="#l667">667</a><td> }<tr><td><a id="l668"></a><a href="#l668">668</a><td> this.log('Starting tests: ' + this.name_);<tr><td><a id="l669"></a><a href="#l669">669</a><td> this.saveMessage('Start');<tr><td><a id="l670"></a><a href="#l670">670</a><td> this.batchTime_ = this.now();<tr><td><a id="l671"></a><a href="#l671">671</a><td> return new goog.Promise(function(resolve) {<tr><td><a id="l672"></a><a href="#l672">672</a><td> this.runNextTestCallback_ = resolve;<tr><td><a id="l673"></a><a href="#l673">673</a><td> this.runNextTest_();<tr><td><a id="l674"></a><a href="#l674">674</a><td> }, this);<tr><td><a id="l675"></a><a href="#l675">675</a><td>};<tr><td><a id="l676"></a><a href="#l676">676</a><td><tr><td><a id="l677"></a><a href="#l677">677</a><td><tr><td><a id="l678"></a><a href="#l678">678</a><td>/**<tr><td><a id="l679"></a><a href="#l679">679</a><td> * Executes the next test method synchronously or with promises, depending on<tr><td><a id="l680"></a><a href="#l680">680</a><td> * the test method's return value.<tr><td><a id="l681"></a><a href="#l681">681</a><td> *<tr><td><a id="l682"></a><a href="#l682">682</a><td> * If the test method returns a promise, the next test method will run once<tr><td><a id="l683"></a><a href="#l683">683</a><td> * the promise is resolved or rejected. If the test method does not<tr><td><a id="l684"></a><a href="#l684">684</a><td> * return a promise, it is assumed to be synchronous, and execution proceeds<tr><td><a id="l685"></a><a href="#l685">685</a><td> * immediately to the next test method. This means that test cases can run<tr><td><a id="l686"></a><a href="#l686">686</a><td> * partially synchronously and partially asynchronously, depending on<tr><td><a id="l687"></a><a href="#l687">687</a><td> * the return values of their test methods. In particular, a test case<tr><td><a id="l688"></a><a href="#l688">688</a><td> * executes synchronously until the first promise is returned from a<tr><td><a id="l689"></a><a href="#l689">689</a><td> * test method (or until a resource limit is reached; see<tr><td><a id="l690"></a><a href="#l690">690</a><td> * {@link finishTestInvocation_}).<tr><td><a id="l691"></a><a href="#l691">691</a><td> * @private<tr><td><a id="l692"></a><a href="#l692">692</a><td> */<tr><td><a id="l693"></a><a href="#l693">693</a><td>goog.testing.TestCase.prototype.runNextTest_ = function() {<tr><td><a id="l694"></a><a href="#l694">694</a><td> this.curTest_ = this.next();<tr><td><a id="l695"></a><a href="#l695">695</a><td> if (!this.curTest_ || !this.running) {<tr><td><a id="l696"></a><a href="#l696">696</a><td> this.finalize();<tr><td><a id="l697"></a><a href="#l697">697</a><td> this.runNextTestCallback_(this.result_);<tr><td><a id="l698"></a><a href="#l698">698</a><td> return;<tr><td><a id="l699"></a><a href="#l699">699</a><td> }<tr><td><a id="l700"></a><a href="#l700">700</a><td> this.result_.runCount++;<tr><td><a id="l701"></a><a href="#l701">701</a><td> this.log('Running test: ' + this.curTest_.name);<tr><td><a id="l702"></a><a href="#l702">702</a><td> if (this.maybeFailTestEarly(this.curTest_)) {<tr><td><a id="l703"></a><a href="#l703">703</a><td> this.finishTestInvocation_();<tr><td><a id="l704"></a><a href="#l704">704</a><td> return;<tr><td><a id="l705"></a><a href="#l705">705</a><td> }<tr><td><a id="l706"></a><a href="#l706">706</a><td> goog.testing.TestCase.currentTestName = this.curTest_.name;<tr><td><a id="l707"></a><a href="#l707">707</a><td> this.invokeTestFunction_(<tr><td><a id="l708"></a><a href="#l708">708</a><td> this.setUp, this.safeRunTest_, this.safeTearDown_);<tr><td><a id="l709"></a><a href="#l709">709</a><td>};<tr><td><a id="l710"></a><a href="#l710">710</a><td><tr><td><a id="l711"></a><a href="#l711">711</a><td><tr><td><a id="l712"></a><a href="#l712">712</a><td>/**<tr><td><a id="l713"></a><a href="#l713">713</a><td> * Calls the given test function, handling errors appropriately.<tr><td><a id="l714"></a><a href="#l714">714</a><td> * @private<tr><td><a id="l715"></a><a href="#l715">715</a><td> */<tr><td><a id="l716"></a><a href="#l716">716</a><td>goog.testing.TestCase.prototype.safeRunTest_ = function() {<tr><td><a id="l717"></a><a href="#l717">717</a><td> this.invokeTestFunction_(<tr><td><a id="l718"></a><a href="#l718">718</a><td> goog.bind(this.curTest_.ref, this.curTest_.scope),<tr><td><a id="l719"></a><a href="#l719">719</a><td> this.safeTearDown_,<tr><td><a id="l720"></a><a href="#l720">720</a><td> this.safeTearDown_);<tr><td><a id="l721"></a><a href="#l721">721</a><td>};<tr><td><a id="l722"></a><a href="#l722">722</a><td><tr><td><a id="l723"></a><a href="#l723">723</a><td><tr><td><a id="l724"></a><a href="#l724">724</a><td>/**<tr><td><a id="l725"></a><a href="#l725">725</a><td> * Calls {@link tearDown}, handling errors appropriately.<tr><td><a id="l726"></a><a href="#l726">726</a><td> * @param {*=} opt_error Error associated with the test, if any.<tr><td><a id="l727"></a><a href="#l727">727</a><td> * @private<tr><td><a id="l728"></a><a href="#l728">728</a><td> */<tr><td><a id="l729"></a><a href="#l729">729</a><td>goog.testing.TestCase.prototype.safeTearDown_ = function(opt_error) {<tr><td><a id="l730"></a><a href="#l730">730</a><td> if (arguments.length == 1) {<tr><td><a id="l731"></a><a href="#l731">731</a><td> this.doError(this.curTest_, opt_error);<tr><td><a id="l732"></a><a href="#l732">732</a><td> }<tr><td><a id="l733"></a><a href="#l733">733</a><td> this.invokeTestFunction_(<tr><td><a id="l734"></a><a href="#l734">734</a><td> this.tearDown, this.finishTestInvocation_, this.finishTestInvocation_);<tr><td><a id="l735"></a><a href="#l735">735</a><td>};<tr><td><a id="l736"></a><a href="#l736">736</a><td><tr><td><a id="l737"></a><a href="#l737">737</a><td><tr><td><a id="l738"></a><a href="#l738">738</a><td>/**<tr><td><a id="l739"></a><a href="#l739">739</a><td> * Calls the given {@code fn}, then calls either {@code onSuccess} or<tr><td><a id="l740"></a><a href="#l740">740</a><td> * {@code onFailure}, either synchronously or using promises, depending on<tr><td><a id="l741"></a><a href="#l741">741</a><td> * {@code fn}'s return value.<tr><td><a id="l742"></a><a href="#l742">742</a><td> *<tr><td><a id="l743"></a><a href="#l743">743</a><td> * If {@code fn} throws an exception, {@code onFailure} is called immediately<tr><td><a id="l744"></a><a href="#l744">744</a><td> * with the exception.<tr><td><a id="l745"></a><a href="#l745">745</a><td> *<tr><td><a id="l746"></a><a href="#l746">746</a><td> * If {@code fn} returns a promise, and the promise is eventually resolved,<tr><td><a id="l747"></a><a href="#l747">747</a><td> * {@code onSuccess} is called with no arguments. If the promise is eventually<tr><td><a id="l748"></a><a href="#l748">748</a><td> * rejected, {@code onFailure} is called with the rejection reason.<tr><td><a id="l749"></a><a href="#l749">749</a><td> *<tr><td><a id="l750"></a><a href="#l750">750</a><td> * Otherwise, if {@code fn} neither returns a promise nor throws an exception,<tr><td><a id="l751"></a><a href="#l751">751</a><td> * {@code onSuccess} is called immediately with no arguments.<tr><td><a id="l752"></a><a href="#l752">752</a><td> *<tr><td><a id="l753"></a><a href="#l753">753</a><td> * {@code fn}, {@code onSuccess}, and {@code onFailure} are all called with<tr><td><a id="l754"></a><a href="#l754">754</a><td> * the TestCase instance as the method receiver.<tr><td><a id="l755"></a><a href="#l755">755</a><td> *<tr><td><a id="l756"></a><a href="#l756">756</a><td> * @param {function()} fn The function to call.<tr><td><a id="l757"></a><a href="#l757">757</a><td> * @param {function()} onSuccess Success callback.<tr><td><a id="l758"></a><a href="#l758">758</a><td> * @param {function(*)} onFailure Failure callback.<tr><td><a id="l759"></a><a href="#l759">759</a><td> * @private<tr><td><a id="l760"></a><a href="#l760">760</a><td> */<tr><td><a id="l761"></a><a href="#l761">761</a><td>goog.testing.TestCase.prototype.invokeTestFunction_ = function(<tr><td><a id="l762"></a><a href="#l762">762</a><td> fn, onSuccess, onFailure) {<tr><td><a id="l763"></a><a href="#l763">763</a><td> try {<tr><td><a id="l764"></a><a href="#l764">764</a><td> var retval = fn.call(this);<tr><td><a id="l765"></a><a href="#l765">765</a><td> if (goog.Thenable.isImplementedBy(retval) ||<tr><td><a id="l766"></a><a href="#l766">766</a><td> goog.isFunction(retval && retval['then'])) {<tr><td><a id="l767"></a><a href="#l767">767</a><td> var self = this;<tr><td><a id="l768"></a><a href="#l768">768</a><td> retval.then(<tr><td><a id="l769"></a><a href="#l769">769</a><td> function() {<tr><td><a id="l770"></a><a href="#l770">770</a><td> self.resetBatchTimeAfterPromise_();<tr><td><a id="l771"></a><a href="#l771">771</a><td> onSuccess.call(self);<tr><td><a id="l772"></a><a href="#l772">772</a><td> },<tr><td><a id="l773"></a><a href="#l773">773</a><td> function(e) {<tr><td><a id="l774"></a><a href="#l774">774</a><td> self.resetBatchTimeAfterPromise_();<tr><td><a id="l775"></a><a href="#l775">775</a><td> onFailure.call(self, e);<tr><td><a id="l776"></a><a href="#l776">776</a><td> });<tr><td><a id="l777"></a><a href="#l777">777</a><td> } else {<tr><td><a id="l778"></a><a href="#l778">778</a><td> onSuccess.call(this);<tr><td><a id="l779"></a><a href="#l779">779</a><td> }<tr><td><a id="l780"></a><a href="#l780">780</a><td> } catch (e) {<tr><td><a id="l781"></a><a href="#l781">781</a><td> onFailure.call(this, e);<tr><td><a id="l782"></a><a href="#l782">782</a><td> }<tr><td><a id="l783"></a><a href="#l783">783</a><td>};<tr><td><a id="l784"></a><a href="#l784">784</a><td><tr><td><a id="l785"></a><a href="#l785">785</a><td><tr><td><a id="l786"></a><a href="#l786">786</a><td>/**<tr><td><a id="l787"></a><a href="#l787">787</a><td> * Resets the batch run timer. This should only be called after resolving a<tr><td><a id="l788"></a><a href="#l788">788</a><td> * promise since Promise.then() has an implicit yield.<tr><td><a id="l789"></a><a href="#l789">789</a><td> * @private<tr><td><a id="l790"></a><a href="#l790">790</a><td> */<tr><td><a id="l791"></a><a href="#l791">791</a><td>goog.testing.TestCase.prototype.resetBatchTimeAfterPromise_ = function() {<tr><td><a id="l792"></a><a href="#l792">792</a><td> this.batchTime_ = this.now();<tr><td><a id="l793"></a><a href="#l793">793</a><td>};<tr><td><a id="l794"></a><a href="#l794">794</a><td><tr><td><a id="l795"></a><a href="#l795">795</a><td><tr><td><a id="l796"></a><a href="#l796">796</a><td>/**<tr><td><a id="l797"></a><a href="#l797">797</a><td> * Finishes up bookkeeping for the current test function, and schedules<tr><td><a id="l798"></a><a href="#l798">798</a><td> * the next test function to run, either immediately or asychronously.<tr><td><a id="l799"></a><a href="#l799">799</a><td> * @param {*=} opt_error Optional error resulting from the test invocation.<tr><td><a id="l800"></a><a href="#l800">800</a><td> * @private<tr><td><a id="l801"></a><a href="#l801">801</a><td> */<tr><td><a id="l802"></a><a href="#l802">802</a><td>goog.testing.TestCase.prototype.finishTestInvocation_ = function(opt_error) {<tr><td><a id="l803"></a><a href="#l803">803</a><td> if (arguments.length == 1) {<tr><td><a id="l804"></a><a href="#l804">804</a><td> this.doError(this.curTest_, opt_error);<tr><td><a id="l805"></a><a href="#l805">805</a><td> }<tr><td><a id="l806"></a><a href="#l806">806</a><td><tr><td><a id="l807"></a><a href="#l807">807</a><td> // If no errors have been recorded for the test, it is a success.<tr><td><a id="l808"></a><a href="#l808">808</a><td> if (!(this.curTest_.name in this.result_.resultsByName) ||<tr><td><a id="l809"></a><a href="#l809">809</a><td> !this.result_.resultsByName[this.curTest_.name].length) {<tr><td><a id="l810"></a><a href="#l810">810</a><td> this.doSuccess(this.curTest_);<tr><td><a id="l811"></a><a href="#l811">811</a><td> }<tr><td><a id="l812"></a><a href="#l812">812</a><td><tr><td><a id="l813"></a><a href="#l813">813</a><td> goog.testing.TestCase.currentTestName = null;<tr><td><a id="l814"></a><a href="#l814">814</a><td><tr><td><a id="l815"></a><a href="#l815">815</a><td> // If the test case has consumed too much time or stack space,<tr><td><a id="l816"></a><a href="#l816">816</a><td> // yield to avoid blocking the browser. Otherwise, proceed to the next test.<tr><td><a id="l817"></a><a href="#l817">817</a><td> if (this.depth_ > goog.testing.TestCase.MAX_STACK_DEPTH_ ||<tr><td><a id="l818"></a><a href="#l818">818</a><td> this.now() - this.batchTime_ > goog.testing.TestCase.maxRunTime) {<tr><td><a id="l819"></a><a href="#l819">819</a><td> this.saveMessage('Breaking async');<tr><td><a id="l820"></a><a href="#l820">820</a><td> this.timeout(goog.bind(this.startNextBatch_, this), 0);<tr><td><a id="l821"></a><a href="#l821">821</a><td> } else {<tr><td><a id="l822"></a><a href="#l822">822</a><td> ++this.depth_;<tr><td><a id="l823"></a><a href="#l823">823</a><td> this.runNextTest_();<tr><td><a id="l824"></a><a href="#l824">824</a><td> }<tr><td><a id="l825"></a><a href="#l825">825</a><td>};<tr><td><a id="l826"></a><a href="#l826">826</a><td><tr><td><a id="l827"></a><a href="#l827">827</a><td><tr><td><a id="l828"></a><a href="#l828">828</a><td>/**<tr><td><a id="l829"></a><a href="#l829">829</a><td> * Start a new batch to tests after yielding, resetting batchTime and depth.<tr><td><a id="l830"></a><a href="#l830">830</a><td> * @private<tr><td><a id="l831"></a><a href="#l831">831</a><td> */<tr><td><a id="l832"></a><a href="#l832">832</a><td>goog.testing.TestCase.prototype.startNextBatch_ = function() {<tr><td><a id="l833"></a><a href="#l833">833</a><td> this.batchTime_ = this.now();<tr><td><a id="l834"></a><a href="#l834">834</a><td> this.depth_ = 0;<tr><td><a id="l835"></a><a href="#l835">835</a><td> this.runNextTest_();<tr><td><a id="l836"></a><a href="#l836">836</a><td>};<tr><td><a id="l837"></a><a href="#l837">837</a><td><tr><td><a id="l838"></a><a href="#l838">838</a><td><tr><td><a id="l839"></a><a href="#l839">839</a><td>/**<tr><td><a id="l840"></a><a href="#l840">840</a><td> * Reorders the tests depending on the {@code order} field.<tr><td><a id="l841"></a><a href="#l841">841</a><td> * @private<tr><td><a id="l842"></a><a href="#l842">842</a><td> */<tr><td><a id="l843"></a><a href="#l843">843</a><td>goog.testing.TestCase.prototype.orderTests_ = function() {<tr><td><a id="l844"></a><a href="#l844">844</a><td> switch (this.order) {<tr><td><a id="l845"></a><a href="#l845">845</a><td> case goog.testing.TestCase.Order.RANDOM:<tr><td><a id="l846"></a><a href="#l846">846</a><td> // Fisher-Yates shuffle<tr><td><a id="l847"></a><a href="#l847">847</a><td> var i = this.tests_.length;<tr><td><a id="l848"></a><a href="#l848">848</a><td> while (i > 1) {<tr><td><a id="l849"></a><a href="#l849">849</a><td> // goog.math.randomInt is inlined to reduce dependencies.<tr><td><a id="l850"></a><a href="#l850">850</a><td> var j = Math.floor(Math.random() * i); // exclusive<tr><td><a id="l851"></a><a href="#l851">851</a><td> i--;<tr><td><a id="l852"></a><a href="#l852">852</a><td> var tmp = this.tests_[i];<tr><td><a id="l853"></a><a href="#l853">853</a><td> this.tests_[i] = this.tests_[j];<tr><td><a id="l854"></a><a href="#l854">854</a><td> this.tests_[j] = tmp;<tr><td><a id="l855"></a><a href="#l855">855</a><td> }<tr><td><a id="l856"></a><a href="#l856">856</a><td> break;<tr><td><a id="l857"></a><a href="#l857">857</a><td><tr><td><a id="l858"></a><a href="#l858">858</a><td> case goog.testing.TestCase.Order.SORTED:<tr><td><a id="l859"></a><a href="#l859">859</a><td> this.tests_.sort(function(t1, t2) {<tr><td><a id="l860"></a><a href="#l860">860</a><td> if (t1.name == t2.name) {<tr><td><a id="l861"></a><a href="#l861">861</a><td> return 0;<tr><td><a id="l862"></a><a href="#l862">862</a><td> }<tr><td><a id="l863"></a><a href="#l863">863</a><td> return t1.name < t2.name ? -1 : 1;<tr><td><a id="l864"></a><a href="#l864">864</a><td> });<tr><td><a id="l865"></a><a href="#l865">865</a><td> break;<tr><td><a id="l866"></a><a href="#l866">866</a><td><tr><td><a id="l867"></a><a href="#l867">867</a><td> // Do nothing for NATURAL.<tr><td><a id="l868"></a><a href="#l868">868</a><td> }<tr><td><a id="l869"></a><a href="#l869">869</a><td>};<tr><td><a id="l870"></a><a href="#l870">870</a><td><tr><td><a id="l871"></a><a href="#l871">871</a><td><tr><td><a id="l872"></a><a href="#l872">872</a><td>/**<tr><td><a id="l873"></a><a href="#l873">873</a><td> * Gets list of objects that potentially contain test cases. For IE 8 and below,<tr><td><a id="l874"></a><a href="#l874">874</a><td> * this is the global "this" (for properties set directly on the global this or<tr><td><a id="l875"></a><a href="#l875">875</a><td> * window) and the RuntimeObject (for global variables and functions). For all<tr><td><a id="l876"></a><a href="#l876">876</a><td> * other browsers, the array simply contains the global this.<tr><td><a id="l877"></a><a href="#l877">877</a><td> *<tr><td><a id="l878"></a><a href="#l878">878</a><td> * @param {string=} opt_prefix An optional prefix. If specified, only get things<tr><td><a id="l879"></a><a href="#l879">879</a><td> * under this prefix. Note that the prefix is only honored in IE, since it<tr><td><a id="l880"></a><a href="#l880">880</a><td> * supports the RuntimeObject:<tr><td><a id="l881"></a><a href="#l881">881</a><td> * http://msdn.microsoft.com/en-us/library/ff521039%28VS.85%29.aspx<tr><td><a id="l882"></a><a href="#l882">882</a><td> * TODO: Remove this option.<tr><td><a id="l883"></a><a href="#l883">883</a><td> * @return {!Array<!Object>} A list of objects that should be inspected.<tr><td><a id="l884"></a><a href="#l884">884</a><td> */<tr><td><a id="l885"></a><a href="#l885">885</a><td>goog.testing.TestCase.prototype.getGlobals = function(opt_prefix) {<tr><td><a id="l886"></a><a href="#l886">886</a><td> return goog.testing.TestCase.getGlobals(opt_prefix);<tr><td><a id="l887"></a><a href="#l887">887</a><td>};<tr><td><a id="l888"></a><a href="#l888">888</a><td><tr><td><a id="l889"></a><a href="#l889">889</a><td><tr><td><a id="l890"></a><a href="#l890">890</a><td>/**<tr><td><a id="l891"></a><a href="#l891">891</a><td> * Gets list of objects that potentially contain test cases. For IE 8 and below,<tr><td><a id="l892"></a><a href="#l892">892</a><td> * this is the global "this" (for properties set directly on the global this or<tr><td><a id="l893"></a><a href="#l893">893</a><td> * window) and the RuntimeObject (for global variables and functions). For all<tr><td><a id="l894"></a><a href="#l894">894</a><td> * other browsers, the array simply contains the global this.<tr><td><a id="l895"></a><a href="#l895">895</a><td> *<tr><td><a id="l896"></a><a href="#l896">896</a><td> * @param {string=} opt_prefix An optional prefix. If specified, only get things<tr><td><a id="l897"></a><a href="#l897">897</a><td> * under this prefix. Note that the prefix is only honored in IE, since it<tr><td><a id="l898"></a><a href="#l898">898</a><td> * supports the RuntimeObject:<tr><td><a id="l899"></a><a href="#l899">899</a><td> * http://msdn.microsoft.com/en-us/library/ff521039%28VS.85%29.aspx<tr><td><a id="l900"></a><a href="#l900">900</a><td> * TODO: Remove this option.<tr><td><a id="l901"></a><a href="#l901">901</a><td> * @return {!Array<!Object>} A list of objects that should be inspected.<tr><td><a id="l902"></a><a href="#l902">902</a><td> */<tr><td><a id="l903"></a><a href="#l903">903</a><td>goog.testing.TestCase.getGlobals = function(opt_prefix) {<tr><td><a id="l904"></a><a href="#l904">904</a><td> // Look in the global scope for most browsers, on IE we use the little known<tr><td><a id="l905"></a><a href="#l905">905</a><td> // RuntimeObject which holds references to all globals. We reference this<tr><td><a id="l906"></a><a href="#l906">906</a><td> // via goog.global so that there isn't an aliasing that throws an exception<tr><td><a id="l907"></a><a href="#l907">907</a><td> // in Firefox.<tr><td><a id="l908"></a><a href="#l908">908</a><td> return typeof goog.global['RuntimeObject'] != 'undefined' ?<tr><td><a id="l909"></a><a href="#l909">909</a><td> [goog.global['RuntimeObject']((opt_prefix || '') + '*'), goog.global] :<tr><td><a id="l910"></a><a href="#l910">910</a><td> [goog.global];<tr><td><a id="l911"></a><a href="#l911">911</a><td>};<tr><td><a id="l912"></a><a href="#l912">912</a><td><tr><td><a id="l913"></a><a href="#l913">913</a><td><tr><td><a id="l914"></a><a href="#l914">914</a><td>/**<tr><td><a id="l915"></a><a href="#l915">915</a><td> * Gets called before any tests are executed. Can be overridden to set up the<tr><td><a id="l916"></a><a href="#l916">916</a><td> * environment for the whole test case.<tr><td><a id="l917"></a><a href="#l917">917</a><td> */<tr><td><a id="l918"></a><a href="#l918">918</a><td>goog.testing.TestCase.prototype.setUpPage = function() {};<tr><td><a id="l919"></a><a href="#l919">919</a><td><tr><td><a id="l920"></a><a href="#l920">920</a><td><tr><td><a id="l921"></a><a href="#l921">921</a><td>/**<tr><td><a id="l922"></a><a href="#l922">922</a><td> * Gets called after all tests have been executed. Can be overridden to tear<tr><td><a id="l923"></a><a href="#l923">923</a><td> * down the entire test case.<tr><td><a id="l924"></a><a href="#l924">924</a><td> */<tr><td><a id="l925"></a><a href="#l925">925</a><td>goog.testing.TestCase.prototype.tearDownPage = function() {};<tr><td><a id="l926"></a><a href="#l926">926</a><td><tr><td><a id="l927"></a><a href="#l927">927</a><td><tr><td><a id="l928"></a><a href="#l928">928</a><td>/**<tr><td><a id="l929"></a><a href="#l929">929</a><td> * Gets called before every goog.testing.TestCase.Test is been executed. Can be<tr><td><a id="l930"></a><a href="#l930">930</a><td> * overridden to add set up functionality to each test.<tr><td><a id="l931"></a><a href="#l931">931</a><td> */<tr><td><a id="l932"></a><a href="#l932">932</a><td>goog.testing.TestCase.prototype.setUp = function() {};<tr><td><a id="l933"></a><a href="#l933">933</a><td><tr><td><a id="l934"></a><a href="#l934">934</a><td><tr><td><a id="l935"></a><a href="#l935">935</a><td>/**<tr><td><a id="l936"></a><a href="#l936">936</a><td> * Gets called after every goog.testing.TestCase.Test has been executed. Can be<tr><td><a id="l937"></a><a href="#l937">937</a><td> * overriden to add tear down functionality to each test.<tr><td><a id="l938"></a><a href="#l938">938</a><td> */<tr><td><a id="l939"></a><a href="#l939">939</a><td>goog.testing.TestCase.prototype.tearDown = function() {};<tr><td><a id="l940"></a><a href="#l940">940</a><td><tr><td><a id="l941"></a><a href="#l941">941</a><td><tr><td><a id="l942"></a><a href="#l942">942</a><td>/**<tr><td><a id="l943"></a><a href="#l943">943</a><td> * @return {string} The function name prefix used to auto-discover tests.<tr><td><a id="l944"></a><a href="#l944">944</a><td> */<tr><td><a id="l945"></a><a href="#l945">945</a><td>goog.testing.TestCase.prototype.getAutoDiscoveryPrefix = function() {<tr><td><a id="l946"></a><a href="#l946">946</a><td> return 'test';<tr><td><a id="l947"></a><a href="#l947">947</a><td>};<tr><td><a id="l948"></a><a href="#l948">948</a><td><tr><td><a id="l949"></a><a href="#l949">949</a><td><tr><td><a id="l950"></a><a href="#l950">950</a><td>/**<tr><td><a id="l951"></a><a href="#l951">951</a><td> * @return {number} Time since the last batch of tests was started.<tr><td><a id="l952"></a><a href="#l952">952</a><td> * @protected<tr><td><a id="l953"></a><a href="#l953">953</a><td> */<tr><td><a id="l954"></a><a href="#l954">954</a><td>goog.testing.TestCase.prototype.getBatchTime = function() {<tr><td><a id="l955"></a><a href="#l955">955</a><td> return this.batchTime_;<tr><td><a id="l956"></a><a href="#l956">956</a><td>};<tr><td><a id="l957"></a><a href="#l957">957</a><td><tr><td><a id="l958"></a><a href="#l958">958</a><td><tr><td><a id="l959"></a><a href="#l959">959</a><td>/**<tr><td><a id="l960"></a><a href="#l960">960</a><td> * @param {number} batchTime Time since the last batch of tests was started.<tr><td><a id="l961"></a><a href="#l961">961</a><td> * @protected<tr><td><a id="l962"></a><a href="#l962">962</a><td> */<tr><td><a id="l963"></a><a href="#l963">963</a><td>goog.testing.TestCase.prototype.setBatchTime = function(batchTime) {<tr><td><a id="l964"></a><a href="#l964">964</a><td> this.batchTime_ = batchTime;<tr><td><a id="l965"></a><a href="#l965">965</a><td>};<tr><td><a id="l966"></a><a href="#l966">966</a><td><tr><td><a id="l967"></a><a href="#l967">967</a><td><tr><td><a id="l968"></a><a href="#l968">968</a><td>/**<tr><td><a id="l969"></a><a href="#l969">969</a><td> * Creates a {@code goog.testing.TestCase.Test} from an auto-discovered<tr><td><a id="l970"></a><a href="#l970">970</a><td> * function.<tr><td><a id="l971"></a><a href="#l971">971</a><td> * @param {string} name The name of the function.<tr><td><a id="l972"></a><a href="#l972">972</a><td> * @param {function() : void} ref The auto-discovered function.<tr><td><a id="l973"></a><a href="#l973">973</a><td> * @return {!goog.testing.TestCase.Test} The newly created test.<tr><td><a id="l974"></a><a href="#l974">974</a><td> * @protected<tr><td><a id="l975"></a><a href="#l975">975</a><td> */<tr><td><a id="l976"></a><a href="#l976">976</a><td>goog.testing.TestCase.prototype.createTestFromAutoDiscoveredFunction =<tr><td><a id="l977"></a><a href="#l977">977</a><td> function(name, ref) {<tr><td><a id="l978"></a><a href="#l978">978</a><td> return new goog.testing.TestCase.Test(name, ref, goog.global);<tr><td><a id="l979"></a><a href="#l979">979</a><td>};<tr><td><a id="l980"></a><a href="#l980">980</a><td><tr><td><a id="l981"></a><a href="#l981">981</a><td><tr><td><a id="l982"></a><a href="#l982">982</a><td>/**<tr><td><a id="l983"></a><a href="#l983">983</a><td> * Adds any functions defined on 'obj' (the global object, by default)<tr><td><a id="l984"></a><a href="#l984">984</a><td> * that correspond to lifecycle events for the test case. Overrides<tr><td><a id="l985"></a><a href="#l985">985</a><td> * setUp, tearDown, setUpPage, tearDownPage, runTests, and shouldRunTests<tr><td><a id="l986"></a><a href="#l986">986</a><td> * if they are defined on 'obj'.<tr><td><a id="l987"></a><a href="#l987">987</a><td> * @param {!Object=} opt_obj Defaults to goog.global.<tr><td><a id="l988"></a><a href="#l988">988</a><td> */<tr><td><a id="l989"></a><a href="#l989">989</a><td>goog.testing.TestCase.prototype.autoDiscoverLifecycle = function(opt_obj) {<tr><td><a id="l990"></a><a href="#l990">990</a><td> var obj = opt_obj || goog.global;<tr><td><a id="l991"></a><a href="#l991">991</a><td> if (obj['setUp']) {<tr><td><a id="l992"></a><a href="#l992">992</a><td> this.setUp = goog.bind(obj['setUp'], obj);<tr><td><a id="l993"></a><a href="#l993">993</a><td> }<tr><td><a id="l994"></a><a href="#l994">994</a><td> if (obj['tearDown']) {<tr><td><a id="l995"></a><a href="#l995">995</a><td> this.tearDown = goog.bind(obj['tearDown'], obj);<tr><td><a id="l996"></a><a href="#l996">996</a><td> }<tr><td><a id="l997"></a><a href="#l997">997</a><td> if (obj['setUpPage']) {<tr><td><a id="l998"></a><a href="#l998">998</a><td> this.setUpPage = goog.bind(obj['setUpPage'], obj);<tr><td><a id="l999"></a><a href="#l999">999</a><td> }<tr><td><a id="l1000"></a><a href="#l1000">1000</a><td> if (obj['tearDownPage']) {<tr><td><a id="l1001"></a><a href="#l1001">1001</a><td> this.tearDownPage = goog.bind(obj['tearDownPage'], obj);<tr><td><a id="l1002"></a><a href="#l1002">1002</a><td> }<tr><td><a id="l1003"></a><a href="#l1003">1003</a><td> if (obj['runTests']) {<tr><td><a id="l1004"></a><a href="#l1004">1004</a><td> this.runTests = goog.bind(obj['runTests'], obj);<tr><td><a id="l1005"></a><a href="#l1005">1005</a><td> }<tr><td><a id="l1006"></a><a href="#l1006">1006</a><td> if (obj['shouldRunTests']) {<tr><td><a id="l1007"></a><a href="#l1007">1007</a><td> this.shouldRunTests = goog.bind(obj['shouldRunTests'], obj);<tr><td><a id="l1008"></a><a href="#l1008">1008</a><td> }<tr><td><a id="l1009"></a><a href="#l1009">1009</a><td>};<tr><td><a id="l1010"></a><a href="#l1010">1010</a><td><tr><td><a id="l1011"></a><a href="#l1011">1011</a><td><tr><td><a id="l1012"></a><a href="#l1012">1012</a><td>// TODO(johnlenz): make this package private<tr><td><a id="l1013"></a><a href="#l1013">1013</a><td>/**<tr><td><a id="l1014"></a><a href="#l1014">1014</a><td> * @param {!Object} obj An object from which to extract test and lifecycle<tr><td><a id="l1015"></a><a href="#l1015">1015</a><td> * methods.<tr><td><a id="l1016"></a><a href="#l1016">1016</a><td> */<tr><td><a id="l1017"></a><a href="#l1017">1017</a><td>goog.testing.TestCase.prototype.setTestObj = function(obj) {<tr><td><a id="l1018"></a><a href="#l1018">1018</a><td> // Drop any previously added (likely auto-discovered) tests, only one source<tr><td><a id="l1019"></a><a href="#l1019">1019</a><td> // of discovered test and life-cycle methods is allowed.<tr><td><a id="l1020"></a><a href="#l1020">1020</a><td> goog.asserts.assert(this.tests_.length == 0,<tr><td><a id="l1021"></a><a href="#l1021">1021</a><td> 'Test methods have already been configured.');<tr><td><a id="l1022"></a><a href="#l1022">1022</a><td><tr><td><a id="l1023"></a><a href="#l1023">1023</a><td> var regex = new RegExp('^' + this.getAutoDiscoveryPrefix());<tr><td><a id="l1024"></a><a href="#l1024">1024</a><td> for (var name in obj) {<tr><td><a id="l1025"></a><a href="#l1025">1025</a><td> if (regex.test(name)) {<tr><td><a id="l1026"></a><a href="#l1026">1026</a><td> var testMethod = obj[name];<tr><td><a id="l1027"></a><a href="#l1027">1027</a><td> if (goog.isFunction(testMethod)) {<tr><td><a id="l1028"></a><a href="#l1028">1028</a><td> this.addNewTest(name, testMethod, obj);<tr><td><a id="l1029"></a><a href="#l1029">1029</a><td> }<tr><td><a id="l1030"></a><a href="#l1030">1030</a><td> }<tr><td><a id="l1031"></a><a href="#l1031">1031</a><td> }<tr><td><a id="l1032"></a><a href="#l1032">1032</a><td><tr><td><a id="l1033"></a><a href="#l1033">1033</a><td> this.autoDiscoverLifecycle(obj);<tr><td><a id="l1034"></a><a href="#l1034">1034</a><td>};<tr><td><a id="l1035"></a><a href="#l1035">1035</a><td><tr><td><a id="l1036"></a><a href="#l1036">1036</a><td><tr><td><a id="l1037"></a><a href="#l1037">1037</a><td>/**<tr><td><a id="l1038"></a><a href="#l1038">1038</a><td> * Adds any functions defined in the global scope that are prefixed with "test"<tr><td><a id="l1039"></a><a href="#l1039">1039</a><td> * to the test case.<tr><td><a id="l1040"></a><a href="#l1040">1040</a><td> */<tr><td><a id="l1041"></a><a href="#l1041">1041</a><td>goog.testing.TestCase.prototype.autoDiscoverTests = function() {<tr><td><a id="l1042"></a><a href="#l1042">1042</a><td> var prefix = this.getAutoDiscoveryPrefix();<tr><td><a id="l1043"></a><a href="#l1043">1043</a><td> var testSources = this.getGlobals(prefix);<tr><td><a id="l1044"></a><a href="#l1044">1044</a><td><tr><td><a id="l1045"></a><a href="#l1045">1045</a><td> var foundTests = [];<tr><td><a id="l1046"></a><a href="#l1046">1046</a><td><tr><td><a id="l1047"></a><a href="#l1047">1047</a><td> for (var i = 0; i < testSources.length; i++) {<tr><td><a id="l1048"></a><a href="#l1048">1048</a><td> var testSource = testSources[i];<tr><td><a id="l1049"></a><a href="#l1049">1049</a><td> for (var name in testSource) {<tr><td><a id="l1050"></a><a href="#l1050">1050</a><td> if ((new RegExp('^' + prefix)).test(name)) {<tr><td><a id="l1051"></a><a href="#l1051">1051</a><td> var ref;<tr><td><a id="l1052"></a><a href="#l1052">1052</a><td> try {<tr><td><a id="l1053"></a><a href="#l1053">1053</a><td> ref = testSource[name];<tr><td><a id="l1054"></a><a href="#l1054">1054</a><td> } catch (ex) {<tr><td><a id="l1055"></a><a href="#l1055">1055</a><td> // NOTE(brenneman): When running tests from a file:// URL on Firefox<tr><td><a id="l1056"></a><a href="#l1056">1056</a><td> // 3.5 for Windows, any reference to goog.global.sessionStorage raises<tr><td><a id="l1057"></a><a href="#l1057">1057</a><td> // an "Operation is not supported" exception. Ignore any exceptions<tr><td><a id="l1058"></a><a href="#l1058">1058</a><td> // raised by simply accessing global properties.<tr><td><a id="l1059"></a><a href="#l1059">1059</a><td> ref = undefined;<tr><td><a id="l1060"></a><a href="#l1060">1060</a><td> }<tr><td><a id="l1061"></a><a href="#l1061">1061</a><td><tr><td><a id="l1062"></a><a href="#l1062">1062</a><td> if (goog.isFunction(ref)) {<tr><td><a id="l1063"></a><a href="#l1063">1063</a><td> foundTests.push(this.createTestFromAutoDiscoveredFunction(name, ref));<tr><td><a id="l1064"></a><a href="#l1064">1064</a><td> }<tr><td><a id="l1065"></a><a href="#l1065">1065</a><td> }<tr><td><a id="l1066"></a><a href="#l1066">1066</a><td> }<tr><td><a id="l1067"></a><a href="#l1067">1067</a><td> }<tr><td><a id="l1068"></a><a href="#l1068">1068</a><td><tr><td><a id="l1069"></a><a href="#l1069">1069</a><td> for (var i = 0; i < foundTests.length; i++) {<tr><td><a id="l1070"></a><a href="#l1070">1070</a><td> this.add(foundTests[i]);<tr><td><a id="l1071"></a><a href="#l1071">1071</a><td> }<tr><td><a id="l1072"></a><a href="#l1072">1072</a><td> this.orderTests_();<tr><td><a id="l1073"></a><a href="#l1073">1073</a><td><tr><td><a id="l1074"></a><a href="#l1074">1074</a><td> this.log(this.getCount() + ' tests auto-discovered');<tr><td><a id="l1075"></a><a href="#l1075">1075</a><td><tr><td><a id="l1076"></a><a href="#l1076">1076</a><td> // TODO(user): Do this as a separate call. Unfortunately, a lot of projects<tr><td><a id="l1077"></a><a href="#l1077">1077</a><td> // currently override autoDiscoverTests and expect lifecycle events to be<tr><td><a id="l1078"></a><a href="#l1078">1078</a><td> // registered as a part of this call.<tr><td><a id="l1079"></a><a href="#l1079">1079</a><td> this.autoDiscoverLifecycle();<tr><td><a id="l1080"></a><a href="#l1080">1080</a><td>};<tr><td><a id="l1081"></a><a href="#l1081">1081</a><td><tr><td><a id="l1082"></a><a href="#l1082">1082</a><td><tr><td><a id="l1083"></a><a href="#l1083">1083</a><td>/**<tr><td><a id="l1084"></a><a href="#l1084">1084</a><td> * Checks to see if the test should be marked as failed before it is run.<tr><td><a id="l1085"></a><a href="#l1085">1085</a><td> *<tr><td><a id="l1086"></a><a href="#l1086">1086</a><td> * If there was an error in setUpPage, we treat that as a failure for all tests<tr><td><a id="l1087"></a><a href="#l1087">1087</a><td> * and mark them all as having failed.<tr><td><a id="l1088"></a><a href="#l1088">1088</a><td> *<tr><td><a id="l1089"></a><a href="#l1089">1089</a><td> * @param {goog.testing.TestCase.Test} testCase The current test case.<tr><td><a id="l1090"></a><a href="#l1090">1090</a><td> * @return {boolean} Whether the test was marked as failed.<tr><td><a id="l1091"></a><a href="#l1091">1091</a><td> * @protected<tr><td><a id="l1092"></a><a href="#l1092">1092</a><td> */<tr><td><a id="l1093"></a><a href="#l1093">1093</a><td>goog.testing.TestCase.prototype.maybeFailTestEarly = function(testCase) {<tr><td><a id="l1094"></a><a href="#l1094">1094</a><td> if (this.exceptionBeforeTest) {<tr><td><a id="l1095"></a><a href="#l1095">1095</a><td> // We just use the first error to report an error on a failed test.<tr><td><a id="l1096"></a><a href="#l1096">1096</a><td> this.curTest_.name = 'setUpPage for ' + this.curTest_.name;<tr><td><a id="l1097"></a><a href="#l1097">1097</a><td> this.doError(this.curTest_, this.exceptionBeforeTest);<tr><td><a id="l1098"></a><a href="#l1098">1098</a><td> return true;<tr><td><a id="l1099"></a><a href="#l1099">1099</a><td> }<tr><td><a id="l1100"></a><a href="#l1100">1100</a><td> return false;<tr><td><a id="l1101"></a><a href="#l1101">1101</a><td>};<tr><td><a id="l1102"></a><a href="#l1102">1102</a><td><tr><td><a id="l1103"></a><a href="#l1103">1103</a><td><tr><td><a id="l1104"></a><a href="#l1104">1104</a><td>/**<tr><td><a id="l1105"></a><a href="#l1105">1105</a><td> * Cycles through the tests, yielding asynchronously if the execution time<tr><td><a id="l1106"></a><a href="#l1106">1106</a><td> * execeeds {@link #maxRunTime}. In particular, there is no guarantee that<tr><td><a id="l1107"></a><a href="#l1107">1107</a><td> * the test case has finished execution once this method has returned.<tr><td><a id="l1108"></a><a href="#l1108">1108</a><td> * To be notified when the test case has finished execution, use<tr><td><a id="l1109"></a><a href="#l1109">1109</a><td> * {@link #setCompletedCallback} or {@link #runTestsReturningPromise}.<tr><td><a id="l1110"></a><a href="#l1110">1110</a><td> */<tr><td><a id="l1111"></a><a href="#l1111">1111</a><td>goog.testing.TestCase.prototype.cycleTests = function() {<tr><td><a id="l1112"></a><a href="#l1112">1112</a><td> this.saveMessage('Start');<tr><td><a id="l1113"></a><a href="#l1113">1113</a><td> this.batchTime_ = this.now();<tr><td><a id="l1114"></a><a href="#l1114">1114</a><td> if (this.running) {<tr><td><a id="l1115"></a><a href="#l1115">1115</a><td> this.runNextTestCallback_ = goog.nullFunction;<tr><td><a id="l1116"></a><a href="#l1116">1116</a><td> // Kick off the tests. runNextTest_ will schedule all of the tests,<tr><td><a id="l1117"></a><a href="#l1117">1117</a><td> // using a mixture of synchronous and asynchronous strategies.<tr><td><a id="l1118"></a><a href="#l1118">1118</a><td> this.runNextTest_();<tr><td><a id="l1119"></a><a href="#l1119">1119</a><td> }<tr><td><a id="l1120"></a><a href="#l1120">1120</a><td>};<tr><td><a id="l1121"></a><a href="#l1121">1121</a><td><tr><td><a id="l1122"></a><a href="#l1122">1122</a><td><tr><td><a id="l1123"></a><a href="#l1123">1123</a><td>/**<tr><td><a id="l1124"></a><a href="#l1124">1124</a><td> * Counts the number of files that were loaded for dependencies that are<tr><td><a id="l1125"></a><a href="#l1125">1125</a><td> * required to run the test.<tr><td><a id="l1126"></a><a href="#l1126">1126</a><td> * @return {number} The number of files loaded.<tr><td><a id="l1127"></a><a href="#l1127">1127</a><td> * @private<tr><td><a id="l1128"></a><a href="#l1128">1128</a><td> */<tr><td><a id="l1129"></a><a href="#l1129">1129</a><td>goog.testing.TestCase.prototype.countNumFilesLoaded_ = function() {<tr><td><a id="l1130"></a><a href="#l1130">1130</a><td> var scripts = document.getElementsByTagName(goog.dom.TagName.SCRIPT);<tr><td><a id="l1131"></a><a href="#l1131">1131</a><td> var count = 0;<tr><td><a id="l1132"></a><a href="#l1132">1132</a><td> for (var i = 0, n = scripts.length; i < n; i++) {<tr><td><a id="l1133"></a><a href="#l1133">1133</a><td> if (scripts[i].src) {<tr><td><a id="l1134"></a><a href="#l1134">1134</a><td> count++;<tr><td><a id="l1135"></a><a href="#l1135">1135</a><td> }<tr><td><a id="l1136"></a><a href="#l1136">1136</a><td> }<tr><td><a id="l1137"></a><a href="#l1137">1137</a><td> return count;<tr><td><a id="l1138"></a><a href="#l1138">1138</a><td>};<tr><td><a id="l1139"></a><a href="#l1139">1139</a><td><tr><td><a id="l1140"></a><a href="#l1140">1140</a><td><tr><td><a id="l1141"></a><a href="#l1141">1141</a><td>/**<tr><td><a id="l1142"></a><a href="#l1142">1142</a><td> * Calls a function after a delay, using the protected timeout.<tr><td><a id="l1143"></a><a href="#l1143">1143</a><td> * @param {Function} fn The function to call.<tr><td><a id="l1144"></a><a href="#l1144">1144</a><td> * @param {number} time Delay in milliseconds.<tr><td><a id="l1145"></a><a href="#l1145">1145</a><td> * @return {number} The timeout id.<tr><td><a id="l1146"></a><a href="#l1146">1146</a><td> * @protected<tr><td><a id="l1147"></a><a href="#l1147">1147</a><td> */<tr><td><a id="l1148"></a><a href="#l1148">1148</a><td>goog.testing.TestCase.prototype.timeout = function(fn, time) {<tr><td><a id="l1149"></a><a href="#l1149">1149</a><td> // NOTE: invoking protectedSetTimeout_ as a member of goog.testing.TestCase<tr><td><a id="l1150"></a><a href="#l1150">1150</a><td> // would result in an Illegal Invocation error. The method must be executed<tr><td><a id="l1151"></a><a href="#l1151">1151</a><td> // with the global context.<tr><td><a id="l1152"></a><a href="#l1152">1152</a><td> var protectedSetTimeout = goog.testing.TestCase.protectedSetTimeout_;<tr><td><a id="l1153"></a><a href="#l1153">1153</a><td> return protectedSetTimeout(fn, time);<tr><td><a id="l1154"></a><a href="#l1154">1154</a><td>};<tr><td><a id="l1155"></a><a href="#l1155">1155</a><td><tr><td><a id="l1156"></a><a href="#l1156">1156</a><td><tr><td><a id="l1157"></a><a href="#l1157">1157</a><td>/**<tr><td><a id="l1158"></a><a href="#l1158">1158</a><td> * Clears a timeout created by {@code this.timeout()}.<tr><td><a id="l1159"></a><a href="#l1159">1159</a><td> * @param {number} id A timeout id.<tr><td><a id="l1160"></a><a href="#l1160">1160</a><td> * @protected<tr><td><a id="l1161"></a><a href="#l1161">1161</a><td> */<tr><td><a id="l1162"></a><a href="#l1162">1162</a><td>goog.testing.TestCase.prototype.clearTimeout = function(id) {<tr><td><a id="l1163"></a><a href="#l1163">1163</a><td> // NOTE: see execution note for protectedSetTimeout above.<tr><td><a id="l1164"></a><a href="#l1164">1164</a><td> var protectedClearTimeout = goog.testing.TestCase.protectedClearTimeout_;<tr><td><a id="l1165"></a><a href="#l1165">1165</a><td> protectedClearTimeout(id);<tr><td><a id="l1166"></a><a href="#l1166">1166</a><td>};<tr><td><a id="l1167"></a><a href="#l1167">1167</a><td><tr><td><a id="l1168"></a><a href="#l1168">1168</a><td><tr><td><a id="l1169"></a><a href="#l1169">1169</a><td>/**<tr><td><a id="l1170"></a><a href="#l1170">1170</a><td> * @return {number} The current time in milliseconds, don't use goog.now as some<tr><td><a id="l1171"></a><a href="#l1171">1171</a><td> * tests override it.<tr><td><a id="l1172"></a><a href="#l1172">1172</a><td> * @protected<tr><td><a id="l1173"></a><a href="#l1173">1173</a><td> */<tr><td><a id="l1174"></a><a href="#l1174">1174</a><td>goog.testing.TestCase.prototype.now = function() {<tr><td><a id="l1175"></a><a href="#l1175">1175</a><td> // Cannot use "new goog.testing.TestCase.protectedDate_()" due to b/8323223.<tr><td><a id="l1176"></a><a href="#l1176">1176</a><td> var protectedDate = goog.testing.TestCase.protectedDate_;<tr><td><a id="l1177"></a><a href="#l1177">1177</a><td> return new protectedDate().getTime();<tr><td><a id="l1178"></a><a href="#l1178">1178</a><td>};<tr><td><a id="l1179"></a><a href="#l1179">1179</a><td><tr><td><a id="l1180"></a><a href="#l1180">1180</a><td><tr><td><a id="l1181"></a><a href="#l1181">1181</a><td>/**<tr><td><a id="l1182"></a><a href="#l1182">1182</a><td> * Returns the current time.<tr><td><a id="l1183"></a><a href="#l1183">1183</a><td> * @return {string} HH:MM:SS.<tr><td><a id="l1184"></a><a href="#l1184">1184</a><td> * @private<tr><td><a id="l1185"></a><a href="#l1185">1185</a><td> */<tr><td><a id="l1186"></a><a href="#l1186">1186</a><td>goog.testing.TestCase.prototype.getTimeStamp_ = function() {<tr><td><a id="l1187"></a><a href="#l1187">1187</a><td> // Cannot use "new goog.testing.TestCase.protectedDate_()" due to b/8323223.<tr><td><a id="l1188"></a><a href="#l1188">1188</a><td> var protectedDate = goog.testing.TestCase.protectedDate_;<tr><td><a id="l1189"></a><a href="#l1189">1189</a><td> var d = new protectedDate();<tr><td><a id="l1190"></a><a href="#l1190">1190</a><td><tr><td><a id="l1191"></a><a href="#l1191">1191</a><td> // Ensure millis are always 3-digits<tr><td><a id="l1192"></a><a href="#l1192">1192</a><td> var millis = '00' + d.getMilliseconds();<tr><td><a id="l1193"></a><a href="#l1193">1193</a><td> millis = millis.substr(millis.length - 3);<tr><td><a id="l1194"></a><a href="#l1194">1194</a><td><tr><td><a id="l1195"></a><a href="#l1195">1195</a><td> return this.pad_(d.getHours()) + ':' + this.pad_(d.getMinutes()) + ':' +<tr><td><a id="l1196"></a><a href="#l1196">1196</a><td> this.pad_(d.getSeconds()) + '.' + millis;<tr><td><a id="l1197"></a><a href="#l1197">1197</a><td>};<tr><td><a id="l1198"></a><a href="#l1198">1198</a><td><tr><td><a id="l1199"></a><a href="#l1199">1199</a><td><tr><td><a id="l1200"></a><a href="#l1200">1200</a><td>/**<tr><td><a id="l1201"></a><a href="#l1201">1201</a><td> * Pads a number to make it have a leading zero if it's less than 10.<tr><td><a id="l1202"></a><a href="#l1202">1202</a><td> * @param {number} number The number to pad.<tr><td><a id="l1203"></a><a href="#l1203">1203</a><td> * @return {string} The resulting string.<tr><td><a id="l1204"></a><a href="#l1204">1204</a><td> * @private<tr><td><a id="l1205"></a><a href="#l1205">1205</a><td> */<tr><td><a id="l1206"></a><a href="#l1206">1206</a><td>goog.testing.TestCase.prototype.pad_ = function(number) {<tr><td><a id="l1207"></a><a href="#l1207">1207</a><td> return number < 10 ? '0' + number : String(number);<tr><td><a id="l1208"></a><a href="#l1208">1208</a><td>};<tr><td><a id="l1209"></a><a href="#l1209">1209</a><td><tr><td><a id="l1210"></a><a href="#l1210">1210</a><td><tr><td><a id="l1211"></a><a href="#l1211">1211</a><td>/**<tr><td><a id="l1212"></a><a href="#l1212">1212</a><td> * Trims a path to be only that after google3.<tr><td><a id="l1213"></a><a href="#l1213">1213</a><td> * @param {string} path The path to trim.<tr><td><a id="l1214"></a><a href="#l1214">1214</a><td> * @return {string} The resulting string.<tr><td><a id="l1215"></a><a href="#l1215">1215</a><td> * @private<tr><td><a id="l1216"></a><a href="#l1216">1216</a><td> */<tr><td><a id="l1217"></a><a href="#l1217">1217</a><td>goog.testing.TestCase.prototype.trimPath_ = function(path) {<tr><td><a id="l1218"></a><a href="#l1218">1218</a><td> return path.substring(path.indexOf('google3') + 8);<tr><td><a id="l1219"></a><a href="#l1219">1219</a><td>};<tr><td><a id="l1220"></a><a href="#l1220">1220</a><td><tr><td><a id="l1221"></a><a href="#l1221">1221</a><td><tr><td><a id="l1222"></a><a href="#l1222">1222</a><td>/**<tr><td><a id="l1223"></a><a href="#l1223">1223</a><td> * Handles a test that passed.<tr><td><a id="l1224"></a><a href="#l1224">1224</a><td> * @param {goog.testing.TestCase.Test} test The test that passed.<tr><td><a id="l1225"></a><a href="#l1225">1225</a><td> * @protected<tr><td><a id="l1226"></a><a href="#l1226">1226</a><td> */<tr><td><a id="l1227"></a><a href="#l1227">1227</a><td>goog.testing.TestCase.prototype.doSuccess = function(test) {<tr><td><a id="l1228"></a><a href="#l1228">1228</a><td> this.result_.successCount++;<tr><td><a id="l1229"></a><a href="#l1229">1229</a><td> // An empty list of error messages indicates that the test passed.<tr><td><a id="l1230"></a><a href="#l1230">1230</a><td> // If we already have a failure for this test, do not set to empty list.<tr><td><a id="l1231"></a><a href="#l1231">1231</a><td> if (!(test.name in this.result_.resultsByName)) {<tr><td><a id="l1232"></a><a href="#l1232">1232</a><td> this.result_.resultsByName[test.name] = [];<tr><td><a id="l1233"></a><a href="#l1233">1233</a><td> }<tr><td><a id="l1234"></a><a href="#l1234">1234</a><td> var message = test.name + ' : PASSED';<tr><td><a id="l1235"></a><a href="#l1235">1235</a><td> this.saveMessage(message);<tr><td><a id="l1236"></a><a href="#l1236">1236</a><td> this.log(message);<tr><td><a id="l1237"></a><a href="#l1237">1237</a><td>};<tr><td><a id="l1238"></a><a href="#l1238">1238</a><td><tr><td><a id="l1239"></a><a href="#l1239">1239</a><td><tr><td><a id="l1240"></a><a href="#l1240">1240</a><td>/**<tr><td><a id="l1241"></a><a href="#l1241">1241</a><td> * Handles a test that failed.<tr><td><a id="l1242"></a><a href="#l1242">1242</a><td> * @param {goog.testing.TestCase.Test} test The test that failed.<tr><td><a id="l1243"></a><a href="#l1243">1243</a><td> * @param {*=} opt_e The exception object associated with the<tr><td><a id="l1244"></a><a href="#l1244">1244</a><td> * failure or a string.<tr><td><a id="l1245"></a><a href="#l1245">1245</a><td> * @protected<tr><td><a id="l1246"></a><a href="#l1246">1246</a><td> */<tr><td><a id="l1247"></a><a href="#l1247">1247</a><td>goog.testing.TestCase.prototype.doError = function(test, opt_e) {<tr><td><a id="l1248"></a><a href="#l1248">1248</a><td> var message = test.name + ' : FAILED';<tr><td><a id="l1249"></a><a href="#l1249">1249</a><td> this.log(message);<tr><td><a id="l1250"></a><a href="#l1250">1250</a><td> this.saveMessage(message);<tr><td><a id="l1251"></a><a href="#l1251">1251</a><td> var err = this.logError(test.name, opt_e);<tr><td><a id="l1252"></a><a href="#l1252">1252</a><td> this.result_.errors.push(err);<tr><td><a id="l1253"></a><a href="#l1253">1253</a><td> if (test.name in this.result_.resultsByName) {<tr><td><a id="l1254"></a><a href="#l1254">1254</a><td> this.result_.resultsByName[test.name].push(err.toString());<tr><td><a id="l1255"></a><a href="#l1255">1255</a><td> } else {<tr><td><a id="l1256"></a><a href="#l1256">1256</a><td> this.result_.resultsByName[test.name] = [err.toString()];<tr><td><a id="l1257"></a><a href="#l1257">1257</a><td> }<tr><td><a id="l1258"></a><a href="#l1258">1258</a><td>};<tr><td><a id="l1259"></a><a href="#l1259">1259</a><td><tr><td><a id="l1260"></a><a href="#l1260">1260</a><td><tr><td><a id="l1261"></a><a href="#l1261">1261</a><td>/**<tr><td><a id="l1262"></a><a href="#l1262">1262</a><td> * @param {string} name Failed test name.<tr><td><a id="l1263"></a><a href="#l1263">1263</a><td> * @param {*=} opt_e The exception object associated with the<tr><td><a id="l1264"></a><a href="#l1264">1264</a><td> * failure or a string.<tr><td><a id="l1265"></a><a href="#l1265">1265</a><td> * @return {!goog.testing.TestCase.Error} Error object.<tr><td><a id="l1266"></a><a href="#l1266">1266</a><td> */<tr><td><a id="l1267"></a><a href="#l1267">1267</a><td>goog.testing.TestCase.prototype.logError = function(name, opt_e) {<tr><td><a id="l1268"></a><a href="#l1268">1268</a><td> var errMsg = null;<tr><td><a id="l1269"></a><a href="#l1269">1269</a><td> var stack = null;<tr><td><a id="l1270"></a><a href="#l1270">1270</a><td> if (opt_e) {<tr><td><a id="l1271"></a><a href="#l1271">1271</a><td> this.log(opt_e);<tr><td><a id="l1272"></a><a href="#l1272">1272</a><td> if (goog.isString(opt_e)) {<tr><td><a id="l1273"></a><a href="#l1273">1273</a><td> errMsg = opt_e;<tr><td><a id="l1274"></a><a href="#l1274">1274</a><td> } else {<tr><td><a id="l1275"></a><a href="#l1275">1275</a><td> errMsg = opt_e.message || opt_e.description || opt_e.toString();<tr><td><a id="l1276"></a><a href="#l1276">1276</a><td> stack = opt_e.stack ? goog.testing.stacktrace.canonicalize(opt_e.stack) :<tr><td><a id="l1277"></a><a href="#l1277">1277</a><td> opt_e['stackTrace'];<tr><td><a id="l1278"></a><a href="#l1278">1278</a><td> }<tr><td><a id="l1279"></a><a href="#l1279">1279</a><td> } else {<tr><td><a id="l1280"></a><a href="#l1280">1280</a><td> errMsg = 'An unknown error occurred';<tr><td><a id="l1281"></a><a href="#l1281">1281</a><td> }<tr><td><a id="l1282"></a><a href="#l1282">1282</a><td> var err = new goog.testing.TestCase.Error(name, errMsg, stack);<tr><td><a id="l1283"></a><a href="#l1283">1283</a><td><tr><td><a id="l1284"></a><a href="#l1284">1284</a><td> // Avoid double logging.<tr><td><a id="l1285"></a><a href="#l1285">1285</a><td> if (!opt_e || !opt_e['isJsUnitException'] ||<tr><td><a id="l1286"></a><a href="#l1286">1286</a><td> !opt_e['loggedJsUnitException']) {<tr><td><a id="l1287"></a><a href="#l1287">1287</a><td> this.saveMessage(err.toString());<tr><td><a id="l1288"></a><a href="#l1288">1288</a><td> }<tr><td><a id="l1289"></a><a href="#l1289">1289</a><td> if (opt_e && opt_e['isJsUnitException']) {<tr><td><a id="l1290"></a><a href="#l1290">1290</a><td> opt_e['loggedJsUnitException'] = true;<tr><td><a id="l1291"></a><a href="#l1291">1291</a><td> }<tr><td><a id="l1292"></a><a href="#l1292">1292</a><td><tr><td><a id="l1293"></a><a href="#l1293">1293</a><td> return err;<tr><td><a id="l1294"></a><a href="#l1294">1294</a><td>};<tr><td><a id="l1295"></a><a href="#l1295">1295</a><td><tr><td><a id="l1296"></a><a href="#l1296">1296</a><td><tr><td><a id="l1297"></a><a href="#l1297">1297</a><td><tr><td><a id="l1298"></a><a href="#l1298">1298</a><td>/**<tr><td><a id="l1299"></a><a href="#l1299">1299</a><td> * A class representing a single test function.<tr><td><a id="l1300"></a><a href="#l1300">1300</a><td> * @param {string} name The test name.<tr><td><a id="l1301"></a><a href="#l1301">1301</a><td> * @param {Function} ref Reference to the test function.<tr><td><a id="l1302"></a><a href="#l1302">1302</a><td> * @param {Object=} opt_scope Optional scope that the test function should be<tr><td><a id="l1303"></a><a href="#l1303">1303</a><td> * called in.<tr><td><a id="l1304"></a><a href="#l1304">1304</a><td> * @constructor<tr><td><a id="l1305"></a><a href="#l1305">1305</a><td> */<tr><td><a id="l1306"></a><a href="#l1306">1306</a><td>goog.testing.TestCase.Test = function(name, ref, opt_scope) {<tr><td><a id="l1307"></a><a href="#l1307">1307</a><td> /**<tr><td><a id="l1308"></a><a href="#l1308">1308</a><td> * The name of the test.<tr><td><a id="l1309"></a><a href="#l1309">1309</a><td> * @type {string}<tr><td><a id="l1310"></a><a href="#l1310">1310</a><td> */<tr><td><a id="l1311"></a><a href="#l1311">1311</a><td> this.name = name;<tr><td><a id="l1312"></a><a href="#l1312">1312</a><td><tr><td><a id="l1313"></a><a href="#l1313">1313</a><td> /**<tr><td><a id="l1314"></a><a href="#l1314">1314</a><td> * Reference to the test function.<tr><td><a id="l1315"></a><a href="#l1315">1315</a><td> * @type {Function}<tr><td><a id="l1316"></a><a href="#l1316">1316</a><td> */<tr><td><a id="l1317"></a><a href="#l1317">1317</a><td> this.ref = ref;<tr><td><a id="l1318"></a><a href="#l1318">1318</a><td><tr><td><a id="l1319"></a><a href="#l1319">1319</a><td> /**<tr><td><a id="l1320"></a><a href="#l1320">1320</a><td> * Scope that the test function should be called in.<tr><td><a id="l1321"></a><a href="#l1321">1321</a><td> * @type {Object}<tr><td><a id="l1322"></a><a href="#l1322">1322</a><td> */<tr><td><a id="l1323"></a><a href="#l1323">1323</a><td> this.scope = opt_scope || null;<tr><td><a id="l1324"></a><a href="#l1324">1324</a><td>};<tr><td><a id="l1325"></a><a href="#l1325">1325</a><td><tr><td><a id="l1326"></a><a href="#l1326">1326</a><td><tr><td><a id="l1327"></a><a href="#l1327">1327</a><td>/**<tr><td><a id="l1328"></a><a href="#l1328">1328</a><td> * Executes the test function.<tr><td><a id="l1329"></a><a href="#l1329">1329</a><td> * @package<tr><td><a id="l1330"></a><a href="#l1330">1330</a><td> */<tr><td><a id="l1331"></a><a href="#l1331">1331</a><td>goog.testing.TestCase.Test.prototype.execute = function() {<tr><td><a id="l1332"></a><a href="#l1332">1332</a><td> this.ref.call(this.scope);<tr><td><a id="l1333"></a><a href="#l1333">1333</a><td>};<tr><td><a id="l1334"></a><a href="#l1334">1334</a><td><tr><td><a id="l1335"></a><a href="#l1335">1335</a><td><tr><td><a id="l1336"></a><a href="#l1336">1336</a><td><tr><td><a id="l1337"></a><a href="#l1337">1337</a><td>/**<tr><td><a id="l1338"></a><a href="#l1338">1338</a><td> * A class for representing test results. A bag of public properties.<tr><td><a id="l1339"></a><a href="#l1339">1339</a><td> * @param {goog.testing.TestCase} testCase The test case that owns this result.<tr><td><a id="l1340"></a><a href="#l1340">1340</a><td> * @constructor<tr><td><a id="l1341"></a><a href="#l1341">1341</a><td> * @final<tr><td><a id="l1342"></a><a href="#l1342">1342</a><td> */<tr><td><a id="l1343"></a><a href="#l1343">1343</a><td>goog.testing.TestCase.Result = function(testCase) {<tr><td><a id="l1344"></a><a href="#l1344">1344</a><td> /**<tr><td><a id="l1345"></a><a href="#l1345">1345</a><td> * The test case that owns this result.<tr><td><a id="l1346"></a><a href="#l1346">1346</a><td> * @type {goog.testing.TestCase}<tr><td><a id="l1347"></a><a href="#l1347">1347</a><td> * @private<tr><td><a id="l1348"></a><a href="#l1348">1348</a><td> */<tr><td><a id="l1349"></a><a href="#l1349">1349</a><td> this.testCase_ = testCase;<tr><td><a id="l1350"></a><a href="#l1350">1350</a><td><tr><td><a id="l1351"></a><a href="#l1351">1351</a><td> /**<tr><td><a id="l1352"></a><a href="#l1352">1352</a><td> * Total number of tests that should have been run.<tr><td><a id="l1353"></a><a href="#l1353">1353</a><td> * @type {number}<tr><td><a id="l1354"></a><a href="#l1354">1354</a><td> */<tr><td><a id="l1355"></a><a href="#l1355">1355</a><td> this.totalCount = 0;<tr><td><a id="l1356"></a><a href="#l1356">1356</a><td><tr><td><a id="l1357"></a><a href="#l1357">1357</a><td> /**<tr><td><a id="l1358"></a><a href="#l1358">1358</a><td> * Total number of tests that were actually run.<tr><td><a id="l1359"></a><a href="#l1359">1359</a><td> * @type {number}<tr><td><a id="l1360"></a><a href="#l1360">1360</a><td> */<tr><td><a id="l1361"></a><a href="#l1361">1361</a><td> this.runCount = 0;<tr><td><a id="l1362"></a><a href="#l1362">1362</a><td><tr><td><a id="l1363"></a><a href="#l1363">1363</a><td> /**<tr><td><a id="l1364"></a><a href="#l1364">1364</a><td> * Number of successful tests.<tr><td><a id="l1365"></a><a href="#l1365">1365</a><td> * @type {number}<tr><td><a id="l1366"></a><a href="#l1366">1366</a><td> */<tr><td><a id="l1367"></a><a href="#l1367">1367</a><td> this.successCount = 0;<tr><td><a id="l1368"></a><a href="#l1368">1368</a><td><tr><td><a id="l1369"></a><a href="#l1369">1369</a><td> /**<tr><td><a id="l1370"></a><a href="#l1370">1370</a><td> * The amount of time the tests took to run.<tr><td><a id="l1371"></a><a href="#l1371">1371</a><td> * @type {number}<tr><td><a id="l1372"></a><a href="#l1372">1372</a><td> */<tr><td><a id="l1373"></a><a href="#l1373">1373</a><td> this.runTime = 0;<tr><td><a id="l1374"></a><a href="#l1374">1374</a><td><tr><td><a id="l1375"></a><a href="#l1375">1375</a><td> /**<tr><td><a id="l1376"></a><a href="#l1376">1376</a><td> * The number of files loaded to run this test.<tr><td><a id="l1377"></a><a href="#l1377">1377</a><td> * @type {number}<tr><td><a id="l1378"></a><a href="#l1378">1378</a><td> */<tr><td><a id="l1379"></a><a href="#l1379">1379</a><td> this.numFilesLoaded = 0;<tr><td><a id="l1380"></a><a href="#l1380">1380</a><td><tr><td><a id="l1381"></a><a href="#l1381">1381</a><td> /**<tr><td><a id="l1382"></a><a href="#l1382">1382</a><td> * Whether this test case was suppressed by shouldRunTests() returning false.<tr><td><a id="l1383"></a><a href="#l1383">1383</a><td> * @type {boolean}<tr><td><a id="l1384"></a><a href="#l1384">1384</a><td> */<tr><td><a id="l1385"></a><a href="#l1385">1385</a><td> this.testSuppressed = false;<tr><td><a id="l1386"></a><a href="#l1386">1386</a><td><tr><td><a id="l1387"></a><a href="#l1387">1387</a><td> /**<tr><td><a id="l1388"></a><a href="#l1388">1388</a><td> * Test results for each test that was run. The test name is always added<tr><td><a id="l1389"></a><a href="#l1389">1389</a><td> * as the key in the map, and the array of strings is an optional list<tr><td><a id="l1390"></a><a href="#l1390">1390</a><td> * of failure messages. If the array is empty, the test passed. Otherwise,<tr><td><a id="l1391"></a><a href="#l1391">1391</a><td> * the test failed.<tr><td><a id="l1392"></a><a href="#l1392">1392</a><td> * @type {!Object<string, !Array<string>>}<tr><td><a id="l1393"></a><a href="#l1393">1393</a><td> */<tr><td><a id="l1394"></a><a href="#l1394">1394</a><td> this.resultsByName = {};<tr><td><a id="l1395"></a><a href="#l1395">1395</a><td><tr><td><a id="l1396"></a><a href="#l1396">1396</a><td> /**<tr><td><a id="l1397"></a><a href="#l1397">1397</a><td> * Errors encountered while running the test.<tr><td><a id="l1398"></a><a href="#l1398">1398</a><td> * @type {!Array<goog.testing.TestCase.Error>}<tr><td><a id="l1399"></a><a href="#l1399">1399</a><td> */<tr><td><a id="l1400"></a><a href="#l1400">1400</a><td> this.errors = [];<tr><td><a id="l1401"></a><a href="#l1401">1401</a><td><tr><td><a id="l1402"></a><a href="#l1402">1402</a><td> /**<tr><td><a id="l1403"></a><a href="#l1403">1403</a><td> * Messages to show the user after running the test.<tr><td><a id="l1404"></a><a href="#l1404">1404</a><td> * @type {!Array<string>}<tr><td><a id="l1405"></a><a href="#l1405">1405</a><td> */<tr><td><a id="l1406"></a><a href="#l1406">1406</a><td> this.messages = [];<tr><td><a id="l1407"></a><a href="#l1407">1407</a><td><tr><td><a id="l1408"></a><a href="#l1408">1408</a><td> /**<tr><td><a id="l1409"></a><a href="#l1409">1409</a><td> * Whether the tests have completed.<tr><td><a id="l1410"></a><a href="#l1410">1410</a><td> * @type {boolean}<tr><td><a id="l1411"></a><a href="#l1411">1411</a><td> */<tr><td><a id="l1412"></a><a href="#l1412">1412</a><td> this.complete = false;<tr><td><a id="l1413"></a><a href="#l1413">1413</a><td>};<tr><td><a id="l1414"></a><a href="#l1414">1414</a><td><tr><td><a id="l1415"></a><a href="#l1415">1415</a><td><tr><td><a id="l1416"></a><a href="#l1416">1416</a><td>/**<tr><td><a id="l1417"></a><a href="#l1417">1417</a><td> * @return {boolean} Whether the test was successful.<tr><td><a id="l1418"></a><a href="#l1418">1418</a><td> */<tr><td><a id="l1419"></a><a href="#l1419">1419</a><td>goog.testing.TestCase.Result.prototype.isSuccess = function() {<tr><td><a id="l1420"></a><a href="#l1420">1420</a><td> return this.complete && this.errors.length == 0;<tr><td><a id="l1421"></a><a href="#l1421">1421</a><td>};<tr><td><a id="l1422"></a><a href="#l1422">1422</a><td><tr><td><a id="l1423"></a><a href="#l1423">1423</a><td><tr><td><a id="l1424"></a><a href="#l1424">1424</a><td>/**<tr><td><a id="l1425"></a><a href="#l1425">1425</a><td> * @return {string} A summary of the tests, including total number of tests that<tr><td><a id="l1426"></a><a href="#l1426">1426</a><td> * passed, failed, and the time taken.<tr><td><a id="l1427"></a><a href="#l1427">1427</a><td> */<tr><td><a id="l1428"></a><a href="#l1428">1428</a><td>goog.testing.TestCase.Result.prototype.getSummary = function() {<tr><td><a id="l1429"></a><a href="#l1429">1429</a><td> var summary = this.runCount + ' of ' + this.totalCount + ' tests run in ' +<tr><td><a id="l1430"></a><a href="#l1430">1430</a><td> this.runTime + 'ms.\n';<tr><td><a id="l1431"></a><a href="#l1431">1431</a><td> if (this.testSuppressed) {<tr><td><a id="l1432"></a><a href="#l1432">1432</a><td> summary += 'Tests not run because shouldRunTests() returned false.';<tr><td><a id="l1433"></a><a href="#l1433">1433</a><td> } else {<tr><td><a id="l1434"></a><a href="#l1434">1434</a><td> var failures = this.totalCount - this.successCount;<tr><td><a id="l1435"></a><a href="#l1435">1435</a><td> var suppressionMessage = '';<tr><td><a id="l1436"></a><a href="#l1436">1436</a><td><tr><td><a id="l1437"></a><a href="#l1437">1437</a><td> var countOfRunTests = this.testCase_.getActuallyRunCount();<tr><td><a id="l1438"></a><a href="#l1438">1438</a><td> if (countOfRunTests) {<tr><td><a id="l1439"></a><a href="#l1439">1439</a><td> failures = countOfRunTests - this.successCount;<tr><td><a id="l1440"></a><a href="#l1440">1440</a><td> suppressionMessage = ', ' +<tr><td><a id="l1441"></a><a href="#l1441">1441</a><td> (this.totalCount - countOfRunTests) + ' suppressed by querystring';<tr><td><a id="l1442"></a><a href="#l1442">1442</a><td> }<tr><td><a id="l1443"></a><a href="#l1443">1443</a><td> summary += this.successCount + ' passed, ' +<tr><td><a id="l1444"></a><a href="#l1444">1444</a><td> failures + ' failed' + suppressionMessage + '.\n' +<tr><td><a id="l1445"></a><a href="#l1445">1445</a><td> Math.round(this.runTime / this.runCount) + ' ms/test. ' +<tr><td><a id="l1446"></a><a href="#l1446">1446</a><td> this.numFilesLoaded + ' files loaded.';<tr><td><a id="l1447"></a><a href="#l1447">1447</a><td> }<tr><td><a id="l1448"></a><a href="#l1448">1448</a><td><tr><td><a id="l1449"></a><a href="#l1449">1449</a><td> return summary;<tr><td><a id="l1450"></a><a href="#l1450">1450</a><td>};<tr><td><a id="l1451"></a><a href="#l1451">1451</a><td><tr><td><a id="l1452"></a><a href="#l1452">1452</a><td><tr><td><a id="l1453"></a><a href="#l1453">1453</a><td>/**<tr><td><a id="l1454"></a><a href="#l1454">1454</a><td> * Initializes the given test case with the global test runner 'G_testRunner'.<tr><td><a id="l1455"></a><a href="#l1455">1455</a><td> * @param {goog.testing.TestCase} testCase The test case to install.<tr><td><a id="l1456"></a><a href="#l1456">1456</a><td> */<tr><td><a id="l1457"></a><a href="#l1457">1457</a><td>goog.testing.TestCase.initializeTestRunner = function(testCase) {<tr><td><a id="l1458"></a><a href="#l1458">1458</a><td> testCase.autoDiscoverTests();<tr><td><a id="l1459"></a><a href="#l1459">1459</a><td><tr><td><a id="l1460"></a><a href="#l1460">1460</a><td> if (goog.global.location) {<tr><td><a id="l1461"></a><a href="#l1461">1461</a><td> var search = goog.global.location.search;<tr><td><a id="l1462"></a><a href="#l1462">1462</a><td> testCase.setOrder(goog.testing.TestCase.parseOrder_(search) ||<tr><td><a id="l1463"></a><a href="#l1463">1463</a><td> goog.testing.TestCase.Order.SORTED);<tr><td><a id="l1464"></a><a href="#l1464">1464</a><td> testCase.setTestsToRun(goog.testing.TestCase.parseRunTests_(search));<tr><td><a id="l1465"></a><a href="#l1465">1465</a><td> }<tr><td><a id="l1466"></a><a href="#l1466">1466</a><td><tr><td><a id="l1467"></a><a href="#l1467">1467</a><td> var gTestRunner = goog.global['G_testRunner'];<tr><td><a id="l1468"></a><a href="#l1468">1468</a><td> if (gTestRunner) {<tr><td><a id="l1469"></a><a href="#l1469">1469</a><td> gTestRunner['initialize'](testCase);<tr><td><a id="l1470"></a><a href="#l1470">1470</a><td> } else {<tr><td><a id="l1471"></a><a href="#l1471">1471</a><td> throw Error('G_testRunner is undefined. Please ensure goog.testing.jsunit' +<tr><td><a id="l1472"></a><a href="#l1472">1472</a><td> ' is included.');<tr><td><a id="l1473"></a><a href="#l1473">1473</a><td> }<tr><td><a id="l1474"></a><a href="#l1474">1474</a><td>};<tr><td><a id="l1475"></a><a href="#l1475">1475</a><td><tr><td><a id="l1476"></a><a href="#l1476">1476</a><td><tr><td><a id="l1477"></a><a href="#l1477">1477</a><td>/**<tr><td><a id="l1478"></a><a href="#l1478">1478</a><td> * Parses URL query parameters for the 'order' parameter.<tr><td><a id="l1479"></a><a href="#l1479">1479</a><td> * @param {string} search The URL query string.<tr><td><a id="l1480"></a><a href="#l1480">1480</a><td> * @return {?goog.testing.TestCase.Order} The sort order for running tests.<tr><td><a id="l1481"></a><a href="#l1481">1481</a><td> * @private<tr><td><a id="l1482"></a><a href="#l1482">1482</a><td> */<tr><td><a id="l1483"></a><a href="#l1483">1483</a><td>goog.testing.TestCase.parseOrder_ = function(search) {<tr><td><a id="l1484"></a><a href="#l1484">1484</a><td> var order = null;<tr><td><a id="l1485"></a><a href="#l1485">1485</a><td> var orderMatch = search.match(<tr><td><a id="l1486"></a><a href="#l1486">1486</a><td> /(?:\?|&)order=(natural|random|sorted)/i);<tr><td><a id="l1487"></a><a href="#l1487">1487</a><td> if (orderMatch) {<tr><td><a id="l1488"></a><a href="#l1488">1488</a><td> order = /** @type {goog.testing.TestCase.Order} */ (<tr><td><a id="l1489"></a><a href="#l1489">1489</a><td> orderMatch[1].toLowerCase());<tr><td><a id="l1490"></a><a href="#l1490">1490</a><td> }<tr><td><a id="l1491"></a><a href="#l1491">1491</a><td> return order;<tr><td><a id="l1492"></a><a href="#l1492">1492</a><td>};<tr><td><a id="l1493"></a><a href="#l1493">1493</a><td><tr><td><a id="l1494"></a><a href="#l1494">1494</a><td><tr><td><a id="l1495"></a><a href="#l1495">1495</a><td>/**<tr><td><a id="l1496"></a><a href="#l1496">1496</a><td> * Parses URL query parameters for the 'runTests' parameter.<tr><td><a id="l1497"></a><a href="#l1497">1497</a><td> * @param {string} search The URL query string.<tr><td><a id="l1498"></a><a href="#l1498">1498</a><td> * @return {Object<string, boolean>} A set of test names or test indices to be<tr><td><a id="l1499"></a><a href="#l1499">1499</a><td> * run by the test runner.<tr><td><a id="l1500"></a><a href="#l1500">1500</a><td> * @private<tr><td><a id="l1501"></a><a href="#l1501">1501</a><td> */<tr><td><a id="l1502"></a><a href="#l1502">1502</a><td>goog.testing.TestCase.parseRunTests_ = function(search) {<tr><td><a id="l1503"></a><a href="#l1503">1503</a><td> var testsToRun = null;<tr><td><a id="l1504"></a><a href="#l1504">1504</a><td> var runTestsMatch = search.match(/(?:\?|&)runTests=([^?&]+)/i);<tr><td><a id="l1505"></a><a href="#l1505">1505</a><td> if (runTestsMatch) {<tr><td><a id="l1506"></a><a href="#l1506">1506</a><td> testsToRun = {};<tr><td><a id="l1507"></a><a href="#l1507">1507</a><td> var arr = runTestsMatch[1].split(',');<tr><td><a id="l1508"></a><a href="#l1508">1508</a><td> for (var i = 0, len = arr.length; i < len; i++) {<tr><td><a id="l1509"></a><a href="#l1509">1509</a><td> testsToRun[arr[i]] = true;<tr><td><a id="l1510"></a><a href="#l1510">1510</a><td> }<tr><td><a id="l1511"></a><a href="#l1511">1511</a><td> }<tr><td><a id="l1512"></a><a href="#l1512">1512</a><td> return testsToRun;<tr><td><a id="l1513"></a><a href="#l1513">1513</a><td>};<tr><td><a id="l1514"></a><a href="#l1514">1514</a><td><tr><td><a id="l1515"></a><a href="#l1515">1515</a><td><tr><td><a id="l1516"></a><a href="#l1516">1516</a><td><tr><td><a id="l1517"></a><a href="#l1517">1517</a><td>/**<tr><td><a id="l1518"></a><a href="#l1518">1518</a><td> * A class representing an error thrown by the test<tr><td><a id="l1519"></a><a href="#l1519">1519</a><td> * @param {string} source The name of the test which threw the error.<tr><td><a id="l1520"></a><a href="#l1520">1520</a><td> * @param {string} message The error message.<tr><td><a id="l1521"></a><a href="#l1521">1521</a><td> * @param {string=} opt_stack A string showing the execution stack.<tr><td><a id="l1522"></a><a href="#l1522">1522</a><td> * @constructor<tr><td><a id="l1523"></a><a href="#l1523">1523</a><td> * @final<tr><td><a id="l1524"></a><a href="#l1524">1524</a><td> */<tr><td><a id="l1525"></a><a href="#l1525">1525</a><td>goog.testing.TestCase.Error = function(source, message, opt_stack) {<tr><td><a id="l1526"></a><a href="#l1526">1526</a><td> /**<tr><td><a id="l1527"></a><a href="#l1527">1527</a><td> * The name of the test which threw the error.<tr><td><a id="l1528"></a><a href="#l1528">1528</a><td> * @type {string}<tr><td><a id="l1529"></a><a href="#l1529">1529</a><td> */<tr><td><a id="l1530"></a><a href="#l1530">1530</a><td> this.source = source;<tr><td><a id="l1531"></a><a href="#l1531">1531</a><td><tr><td><a id="l1532"></a><a href="#l1532">1532</a><td> /**<tr><td><a id="l1533"></a><a href="#l1533">1533</a><td> * Reference to the test function.<tr><td><a id="l1534"></a><a href="#l1534">1534</a><td> * @type {string}<tr><td><a id="l1535"></a><a href="#l1535">1535</a><td> */<tr><td><a id="l1536"></a><a href="#l1536">1536</a><td> this.message = message;<tr><td><a id="l1537"></a><a href="#l1537">1537</a><td><tr><td><a id="l1538"></a><a href="#l1538">1538</a><td> /**<tr><td><a id="l1539"></a><a href="#l1539">1539</a><td> * The stack.<tr><td><a id="l1540"></a><a href="#l1540">1540</a><td> * @type {?string}<tr><td><a id="l1541"></a><a href="#l1541">1541</a><td> */<tr><td><a id="l1542"></a><a href="#l1542">1542</a><td> this.stack = null;<tr><td><a id="l1543"></a><a href="#l1543">1543</a><td><tr><td><a id="l1544"></a><a href="#l1544">1544</a><td> if (opt_stack) {<tr><td><a id="l1545"></a><a href="#l1545">1545</a><td> this.stack = opt_stack;<tr><td><a id="l1546"></a><a href="#l1546">1546</a><td> } else {<tr><td><a id="l1547"></a><a href="#l1547">1547</a><td> // Attempt to capture a stack trace.<tr><td><a id="l1548"></a><a href="#l1548">1548</a><td> if (Error.captureStackTrace) {<tr><td><a id="l1549"></a><a href="#l1549">1549</a><td> // See https://code.google.com/p/v8-wiki/wiki/JavaScriptStackTraceApi<tr><td><a id="l1550"></a><a href="#l1550">1550</a><td> Error.captureStackTrace(this, goog.testing.TestCase.Error);<tr><td><a id="l1551"></a><a href="#l1551">1551</a><td> } else {<tr><td><a id="l1552"></a><a href="#l1552">1552</a><td> var stack = new Error().stack;<tr><td><a id="l1553"></a><a href="#l1553">1553</a><td> if (stack) {<tr><td><a id="l1554"></a><a href="#l1554">1554</a><td> this.stack = stack;<tr><td><a id="l1555"></a><a href="#l1555">1555</a><td> }<tr><td><a id="l1556"></a><a href="#l1556">1556</a><td> }<tr><td><a id="l1557"></a><a href="#l1557">1557</a><td> }<tr><td><a id="l1558"></a><a href="#l1558">1558</a><td>};<tr><td><a id="l1559"></a><a href="#l1559">1559</a><td><tr><td><a id="l1560"></a><a href="#l1560">1560</a><td><tr><td><a id="l1561"></a><a href="#l1561">1561</a><td>/**<tr><td><a id="l1562"></a><a href="#l1562">1562</a><td> * Returns a string representing the error object.<tr><td><a id="l1563"></a><a href="#l1563">1563</a><td> * @return {string} A string representation of the error.<tr><td><a id="l1564"></a><a href="#l1564">1564</a><td> * @override<tr><td><a id="l1565"></a><a href="#l1565">1565</a><td> */<tr><td><a id="l1566"></a><a href="#l1566">1566</a><td>goog.testing.TestCase.Error.prototype.toString = function() {<tr><td><a id="l1567"></a><a href="#l1567">1567</a><td> return 'ERROR in ' + this.source + '\n' +<tr><td><a id="l1568"></a><a href="#l1568">1568</a><td> this.message + (this.stack ? '\n' + this.stack : '');<tr><td><a id="l1569"></a><a href="#l1569">1569</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>
|