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.
Files changed (529) hide show
  1. package/CHANGES.md +96 -0
  2. package/NOTICE +1 -1
  3. package/README.md +57 -6
  4. package/builder.js +375 -358
  5. package/chrome.js +549 -586
  6. package/edge.js +378 -0
  7. package/error.js +597 -5
  8. package/example/google_search_generator.js +2 -4
  9. package/example/logging.js +6 -2
  10. package/executors.js +11 -27
  11. package/firefox/binary.js +80 -114
  12. package/firefox/extension.js +10 -19
  13. package/firefox/index.js +175 -171
  14. package/firefox/profile.js +221 -239
  15. package/http/index.js +396 -77
  16. package/http/util.js +35 -35
  17. package/ie.js +288 -309
  18. package/index.js +34 -125
  19. package/io/exec.js +58 -39
  20. package/io/index.js +54 -48
  21. package/lib/actions.js +594 -0
  22. package/lib/by.js +276 -0
  23. package/lib/capabilities.js +404 -0
  24. package/lib/{webdriver/command.js → command.js} +89 -72
  25. package/lib/{webdriver/button.js → devmode.js} +13 -8
  26. package/lib/events.js +210 -0
  27. package/lib/firefox/amd64/libnoblur64.so +0 -0
  28. package/lib/firefox/i386/libnoblur.so +0 -0
  29. package/lib/firefox/webdriver.json +6 -1
  30. package/lib/firefox/webdriver.xpi +0 -0
  31. package/lib/{webdriver/key.js → input.js} +82 -2
  32. package/lib/logging.js +668 -0
  33. package/lib/promise.js +3093 -0
  34. package/lib/safari/client.js +697 -659
  35. package/lib/session.js +79 -0
  36. package/{test/promise_aplus_test.js → lib/symbols.js} +15 -25
  37. package/lib/test/build.js +4 -4
  38. package/lib/test/data/click_tests/disappearing_element.html +62 -0
  39. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  40. package/lib/test/data/click_tests/overlapping_elements.html +70 -0
  41. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  42. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  43. package/lib/test/data/readOnlyPage.html +3 -1
  44. package/lib/test/data/selectPage.html +18 -2
  45. package/lib/test/data/simpleTest.html +1 -0
  46. package/lib/test/fileserver.js +3 -4
  47. package/lib/test/index.js +13 -4
  48. package/lib/test/resources.js +1 -1
  49. package/lib/until.js +428 -0
  50. package/lib/webdriver.js +2351 -0
  51. package/net/portprober.js +15 -11
  52. package/opera.js +295 -314
  53. package/package.json +6 -5
  54. package/phantomjs.js +135 -140
  55. package/proxy.js +6 -4
  56. package/remote/index.js +234 -219
  57. package/safari.js +319 -310
  58. package/test/chrome/options_test.js +11 -9
  59. package/test/element_finding_test.js +51 -13
  60. package/test/error_test.js +163 -0
  61. package/test/execute_script_test.js +1 -1
  62. package/test/firefox/firefox_test.js +24 -0
  63. package/test/http/http_test.js +354 -43
  64. package/test/http/util_test.js +25 -23
  65. package/test/io_test.js +6 -1
  66. package/test/lib/by_test.js +127 -0
  67. package/test/lib/capabilities_test.js +84 -0
  68. package/test/lib/events_test.js +177 -0
  69. package/test/lib/logging_test.js +272 -0
  70. package/test/lib/promise_aplus_test.js +74 -0
  71. package/test/lib/promise_error_test.js +808 -0
  72. package/test/lib/promise_flow_test.js +2282 -0
  73. package/test/lib/promise_generator_test.js +308 -0
  74. package/test/lib/promise_test.js +996 -0
  75. package/test/lib/testutil.js +90 -0
  76. package/test/lib/until_test.js +436 -0
  77. package/test/lib/webdriver_test.js +2207 -0
  78. package/test/page_loading_test.js +7 -9
  79. package/test/stale_element_test.js +2 -2
  80. package/test/testing/assert_test.js +374 -0
  81. package/test/testing/index_test.js +9 -11
  82. package/testing/assert.js +334 -17
  83. package/testing/index.js +10 -0
  84. package/_base.js +0 -200
  85. package/docs/Changes.html +0 -317
  86. package/docs/class_bot_Error.html +0 -15
  87. package/docs/class_webdriver_ActionSequence.html +0 -115
  88. package/docs/class_webdriver_Alert.html +0 -24
  89. package/docs/class_webdriver_AlertPromise.html +0 -91
  90. package/docs/class_webdriver_Capabilities.html +0 -60
  91. package/docs/class_webdriver_Command.html +0 -15
  92. package/docs/class_webdriver_EventEmitter.html +0 -35
  93. package/docs/class_webdriver_FileDetector.html +0 -21
  94. package/docs/class_webdriver_Locator.html +0 -12
  95. package/docs/class_webdriver_Serializable.html +0 -9
  96. package/docs/class_webdriver_Session.html +0 -13
  97. package/docs/class_webdriver_TouchSequence.html +0 -49
  98. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  99. package/docs/class_webdriver_WebDriver.html +0 -313
  100. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  101. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  102. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  103. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  104. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  105. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  106. package/docs/class_webdriver_WebElement.html +0 -216
  107. package/docs/class_webdriver_WebElementPromise.html +0 -266
  108. package/docs/class_webdriver_http_Executor.html +0 -22
  109. package/docs/class_webdriver_http_Request.html +0 -12
  110. package/docs/class_webdriver_http_Response.html +0 -13
  111. package/docs/class_webdriver_logging_Entry.html +0 -15
  112. package/docs/class_webdriver_logging_Level.html +0 -55
  113. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  114. package/docs/class_webdriver_logging_Logger.html +0 -119
  115. package/docs/class_webdriver_logging_Preferences.html +0 -8
  116. package/docs/class_webdriver_promise_CancellationError.html +0 -18
  117. package/docs/class_webdriver_promise_ControlFlow.html +0 -109
  118. package/docs/class_webdriver_promise_Deferred.html +0 -84
  119. package/docs/class_webdriver_promise_Promise.html +0 -74
  120. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  121. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  122. package/docs/class_webdriver_testing_Assertion.html +0 -99
  123. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  124. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  125. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  126. package/docs/class_webdriver_until_Condition.html +0 -7
  127. package/docs/dossier.css +0 -1
  128. package/docs/dossier.js +0 -86
  129. package/docs/enum_bot_ErrorCode.html +0 -3
  130. package/docs/enum_bot_Error_State.html +0 -2
  131. package/docs/enum_webdriver_Browser.html +0 -2
  132. package/docs/enum_webdriver_Button.html +0 -2
  133. package/docs/enum_webdriver_Capability.html +0 -33
  134. package/docs/enum_webdriver_CommandName.html +0 -3
  135. package/docs/enum_webdriver_Key.html +0 -12
  136. package/docs/enum_webdriver_logging_Type.html +0 -6
  137. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  138. package/docs/index.html +0 -123
  139. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  140. package/docs/interface_webdriver_http_Client.html +0 -10
  141. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  142. package/docs/module_selenium-webdriver.html +0 -23
  143. package/docs/module_selenium-webdriver__base.html +0 -23
  144. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  145. package/docs/module_selenium-webdriver_builder.html +0 -2
  146. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  147. package/docs/module_selenium-webdriver_chrome.html +0 -90
  148. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  149. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  150. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  151. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  152. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  153. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  154. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  155. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  156. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  157. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  158. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  159. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  160. package/docs/module_selenium-webdriver_class_WebElement.html +0 -216
  161. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -266
  162. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  163. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  164. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  165. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  166. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  167. package/docs/module_selenium-webdriver_error.html +0 -4
  168. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  169. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  170. package/docs/module_selenium-webdriver_executors.html +0 -10
  171. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  172. package/docs/module_selenium-webdriver_firefox.html +0 -67
  173. package/docs/module_selenium-webdriver_firefox_binary.html +0 -4
  174. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -21
  175. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -21
  176. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  177. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  178. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  179. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  180. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  181. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  182. package/docs/module_selenium-webdriver_http.html +0 -9
  183. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  184. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  185. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  186. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  187. package/docs/module_selenium-webdriver_http_util.html +0 -17
  188. package/docs/module_selenium-webdriver_ie.html +0 -11
  189. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  190. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  191. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  192. package/docs/module_selenium-webdriver_io.html +0 -37
  193. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  194. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  195. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  196. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  197. package/docs/module_selenium-webdriver_namespace_promise.html +0 -162
  198. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  199. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  200. package/docs/module_selenium-webdriver_net.html +0 -7
  201. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  202. package/docs/module_selenium-webdriver_opera.html +0 -62
  203. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  204. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  205. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  206. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  207. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  208. package/docs/module_selenium-webdriver_proxy.html +0 -28
  209. package/docs/module_selenium-webdriver_remote.html +0 -8
  210. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  211. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  212. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -40
  213. package/docs/module_selenium-webdriver_safari.html +0 -9
  214. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  215. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  216. package/docs/module_selenium-webdriver_testing.html +0 -74
  217. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  218. package/docs/namespace_bot.html +0 -4
  219. package/docs/namespace_bot_json.html +0 -20
  220. package/docs/namespace_bot_response.html +0 -18
  221. package/docs/namespace_bot_userAgent.html +0 -33
  222. package/docs/namespace_webdriver.html +0 -30
  223. package/docs/namespace_webdriver_By.html +0 -56
  224. package/docs/namespace_webdriver_http.html +0 -6
  225. package/docs/namespace_webdriver_logging.html +0 -70
  226. package/docs/namespace_webdriver_promise.html +0 -165
  227. package/docs/namespace_webdriver_stacktrace.html +0 -17
  228. package/docs/namespace_webdriver_testing.html +0 -7
  229. package/docs/namespace_webdriver_testing_assert.html +0 -9
  230. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  231. package/docs/namespace_webdriver_until.html +0 -82
  232. package/docs/source/_base.js.src.html +0 -1
  233. package/docs/source/builder.js.src.html +0 -1
  234. package/docs/source/chrome.js.src.html +0 -1
  235. package/docs/source/error.js.src.html +0 -1
  236. package/docs/source/executors.js.src.html +0 -1
  237. package/docs/source/firefox/binary.js.src.html +0 -1
  238. package/docs/source/firefox/extension.js.src.html +0 -1
  239. package/docs/source/firefox/index.js.src.html +0 -1
  240. package/docs/source/firefox/profile.js.src.html +0 -1
  241. package/docs/source/http/index.js.src.html +0 -1
  242. package/docs/source/http/util.js.src.html +0 -1
  243. package/docs/source/ie.js.src.html +0 -1
  244. package/docs/source/index.js.src.html +0 -1
  245. package/docs/source/io/exec.js.src.html +0 -1
  246. package/docs/source/io/index.js.src.html +0 -1
  247. package/docs/source/lib/atoms/error.js.src.html +0 -1
  248. package/docs/source/lib/atoms/json.js.src.html +0 -1
  249. package/docs/source/lib/atoms/response.js.src.html +0 -1
  250. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  251. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  252. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  253. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  254. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  255. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  256. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  257. package/docs/source/lib/goog/base.js.src.html +0 -1
  258. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  259. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  260. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  261. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  262. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  263. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  264. package/docs/source/lib/goog/deps.js.src.html +0 -1
  265. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  266. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  267. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  268. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  269. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  270. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  271. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  272. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  273. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  274. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  275. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  276. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  277. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  278. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  279. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  280. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  282. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  283. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  284. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  285. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  286. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  287. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  288. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  289. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  290. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  291. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  292. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  293. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  294. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  295. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  296. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  297. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  298. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  299. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  300. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  301. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  302. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  303. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  304. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  305. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  306. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  307. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  308. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  309. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  310. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  311. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  312. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  313. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  314. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  315. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  316. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  317. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  318. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  319. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  320. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  321. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  322. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  323. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  324. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  325. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  326. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  327. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  328. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  329. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  330. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  331. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  332. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  333. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  334. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  335. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  336. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  344. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  345. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  346. package/docs/source/lib/goog/testing/watchers.js.src.html +0 -1
  347. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  348. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  349. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  350. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  351. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  352. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  353. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  354. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  355. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  356. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  357. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  358. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  366. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  367. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  368. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  369. package/docs/source/net/index.js.src.html +0 -1
  370. package/docs/source/net/portprober.js.src.html +0 -1
  371. package/docs/source/opera.js.src.html +0 -1
  372. package/docs/source/phantomjs.js.src.html +0 -1
  373. package/docs/source/proxy.js.src.html +0 -1
  374. package/docs/source/remote/index.js.src.html +0 -1
  375. package/docs/source/safari.js.src.html +0 -1
  376. package/docs/source/testing/assert.js.src.html +0 -1
  377. package/docs/source/testing/index.js.src.html +0 -1
  378. package/docs/types.js +0 -1
  379. package/lib/atoms/error.js +0 -202
  380. package/lib/atoms/json.js +0 -80
  381. package/lib/atoms/response.js +0 -110
  382. package/lib/atoms/userAgent.js +0 -257
  383. package/lib/goog/LICENSE +0 -176
  384. package/lib/goog/array/array.js +0 -1655
  385. package/lib/goog/asserts/asserts.js +0 -365
  386. package/lib/goog/async/freelist.js +0 -88
  387. package/lib/goog/async/nexttick.js +0 -241
  388. package/lib/goog/async/run.js +0 -139
  389. package/lib/goog/async/workqueue.js +0 -139
  390. package/lib/goog/base.js +0 -2547
  391. package/lib/goog/debug/debug.js +0 -653
  392. package/lib/goog/debug/entrypointregistry.js +0 -158
  393. package/lib/goog/debug/error.js +0 -63
  394. package/lib/goog/debug/logbuffer.js +0 -148
  395. package/lib/goog/debug/logger.js +0 -873
  396. package/lib/goog/debug/logrecord.js +0 -242
  397. package/lib/goog/deps.js +0 -151
  398. package/lib/goog/disposable/disposable.js +0 -307
  399. package/lib/goog/disposable/idisposable.js +0 -45
  400. package/lib/goog/dom/browserfeature.js +0 -72
  401. package/lib/goog/dom/dom.js +0 -2995
  402. package/lib/goog/dom/nodetype.js +0 -48
  403. package/lib/goog/dom/safe.js +0 -347
  404. package/lib/goog/dom/tagname.js +0 -160
  405. package/lib/goog/dom/tags.js +0 -42
  406. package/lib/goog/dom/vendor.js +0 -96
  407. package/lib/goog/events/browserevent.js +0 -386
  408. package/lib/goog/events/browserfeature.js +0 -85
  409. package/lib/goog/events/event.js +0 -143
  410. package/lib/goog/events/eventid.js +0 -47
  411. package/lib/goog/events/events.js +0 -984
  412. package/lib/goog/events/eventtarget.js +0 -394
  413. package/lib/goog/events/eventtype.js +0 -233
  414. package/lib/goog/events/keycodes.js +0 -420
  415. package/lib/goog/events/listenable.js +0 -335
  416. package/lib/goog/events/listener.js +0 -131
  417. package/lib/goog/events/listenermap.js +0 -308
  418. package/lib/goog/fs/url.js +0 -105
  419. package/lib/goog/functions/functions.js +0 -332
  420. package/lib/goog/html/safehtml.js +0 -756
  421. package/lib/goog/html/safescript.js +0 -234
  422. package/lib/goog/html/safestyle.js +0 -442
  423. package/lib/goog/html/safestylesheet.js +0 -276
  424. package/lib/goog/html/safeurl.js +0 -431
  425. package/lib/goog/html/trustedresourceurl.js +0 -224
  426. package/lib/goog/html/uncheckedconversions.js +0 -231
  427. package/lib/goog/i18n/bidi.js +0 -908
  428. package/lib/goog/iter/iter.js +0 -1305
  429. package/lib/goog/json/json.js +0 -365
  430. package/lib/goog/labs/testing/assertthat.js +0 -58
  431. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  432. package/lib/goog/labs/testing/matcher.js +0 -80
  433. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  434. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  435. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  436. package/lib/goog/labs/useragent/browser.js +0 -327
  437. package/lib/goog/labs/useragent/engine.js +0 -160
  438. package/lib/goog/labs/useragent/platform.js +0 -160
  439. package/lib/goog/labs/useragent/util.js +0 -148
  440. package/lib/goog/math/box.js +0 -389
  441. package/lib/goog/math/coordinate.js +0 -268
  442. package/lib/goog/math/math.js +0 -451
  443. package/lib/goog/math/rect.js +0 -476
  444. package/lib/goog/math/size.js +0 -227
  445. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  446. package/lib/goog/net/xhrlike.js +0 -124
  447. package/lib/goog/net/xmlhttp.js +0 -246
  448. package/lib/goog/net/xmlhttpfactory.js +0 -67
  449. package/lib/goog/object/object.js +0 -686
  450. package/lib/goog/promise/promise.js +0 -1310
  451. package/lib/goog/promise/resolver.js +0 -48
  452. package/lib/goog/promise/thenable.js +0 -126
  453. package/lib/goog/reflect/reflect.js +0 -78
  454. package/lib/goog/string/const.js +0 -182
  455. package/lib/goog/string/string.js +0 -1565
  456. package/lib/goog/string/typedstring.js +0 -48
  457. package/lib/goog/structs/collection.js +0 -56
  458. package/lib/goog/structs/map.js +0 -456
  459. package/lib/goog/structs/set.js +0 -279
  460. package/lib/goog/structs/structs.js +0 -354
  461. package/lib/goog/style/style.js +0 -2054
  462. package/lib/goog/testing/asserts.js +0 -1265
  463. package/lib/goog/testing/events/events.js +0 -727
  464. package/lib/goog/testing/functionmock.js +0 -176
  465. package/lib/goog/testing/jsunit.js +0 -162
  466. package/lib/goog/testing/loosemock.js +0 -242
  467. package/lib/goog/testing/mock.js +0 -645
  468. package/lib/goog/testing/mockclock.js +0 -617
  469. package/lib/goog/testing/mockcontrol.js +0 -220
  470. package/lib/goog/testing/mockinterface.js +0 -45
  471. package/lib/goog/testing/mockmatchers.js +0 -400
  472. package/lib/goog/testing/objectpropertystring.js +0 -68
  473. package/lib/goog/testing/propertyreplacer.js +0 -245
  474. package/lib/goog/testing/recordfunction.js +0 -215
  475. package/lib/goog/testing/stacktrace.js +0 -594
  476. package/lib/goog/testing/strictmock.js +0 -130
  477. package/lib/goog/testing/testcase.js +0 -1569
  478. package/lib/goog/testing/testrunner.js +0 -440
  479. package/lib/goog/testing/watchers.js +0 -46
  480. package/lib/goog/uri/uri.js +0 -1507
  481. package/lib/goog/uri/utils.js +0 -1116
  482. package/lib/goog/useragent/product.js +0 -175
  483. package/lib/goog/useragent/product_isversion.js +0 -143
  484. package/lib/goog/useragent/useragent.js +0 -538
  485. package/lib/webdriver/actionsequence.js +0 -356
  486. package/lib/webdriver/builder.js +0 -208
  487. package/lib/webdriver/capabilities.js +0 -411
  488. package/lib/webdriver/events.js +0 -179
  489. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  490. package/lib/webdriver/http/corsclient.js +0 -133
  491. package/lib/webdriver/http/http.js +0 -523
  492. package/lib/webdriver/http/xhrclient.js +0 -67
  493. package/lib/webdriver/locators.js +0 -257
  494. package/lib/webdriver/logging.js +0 -347
  495. package/lib/webdriver/promise.js +0 -2609
  496. package/lib/webdriver/serializable.js +0 -41
  497. package/lib/webdriver/session.js +0 -74
  498. package/lib/webdriver/stacktrace.js +0 -619
  499. package/lib/webdriver/test/builder_test.js +0 -53
  500. package/lib/webdriver/test/capabilities_test.js +0 -72
  501. package/lib/webdriver/test/events_test.js +0 -203
  502. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  503. package/lib/webdriver/test/http/http_test.js +0 -428
  504. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  505. package/lib/webdriver/test/locators_test.js +0 -59
  506. package/lib/webdriver/test/logging_test.js +0 -85
  507. package/lib/webdriver/test/promise_error_test.js +0 -719
  508. package/lib/webdriver/test/promise_flow_test.js +0 -1957
  509. package/lib/webdriver/test/promise_generator_test.js +0 -251
  510. package/lib/webdriver/test/promise_test.js +0 -1981
  511. package/lib/webdriver/test/stacktrace_test.js +0 -480
  512. package/lib/webdriver/test/test_bootstrap.js +0 -67
  513. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  514. package/lib/webdriver/test/testing/client_test.js +0 -88
  515. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  516. package/lib/webdriver/test/testutil.js +0 -209
  517. package/lib/webdriver/test/testutil_test.js +0 -104
  518. package/lib/webdriver/test/until_test.js +0 -411
  519. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  520. package/lib/webdriver/test/webdriver_test.js +0 -2369
  521. package/lib/webdriver/testing/asserts.js +0 -487
  522. package/lib/webdriver/testing/client.js +0 -179
  523. package/lib/webdriver/testing/jsunit.js +0 -363
  524. package/lib/webdriver/testing/testcase.js +0 -168
  525. package/lib/webdriver/testing/window.js +0 -244
  526. package/lib/webdriver/touchsequence.js +0 -248
  527. package/lib/webdriver/until.js +0 -412
  528. package/lib/webdriver/webdriver.js +0 -2492
  529. 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 &quot;License&quot;);<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 &quot;AS-IS&quot; 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(&#39;goog.testing.TestCase&#39;);<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.provide(&#39;goog.testing.TestCase.Error&#39;);<tr><td><a id="l28"></a><a href="#l28">28</a><td>goog.provide(&#39;goog.testing.TestCase.Order&#39;);<tr><td><a id="l29"></a><a href="#l29">29</a><td>goog.provide(&#39;goog.testing.TestCase.Result&#39;);<tr><td><a id="l30"></a><a href="#l30">30</a><td>goog.provide(&#39;goog.testing.TestCase.Test&#39;);<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(&#39;goog.Promise&#39;);<tr><td><a id="l34"></a><a href="#l34">34</a><td>goog.require(&#39;goog.Thenable&#39;);<tr><td><a id="l35"></a><a href="#l35">35</a><td>goog.require(&#39;goog.asserts&#39;);<tr><td><a id="l36"></a><a href="#l36">36</a><td>goog.require(&#39;goog.dom.TagName&#39;);<tr><td><a id="l37"></a><a href="#l37">37</a><td>goog.require(&#39;goog.object&#39;);<tr><td><a id="l38"></a><a href="#l38">38</a><td>goog.require(&#39;goog.testing.asserts&#39;);<tr><td><a id="l39"></a><a href="#l39">39</a><td>goog.require(&#39;goog.testing.stacktrace&#39;);<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&#39;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&#39;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> * &#39;Untitled Test Case&#39;.<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 || &#39;Untitled Test Case&#39;;<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&lt;!goog.testing.TestCase.Test&gt;}<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> * &lt;ul&gt;<tr><td><a id="l88"></a><a href="#l88">88</a><td> * &lt;li&gt;[testName]<tr><td><a id="l89"></a><a href="#l89">89</a><td> * &lt;li&gt;[testName1, testName2]<tr><td><a id="l90"></a><a href="#l90">90</a><td> * &lt;li&gt;[2] - will run the 3rd test in the order specified<tr><td><a id="l91"></a><a href="#l91">91</a><td> * &lt;li&gt;[1,3,5]<tr><td><a id="l92"></a><a href="#l92">92</a><td> * &lt;li&gt;[testName1, testName2, 3, 5] - will work<tr><td><a id="l93"></a><a href="#l93">93</a><td> * &lt;ul&gt;<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: &#39;natural&#39;,<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: &#39;random&#39;,<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: &#39;sorted&#39;<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&#39;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&#39;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&#39;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&#39;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 == &#39;undefined&#39; &amp;&amp;<tr><td><a id="l228"></a><a href="#l228">228</a><td> !!goog.global.navigator &amp;&amp;<tr><td><a id="l229"></a><a href="#l229">229</a><td> goog.global.navigator.userAgent.indexOf(&#39;MSIE&#39;) != -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(&#39;Tests cannot be added after execute() has been called. &#39; +<tr><td><a id="l295"></a><a href="#l295">295</a><td> &#39;Test: &#39; + 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&lt;goog.testing.TestCase.Test&gt;} 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&lt;goog.testing.TestCase.Test&gt;} 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&lt;string, boolean&gt;} 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 &quot;testFoo&quot;, 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(&#39;Starting tests: &#39; + 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(&#39;shouldRunTests() returned false, skipping these tests.&#39;);<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(&#39;Done&#39;);<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 &amp;&amp;<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 &amp;&amp; goog.testing.TestCase.IS_IE &amp;&amp;<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&#39;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 = &#39;ERROR: Test did not restore setTimeout and clearTimeout&#39;;<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(&#39;Tests complete&#39;);<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(&#39;Tests Failed&#39;);<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&#39;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_() + &#39; &#39; + 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[&#39;top&#39;];<tr><td><a id="l523"></a><a href="#l523">523</a><td> return top &amp;&amp; typeof top[&#39;_allTests&#39;] != &#39;undefined&#39;;<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&#39;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() &amp;&amp; goog.global.console) {<tr><td><a id="l533"></a><a href="#l533">533</a><td> if (typeof val == &#39;string&#39;) {<tr><td><a id="l534"></a><a href="#l534">534</a><td> val = this.getTimeStamp_() + &#39; : &#39; + 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 &amp;&amp; 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_ &amp;&amp; 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_ + &#39; [RUNNING]&#39;);<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() ? &#39;PASSED&#39; : &#39;FAILED&#39;;<tr><td><a id="l572"></a><a href="#l572">572</a><td> rv.push(this.name_ + &#39; [&#39; + label + &#39;]&#39;);<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(&#39;.&#39;, this.result_.messages.join(&#39;\n&#39;));<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(&#39;\n&#39;));<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(&#39; &#39;);<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(&#39;\n&#39;);<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&lt;string, !Array&lt;string&gt;&gt;} 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.&lt;!goog.testing.TestCase.Result&gt;}<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(&#39;Starting tests: &#39; + this.name_);<tr><td><a id="l669"></a><a href="#l669">669</a><td> this.saveMessage(&#39;Start&#39;);<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&#39;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(&#39;Running test: &#39; + 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}&#39;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 &amp;&amp; retval[&#39;then&#39;])) {<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_ &gt; goog.testing.TestCase.MAX_STACK_DEPTH_ ||<tr><td><a id="l818"></a><a href="#l818">818</a><td> this.now() - this.batchTime_ &gt; goog.testing.TestCase.maxRunTime) {<tr><td><a id="l819"></a><a href="#l819">819</a><td> this.saveMessage(&#39;Breaking async&#39;);<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 &gt; 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 &lt; 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 &quot;this&quot; (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&lt;!Object&gt;} 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 &quot;this&quot; (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&lt;!Object&gt;} 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&#39;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[&#39;RuntimeObject&#39;] != &#39;undefined&#39; ?<tr><td><a id="l909"></a><a href="#l909">909</a><td> [goog.global[&#39;RuntimeObject&#39;]((opt_prefix || &#39;&#39;) + &#39;*&#39;), 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 &#39;test&#39;;<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 &#39;obj&#39; (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 &#39;obj&#39;.<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[&#39;setUp&#39;]) {<tr><td><a id="l992"></a><a href="#l992">992</a><td> this.setUp = goog.bind(obj[&#39;setUp&#39;], 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[&#39;tearDown&#39;]) {<tr><td><a id="l995"></a><a href="#l995">995</a><td> this.tearDown = goog.bind(obj[&#39;tearDown&#39;], 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[&#39;setUpPage&#39;]) {<tr><td><a id="l998"></a><a href="#l998">998</a><td> this.setUpPage = goog.bind(obj[&#39;setUpPage&#39;], 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[&#39;tearDownPage&#39;]) {<tr><td><a id="l1001"></a><a href="#l1001">1001</a><td> this.tearDownPage = goog.bind(obj[&#39;tearDownPage&#39;], 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[&#39;runTests&#39;]) {<tr><td><a id="l1004"></a><a href="#l1004">1004</a><td> this.runTests = goog.bind(obj[&#39;runTests&#39;], 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[&#39;shouldRunTests&#39;]) {<tr><td><a id="l1007"></a><a href="#l1007">1007</a><td> this.shouldRunTests = goog.bind(obj[&#39;shouldRunTests&#39;], 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> &#39;Test methods have already been configured.&#39;);<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(&#39;^&#39; + 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 &quot;test&quot;<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 &lt; 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(&#39;^&#39; + 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 &quot;Operation is not supported&quot; 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 &lt; 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() + &#39; tests auto-discovered&#39;);<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 = &#39;setUpPage for &#39; + 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(&#39;Start&#39;);<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 &lt; 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&#39;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 &quot;new goog.testing.TestCase.protectedDate_()&quot; 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 &quot;new goog.testing.TestCase.protectedDate_()&quot; 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 = &#39;00&#39; + 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()) + &#39;:&#39; + this.pad_(d.getMinutes()) + &#39;:&#39; +<tr><td><a id="l1196"></a><a href="#l1196">1196</a><td> this.pad_(d.getSeconds()) + &#39;.&#39; + 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&#39;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 &lt; 10 ? &#39;0&#39; + 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(&#39;google3&#39;) + 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 + &#39; : PASSED&#39;;<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 + &#39; : FAILED&#39;;<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[&#39;stackTrace&#39;];<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 = &#39;An unknown error occurred&#39;;<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[&#39;isJsUnitException&#39;] ||<tr><td><a id="l1286"></a><a href="#l1286">1286</a><td> !opt_e[&#39;loggedJsUnitException&#39;]) {<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 &amp;&amp; opt_e[&#39;isJsUnitException&#39;]) {<tr><td><a id="l1290"></a><a href="#l1290">1290</a><td> opt_e[&#39;loggedJsUnitException&#39;] = 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&lt;string, !Array&lt;string&gt;&gt;}<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&lt;goog.testing.TestCase.Error&gt;}<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&lt;string&gt;}<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 &amp;&amp; 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 + &#39; of &#39; + this.totalCount + &#39; tests run in &#39; +<tr><td><a id="l1430"></a><a href="#l1430">1430</a><td> this.runTime + &#39;ms.\n&#39;;<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 += &#39;Tests not run because shouldRunTests() returned false.&#39;;<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 = &#39;&#39;;<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 = &#39;, &#39; +<tr><td><a id="l1441"></a><a href="#l1441">1441</a><td> (this.totalCount - countOfRunTests) + &#39; suppressed by querystring&#39;;<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 + &#39; passed, &#39; +<tr><td><a id="l1444"></a><a href="#l1444">1444</a><td> failures + &#39; failed&#39; + suppressionMessage + &#39;.\n&#39; +<tr><td><a id="l1445"></a><a href="#l1445">1445</a><td> Math.round(this.runTime / this.runCount) + &#39; ms/test. &#39; +<tr><td><a id="l1446"></a><a href="#l1446">1446</a><td> this.numFilesLoaded + &#39; files loaded.&#39;;<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 &#39;G_testRunner&#39;.<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[&#39;G_testRunner&#39;];<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[&#39;initialize&#39;](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(&#39;G_testRunner is undefined. Please ensure goog.testing.jsunit&#39; +<tr><td><a id="l1472"></a><a href="#l1472">1472</a><td> &#39; is included.&#39;);<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 &#39;order&#39; 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> /(?:\?|&amp;)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 &#39;runTests&#39; 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&lt;string, boolean&gt;} 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(/(?:\?|&amp;)runTests=([^?&amp;]+)/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(&#39;,&#39;);<tr><td><a id="l1508"></a><a href="#l1508">1508</a><td> for (var i = 0, len = arr.length; i &lt; 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 &#39;ERROR in &#39; + this.source + &#39;\n&#39; +<tr><td><a id="l1568"></a><a href="#l1568">1568</a><td> this.message + (this.stack ? &#39;\n&#39; + this.stack : &#39;&#39;);<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>