selenium-webdriver 2.48.2 → 2.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/CHANGES.md +57 -0
  2. package/NOTICE +1 -1
  3. package/README.md +56 -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 +79 -87
  12. package/firefox/extension.js +10 -18
  13. package/firefox/index.js +173 -173
  14. package/firefox/profile.js +220 -240
  15. package/http/index.js +396 -79
  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} +88 -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 +5 -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/{webdriver/promise.js → promise.js} +688 -644
  34. package/lib/session.js +79 -0
  35. package/lib/{webdriver/serializable.js → symbols.js} +11 -16
  36. package/lib/test/build.js +4 -4
  37. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  38. package/lib/test/data/click_tests/overlapping_elements.html +15 -4
  39. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  40. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  41. package/lib/test/data/readOnlyPage.html +1 -1
  42. package/lib/test/data/selectPage.html +18 -2
  43. package/lib/test/fileserver.js +3 -4
  44. package/lib/test/index.js +7 -3
  45. package/lib/test/resources.js +1 -1
  46. package/lib/until.js +428 -0
  47. package/lib/webdriver.js +2351 -0
  48. package/net/portprober.js +15 -11
  49. package/opera.js +295 -314
  50. package/package.json +6 -5
  51. package/phantomjs.js +135 -140
  52. package/proxy.js +6 -4
  53. package/remote/index.js +229 -221
  54. package/safari.js +319 -310
  55. package/test/chrome/options_test.js +11 -9
  56. package/test/element_finding_test.js +51 -13
  57. package/test/error_test.js +163 -0
  58. package/test/execute_script_test.js +1 -1
  59. package/test/http/http_test.js +317 -55
  60. package/test/http/util_test.js +25 -23
  61. package/test/io_test.js +6 -1
  62. package/test/lib/by_test.js +127 -0
  63. package/test/lib/capabilities_test.js +84 -0
  64. package/test/lib/events_test.js +177 -0
  65. package/test/lib/logging_test.js +272 -0
  66. package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
  67. package/test/lib/promise_error_test.js +808 -0
  68. package/test/lib/promise_flow_test.js +2282 -0
  69. package/test/lib/promise_generator_test.js +308 -0
  70. package/test/lib/promise_test.js +996 -0
  71. package/test/lib/testutil.js +90 -0
  72. package/test/lib/until_test.js +436 -0
  73. package/test/lib/webdriver_test.js +2207 -0
  74. package/test/page_loading_test.js +7 -9
  75. package/test/stale_element_test.js +2 -2
  76. package/test/testing/assert_test.js +374 -0
  77. package/test/testing/index_test.js +9 -11
  78. package/testing/assert.js +334 -17
  79. package/testing/index.js +10 -0
  80. package/_base.js +0 -200
  81. package/docs/Changes.html +0 -356
  82. package/docs/class_bot_Error.html +0 -15
  83. package/docs/class_webdriver_ActionSequence.html +0 -115
  84. package/docs/class_webdriver_Alert.html +0 -24
  85. package/docs/class_webdriver_AlertPromise.html +0 -92
  86. package/docs/class_webdriver_Capabilities.html +0 -60
  87. package/docs/class_webdriver_Command.html +0 -15
  88. package/docs/class_webdriver_EventEmitter.html +0 -35
  89. package/docs/class_webdriver_FileDetector.html +0 -21
  90. package/docs/class_webdriver_Locator.html +0 -12
  91. package/docs/class_webdriver_Serializable.html +0 -9
  92. package/docs/class_webdriver_Session.html +0 -13
  93. package/docs/class_webdriver_TouchSequence.html +0 -49
  94. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  95. package/docs/class_webdriver_WebDriver.html +0 -313
  96. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  97. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  98. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  99. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  100. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  101. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  102. package/docs/class_webdriver_WebElement.html +0 -223
  103. package/docs/class_webdriver_WebElementPromise.html +0 -274
  104. package/docs/class_webdriver_http_Executor.html +0 -22
  105. package/docs/class_webdriver_http_Request.html +0 -12
  106. package/docs/class_webdriver_http_Response.html +0 -13
  107. package/docs/class_webdriver_logging_Entry.html +0 -15
  108. package/docs/class_webdriver_logging_Level.html +0 -55
  109. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  110. package/docs/class_webdriver_logging_Logger.html +0 -119
  111. package/docs/class_webdriver_logging_Preferences.html +0 -8
  112. package/docs/class_webdriver_promise_CancellationError.html +0 -17
  113. package/docs/class_webdriver_promise_ControlFlow.html +0 -153
  114. package/docs/class_webdriver_promise_Deferred.html +0 -84
  115. package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
  116. package/docs/class_webdriver_promise_Promise.html +0 -75
  117. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  118. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  119. package/docs/class_webdriver_testing_Assertion.html +0 -99
  120. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  121. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  122. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  123. package/docs/class_webdriver_until_Condition.html +0 -7
  124. package/docs/dossier.css +0 -1
  125. package/docs/dossier.js +0 -86
  126. package/docs/enum_bot_ErrorCode.html +0 -3
  127. package/docs/enum_bot_Error_State.html +0 -2
  128. package/docs/enum_webdriver_Browser.html +0 -2
  129. package/docs/enum_webdriver_Button.html +0 -2
  130. package/docs/enum_webdriver_Capability.html +0 -33
  131. package/docs/enum_webdriver_CommandName.html +0 -3
  132. package/docs/enum_webdriver_Key.html +0 -12
  133. package/docs/enum_webdriver_logging_Type.html +0 -6
  134. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  135. package/docs/index.html +0 -125
  136. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  137. package/docs/interface_webdriver_http_Client.html +0 -10
  138. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  139. package/docs/module_selenium-webdriver.html +0 -23
  140. package/docs/module_selenium-webdriver__base.html +0 -23
  141. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  142. package/docs/module_selenium-webdriver_builder.html +0 -2
  143. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  144. package/docs/module_selenium-webdriver_chrome.html +0 -90
  145. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  146. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  147. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  148. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  149. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  150. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  151. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  152. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  153. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  154. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  155. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  156. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  157. package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
  158. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
  159. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  160. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  161. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  162. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  163. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  164. package/docs/module_selenium-webdriver_error.html +0 -4
  165. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  166. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  167. package/docs/module_selenium-webdriver_executors.html +0 -10
  168. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  169. package/docs/module_selenium-webdriver_firefox.html +0 -68
  170. package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
  171. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
  172. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
  173. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  174. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  175. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  176. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  177. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  178. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  179. package/docs/module_selenium-webdriver_http.html +0 -9
  180. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  181. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  182. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  183. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  184. package/docs/module_selenium-webdriver_http_util.html +0 -17
  185. package/docs/module_selenium-webdriver_ie.html +0 -11
  186. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  187. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  188. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  189. package/docs/module_selenium-webdriver_io.html +0 -37
  190. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  191. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  192. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  193. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  194. package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
  195. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  196. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  197. package/docs/module_selenium-webdriver_net.html +0 -7
  198. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  199. package/docs/module_selenium-webdriver_opera.html +0 -62
  200. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  201. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  202. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  203. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  204. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  205. package/docs/module_selenium-webdriver_proxy.html +0 -28
  206. package/docs/module_selenium-webdriver_remote.html +0 -8
  207. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  208. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  209. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
  210. package/docs/module_selenium-webdriver_safari.html +0 -9
  211. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  212. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  213. package/docs/module_selenium-webdriver_testing.html +0 -74
  214. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  215. package/docs/namespace_bot.html +0 -4
  216. package/docs/namespace_bot_json.html +0 -20
  217. package/docs/namespace_bot_response.html +0 -18
  218. package/docs/namespace_bot_userAgent.html +0 -33
  219. package/docs/namespace_webdriver.html +0 -30
  220. package/docs/namespace_webdriver_By.html +0 -56
  221. package/docs/namespace_webdriver_http.html +0 -6
  222. package/docs/namespace_webdriver_logging.html +0 -70
  223. package/docs/namespace_webdriver_promise.html +0 -688
  224. package/docs/namespace_webdriver_stacktrace.html +0 -17
  225. package/docs/namespace_webdriver_testing.html +0 -7
  226. package/docs/namespace_webdriver_testing_assert.html +0 -9
  227. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  228. package/docs/namespace_webdriver_until.html +0 -82
  229. package/docs/source/_base.js.src.html +0 -1
  230. package/docs/source/builder.js.src.html +0 -1
  231. package/docs/source/chrome.js.src.html +0 -1
  232. package/docs/source/error.js.src.html +0 -1
  233. package/docs/source/executors.js.src.html +0 -1
  234. package/docs/source/firefox/binary.js.src.html +0 -1
  235. package/docs/source/firefox/extension.js.src.html +0 -1
  236. package/docs/source/firefox/index.js.src.html +0 -1
  237. package/docs/source/firefox/profile.js.src.html +0 -1
  238. package/docs/source/http/index.js.src.html +0 -1
  239. package/docs/source/http/util.js.src.html +0 -1
  240. package/docs/source/ie.js.src.html +0 -1
  241. package/docs/source/index.js.src.html +0 -1
  242. package/docs/source/io/exec.js.src.html +0 -1
  243. package/docs/source/io/index.js.src.html +0 -1
  244. package/docs/source/lib/atoms/error.js.src.html +0 -1
  245. package/docs/source/lib/atoms/json.js.src.html +0 -1
  246. package/docs/source/lib/atoms/response.js.src.html +0 -1
  247. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  248. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  249. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  250. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  251. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  252. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  253. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  254. package/docs/source/lib/goog/base.js.src.html +0 -1
  255. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  256. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  257. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  258. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  259. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  260. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  261. package/docs/source/lib/goog/deps.js.src.html +0 -1
  262. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  263. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  264. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  265. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  266. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  267. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  268. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  269. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  270. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  271. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  272. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  273. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  274. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  275. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  276. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  277. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  278. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  279. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  280. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  282. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  283. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  284. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  285. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  286. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  287. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  288. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  289. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  290. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  291. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  292. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  293. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  294. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  295. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  296. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  297. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  298. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  299. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  300. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  301. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  302. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  303. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  304. package/docs/source/lib/goog/log/log.js.src.html +0 -1
  305. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  306. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  307. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  308. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  309. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  310. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  311. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  312. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  313. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  314. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  315. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  316. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  317. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  318. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  319. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  320. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  321. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  322. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  323. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  324. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  325. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  326. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  327. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  328. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  329. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  330. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  331. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  332. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  333. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  334. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  335. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  336. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  344. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  345. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  346. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  347. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  348. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  349. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  350. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  351. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  352. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  353. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  354. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  355. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  356. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  357. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  358. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  366. package/docs/source/net/index.js.src.html +0 -1
  367. package/docs/source/net/portprober.js.src.html +0 -1
  368. package/docs/source/opera.js.src.html +0 -1
  369. package/docs/source/phantomjs.js.src.html +0 -1
  370. package/docs/source/proxy.js.src.html +0 -1
  371. package/docs/source/remote/index.js.src.html +0 -1
  372. package/docs/source/safari.js.src.html +0 -1
  373. package/docs/source/testing/assert.js.src.html +0 -1
  374. package/docs/source/testing/index.js.src.html +0 -1
  375. package/docs/types.js +0 -1
  376. package/lib/atoms/error.js +0 -202
  377. package/lib/atoms/json.js +0 -80
  378. package/lib/atoms/response.js +0 -110
  379. package/lib/atoms/userAgent.js +0 -257
  380. package/lib/goog/LICENSE +0 -176
  381. package/lib/goog/array/array.js +0 -1654
  382. package/lib/goog/asserts/asserts.js +0 -365
  383. package/lib/goog/async/freelist.js +0 -88
  384. package/lib/goog/async/nexttick.js +0 -241
  385. package/lib/goog/async/run.js +0 -133
  386. package/lib/goog/async/workqueue.js +0 -139
  387. package/lib/goog/base.js +0 -2548
  388. package/lib/goog/debug/debug.js +0 -653
  389. package/lib/goog/debug/entrypointregistry.js +0 -158
  390. package/lib/goog/debug/error.js +0 -63
  391. package/lib/goog/debug/logbuffer.js +0 -148
  392. package/lib/goog/debug/logger.js +0 -873
  393. package/lib/goog/debug/logrecord.js +0 -242
  394. package/lib/goog/deps.js +0 -151
  395. package/lib/goog/disposable/disposable.js +0 -307
  396. package/lib/goog/disposable/idisposable.js +0 -45
  397. package/lib/goog/dom/browserfeature.js +0 -72
  398. package/lib/goog/dom/dom.js +0 -2991
  399. package/lib/goog/dom/nodetype.js +0 -48
  400. package/lib/goog/dom/safe.js +0 -347
  401. package/lib/goog/dom/tagname.js +0 -160
  402. package/lib/goog/dom/tags.js +0 -41
  403. package/lib/goog/dom/vendor.js +0 -96
  404. package/lib/goog/events/browserevent.js +0 -400
  405. package/lib/goog/events/browserfeature.js +0 -85
  406. package/lib/goog/events/event.js +0 -143
  407. package/lib/goog/events/eventid.js +0 -47
  408. package/lib/goog/events/events.js +0 -984
  409. package/lib/goog/events/eventtarget.js +0 -394
  410. package/lib/goog/events/eventtype.js +0 -237
  411. package/lib/goog/events/keycodes.js +0 -427
  412. package/lib/goog/events/listenable.js +0 -335
  413. package/lib/goog/events/listener.js +0 -131
  414. package/lib/goog/events/listenermap.js +0 -308
  415. package/lib/goog/fs/url.js +0 -109
  416. package/lib/goog/functions/functions.js +0 -442
  417. package/lib/goog/html/safehtml.js +0 -757
  418. package/lib/goog/html/safescript.js +0 -234
  419. package/lib/goog/html/safestyle.js +0 -442
  420. package/lib/goog/html/safestylesheet.js +0 -276
  421. package/lib/goog/html/safeurl.js +0 -398
  422. package/lib/goog/html/trustedresourceurl.js +0 -224
  423. package/lib/goog/html/uncheckedconversions.js +0 -232
  424. package/lib/goog/i18n/bidi.js +0 -908
  425. package/lib/goog/iter/iter.js +0 -1302
  426. package/lib/goog/json/json.js +0 -363
  427. package/lib/goog/labs/testing/assertthat.js +0 -58
  428. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  429. package/lib/goog/labs/testing/matcher.js +0 -80
  430. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  431. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  432. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  433. package/lib/goog/labs/useragent/browser.js +0 -341
  434. package/lib/goog/labs/useragent/engine.js +0 -160
  435. package/lib/goog/labs/useragent/platform.js +0 -160
  436. package/lib/goog/labs/useragent/util.js +0 -148
  437. package/lib/goog/log/log.js +0 -197
  438. package/lib/goog/math/box.js +0 -398
  439. package/lib/goog/math/coordinate.js +0 -268
  440. package/lib/goog/math/math.js +0 -451
  441. package/lib/goog/math/rect.js +0 -476
  442. package/lib/goog/math/size.js +0 -227
  443. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  444. package/lib/goog/net/xhrlike.js +0 -124
  445. package/lib/goog/net/xmlhttp.js +0 -246
  446. package/lib/goog/net/xmlhttpfactory.js +0 -67
  447. package/lib/goog/object/object.js +0 -686
  448. package/lib/goog/promise/promise.js +0 -1350
  449. package/lib/goog/promise/resolver.js +0 -48
  450. package/lib/goog/promise/thenable.js +0 -126
  451. package/lib/goog/reflect/reflect.js +0 -77
  452. package/lib/goog/string/const.js +0 -182
  453. package/lib/goog/string/string.js +0 -1599
  454. package/lib/goog/string/typedstring.js +0 -48
  455. package/lib/goog/structs/collection.js +0 -56
  456. package/lib/goog/structs/map.js +0 -457
  457. package/lib/goog/structs/set.js +0 -279
  458. package/lib/goog/structs/structs.js +0 -354
  459. package/lib/goog/style/style.js +0 -2037
  460. package/lib/goog/testing/asserts.js +0 -1278
  461. package/lib/goog/testing/events/events.js +0 -767
  462. package/lib/goog/testing/functionmock.js +0 -175
  463. package/lib/goog/testing/jsunit.js +0 -162
  464. package/lib/goog/testing/loosemock.js +0 -242
  465. package/lib/goog/testing/mock.js +0 -645
  466. package/lib/goog/testing/mockclock.js +0 -606
  467. package/lib/goog/testing/mockcontrol.js +0 -220
  468. package/lib/goog/testing/mockinterface.js +0 -45
  469. package/lib/goog/testing/mockmatchers.js +0 -400
  470. package/lib/goog/testing/objectpropertystring.js +0 -68
  471. package/lib/goog/testing/propertyreplacer.js +0 -262
  472. package/lib/goog/testing/recordfunction.js +0 -215
  473. package/lib/goog/testing/stacktrace.js +0 -594
  474. package/lib/goog/testing/strictmock.js +0 -130
  475. package/lib/goog/testing/testcase.js +0 -1629
  476. package/lib/goog/testing/testrunner.js +0 -440
  477. package/lib/goog/uri/uri.js +0 -1524
  478. package/lib/goog/uri/utils.js +0 -1064
  479. package/lib/goog/useragent/product.js +0 -183
  480. package/lib/goog/useragent/product_isversion.js +0 -144
  481. package/lib/goog/useragent/useragent.js +0 -572
  482. package/lib/webdriver/actionsequence.js +0 -356
  483. package/lib/webdriver/builder.js +0 -207
  484. package/lib/webdriver/capabilities.js +0 -412
  485. package/lib/webdriver/events.js +0 -179
  486. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  487. package/lib/webdriver/http/corsclient.js +0 -133
  488. package/lib/webdriver/http/http.js +0 -525
  489. package/lib/webdriver/http/xhrclient.js +0 -67
  490. package/lib/webdriver/locators.js +0 -257
  491. package/lib/webdriver/logging.js +0 -347
  492. package/lib/webdriver/session.js +0 -74
  493. package/lib/webdriver/stacktrace.js +0 -619
  494. package/lib/webdriver/test/builder_test.js +0 -53
  495. package/lib/webdriver/test/capabilities_test.js +0 -72
  496. package/lib/webdriver/test/events_test.js +0 -203
  497. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  498. package/lib/webdriver/test/http/http_test.js +0 -428
  499. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  500. package/lib/webdriver/test/locators_test.js +0 -59
  501. package/lib/webdriver/test/logging_test.js +0 -85
  502. package/lib/webdriver/test/promise_error_test.js +0 -892
  503. package/lib/webdriver/test/promise_flow_test.js +0 -2365
  504. package/lib/webdriver/test/promise_generator_test.js +0 -323
  505. package/lib/webdriver/test/promise_test.js +0 -2012
  506. package/lib/webdriver/test/stacktrace_test.js +0 -480
  507. package/lib/webdriver/test/test_bootstrap.js +0 -67
  508. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  509. package/lib/webdriver/test/testing/client_test.js +0 -88
  510. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  511. package/lib/webdriver/test/testutil.js +0 -209
  512. package/lib/webdriver/test/testutil_test.js +0 -104
  513. package/lib/webdriver/test/until_test.js +0 -411
  514. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  515. package/lib/webdriver/test/webdriver_test.js +0 -2369
  516. package/lib/webdriver/testing/asserts.js +0 -487
  517. package/lib/webdriver/testing/client.js +0 -179
  518. package/lib/webdriver/testing/jsunit.js +0 -363
  519. package/lib/webdriver/testing/testcase.js +0 -168
  520. package/lib/webdriver/testing/window.js +0 -244
  521. package/lib/webdriver/touchsequence.js +0 -248
  522. package/lib/webdriver/until.js +0 -412
  523. package/lib/webdriver/webdriver.js +0 -2511
  524. 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>asserts.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/asserts.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2010 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &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>goog.provide(&#39;goog.testing.JsUnitException&#39;);<tr><td><a id="l15"></a><a href="#l15">15</a><td>goog.provide(&#39;goog.testing.asserts&#39;);<tr><td><a id="l16"></a><a href="#l16">16</a><td>goog.provide(&#39;goog.testing.asserts.ArrayLike&#39;);<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>goog.require(&#39;goog.testing.stacktrace&#39;);<tr><td><a id="l19"></a><a href="#l19">19</a><td><tr><td><a id="l20"></a><a href="#l20">20</a><td>// TODO(user): Copied from JsUnit with some small modifications, we should<tr><td><a id="l21"></a><a href="#l21">21</a><td>// reimplement the asserters.<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td><tr><td><a id="l24"></a><a href="#l24">24</a><td>/**<tr><td><a id="l25"></a><a href="#l25">25</a><td> * @typedef {Array|NodeList|Arguments|{length: number}}<tr><td><a id="l26"></a><a href="#l26">26</a><td> */<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.testing.asserts.ArrayLike;<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td>var DOUBLE_EQUALITY_PREDICATE = function(var1, var2) {<tr><td><a id="l30"></a><a href="#l30">30</a><td> return var1 == var2;<tr><td><a id="l31"></a><a href="#l31">31</a><td>};<tr><td><a id="l32"></a><a href="#l32">32</a><td>var JSUNIT_UNDEFINED_VALUE = void 0;<tr><td><a id="l33"></a><a href="#l33">33</a><td>var TO_STRING_EQUALITY_PREDICATE = function(var1, var2) {<tr><td><a id="l34"></a><a href="#l34">34</a><td> return var1.toString() === var2.toString();<tr><td><a id="l35"></a><a href="#l35">35</a><td>};<tr><td><a id="l36"></a><a href="#l36">36</a><td><tr><td><a id="l37"></a><a href="#l37">37</a><td>/** @typedef {function(?, ?):boolean} */<tr><td><a id="l38"></a><a href="#l38">38</a><td>var PredicateFunctionType;<tr><td><a id="l39"></a><a href="#l39">39</a><td><tr><td><a id="l40"></a><a href="#l40">40</a><td>/**<tr><td><a id="l41"></a><a href="#l41">41</a><td> * @const {{<tr><td><a id="l42"></a><a href="#l42">42</a><td> * String : PredicateFunctionType,<tr><td><a id="l43"></a><a href="#l43">43</a><td> * Number : PredicateFunctionType,<tr><td><a id="l44"></a><a href="#l44">44</a><td> * Boolean : PredicateFunctionType,<tr><td><a id="l45"></a><a href="#l45">45</a><td> * Date : PredicateFunctionType,<tr><td><a id="l46"></a><a href="#l46">46</a><td> * RegExp : PredicateFunctionType,<tr><td><a id="l47"></a><a href="#l47">47</a><td> * Function : PredicateFunctionType<tr><td><a id="l48"></a><a href="#l48">48</a><td> * }}<tr><td><a id="l49"></a><a href="#l49">49</a><td> */<tr><td><a id="l50"></a><a href="#l50">50</a><td>var PRIMITIVE_EQUALITY_PREDICATES = {<tr><td><a id="l51"></a><a href="#l51">51</a><td> &#39;String&#39;: DOUBLE_EQUALITY_PREDICATE,<tr><td><a id="l52"></a><a href="#l52">52</a><td> &#39;Number&#39;: DOUBLE_EQUALITY_PREDICATE,<tr><td><a id="l53"></a><a href="#l53">53</a><td> &#39;Boolean&#39;: DOUBLE_EQUALITY_PREDICATE,<tr><td><a id="l54"></a><a href="#l54">54</a><td> &#39;Date&#39;: function(date1, date2) {<tr><td><a id="l55"></a><a href="#l55">55</a><td> return date1.getTime() == date2.getTime();<tr><td><a id="l56"></a><a href="#l56">56</a><td> },<tr><td><a id="l57"></a><a href="#l57">57</a><td> &#39;RegExp&#39;: TO_STRING_EQUALITY_PREDICATE,<tr><td><a id="l58"></a><a href="#l58">58</a><td> &#39;Function&#39;: TO_STRING_EQUALITY_PREDICATE<tr><td><a id="l59"></a><a href="#l59">59</a><td>};<tr><td><a id="l60"></a><a href="#l60">60</a><td><tr><td><a id="l61"></a><a href="#l61">61</a><td><tr><td><a id="l62"></a><a href="#l62">62</a><td>/**<tr><td><a id="l63"></a><a href="#l63">63</a><td> * Compares equality of two numbers, allowing them to differ up to a given<tr><td><a id="l64"></a><a href="#l64">64</a><td> * tolerance.<tr><td><a id="l65"></a><a href="#l65">65</a><td> * @param {number} var1 A number.<tr><td><a id="l66"></a><a href="#l66">66</a><td> * @param {number} var2 A number.<tr><td><a id="l67"></a><a href="#l67">67</a><td> * @param {number} tolerance the maximum allowed difference.<tr><td><a id="l68"></a><a href="#l68">68</a><td> * @return {boolean} Whether the two variables are sufficiently close.<tr><td><a id="l69"></a><a href="#l69">69</a><td> * @private<tr><td><a id="l70"></a><a href="#l70">70</a><td> */<tr><td><a id="l71"></a><a href="#l71">71</a><td>goog.testing.asserts.numberRoughEqualityPredicate_ = function(<tr><td><a id="l72"></a><a href="#l72">72</a><td> var1, var2, tolerance) {<tr><td><a id="l73"></a><a href="#l73">73</a><td> return Math.abs(var1 - var2) &lt;= tolerance;<tr><td><a id="l74"></a><a href="#l74">74</a><td>};<tr><td><a id="l75"></a><a href="#l75">75</a><td><tr><td><a id="l76"></a><a href="#l76">76</a><td><tr><td><a id="l77"></a><a href="#l77">77</a><td>/**<tr><td><a id="l78"></a><a href="#l78">78</a><td> * @type {Object&lt;string, function(*, *, number): boolean&gt;}<tr><td><a id="l79"></a><a href="#l79">79</a><td> * @private<tr><td><a id="l80"></a><a href="#l80">80</a><td> */<tr><td><a id="l81"></a><a href="#l81">81</a><td>goog.testing.asserts.primitiveRoughEqualityPredicates_ = {<tr><td><a id="l82"></a><a href="#l82">82</a><td> &#39;Number&#39;: goog.testing.asserts.numberRoughEqualityPredicate_<tr><td><a id="l83"></a><a href="#l83">83</a><td>};<tr><td><a id="l84"></a><a href="#l84">84</a><td><tr><td><a id="l85"></a><a href="#l85">85</a><td><tr><td><a id="l86"></a><a href="#l86">86</a><td>var _trueTypeOf = function(something) {<tr><td><a id="l87"></a><a href="#l87">87</a><td> var result = typeof something;<tr><td><a id="l88"></a><a href="#l88">88</a><td> try {<tr><td><a id="l89"></a><a href="#l89">89</a><td> switch (result) {<tr><td><a id="l90"></a><a href="#l90">90</a><td> case &#39;string&#39;:<tr><td><a id="l91"></a><a href="#l91">91</a><td> break;<tr><td><a id="l92"></a><a href="#l92">92</a><td> case &#39;boolean&#39;:<tr><td><a id="l93"></a><a href="#l93">93</a><td> break;<tr><td><a id="l94"></a><a href="#l94">94</a><td> case &#39;number&#39;:<tr><td><a id="l95"></a><a href="#l95">95</a><td> break;<tr><td><a id="l96"></a><a href="#l96">96</a><td> case &#39;object&#39;:<tr><td><a id="l97"></a><a href="#l97">97</a><td> if (something == null) {<tr><td><a id="l98"></a><a href="#l98">98</a><td> result = &#39;null&#39;;<tr><td><a id="l99"></a><a href="#l99">99</a><td> break;<tr><td><a id="l100"></a><a href="#l100">100</a><td> }<tr><td><a id="l101"></a><a href="#l101">101</a><td> case &#39;function&#39;:<tr><td><a id="l102"></a><a href="#l102">102</a><td> switch (something.constructor) {<tr><td><a id="l103"></a><a href="#l103">103</a><td> case new String(&#39;&#39;).constructor:<tr><td><a id="l104"></a><a href="#l104">104</a><td> result = &#39;String&#39;;<tr><td><a id="l105"></a><a href="#l105">105</a><td> break;<tr><td><a id="l106"></a><a href="#l106">106</a><td> case new Boolean(true).constructor:<tr><td><a id="l107"></a><a href="#l107">107</a><td> result = &#39;Boolean&#39;;<tr><td><a id="l108"></a><a href="#l108">108</a><td> break;<tr><td><a id="l109"></a><a href="#l109">109</a><td> case new Number(0).constructor:<tr><td><a id="l110"></a><a href="#l110">110</a><td> result = &#39;Number&#39;;<tr><td><a id="l111"></a><a href="#l111">111</a><td> break;<tr><td><a id="l112"></a><a href="#l112">112</a><td> case new Array().constructor:<tr><td><a id="l113"></a><a href="#l113">113</a><td> result = &#39;Array&#39;;<tr><td><a id="l114"></a><a href="#l114">114</a><td> break;<tr><td><a id="l115"></a><a href="#l115">115</a><td> case new RegExp().constructor:<tr><td><a id="l116"></a><a href="#l116">116</a><td> result = &#39;RegExp&#39;;<tr><td><a id="l117"></a><a href="#l117">117</a><td> break;<tr><td><a id="l118"></a><a href="#l118">118</a><td> case new Date().constructor:<tr><td><a id="l119"></a><a href="#l119">119</a><td> result = &#39;Date&#39;;<tr><td><a id="l120"></a><a href="#l120">120</a><td> break;<tr><td><a id="l121"></a><a href="#l121">121</a><td> case Function:<tr><td><a id="l122"></a><a href="#l122">122</a><td> result = &#39;Function&#39;;<tr><td><a id="l123"></a><a href="#l123">123</a><td> break;<tr><td><a id="l124"></a><a href="#l124">124</a><td> default:<tr><td><a id="l125"></a><a href="#l125">125</a><td> var m = something.constructor.toString().match(<tr><td><a id="l126"></a><a href="#l126">126</a><td> /function\s*([^( ]+)\(/);<tr><td><a id="l127"></a><a href="#l127">127</a><td> if (m) {<tr><td><a id="l128"></a><a href="#l128">128</a><td> result = m[1];<tr><td><a id="l129"></a><a href="#l129">129</a><td> } else {<tr><td><a id="l130"></a><a href="#l130">130</a><td> break;<tr><td><a id="l131"></a><a href="#l131">131</a><td> }<tr><td><a id="l132"></a><a href="#l132">132</a><td> }<tr><td><a id="l133"></a><a href="#l133">133</a><td> break;<tr><td><a id="l134"></a><a href="#l134">134</a><td> }<tr><td><a id="l135"></a><a href="#l135">135</a><td> } catch (e) {<tr><td><a id="l136"></a><a href="#l136">136</a><td><tr><td><a id="l137"></a><a href="#l137">137</a><td> } finally {<tr><td><a id="l138"></a><a href="#l138">138</a><td> result = result.substr(0, 1).toUpperCase() + result.substr(1);<tr><td><a id="l139"></a><a href="#l139">139</a><td> }<tr><td><a id="l140"></a><a href="#l140">140</a><td> return result;<tr><td><a id="l141"></a><a href="#l141">141</a><td>};<tr><td><a id="l142"></a><a href="#l142">142</a><td><tr><td><a id="l143"></a><a href="#l143">143</a><td>var _displayStringForValue = function(aVar) {<tr><td><a id="l144"></a><a href="#l144">144</a><td> var result;<tr><td><a id="l145"></a><a href="#l145">145</a><td> try {<tr><td><a id="l146"></a><a href="#l146">146</a><td> result = &#39;&lt;&#39; + String(aVar) + &#39;&gt;&#39;;<tr><td><a id="l147"></a><a href="#l147">147</a><td> } catch (ex) {<tr><td><a id="l148"></a><a href="#l148">148</a><td> result = &#39;&lt;toString failed: &#39; + ex.message + &#39;&gt;&#39;;<tr><td><a id="l149"></a><a href="#l149">149</a><td> // toString does not work on this object :-(<tr><td><a id="l150"></a><a href="#l150">150</a><td> }<tr><td><a id="l151"></a><a href="#l151">151</a><td> if (!(aVar === null || aVar === JSUNIT_UNDEFINED_VALUE)) {<tr><td><a id="l152"></a><a href="#l152">152</a><td> result += &#39; (&#39; + _trueTypeOf(aVar) + &#39;)&#39;;<tr><td><a id="l153"></a><a href="#l153">153</a><td> }<tr><td><a id="l154"></a><a href="#l154">154</a><td> return result;<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>var fail = function(failureMessage) {<tr><td><a id="l158"></a><a href="#l158">158</a><td> goog.testing.asserts.raiseException(&#39;Call to fail()&#39;, failureMessage);<tr><td><a id="l159"></a><a href="#l159">159</a><td>};<tr><td><a id="l160"></a><a href="#l160">160</a><td><tr><td><a id="l161"></a><a href="#l161">161</a><td>var argumentsIncludeComments = function(expectedNumberOfNonCommentArgs, args) {<tr><td><a id="l162"></a><a href="#l162">162</a><td> return args.length == expectedNumberOfNonCommentArgs + 1;<tr><td><a id="l163"></a><a href="#l163">163</a><td>};<tr><td><a id="l164"></a><a href="#l164">164</a><td><tr><td><a id="l165"></a><a href="#l165">165</a><td>var commentArg = function(expectedNumberOfNonCommentArgs, args) {<tr><td><a id="l166"></a><a href="#l166">166</a><td> if (argumentsIncludeComments(expectedNumberOfNonCommentArgs, args)) {<tr><td><a id="l167"></a><a href="#l167">167</a><td> return args[0];<tr><td><a id="l168"></a><a href="#l168">168</a><td> }<tr><td><a id="l169"></a><a href="#l169">169</a><td><tr><td><a id="l170"></a><a href="#l170">170</a><td> return null;<tr><td><a id="l171"></a><a href="#l171">171</a><td>};<tr><td><a id="l172"></a><a href="#l172">172</a><td><tr><td><a id="l173"></a><a href="#l173">173</a><td>var nonCommentArg = function(desiredNonCommentArgIndex,<tr><td><a id="l174"></a><a href="#l174">174</a><td> expectedNumberOfNonCommentArgs, args) {<tr><td><a id="l175"></a><a href="#l175">175</a><td> return argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) ?<tr><td><a id="l176"></a><a href="#l176">176</a><td> args[desiredNonCommentArgIndex] :<tr><td><a id="l177"></a><a href="#l177">177</a><td> args[desiredNonCommentArgIndex - 1];<tr><td><a id="l178"></a><a href="#l178">178</a><td>};<tr><td><a id="l179"></a><a href="#l179">179</a><td><tr><td><a id="l180"></a><a href="#l180">180</a><td>var _validateArguments = function(expectedNumberOfNonCommentArgs, args) {<tr><td><a id="l181"></a><a href="#l181">181</a><td> var valid = args.length == expectedNumberOfNonCommentArgs ||<tr><td><a id="l182"></a><a href="#l182">182</a><td> args.length == expectedNumberOfNonCommentArgs + 1 &amp;&amp;<tr><td><a id="l183"></a><a href="#l183">183</a><td> goog.isString(args[0]);<tr><td><a id="l184"></a><a href="#l184">184</a><td> _assert(null, valid, &#39;Incorrect arguments passed to assert function&#39;);<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>var _assert = function(comment, booleanValue, failureMessage) {<tr><td><a id="l188"></a><a href="#l188">188</a><td> if (!booleanValue) {<tr><td><a id="l189"></a><a href="#l189">189</a><td> goog.testing.asserts.raiseException(comment, failureMessage);<tr><td><a id="l190"></a><a href="#l190">190</a><td> }<tr><td><a id="l191"></a><a href="#l191">191</a><td>};<tr><td><a id="l192"></a><a href="#l192">192</a><td><tr><td><a id="l193"></a><a href="#l193">193</a><td><tr><td><a id="l194"></a><a href="#l194">194</a><td>/**<tr><td><a id="l195"></a><a href="#l195">195</a><td> * @param {*} expected The expected value.<tr><td><a id="l196"></a><a href="#l196">196</a><td> * @param {*} actual The actual value.<tr><td><a id="l197"></a><a href="#l197">197</a><td> * @return {string} A failure message of the values don&#39;t match.<tr><td><a id="l198"></a><a href="#l198">198</a><td> * @private<tr><td><a id="l199"></a><a href="#l199">199</a><td> */<tr><td><a id="l200"></a><a href="#l200">200</a><td>goog.testing.asserts.getDefaultErrorMsg_ = function(expected, actual) {<tr><td><a id="l201"></a><a href="#l201">201</a><td> var msg = &#39;Expected &#39; + _displayStringForValue(expected) + &#39; but was &#39; +<tr><td><a id="l202"></a><a href="#l202">202</a><td> _displayStringForValue(actual);<tr><td><a id="l203"></a><a href="#l203">203</a><td> if ((typeof expected == &#39;string&#39;) &amp;&amp; (typeof actual == &#39;string&#39;)) {<tr><td><a id="l204"></a><a href="#l204">204</a><td> // Try to find a human-readable difference.<tr><td><a id="l205"></a><a href="#l205">205</a><td> var limit = Math.min(expected.length, actual.length);<tr><td><a id="l206"></a><a href="#l206">206</a><td> var commonPrefix = 0;<tr><td><a id="l207"></a><a href="#l207">207</a><td> while (commonPrefix &lt; limit &amp;&amp;<tr><td><a id="l208"></a><a href="#l208">208</a><td> expected.charAt(commonPrefix) == actual.charAt(commonPrefix)) {<tr><td><a id="l209"></a><a href="#l209">209</a><td> commonPrefix++;<tr><td><a id="l210"></a><a href="#l210">210</a><td> }<tr><td><a id="l211"></a><a href="#l211">211</a><td><tr><td><a id="l212"></a><a href="#l212">212</a><td> var commonSuffix = 0;<tr><td><a id="l213"></a><a href="#l213">213</a><td> while (commonSuffix &lt; limit &amp;&amp;<tr><td><a id="l214"></a><a href="#l214">214</a><td> expected.charAt(expected.length - commonSuffix - 1) ==<tr><td><a id="l215"></a><a href="#l215">215</a><td> actual.charAt(actual.length - commonSuffix - 1)) {<tr><td><a id="l216"></a><a href="#l216">216</a><td> commonSuffix++;<tr><td><a id="l217"></a><a href="#l217">217</a><td> }<tr><td><a id="l218"></a><a href="#l218">218</a><td><tr><td><a id="l219"></a><a href="#l219">219</a><td> if (commonPrefix + commonSuffix &gt; limit) {<tr><td><a id="l220"></a><a href="#l220">220</a><td> commonSuffix = 0;<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> if (commonPrefix &gt; 2 || commonSuffix &gt; 2) {<tr><td><a id="l224"></a><a href="#l224">224</a><td> var printString = function(str) {<tr><td><a id="l225"></a><a href="#l225">225</a><td> var startIndex = Math.max(0, commonPrefix - 2);<tr><td><a id="l226"></a><a href="#l226">226</a><td> var endIndex = Math.min(str.length, str.length - (commonSuffix - 2));<tr><td><a id="l227"></a><a href="#l227">227</a><td> return (startIndex &gt; 0 ? &#39;...&#39; : &#39;&#39;) +<tr><td><a id="l228"></a><a href="#l228">228</a><td> str.substring(startIndex, endIndex) +<tr><td><a id="l229"></a><a href="#l229">229</a><td> (endIndex &lt; str.length ? &#39;...&#39; : &#39;&#39;);<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> msg += &#39;\nDifference was at position &#39; + commonPrefix +<tr><td><a id="l233"></a><a href="#l233">233</a><td> &#39;. Expected [&#39; + printString(expected) +<tr><td><a id="l234"></a><a href="#l234">234</a><td> &#39;] vs. actual [&#39; + printString(actual) + &#39;]&#39;;<tr><td><a id="l235"></a><a href="#l235">235</a><td> }<tr><td><a id="l236"></a><a href="#l236">236</a><td> }<tr><td><a id="l237"></a><a href="#l237">237</a><td> return msg;<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>/**<tr><td><a id="l242"></a><a href="#l242">242</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l243"></a><a href="#l243">243</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l244"></a><a href="#l244">244</a><td> */<tr><td><a id="l245"></a><a href="#l245">245</a><td>var assert = function(a, opt_b) {<tr><td><a id="l246"></a><a href="#l246">246</a><td> _validateArguments(1, arguments);<tr><td><a id="l247"></a><a href="#l247">247</a><td> var comment = commentArg(1, arguments);<tr><td><a id="l248"></a><a href="#l248">248</a><td> var booleanValue = nonCommentArg(1, 1, arguments);<tr><td><a id="l249"></a><a href="#l249">249</a><td><tr><td><a id="l250"></a><a href="#l250">250</a><td> _assert(comment, goog.isBoolean(booleanValue),<tr><td><a id="l251"></a><a href="#l251">251</a><td> &#39;Bad argument to assert(boolean)&#39;);<tr><td><a id="l252"></a><a href="#l252">252</a><td> _assert(comment, booleanValue, &#39;Call to assert(boolean) with false&#39;);<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><tr><td><a id="l256"></a><a href="#l256">256</a><td>/**<tr><td><a id="l257"></a><a href="#l257">257</a><td> * Asserts that the function throws an error.<tr><td><a id="l258"></a><a href="#l258">258</a><td> *<tr><td><a id="l259"></a><a href="#l259">259</a><td> * @param {!(string|Function)} a The assertion comment or the function to call.<tr><td><a id="l260"></a><a href="#l260">260</a><td> * @param {!Function=} opt_b The function to call (if the first argument of<tr><td><a id="l261"></a><a href="#l261">261</a><td> * {@code assertThrows} was the comment).<tr><td><a id="l262"></a><a href="#l262">262</a><td> * @return {*} The error thrown by the function.<tr><td><a id="l263"></a><a href="#l263">263</a><td> * @throws {goog.testing.JsUnitException} If the assertion failed.<tr><td><a id="l264"></a><a href="#l264">264</a><td> */<tr><td><a id="l265"></a><a href="#l265">265</a><td>var assertThrows = function(a, opt_b) {<tr><td><a id="l266"></a><a href="#l266">266</a><td> _validateArguments(1, arguments);<tr><td><a id="l267"></a><a href="#l267">267</a><td> var func = nonCommentArg(1, 1, arguments);<tr><td><a id="l268"></a><a href="#l268">268</a><td> var comment = commentArg(1, arguments);<tr><td><a id="l269"></a><a href="#l269">269</a><td> _assert(comment, typeof func == &#39;function&#39;,<tr><td><a id="l270"></a><a href="#l270">270</a><td> &#39;Argument passed to assertThrows is not a function&#39;);<tr><td><a id="l271"></a><a href="#l271">271</a><td><tr><td><a id="l272"></a><a href="#l272">272</a><td> try {<tr><td><a id="l273"></a><a href="#l273">273</a><td> func();<tr><td><a id="l274"></a><a href="#l274">274</a><td> } catch (e) {<tr><td><a id="l275"></a><a href="#l275">275</a><td> if (e &amp;&amp; goog.isString(e[&#39;stacktrace&#39;]) &amp;&amp; goog.isString(e[&#39;message&#39;])) {<tr><td><a id="l276"></a><a href="#l276">276</a><td> // Remove the stack trace appended to the error message by Opera 10.0<tr><td><a id="l277"></a><a href="#l277">277</a><td> var startIndex = e[&#39;message&#39;].length - e[&#39;stacktrace&#39;].length;<tr><td><a id="l278"></a><a href="#l278">278</a><td> if (e[&#39;message&#39;].indexOf(e[&#39;stacktrace&#39;], startIndex) == startIndex) {<tr><td><a id="l279"></a><a href="#l279">279</a><td> e[&#39;message&#39;] = e[&#39;message&#39;].substr(0, startIndex - 14);<tr><td><a id="l280"></a><a href="#l280">280</a><td> }<tr><td><a id="l281"></a><a href="#l281">281</a><td> }<tr><td><a id="l282"></a><a href="#l282">282</a><td> return e;<tr><td><a id="l283"></a><a href="#l283">283</a><td> }<tr><td><a id="l284"></a><a href="#l284">284</a><td> goog.testing.asserts.raiseException(comment,<tr><td><a id="l285"></a><a href="#l285">285</a><td> &#39;No exception thrown from function passed to assertThrows&#39;);<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>/**<tr><td><a id="l290"></a><a href="#l290">290</a><td> * Asserts that the function does not throw an error.<tr><td><a id="l291"></a><a href="#l291">291</a><td> *<tr><td><a id="l292"></a><a href="#l292">292</a><td> * @param {!(string|Function)} a The assertion comment or the function to call.<tr><td><a id="l293"></a><a href="#l293">293</a><td> * @param {!Function=} opt_b The function to call (if the first argument of<tr><td><a id="l294"></a><a href="#l294">294</a><td> * {@code assertNotThrows} was the comment).<tr><td><a id="l295"></a><a href="#l295">295</a><td> * @return {*} The return value of the function.<tr><td><a id="l296"></a><a href="#l296">296</a><td> * @throws {goog.testing.JsUnitException} If the assertion failed.<tr><td><a id="l297"></a><a href="#l297">297</a><td> */<tr><td><a id="l298"></a><a href="#l298">298</a><td>var assertNotThrows = function(a, opt_b) {<tr><td><a id="l299"></a><a href="#l299">299</a><td> _validateArguments(1, arguments);<tr><td><a id="l300"></a><a href="#l300">300</a><td> var comment = commentArg(1, arguments);<tr><td><a id="l301"></a><a href="#l301">301</a><td> var func = nonCommentArg(1, 1, arguments);<tr><td><a id="l302"></a><a href="#l302">302</a><td> _assert(comment, typeof func == &#39;function&#39;,<tr><td><a id="l303"></a><a href="#l303">303</a><td> &#39;Argument passed to assertNotThrows is not a function&#39;);<tr><td><a id="l304"></a><a href="#l304">304</a><td><tr><td><a id="l305"></a><a href="#l305">305</a><td> try {<tr><td><a id="l306"></a><a href="#l306">306</a><td> return func();<tr><td><a id="l307"></a><a href="#l307">307</a><td> } catch (e) {<tr><td><a id="l308"></a><a href="#l308">308</a><td> comment = comment ? (comment + &#39;\n&#39;) : &#39;&#39;;<tr><td><a id="l309"></a><a href="#l309">309</a><td> comment += &#39;A non expected exception was thrown from function passed to &#39; +<tr><td><a id="l310"></a><a href="#l310">310</a><td> &#39;assertNotThrows&#39;;<tr><td><a id="l311"></a><a href="#l311">311</a><td> // Some browsers don&#39;t have a stack trace so at least have the error<tr><td><a id="l312"></a><a href="#l312">312</a><td> // description.<tr><td><a id="l313"></a><a href="#l313">313</a><td> var stackTrace = e[&#39;stack&#39;] || e[&#39;stacktrace&#39;] || e.toString();<tr><td><a id="l314"></a><a href="#l314">314</a><td> goog.testing.asserts.raiseException(comment, stackTrace);<tr><td><a id="l315"></a><a href="#l315">315</a><td> }<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> * Asserts that the given callback function results in a JsUnitException when<tr><td><a id="l321"></a><a href="#l321">321</a><td> * called, and that the resulting failure message matches the given expected<tr><td><a id="l322"></a><a href="#l322">322</a><td> * message.<tr><td><a id="l323"></a><a href="#l323">323</a><td> * @param {function() : void} callback Function to be run expected to result<tr><td><a id="l324"></a><a href="#l324">324</a><td> * in a JsUnitException (usually contains a call to an assert).<tr><td><a id="l325"></a><a href="#l325">325</a><td> * @param {string=} opt_expectedMessage Failure message expected to be given<tr><td><a id="l326"></a><a href="#l326">326</a><td> * with the exception.<tr><td><a id="l327"></a><a href="#l327">327</a><td> */<tr><td><a id="l328"></a><a href="#l328">328</a><td>var assertThrowsJsUnitException = function(callback, opt_expectedMessage) {<tr><td><a id="l329"></a><a href="#l329">329</a><td> var failed = false;<tr><td><a id="l330"></a><a href="#l330">330</a><td> try {<tr><td><a id="l331"></a><a href="#l331">331</a><td> goog.testing.asserts.callWithoutLogging(callback);<tr><td><a id="l332"></a><a href="#l332">332</a><td> } catch (ex) {<tr><td><a id="l333"></a><a href="#l333">333</a><td> if (!ex.isJsUnitException) {<tr><td><a id="l334"></a><a href="#l334">334</a><td> fail(&#39;Expected a JsUnitException&#39;);<tr><td><a id="l335"></a><a href="#l335">335</a><td> }<tr><td><a id="l336"></a><a href="#l336">336</a><td> if (typeof opt_expectedMessage != &#39;undefined&#39; &amp;&amp;<tr><td><a id="l337"></a><a href="#l337">337</a><td> ex.message != opt_expectedMessage) {<tr><td><a id="l338"></a><a href="#l338">338</a><td> fail(&#39;Expected message [&#39; + opt_expectedMessage + &#39;] but got [&#39; +<tr><td><a id="l339"></a><a href="#l339">339</a><td> ex.message + &#39;]&#39;);<tr><td><a id="l340"></a><a href="#l340">340</a><td> }<tr><td><a id="l341"></a><a href="#l341">341</a><td> failed = true;<tr><td><a id="l342"></a><a href="#l342">342</a><td> }<tr><td><a id="l343"></a><a href="#l343">343</a><td> if (!failed) {<tr><td><a id="l344"></a><a href="#l344">344</a><td> fail(&#39;Expected a failure: &#39; + opt_expectedMessage);<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><tr><td><a id="l349"></a><a href="#l349">349</a><td>/**<tr><td><a id="l350"></a><a href="#l350">350</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l351"></a><a href="#l351">351</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l352"></a><a href="#l352">352</a><td> */<tr><td><a id="l353"></a><a href="#l353">353</a><td>var assertTrue = function(a, opt_b) {<tr><td><a id="l354"></a><a href="#l354">354</a><td> _validateArguments(1, arguments);<tr><td><a id="l355"></a><a href="#l355">355</a><td> var comment = commentArg(1, arguments);<tr><td><a id="l356"></a><a href="#l356">356</a><td> var booleanValue = nonCommentArg(1, 1, arguments);<tr><td><a id="l357"></a><a href="#l357">357</a><td><tr><td><a id="l358"></a><a href="#l358">358</a><td> _assert(comment, goog.isBoolean(booleanValue),<tr><td><a id="l359"></a><a href="#l359">359</a><td> &#39;Bad argument to assertTrue(boolean)&#39;);<tr><td><a id="l360"></a><a href="#l360">360</a><td> _assert(comment, booleanValue, &#39;Call to assertTrue(boolean) with false&#39;);<tr><td><a id="l361"></a><a href="#l361">361</a><td>};<tr><td><a id="l362"></a><a href="#l362">362</a><td><tr><td><a id="l363"></a><a href="#l363">363</a><td><tr><td><a id="l364"></a><a href="#l364">364</a><td>/**<tr><td><a id="l365"></a><a href="#l365">365</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l366"></a><a href="#l366">366</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l367"></a><a href="#l367">367</a><td> */<tr><td><a id="l368"></a><a href="#l368">368</a><td>var assertFalse = function(a, opt_b) {<tr><td><a id="l369"></a><a href="#l369">369</a><td> _validateArguments(1, arguments);<tr><td><a id="l370"></a><a href="#l370">370</a><td> var comment = commentArg(1, arguments);<tr><td><a id="l371"></a><a href="#l371">371</a><td> var booleanValue = nonCommentArg(1, 1, arguments);<tr><td><a id="l372"></a><a href="#l372">372</a><td><tr><td><a id="l373"></a><a href="#l373">373</a><td> _assert(comment, goog.isBoolean(booleanValue),<tr><td><a id="l374"></a><a href="#l374">374</a><td> &#39;Bad argument to assertFalse(boolean)&#39;);<tr><td><a id="l375"></a><a href="#l375">375</a><td> _assert(comment, !booleanValue, &#39;Call to assertFalse(boolean) with true&#39;);<tr><td><a id="l376"></a><a href="#l376">376</a><td>};<tr><td><a id="l377"></a><a href="#l377">377</a><td><tr><td><a id="l378"></a><a href="#l378">378</a><td><tr><td><a id="l379"></a><a href="#l379">379</a><td>/**<tr><td><a id="l380"></a><a href="#l380">380</a><td> * @param {*} a The expected value (2 args) or the debug message (3 args).<tr><td><a id="l381"></a><a href="#l381">381</a><td> * @param {*} b The actual value (2 args) or the expected value (3 args).<tr><td><a id="l382"></a><a href="#l382">382</a><td> * @param {*=} opt_c The actual value (3 args only).<tr><td><a id="l383"></a><a href="#l383">383</a><td> */<tr><td><a id="l384"></a><a href="#l384">384</a><td>var assertEquals = function(a, b, opt_c) {<tr><td><a id="l385"></a><a href="#l385">385</a><td> _validateArguments(2, arguments);<tr><td><a id="l386"></a><a href="#l386">386</a><td> var var1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l387"></a><a href="#l387">387</a><td> var var2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l388"></a><a href="#l388">388</a><td> _assert(commentArg(2, arguments), var1 === var2,<tr><td><a id="l389"></a><a href="#l389">389</a><td> goog.testing.asserts.getDefaultErrorMsg_(var1, var2));<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>/**<tr><td><a id="l394"></a><a href="#l394">394</a><td> * @param {*} a The expected value (2 args) or the debug message (3 args).<tr><td><a id="l395"></a><a href="#l395">395</a><td> * @param {*} b The actual value (2 args) or the expected value (3 args).<tr><td><a id="l396"></a><a href="#l396">396</a><td> * @param {*=} opt_c The actual value (3 args only).<tr><td><a id="l397"></a><a href="#l397">397</a><td> */<tr><td><a id="l398"></a><a href="#l398">398</a><td>var assertNotEquals = function(a, b, opt_c) {<tr><td><a id="l399"></a><a href="#l399">399</a><td> _validateArguments(2, arguments);<tr><td><a id="l400"></a><a href="#l400">400</a><td> var var1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l401"></a><a href="#l401">401</a><td> var var2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l402"></a><a href="#l402">402</a><td> _assert(commentArg(2, arguments), var1 !== var2,<tr><td><a id="l403"></a><a href="#l403">403</a><td> &#39;Expected not to be &#39; + _displayStringForValue(var2));<tr><td><a id="l404"></a><a href="#l404">404</a><td>};<tr><td><a id="l405"></a><a href="#l405">405</a><td><tr><td><a id="l406"></a><a href="#l406">406</a><td><tr><td><a id="l407"></a><a href="#l407">407</a><td>/**<tr><td><a id="l408"></a><a href="#l408">408</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l409"></a><a href="#l409">409</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l410"></a><a href="#l410">410</a><td> */<tr><td><a id="l411"></a><a href="#l411">411</a><td>var assertNull = function(a, opt_b) {<tr><td><a id="l412"></a><a href="#l412">412</a><td> _validateArguments(1, arguments);<tr><td><a id="l413"></a><a href="#l413">413</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l414"></a><a href="#l414">414</a><td> _assert(commentArg(1, arguments), aVar === null,<tr><td><a id="l415"></a><a href="#l415">415</a><td> goog.testing.asserts.getDefaultErrorMsg_(null, aVar));<tr><td><a id="l416"></a><a href="#l416">416</a><td>};<tr><td><a id="l417"></a><a href="#l417">417</a><td><tr><td><a id="l418"></a><a href="#l418">418</a><td><tr><td><a id="l419"></a><a href="#l419">419</a><td>/**<tr><td><a id="l420"></a><a href="#l420">420</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l421"></a><a href="#l421">421</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l422"></a><a href="#l422">422</a><td> */<tr><td><a id="l423"></a><a href="#l423">423</a><td>var assertNotNull = function(a, opt_b) {<tr><td><a id="l424"></a><a href="#l424">424</a><td> _validateArguments(1, arguments);<tr><td><a id="l425"></a><a href="#l425">425</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l426"></a><a href="#l426">426</a><td> _assert(commentArg(1, arguments), aVar !== null,<tr><td><a id="l427"></a><a href="#l427">427</a><td> &#39;Expected not to be &#39; + _displayStringForValue(null));<tr><td><a id="l428"></a><a href="#l428">428</a><td>};<tr><td><a id="l429"></a><a href="#l429">429</a><td><tr><td><a id="l430"></a><a href="#l430">430</a><td><tr><td><a id="l431"></a><a href="#l431">431</a><td>/**<tr><td><a id="l432"></a><a href="#l432">432</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l433"></a><a href="#l433">433</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l434"></a><a href="#l434">434</a><td> */<tr><td><a id="l435"></a><a href="#l435">435</a><td>var assertUndefined = function(a, opt_b) {<tr><td><a id="l436"></a><a href="#l436">436</a><td> _validateArguments(1, arguments);<tr><td><a id="l437"></a><a href="#l437">437</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l438"></a><a href="#l438">438</a><td> _assert(commentArg(1, arguments), aVar === JSUNIT_UNDEFINED_VALUE,<tr><td><a id="l439"></a><a href="#l439">439</a><td> goog.testing.asserts.getDefaultErrorMsg_(JSUNIT_UNDEFINED_VALUE, aVar));<tr><td><a id="l440"></a><a href="#l440">440</a><td>};<tr><td><a id="l441"></a><a href="#l441">441</a><td><tr><td><a id="l442"></a><a href="#l442">442</a><td><tr><td><a id="l443"></a><a href="#l443">443</a><td>/**<tr><td><a id="l444"></a><a href="#l444">444</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l445"></a><a href="#l445">445</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l446"></a><a href="#l446">446</a><td> */<tr><td><a id="l447"></a><a href="#l447">447</a><td>var assertNotUndefined = function(a, opt_b) {<tr><td><a id="l448"></a><a href="#l448">448</a><td> _validateArguments(1, arguments);<tr><td><a id="l449"></a><a href="#l449">449</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l450"></a><a href="#l450">450</a><td> _assert(commentArg(1, arguments), aVar !== JSUNIT_UNDEFINED_VALUE,<tr><td><a id="l451"></a><a href="#l451">451</a><td> &#39;Expected not to be &#39; + _displayStringForValue(JSUNIT_UNDEFINED_VALUE));<tr><td><a id="l452"></a><a href="#l452">452</a><td>};<tr><td><a id="l453"></a><a href="#l453">453</a><td><tr><td><a id="l454"></a><a href="#l454">454</a><td><tr><td><a id="l455"></a><a href="#l455">455</a><td>/**<tr><td><a id="l456"></a><a href="#l456">456</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l457"></a><a href="#l457">457</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l458"></a><a href="#l458">458</a><td> */<tr><td><a id="l459"></a><a href="#l459">459</a><td>var assertNotNullNorUndefined = function(a, opt_b) {<tr><td><a id="l460"></a><a href="#l460">460</a><td> _validateArguments(1, arguments);<tr><td><a id="l461"></a><a href="#l461">461</a><td> assertNotNull.apply(null, arguments);<tr><td><a id="l462"></a><a href="#l462">462</a><td> assertNotUndefined.apply(null, arguments);<tr><td><a id="l463"></a><a href="#l463">463</a><td>};<tr><td><a id="l464"></a><a href="#l464">464</a><td><tr><td><a id="l465"></a><a href="#l465">465</a><td><tr><td><a id="l466"></a><a href="#l466">466</a><td>/**<tr><td><a id="l467"></a><a href="#l467">467</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l468"></a><a href="#l468">468</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l469"></a><a href="#l469">469</a><td> */<tr><td><a id="l470"></a><a href="#l470">470</a><td>var assertNonEmptyString = function(a, opt_b) {<tr><td><a id="l471"></a><a href="#l471">471</a><td> _validateArguments(1, arguments);<tr><td><a id="l472"></a><a href="#l472">472</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l473"></a><a href="#l473">473</a><td> _assert(commentArg(1, arguments),<tr><td><a id="l474"></a><a href="#l474">474</a><td> aVar !== JSUNIT_UNDEFINED_VALUE &amp;&amp; aVar !== null &amp;&amp;<tr><td><a id="l475"></a><a href="#l475">475</a><td> typeof aVar == &#39;string&#39; &amp;&amp; aVar !== &#39;&#39;,<tr><td><a id="l476"></a><a href="#l476">476</a><td> &#39;Expected non-empty string but was &#39; + _displayStringForValue(aVar));<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><tr><td><a id="l480"></a><a href="#l480">480</a><td>/**<tr><td><a id="l481"></a><a href="#l481">481</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l482"></a><a href="#l482">482</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l483"></a><a href="#l483">483</a><td> */<tr><td><a id="l484"></a><a href="#l484">484</a><td>var assertNaN = function(a, opt_b) {<tr><td><a id="l485"></a><a href="#l485">485</a><td> _validateArguments(1, arguments);<tr><td><a id="l486"></a><a href="#l486">486</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l487"></a><a href="#l487">487</a><td> _assert(commentArg(1, arguments), isNaN(aVar), &#39;Expected NaN&#39;);<tr><td><a id="l488"></a><a href="#l488">488</a><td>};<tr><td><a id="l489"></a><a href="#l489">489</a><td><tr><td><a id="l490"></a><a href="#l490">490</a><td><tr><td><a id="l491"></a><a href="#l491">491</a><td>/**<tr><td><a id="l492"></a><a href="#l492">492</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l493"></a><a href="#l493">493</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l494"></a><a href="#l494">494</a><td> */<tr><td><a id="l495"></a><a href="#l495">495</a><td>var assertNotNaN = function(a, opt_b) {<tr><td><a id="l496"></a><a href="#l496">496</a><td> _validateArguments(1, arguments);<tr><td><a id="l497"></a><a href="#l497">497</a><td> var aVar = nonCommentArg(1, 1, arguments);<tr><td><a id="l498"></a><a href="#l498">498</a><td> _assert(commentArg(1, arguments), !isNaN(aVar), &#39;Expected not NaN&#39;);<tr><td><a id="l499"></a><a href="#l499">499</a><td>};<tr><td><a id="l500"></a><a href="#l500">500</a><td><tr><td><a id="l501"></a><a href="#l501">501</a><td><tr><td><a id="l502"></a><a href="#l502">502</a><td>/**<tr><td><a id="l503"></a><a href="#l503">503</a><td> * Runs a function in an environment where test failures are not logged. This is<tr><td><a id="l504"></a><a href="#l504">504</a><td> * useful for testing test code, where failures can be a normal part of a test.<tr><td><a id="l505"></a><a href="#l505">505</a><td> * @param {function() : void} fn Function to run without logging failures.<tr><td><a id="l506"></a><a href="#l506">506</a><td> */<tr><td><a id="l507"></a><a href="#l507">507</a><td>goog.testing.asserts.callWithoutLogging = function(fn) {<tr><td><a id="l508"></a><a href="#l508">508</a><td> var testRunner = goog.global[&#39;G_testRunner&#39;];<tr><td><a id="l509"></a><a href="#l509">509</a><td> var oldLogTestFailure = testRunner[&#39;logTestFailure&#39;];<tr><td><a id="l510"></a><a href="#l510">510</a><td> try {<tr><td><a id="l511"></a><a href="#l511">511</a><td> // Any failures in the callback shouldn&#39;t be recorded.<tr><td><a id="l512"></a><a href="#l512">512</a><td> testRunner[&#39;logTestFailure&#39;] = undefined;<tr><td><a id="l513"></a><a href="#l513">513</a><td> fn();<tr><td><a id="l514"></a><a href="#l514">514</a><td> } finally {<tr><td><a id="l515"></a><a href="#l515">515</a><td> testRunner[&#39;logTestFailure&#39;] = oldLogTestFailure;<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><tr><td><a id="l519"></a><a href="#l519">519</a><td><tr><td><a id="l520"></a><a href="#l520">520</a><td>/**<tr><td><a id="l521"></a><a href="#l521">521</a><td> * The return value of the equality predicate passed to findDifferences below,<tr><td><a id="l522"></a><a href="#l522">522</a><td> * in cases where the predicate can&#39;t test the input variables for equality.<tr><td><a id="l523"></a><a href="#l523">523</a><td> * @type {?string}<tr><td><a id="l524"></a><a href="#l524">524</a><td> */<tr><td><a id="l525"></a><a href="#l525">525</a><td>goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS = null;<tr><td><a id="l526"></a><a href="#l526">526</a><td><tr><td><a id="l527"></a><a href="#l527">527</a><td><tr><td><a id="l528"></a><a href="#l528">528</a><td>/**<tr><td><a id="l529"></a><a href="#l529">529</a><td> * The return value of the equality predicate passed to findDifferences below,<tr><td><a id="l530"></a><a href="#l530">530</a><td> * in cases where the input vriables are equal.<tr><td><a id="l531"></a><a href="#l531">531</a><td> * @type {?string}<tr><td><a id="l532"></a><a href="#l532">532</a><td> */<tr><td><a id="l533"></a><a href="#l533">533</a><td>goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL = &#39;&#39;;<tr><td><a id="l534"></a><a href="#l534">534</a><td><tr><td><a id="l535"></a><a href="#l535">535</a><td><tr><td><a id="l536"></a><a href="#l536">536</a><td>/**<tr><td><a id="l537"></a><a href="#l537">537</a><td> * Determines if two items of any type match, and formulates an error message<tr><td><a id="l538"></a><a href="#l538">538</a><td> * if not.<tr><td><a id="l539"></a><a href="#l539">539</a><td> * @param {*} expected Expected argument to match.<tr><td><a id="l540"></a><a href="#l540">540</a><td> * @param {*} actual Argument as a result of performing the test.<tr><td><a id="l541"></a><a href="#l541">541</a><td> * @param {(function(string, *, *): ?string)=} opt_equalityPredicate An optional<tr><td><a id="l542"></a><a href="#l542">542</a><td> * function that can be used to check equality of variables. It accepts 3<tr><td><a id="l543"></a><a href="#l543">543</a><td> * arguments: type-of-variables, var1, var2 (in that order) and returns an<tr><td><a id="l544"></a><a href="#l544">544</a><td> * error message if the variables are not equal,<tr><td><a id="l545"></a><a href="#l545">545</a><td> * goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL if the variables<tr><td><a id="l546"></a><a href="#l546">546</a><td> * are equal, or<tr><td><a id="l547"></a><a href="#l547">547</a><td> * goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS if the predicate<tr><td><a id="l548"></a><a href="#l548">548</a><td> * couldn&#39;t check the input variables. The function will be called only if<tr><td><a id="l549"></a><a href="#l549">549</a><td> * the types of var1 and var2 are identical.<tr><td><a id="l550"></a><a href="#l550">550</a><td> * @return {?string} Null on success, error message on failure.<tr><td><a id="l551"></a><a href="#l551">551</a><td> */<tr><td><a id="l552"></a><a href="#l552">552</a><td>goog.testing.asserts.findDifferences = function(expected, actual,<tr><td><a id="l553"></a><a href="#l553">553</a><td> opt_equalityPredicate) {<tr><td><a id="l554"></a><a href="#l554">554</a><td> var failures = [];<tr><td><a id="l555"></a><a href="#l555">555</a><td> var seen1 = [];<tr><td><a id="l556"></a><a href="#l556">556</a><td> var seen2 = [];<tr><td><a id="l557"></a><a href="#l557">557</a><td><tr><td><a id="l558"></a><a href="#l558">558</a><td> // To avoid infinite recursion when the two parameters are self-referential<tr><td><a id="l559"></a><a href="#l559">559</a><td> // along the same path of properties, keep track of the object pairs already<tr><td><a id="l560"></a><a href="#l560">560</a><td> // seen in this call subtree, and abort when a cycle is detected.<tr><td><a id="l561"></a><a href="#l561">561</a><td> function innerAssertWithCycleCheck(var1, var2, path) {<tr><td><a id="l562"></a><a href="#l562">562</a><td> // This is used for testing, so we can afford to be slow (but more<tr><td><a id="l563"></a><a href="#l563">563</a><td> // accurate). So we just check whether var1 is in seen1. If we<tr><td><a id="l564"></a><a href="#l564">564</a><td> // found var1 in index i, we simply need to check whether var2 is<tr><td><a id="l565"></a><a href="#l565">565</a><td> // in seen2[i]. If it is, we do not recurse to check var1/var2. If<tr><td><a id="l566"></a><a href="#l566">566</a><td> // it isn&#39;t, we know that the structures of the two objects must be<tr><td><a id="l567"></a><a href="#l567">567</a><td> // different.<tr><td><a id="l568"></a><a href="#l568">568</a><td> //<tr><td><a id="l569"></a><a href="#l569">569</a><td> // This is based on the fact that values at index i in seen1 and<tr><td><a id="l570"></a><a href="#l570">570</a><td> // seen2 will be checked for equality eventually (when<tr><td><a id="l571"></a><a href="#l571">571</a><td> // innerAssertImplementation(seen1[i], seen2[i], path) finishes).<tr><td><a id="l572"></a><a href="#l572">572</a><td> for (var i = 0; i &lt; seen1.length; ++i) {<tr><td><a id="l573"></a><a href="#l573">573</a><td> var match1 = seen1[i] === var1;<tr><td><a id="l574"></a><a href="#l574">574</a><td> var match2 = seen2[i] === var2;<tr><td><a id="l575"></a><a href="#l575">575</a><td> if (match1 || match2) {<tr><td><a id="l576"></a><a href="#l576">576</a><td> if (!match1 || !match2) {<tr><td><a id="l577"></a><a href="#l577">577</a><td> // Asymmetric cycles, so the objects have different structure.<tr><td><a id="l578"></a><a href="#l578">578</a><td> failures.push(&#39;Asymmetric cycle detected at &#39; + path);<tr><td><a id="l579"></a><a href="#l579">579</a><td> }<tr><td><a id="l580"></a><a href="#l580">580</a><td> return;<tr><td><a id="l581"></a><a href="#l581">581</a><td> }<tr><td><a id="l582"></a><a href="#l582">582</a><td> }<tr><td><a id="l583"></a><a href="#l583">583</a><td><tr><td><a id="l584"></a><a href="#l584">584</a><td> seen1.push(var1);<tr><td><a id="l585"></a><a href="#l585">585</a><td> seen2.push(var2);<tr><td><a id="l586"></a><a href="#l586">586</a><td> innerAssertImplementation(var1, var2, path);<tr><td><a id="l587"></a><a href="#l587">587</a><td> seen1.pop();<tr><td><a id="l588"></a><a href="#l588">588</a><td> seen2.pop();<tr><td><a id="l589"></a><a href="#l589">589</a><td> }<tr><td><a id="l590"></a><a href="#l590">590</a><td><tr><td><a id="l591"></a><a href="#l591">591</a><td> var equalityPredicate = opt_equalityPredicate || function(type, var1, var2) {<tr><td><a id="l592"></a><a href="#l592">592</a><td> var typedPredicate = PRIMITIVE_EQUALITY_PREDICATES[type];<tr><td><a id="l593"></a><a href="#l593">593</a><td> if (!typedPredicate) {<tr><td><a id="l594"></a><a href="#l594">594</a><td> return goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS;<tr><td><a id="l595"></a><a href="#l595">595</a><td> }<tr><td><a id="l596"></a><a href="#l596">596</a><td> var equal = typedPredicate(var1, var2);<tr><td><a id="l597"></a><a href="#l597">597</a><td> return equal ? goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL :<tr><td><a id="l598"></a><a href="#l598">598</a><td> goog.testing.asserts.getDefaultErrorMsg_(var1, var2);<tr><td><a id="l599"></a><a href="#l599">599</a><td> };<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> * @param {*} var1 An item in the expected object.<tr><td><a id="l603"></a><a href="#l603">603</a><td> * @param {*} var2 The corresponding item in the actual object.<tr><td><a id="l604"></a><a href="#l604">604</a><td> * @param {string} path Their path in the objects.<tr><td><a id="l605"></a><a href="#l605">605</a><td> * @suppress {missingProperties} The map_ property is unknown to the compiler<tr><td><a id="l606"></a><a href="#l606">606</a><td> * unless goog.structs.Map is loaded.<tr><td><a id="l607"></a><a href="#l607">607</a><td> */<tr><td><a id="l608"></a><a href="#l608">608</a><td> function innerAssertImplementation(var1, var2, path) {<tr><td><a id="l609"></a><a href="#l609">609</a><td> if (var1 === var2) {<tr><td><a id="l610"></a><a href="#l610">610</a><td> return;<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> var typeOfVar1 = _trueTypeOf(var1);<tr><td><a id="l614"></a><a href="#l614">614</a><td> var typeOfVar2 = _trueTypeOf(var2);<tr><td><a id="l615"></a><a href="#l615">615</a><td><tr><td><a id="l616"></a><a href="#l616">616</a><td> if (typeOfVar1 == typeOfVar2) {<tr><td><a id="l617"></a><a href="#l617">617</a><td> var isArray = typeOfVar1 == &#39;Array&#39;;<tr><td><a id="l618"></a><a href="#l618">618</a><td> var errorMessage = equalityPredicate(typeOfVar1, var1, var2);<tr><td><a id="l619"></a><a href="#l619">619</a><td> if (errorMessage !=<tr><td><a id="l620"></a><a href="#l620">620</a><td> goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS) {<tr><td><a id="l621"></a><a href="#l621">621</a><td> if (errorMessage !=<tr><td><a id="l622"></a><a href="#l622">622</a><td> goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL) {<tr><td><a id="l623"></a><a href="#l623">623</a><td> failures.push(path + &#39;: &#39; + errorMessage);<tr><td><a id="l624"></a><a href="#l624">624</a><td> }<tr><td><a id="l625"></a><a href="#l625">625</a><td> } else if (isArray &amp;&amp; var1.length != var2.length) {<tr><td><a id="l626"></a><a href="#l626">626</a><td> failures.push(path + &#39;: Expected &#39; + var1.length + &#39;-element array &#39; +<tr><td><a id="l627"></a><a href="#l627">627</a><td> &#39;but got a &#39; + var2.length + &#39;-element array&#39;);<tr><td><a id="l628"></a><a href="#l628">628</a><td> } else {<tr><td><a id="l629"></a><a href="#l629">629</a><td> var childPath = path + (isArray ? &#39;[%s]&#39; : (path ? &#39;.%s&#39; : &#39;%s&#39;));<tr><td><a id="l630"></a><a href="#l630">630</a><td><tr><td><a id="l631"></a><a href="#l631">631</a><td> // if an object has an __iterator__ property, we have no way of<tr><td><a id="l632"></a><a href="#l632">632</a><td> // actually inspecting its raw properties, and JS 1.7 doesn&#39;t<tr><td><a id="l633"></a><a href="#l633">633</a><td> // overload [] to make it possible for someone to generically<tr><td><a id="l634"></a><a href="#l634">634</a><td> // use what the iterator returns to compare the object-managed<tr><td><a id="l635"></a><a href="#l635">635</a><td> // properties. This gets us into deep poo with things like<tr><td><a id="l636"></a><a href="#l636">636</a><td> // goog.structs.Map, at least on systems that support iteration.<tr><td><a id="l637"></a><a href="#l637">637</a><td> if (!var1[&#39;__iterator__&#39;]) {<tr><td><a id="l638"></a><a href="#l638">638</a><td> for (var prop in var1) {<tr><td><a id="l639"></a><a href="#l639">639</a><td> if (isArray &amp;&amp; goog.testing.asserts.isArrayIndexProp_(prop)) {<tr><td><a id="l640"></a><a href="#l640">640</a><td> // Skip array indices for now. We&#39;ll handle them later.<tr><td><a id="l641"></a><a href="#l641">641</a><td> continue;<tr><td><a id="l642"></a><a href="#l642">642</a><td> }<tr><td><a id="l643"></a><a href="#l643">643</a><td><tr><td><a id="l644"></a><a href="#l644">644</a><td> if (prop in var2) {<tr><td><a id="l645"></a><a href="#l645">645</a><td> innerAssertWithCycleCheck(var1[prop], var2[prop],<tr><td><a id="l646"></a><a href="#l646">646</a><td> childPath.replace(&#39;%s&#39;, prop));<tr><td><a id="l647"></a><a href="#l647">647</a><td> } else {<tr><td><a id="l648"></a><a href="#l648">648</a><td> failures.push(&#39;property &#39; + prop +<tr><td><a id="l649"></a><a href="#l649">649</a><td> &#39; not present in actual &#39; + (path || typeOfVar2));<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> // make sure there aren&#39;t properties in var2 that are missing<tr><td><a id="l653"></a><a href="#l653">653</a><td> // from var1. if there are, then by definition they don&#39;t<tr><td><a id="l654"></a><a href="#l654">654</a><td> // match.<tr><td><a id="l655"></a><a href="#l655">655</a><td> for (var prop in var2) {<tr><td><a id="l656"></a><a href="#l656">656</a><td> if (isArray &amp;&amp; goog.testing.asserts.isArrayIndexProp_(prop)) {<tr><td><a id="l657"></a><a href="#l657">657</a><td> // Skip array indices for now. We&#39;ll handle them later.<tr><td><a id="l658"></a><a href="#l658">658</a><td> continue;<tr><td><a id="l659"></a><a href="#l659">659</a><td> }<tr><td><a id="l660"></a><a href="#l660">660</a><td><tr><td><a id="l661"></a><a href="#l661">661</a><td> if (!(prop in var1)) {<tr><td><a id="l662"></a><a href="#l662">662</a><td> failures.push(&#39;property &#39; + prop +<tr><td><a id="l663"></a><a href="#l663">663</a><td> &#39; not present in expected &#39; +<tr><td><a id="l664"></a><a href="#l664">664</a><td> (path || typeOfVar1));<tr><td><a id="l665"></a><a href="#l665">665</a><td> }<tr><td><a id="l666"></a><a href="#l666">666</a><td> }<tr><td><a id="l667"></a><a href="#l667">667</a><td><tr><td><a id="l668"></a><a href="#l668">668</a><td> // Handle array indices by iterating from 0 to arr.length.<tr><td><a id="l669"></a><a href="#l669">669</a><td> //<tr><td><a id="l670"></a><a href="#l670">670</a><td> // Although all browsers allow holes in arrays, browsers<tr><td><a id="l671"></a><a href="#l671">671</a><td> // are inconsistent in what they consider a hole. For example,<tr><td><a id="l672"></a><a href="#l672">672</a><td> // &quot;[0,undefined,2]&quot; has a hole on IE but not on Firefox.<tr><td><a id="l673"></a><a href="#l673">673</a><td> //<tr><td><a id="l674"></a><a href="#l674">674</a><td> // Because our style guide bans for...in iteration over arrays,<tr><td><a id="l675"></a><a href="#l675">675</a><td> // we assume that most users don&#39;t care about holes in arrays,<tr><td><a id="l676"></a><a href="#l676">676</a><td> // and that it is ok to say that a hole is equivalent to a slot<tr><td><a id="l677"></a><a href="#l677">677</a><td> // populated with &#39;undefined&#39;.<tr><td><a id="l678"></a><a href="#l678">678</a><td> if (isArray) {<tr><td><a id="l679"></a><a href="#l679">679</a><td> for (prop = 0; prop &lt; var1.length; prop++) {<tr><td><a id="l680"></a><a href="#l680">680</a><td> innerAssertWithCycleCheck(var1[prop], var2[prop],<tr><td><a id="l681"></a><a href="#l681">681</a><td> childPath.replace(&#39;%s&#39;, String(prop)));<tr><td><a id="l682"></a><a href="#l682">682</a><td> }<tr><td><a id="l683"></a><a href="#l683">683</a><td> }<tr><td><a id="l684"></a><a href="#l684">684</a><td> } else {<tr><td><a id="l685"></a><a href="#l685">685</a><td> // special-case for closure objects that have iterators<tr><td><a id="l686"></a><a href="#l686">686</a><td> if (goog.isFunction(var1.equals)) {<tr><td><a id="l687"></a><a href="#l687">687</a><td> // use the object&#39;s own equals function, assuming it accepts an<tr><td><a id="l688"></a><a href="#l688">688</a><td> // object and returns a boolean<tr><td><a id="l689"></a><a href="#l689">689</a><td> if (!var1.equals(var2)) {<tr><td><a id="l690"></a><a href="#l690">690</a><td> failures.push(&#39;equals() returned false for &#39; +<tr><td><a id="l691"></a><a href="#l691">691</a><td> (path || typeOfVar1));<tr><td><a id="l692"></a><a href="#l692">692</a><td> }<tr><td><a id="l693"></a><a href="#l693">693</a><td> } else if (var1.map_) {<tr><td><a id="l694"></a><a href="#l694">694</a><td> // assume goog.structs.Map or goog.structs.Set, where comparing<tr><td><a id="l695"></a><a href="#l695">695</a><td> // their private map_ field is sufficient<tr><td><a id="l696"></a><a href="#l696">696</a><td> innerAssertWithCycleCheck(var1.map_, var2.map_,<tr><td><a id="l697"></a><a href="#l697">697</a><td> childPath.replace(&#39;%s&#39;, &#39;map_&#39;));<tr><td><a id="l698"></a><a href="#l698">698</a><td> } else {<tr><td><a id="l699"></a><a href="#l699">699</a><td> // else die, so user knows we can&#39;t do anything<tr><td><a id="l700"></a><a href="#l700">700</a><td> failures.push(&#39;unable to check &#39; + (path || typeOfVar1) +<tr><td><a id="l701"></a><a href="#l701">701</a><td> &#39; for equality: it has an iterator we do not &#39; +<tr><td><a id="l702"></a><a href="#l702">702</a><td> &#39;know how to handle. please add an equals method&#39;);<tr><td><a id="l703"></a><a href="#l703">703</a><td> }<tr><td><a id="l704"></a><a href="#l704">704</a><td> }<tr><td><a id="l705"></a><a href="#l705">705</a><td> }<tr><td><a id="l706"></a><a href="#l706">706</a><td> } else {<tr><td><a id="l707"></a><a href="#l707">707</a><td> failures.push(path + &#39; &#39; +<tr><td><a id="l708"></a><a href="#l708">708</a><td> goog.testing.asserts.getDefaultErrorMsg_(var1, var2));<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> innerAssertWithCycleCheck(expected, actual, &#39;&#39;);<tr><td><a id="l713"></a><a href="#l713">713</a><td> return failures.length == 0 ? null :<tr><td><a id="l714"></a><a href="#l714">714</a><td> goog.testing.asserts.getDefaultErrorMsg_(expected, actual) +<tr><td><a id="l715"></a><a href="#l715">715</a><td> &#39;\n &#39; + failures.join(&#39;\n &#39;);<tr><td><a id="l716"></a><a href="#l716">716</a><td>};<tr><td><a id="l717"></a><a href="#l717">717</a><td><tr><td><a id="l718"></a><a href="#l718">718</a><td><tr><td><a id="l719"></a><a href="#l719">719</a><td>/**<tr><td><a id="l720"></a><a href="#l720">720</a><td> * Notes:<tr><td><a id="l721"></a><a href="#l721">721</a><td> * Object equality has some nasty browser quirks, and this implementation is<tr><td><a id="l722"></a><a href="#l722">722</a><td> * not 100% correct. For example,<tr><td><a id="l723"></a><a href="#l723">723</a><td> *<tr><td><a id="l724"></a><a href="#l724">724</a><td> * &lt;code&gt;<tr><td><a id="l725"></a><a href="#l725">725</a><td> * var a = [0, 1, 2];<tr><td><a id="l726"></a><a href="#l726">726</a><td> * var b = [0, 1, 2];<tr><td><a id="l727"></a><a href="#l727">727</a><td> * delete a[1];<tr><td><a id="l728"></a><a href="#l728">728</a><td> * b[1] = undefined;<tr><td><a id="l729"></a><a href="#l729">729</a><td> * assertObjectEquals(a, b); // should fail, but currently passes<tr><td><a id="l730"></a><a href="#l730">730</a><td> * &lt;/code&gt;<tr><td><a id="l731"></a><a href="#l731">731</a><td> *<tr><td><a id="l732"></a><a href="#l732">732</a><td> * See asserts_test.html for more interesting edge cases.<tr><td><a id="l733"></a><a href="#l733">733</a><td> *<tr><td><a id="l734"></a><a href="#l734">734</a><td> * The first comparison object provided is the expected value, the second is<tr><td><a id="l735"></a><a href="#l735">735</a><td> * the actual.<tr><td><a id="l736"></a><a href="#l736">736</a><td> *<tr><td><a id="l737"></a><a href="#l737">737</a><td> * @param {*} a Assertion message or comparison object.<tr><td><a id="l738"></a><a href="#l738">738</a><td> * @param {*} b Comparison object.<tr><td><a id="l739"></a><a href="#l739">739</a><td> * @param {*=} opt_c Comparison object, if an assertion message was provided.<tr><td><a id="l740"></a><a href="#l740">740</a><td> */<tr><td><a id="l741"></a><a href="#l741">741</a><td>var assertObjectEquals = function(a, b, opt_c) {<tr><td><a id="l742"></a><a href="#l742">742</a><td> _validateArguments(2, arguments);<tr><td><a id="l743"></a><a href="#l743">743</a><td> var v1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l744"></a><a href="#l744">744</a><td> var v2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l745"></a><a href="#l745">745</a><td> var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : &#39;&#39;;<tr><td><a id="l746"></a><a href="#l746">746</a><td> var differences = goog.testing.asserts.findDifferences(v1, v2);<tr><td><a id="l747"></a><a href="#l747">747</a><td><tr><td><a id="l748"></a><a href="#l748">748</a><td> _assert(failureMessage, !differences, differences);<tr><td><a id="l749"></a><a href="#l749">749</a><td>};<tr><td><a id="l750"></a><a href="#l750">750</a><td><tr><td><a id="l751"></a><a href="#l751">751</a><td><tr><td><a id="l752"></a><a href="#l752">752</a><td>/**<tr><td><a id="l753"></a><a href="#l753">753</a><td> * Similar to assertObjectEquals above, but accepts a tolerance margin.<tr><td><a id="l754"></a><a href="#l754">754</a><td> *<tr><td><a id="l755"></a><a href="#l755">755</a><td> * @param {*} a Assertion message or comparison object.<tr><td><a id="l756"></a><a href="#l756">756</a><td> * @param {*} b Comparison object.<tr><td><a id="l757"></a><a href="#l757">757</a><td> * @param {*} c Comparison object or tolerance.<tr><td><a id="l758"></a><a href="#l758">758</a><td> * @param {*=} opt_d Tolerance, if an assertion message was provided.<tr><td><a id="l759"></a><a href="#l759">759</a><td> */<tr><td><a id="l760"></a><a href="#l760">760</a><td>var assertObjectRoughlyEquals = function(a, b, c, opt_d) {<tr><td><a id="l761"></a><a href="#l761">761</a><td> _validateArguments(3, arguments);<tr><td><a id="l762"></a><a href="#l762">762</a><td> var v1 = nonCommentArg(1, 3, arguments);<tr><td><a id="l763"></a><a href="#l763">763</a><td> var v2 = nonCommentArg(2, 3, arguments);<tr><td><a id="l764"></a><a href="#l764">764</a><td> var tolerance = nonCommentArg(3, 3, arguments);<tr><td><a id="l765"></a><a href="#l765">765</a><td> var failureMessage = commentArg(3, arguments) ? commentArg(3, arguments) : &#39;&#39;;<tr><td><a id="l766"></a><a href="#l766">766</a><td> var equalityPredicate = function(type, var1, var2) {<tr><td><a id="l767"></a><a href="#l767">767</a><td> var typedPredicate =<tr><td><a id="l768"></a><a href="#l768">768</a><td> goog.testing.asserts.primitiveRoughEqualityPredicates_[type];<tr><td><a id="l769"></a><a href="#l769">769</a><td> if (!typedPredicate) {<tr><td><a id="l770"></a><a href="#l770">770</a><td> return goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS;<tr><td><a id="l771"></a><a href="#l771">771</a><td> }<tr><td><a id="l772"></a><a href="#l772">772</a><td> var equal = typedPredicate(var1, var2, tolerance);<tr><td><a id="l773"></a><a href="#l773">773</a><td> return equal ? goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL :<tr><td><a id="l774"></a><a href="#l774">774</a><td> goog.testing.asserts.getDefaultErrorMsg_(var1, var2) +<tr><td><a id="l775"></a><a href="#l775">775</a><td> &#39; which was more than &#39; + tolerance + &#39; away&#39;;<tr><td><a id="l776"></a><a href="#l776">776</a><td> };<tr><td><a id="l777"></a><a href="#l777">777</a><td> var differences = goog.testing.asserts.findDifferences(<tr><td><a id="l778"></a><a href="#l778">778</a><td> v1, v2, equalityPredicate);<tr><td><a id="l779"></a><a href="#l779">779</a><td><tr><td><a id="l780"></a><a href="#l780">780</a><td> _assert(failureMessage, !differences, differences);<tr><td><a id="l781"></a><a href="#l781">781</a><td>};<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> * Compares two arbitrary objects for non-equalness.<tr><td><a id="l786"></a><a href="#l786">786</a><td> *<tr><td><a id="l787"></a><a href="#l787">787</a><td> * All the same caveats as for assertObjectEquals apply here:<tr><td><a id="l788"></a><a href="#l788">788</a><td> * Undefined values may be confused for missing values, or vice versa.<tr><td><a id="l789"></a><a href="#l789">789</a><td> *<tr><td><a id="l790"></a><a href="#l790">790</a><td> * @param {*} a Assertion message or comparison object.<tr><td><a id="l791"></a><a href="#l791">791</a><td> * @param {*} b Comparison object.<tr><td><a id="l792"></a><a href="#l792">792</a><td> * @param {*=} opt_c Comparison object, if an assertion message was provided.<tr><td><a id="l793"></a><a href="#l793">793</a><td> */<tr><td><a id="l794"></a><a href="#l794">794</a><td>var assertObjectNotEquals = function(a, b, opt_c) {<tr><td><a id="l795"></a><a href="#l795">795</a><td> _validateArguments(2, arguments);<tr><td><a id="l796"></a><a href="#l796">796</a><td> var v1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l797"></a><a href="#l797">797</a><td> var v2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l798"></a><a href="#l798">798</a><td> var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : &#39;&#39;;<tr><td><a id="l799"></a><a href="#l799">799</a><td> var differences = goog.testing.asserts.findDifferences(v1, v2);<tr><td><a id="l800"></a><a href="#l800">800</a><td><tr><td><a id="l801"></a><a href="#l801">801</a><td> _assert(failureMessage, differences, &#39;Objects should not be equal&#39;);<tr><td><a id="l802"></a><a href="#l802">802</a><td>};<tr><td><a id="l803"></a><a href="#l803">803</a><td><tr><td><a id="l804"></a><a href="#l804">804</a><td><tr><td><a id="l805"></a><a href="#l805">805</a><td>/**<tr><td><a id="l806"></a><a href="#l806">806</a><td> * Compares two arrays ignoring negative indexes and extra properties on the<tr><td><a id="l807"></a><a href="#l807">807</a><td> * array objects. Use case: Internet Explorer adds the index, lastIndex and<tr><td><a id="l808"></a><a href="#l808">808</a><td> * input enumerable fields to the result of string.match(/regexp/g), which makes<tr><td><a id="l809"></a><a href="#l809">809</a><td> * assertObjectEquals fail.<tr><td><a id="l810"></a><a href="#l810">810</a><td> * @param {*} a The expected array (2 args) or the debug message (3 args).<tr><td><a id="l811"></a><a href="#l811">811</a><td> * @param {*} b The actual array (2 args) or the expected array (3 args).<tr><td><a id="l812"></a><a href="#l812">812</a><td> * @param {*=} opt_c The actual array (3 args only).<tr><td><a id="l813"></a><a href="#l813">813</a><td> */<tr><td><a id="l814"></a><a href="#l814">814</a><td>var assertArrayEquals = function(a, b, opt_c) {<tr><td><a id="l815"></a><a href="#l815">815</a><td> _validateArguments(2, arguments);<tr><td><a id="l816"></a><a href="#l816">816</a><td> var v1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l817"></a><a href="#l817">817</a><td> var v2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l818"></a><a href="#l818">818</a><td> var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : &#39;&#39;;<tr><td><a id="l819"></a><a href="#l819">819</a><td><tr><td><a id="l820"></a><a href="#l820">820</a><td> var typeOfVar1 = _trueTypeOf(v1);<tr><td><a id="l821"></a><a href="#l821">821</a><td> _assert(failureMessage,<tr><td><a id="l822"></a><a href="#l822">822</a><td> typeOfVar1 == &#39;Array&#39;,<tr><td><a id="l823"></a><a href="#l823">823</a><td> &#39;Expected an array for assertArrayEquals but found a &#39; + typeOfVar1);<tr><td><a id="l824"></a><a href="#l824">824</a><td><tr><td><a id="l825"></a><a href="#l825">825</a><td> var typeOfVar2 = _trueTypeOf(v2);<tr><td><a id="l826"></a><a href="#l826">826</a><td> _assert(failureMessage,<tr><td><a id="l827"></a><a href="#l827">827</a><td> typeOfVar2 == &#39;Array&#39;,<tr><td><a id="l828"></a><a href="#l828">828</a><td> &#39;Expected an array for assertArrayEquals but found a &#39; + typeOfVar2);<tr><td><a id="l829"></a><a href="#l829">829</a><td><tr><td><a id="l830"></a><a href="#l830">830</a><td> assertObjectEquals(failureMessage,<tr><td><a id="l831"></a><a href="#l831">831</a><td> Array.prototype.concat.call(v1), Array.prototype.concat.call(v2));<tr><td><a id="l832"></a><a href="#l832">832</a><td>};<tr><td><a id="l833"></a><a href="#l833">833</a><td><tr><td><a id="l834"></a><a href="#l834">834</a><td><tr><td><a id="l835"></a><a href="#l835">835</a><td>/**<tr><td><a id="l836"></a><a href="#l836">836</a><td> * Compares two objects that can be accessed like an array and assert that<tr><td><a id="l837"></a><a href="#l837">837</a><td> * each element is equal.<tr><td><a id="l838"></a><a href="#l838">838</a><td> * @param {string|Object} a Failure message (3 arguments)<tr><td><a id="l839"></a><a href="#l839">839</a><td> * or object #1 (2 arguments).<tr><td><a id="l840"></a><a href="#l840">840</a><td> * @param {Object} b Object #1 (2 arguments) or object #2 (3 arguments).<tr><td><a id="l841"></a><a href="#l841">841</a><td> * @param {Object=} opt_c Object #2 (3 arguments).<tr><td><a id="l842"></a><a href="#l842">842</a><td> */<tr><td><a id="l843"></a><a href="#l843">843</a><td>var assertElementsEquals = function(a, b, opt_c) {<tr><td><a id="l844"></a><a href="#l844">844</a><td> _validateArguments(2, arguments);<tr><td><a id="l845"></a><a href="#l845">845</a><td><tr><td><a id="l846"></a><a href="#l846">846</a><td> var v1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l847"></a><a href="#l847">847</a><td> var v2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l848"></a><a href="#l848">848</a><td> var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : &#39;&#39;;<tr><td><a id="l849"></a><a href="#l849">849</a><td><tr><td><a id="l850"></a><a href="#l850">850</a><td> if (!v1) {<tr><td><a id="l851"></a><a href="#l851">851</a><td> assert(failureMessage, !v2);<tr><td><a id="l852"></a><a href="#l852">852</a><td> } else {<tr><td><a id="l853"></a><a href="#l853">853</a><td> assertEquals(&#39;length mismatch: &#39; + failureMessage, v1.length, v2.length);<tr><td><a id="l854"></a><a href="#l854">854</a><td> for (var i = 0; i &lt; v1.length; ++i) {<tr><td><a id="l855"></a><a href="#l855">855</a><td> assertEquals(<tr><td><a id="l856"></a><a href="#l856">856</a><td> &#39;mismatch at index &#39; + i + &#39;: &#39; + failureMessage, v1[i], v2[i]);<tr><td><a id="l857"></a><a href="#l857">857</a><td> }<tr><td><a id="l858"></a><a href="#l858">858</a><td> }<tr><td><a id="l859"></a><a href="#l859">859</a><td>};<tr><td><a id="l860"></a><a href="#l860">860</a><td><tr><td><a id="l861"></a><a href="#l861">861</a><td><tr><td><a id="l862"></a><a href="#l862">862</a><td>/**<tr><td><a id="l863"></a><a href="#l863">863</a><td> * Compares two objects that can be accessed like an array and assert that<tr><td><a id="l864"></a><a href="#l864">864</a><td> * each element is roughly equal.<tr><td><a id="l865"></a><a href="#l865">865</a><td> * @param {string|Object} a Failure message (4 arguments)<tr><td><a id="l866"></a><a href="#l866">866</a><td> * or object #1 (3 arguments).<tr><td><a id="l867"></a><a href="#l867">867</a><td> * @param {Object} b Object #1 (4 arguments) or object #2 (3 arguments).<tr><td><a id="l868"></a><a href="#l868">868</a><td> * @param {Object|number} c Object #2 (4 arguments) or tolerance (3 arguments).<tr><td><a id="l869"></a><a href="#l869">869</a><td> * @param {number=} opt_d tolerance (4 arguments).<tr><td><a id="l870"></a><a href="#l870">870</a><td> */<tr><td><a id="l871"></a><a href="#l871">871</a><td>var assertElementsRoughlyEqual = function(a, b, c, opt_d) {<tr><td><a id="l872"></a><a href="#l872">872</a><td> _validateArguments(3, arguments);<tr><td><a id="l873"></a><a href="#l873">873</a><td><tr><td><a id="l874"></a><a href="#l874">874</a><td> var v1 = nonCommentArg(1, 3, arguments);<tr><td><a id="l875"></a><a href="#l875">875</a><td> var v2 = nonCommentArg(2, 3, arguments);<tr><td><a id="l876"></a><a href="#l876">876</a><td> var tolerance = nonCommentArg(3, 3, arguments);<tr><td><a id="l877"></a><a href="#l877">877</a><td> var failureMessage = commentArg(3, arguments) ? commentArg(3, arguments) : &#39;&#39;;<tr><td><a id="l878"></a><a href="#l878">878</a><td><tr><td><a id="l879"></a><a href="#l879">879</a><td> if (!v1) {<tr><td><a id="l880"></a><a href="#l880">880</a><td> assert(failureMessage, !v2);<tr><td><a id="l881"></a><a href="#l881">881</a><td> } else {<tr><td><a id="l882"></a><a href="#l882">882</a><td> assertEquals(&#39;length mismatch: &#39; + failureMessage, v1.length, v2.length);<tr><td><a id="l883"></a><a href="#l883">883</a><td> for (var i = 0; i &lt; v1.length; ++i) {<tr><td><a id="l884"></a><a href="#l884">884</a><td> assertRoughlyEquals(failureMessage, v1[i], v2[i], tolerance);<tr><td><a id="l885"></a><a href="#l885">885</a><td> }<tr><td><a id="l886"></a><a href="#l886">886</a><td> }<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> * Compares two array-like objects without taking their order into account.<tr><td><a id="l892"></a><a href="#l892">892</a><td> * @param {string|goog.testing.asserts.ArrayLike} a Assertion message or the<tr><td><a id="l893"></a><a href="#l893">893</a><td> * expected elements.<tr><td><a id="l894"></a><a href="#l894">894</a><td> * @param {goog.testing.asserts.ArrayLike} b Expected elements or the actual<tr><td><a id="l895"></a><a href="#l895">895</a><td> * elements.<tr><td><a id="l896"></a><a href="#l896">896</a><td> * @param {goog.testing.asserts.ArrayLike=} opt_c Actual elements.<tr><td><a id="l897"></a><a href="#l897">897</a><td> */<tr><td><a id="l898"></a><a href="#l898">898</a><td>var assertSameElements = function(a, b, opt_c) {<tr><td><a id="l899"></a><a href="#l899">899</a><td> _validateArguments(2, arguments);<tr><td><a id="l900"></a><a href="#l900">900</a><td> var expected = nonCommentArg(1, 2, arguments);<tr><td><a id="l901"></a><a href="#l901">901</a><td> var actual = nonCommentArg(2, 2, arguments);<tr><td><a id="l902"></a><a href="#l902">902</a><td> var message = commentArg(2, arguments);<tr><td><a id="l903"></a><a href="#l903">903</a><td><tr><td><a id="l904"></a><a href="#l904">904</a><td> assertTrue(&#39;Bad arguments to assertSameElements(opt_message, expected: &#39; +<tr><td><a id="l905"></a><a href="#l905">905</a><td> &#39;ArrayLike, actual: ArrayLike)&#39;,<tr><td><a id="l906"></a><a href="#l906">906</a><td> goog.isArrayLike(expected) &amp;&amp; goog.isArrayLike(actual));<tr><td><a id="l907"></a><a href="#l907">907</a><td><tr><td><a id="l908"></a><a href="#l908">908</a><td> // Clones expected and actual and converts them to real arrays.<tr><td><a id="l909"></a><a href="#l909">909</a><td> expected = goog.testing.asserts.toArray_(expected);<tr><td><a id="l910"></a><a href="#l910">910</a><td> actual = goog.testing.asserts.toArray_(actual);<tr><td><a id="l911"></a><a href="#l911">911</a><td> // TODO(user): It would be great to show only the difference<tr><td><a id="l912"></a><a href="#l912">912</a><td> // between the expected and actual elements.<tr><td><a id="l913"></a><a href="#l913">913</a><td> _assert(message, expected.length == actual.length,<tr><td><a id="l914"></a><a href="#l914">914</a><td> &#39;Expected &#39; + expected.length + &#39; elements: [&#39; + expected + &#39;], &#39; +<tr><td><a id="l915"></a><a href="#l915">915</a><td> &#39;got &#39; + actual.length + &#39; elements: [&#39; + actual + &#39;]&#39;);<tr><td><a id="l916"></a><a href="#l916">916</a><td><tr><td><a id="l917"></a><a href="#l917">917</a><td> var toFind = goog.testing.asserts.toArray_(expected);<tr><td><a id="l918"></a><a href="#l918">918</a><td> for (var i = 0; i &lt; actual.length; i++) {<tr><td><a id="l919"></a><a href="#l919">919</a><td> var index = goog.testing.asserts.indexOf_(toFind, actual[i]);<tr><td><a id="l920"></a><a href="#l920">920</a><td> _assert(message, index != -1, &#39;Expected [&#39; + expected + &#39;], got [&#39; +<tr><td><a id="l921"></a><a href="#l921">921</a><td> actual + &#39;]&#39;);<tr><td><a id="l922"></a><a href="#l922">922</a><td> toFind.splice(index, 1);<tr><td><a id="l923"></a><a href="#l923">923</a><td> }<tr><td><a id="l924"></a><a href="#l924">924</a><td>};<tr><td><a id="l925"></a><a href="#l925">925</a><td><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> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l929"></a><a href="#l929">929</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l930"></a><a href="#l930">930</a><td> */<tr><td><a id="l931"></a><a href="#l931">931</a><td>var assertEvaluatesToTrue = function(a, opt_b) {<tr><td><a id="l932"></a><a href="#l932">932</a><td> _validateArguments(1, arguments);<tr><td><a id="l933"></a><a href="#l933">933</a><td> var value = nonCommentArg(1, 1, arguments);<tr><td><a id="l934"></a><a href="#l934">934</a><td> if (!value) {<tr><td><a id="l935"></a><a href="#l935">935</a><td> _assert(commentArg(1, arguments), false, &#39;Expected to evaluate to true&#39;);<tr><td><a id="l936"></a><a href="#l936">936</a><td> }<tr><td><a id="l937"></a><a href="#l937">937</a><td>};<tr><td><a id="l938"></a><a href="#l938">938</a><td><tr><td><a id="l939"></a><a href="#l939">939</a><td><tr><td><a id="l940"></a><a href="#l940">940</a><td>/**<tr><td><a id="l941"></a><a href="#l941">941</a><td> * @param {*} a The value to assert (1 arg) or debug message (2 args).<tr><td><a id="l942"></a><a href="#l942">942</a><td> * @param {*=} opt_b The value to assert (2 args only).<tr><td><a id="l943"></a><a href="#l943">943</a><td> */<tr><td><a id="l944"></a><a href="#l944">944</a><td>var assertEvaluatesToFalse = function(a, opt_b) {<tr><td><a id="l945"></a><a href="#l945">945</a><td> _validateArguments(1, arguments);<tr><td><a id="l946"></a><a href="#l946">946</a><td> var value = nonCommentArg(1, 1, arguments);<tr><td><a id="l947"></a><a href="#l947">947</a><td> if (value) {<tr><td><a id="l948"></a><a href="#l948">948</a><td> _assert(commentArg(1, arguments), false, &#39;Expected to evaluate to false&#39;);<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><tr><td><a id="l952"></a><a href="#l952">952</a><td><tr><td><a id="l953"></a><a href="#l953">953</a><td>/**<tr><td><a id="l954"></a><a href="#l954">954</a><td> * Compares two HTML snippets.<tr><td><a id="l955"></a><a href="#l955">955</a><td> *<tr><td><a id="l956"></a><a href="#l956">956</a><td> * Take extra care if attributes are involved. {@code assertHTMLEquals}&#39;s<tr><td><a id="l957"></a><a href="#l957">957</a><td> * implementation isn&#39;t prepared for complex cases. For example, the following<tr><td><a id="l958"></a><a href="#l958">958</a><td> * comparisons erroneously fail:<tr><td><a id="l959"></a><a href="#l959">959</a><td> * &lt;pre&gt;<tr><td><a id="l960"></a><a href="#l960">960</a><td> * assertHTMLEquals(&#39;&lt;a href=&quot;x&quot; target=&quot;y&quot;&gt;&#39;, &#39;&lt;a target=&quot;y&quot; href=&quot;x&quot;&gt;&#39;);<tr><td><a id="l961"></a><a href="#l961">961</a><td> * assertHTMLEquals(&#39;&lt;div class=&quot;a b&quot;&gt;&#39;, &#39;&lt;div class=&quot;b a&quot;&gt;&#39;);<tr><td><a id="l962"></a><a href="#l962">962</a><td> * assertHTMLEquals(&#39;&lt;input disabled&gt;&#39;, &#39;&lt;input disabled=&quot;disabled&quot;&gt;&#39;);<tr><td><a id="l963"></a><a href="#l963">963</a><td> * &lt;/pre&gt;<tr><td><a id="l964"></a><a href="#l964">964</a><td> *<tr><td><a id="l965"></a><a href="#l965">965</a><td> * When in doubt, use {@code goog.testing.dom.assertHtmlMatches}.<tr><td><a id="l966"></a><a href="#l966">966</a><td> *<tr><td><a id="l967"></a><a href="#l967">967</a><td> * @param {*} a The expected value (2 args) or the debug message (3 args).<tr><td><a id="l968"></a><a href="#l968">968</a><td> * @param {*} b The actual value (2 args) or the expected value (3 args).<tr><td><a id="l969"></a><a href="#l969">969</a><td> * @param {*=} opt_c The actual value (3 args only).<tr><td><a id="l970"></a><a href="#l970">970</a><td> */<tr><td><a id="l971"></a><a href="#l971">971</a><td>var assertHTMLEquals = function(a, b, opt_c) {<tr><td><a id="l972"></a><a href="#l972">972</a><td> _validateArguments(2, arguments);<tr><td><a id="l973"></a><a href="#l973">973</a><td> var var1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l974"></a><a href="#l974">974</a><td> var var2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l975"></a><a href="#l975">975</a><td> var var1Standardized = standardizeHTML(var1);<tr><td><a id="l976"></a><a href="#l976">976</a><td> var var2Standardized = standardizeHTML(var2);<tr><td><a id="l977"></a><a href="#l977">977</a><td><tr><td><a id="l978"></a><a href="#l978">978</a><td> _assert(commentArg(2, arguments), var1Standardized === var2Standardized,<tr><td><a id="l979"></a><a href="#l979">979</a><td> goog.testing.asserts.getDefaultErrorMsg_(<tr><td><a id="l980"></a><a href="#l980">980</a><td> var1Standardized, var2Standardized));<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><tr><td><a id="l984"></a><a href="#l984">984</a><td>/**<tr><td><a id="l985"></a><a href="#l985">985</a><td> * Compares two CSS property values to make sure that they represent the same<tr><td><a id="l986"></a><a href="#l986">986</a><td> * things. This will normalize values in the browser. For example, in Firefox,<tr><td><a id="l987"></a><a href="#l987">987</a><td> * this assertion will consider &quot;rgb(0, 0, 255)&quot; and &quot;#0000ff&quot; to be identical<tr><td><a id="l988"></a><a href="#l988">988</a><td> * values for the &quot;color&quot; property. This function won&#39;t normalize everything --<tr><td><a id="l989"></a><a href="#l989">989</a><td> * for example, in most browsers, &quot;blue&quot; will not match &quot;#0000ff&quot;. It is<tr><td><a id="l990"></a><a href="#l990">990</a><td> * intended only to compensate for unexpected normalizations performed by<tr><td><a id="l991"></a><a href="#l991">991</a><td> * the browser that should also affect your expected value.<tr><td><a id="l992"></a><a href="#l992">992</a><td> * @param {string} a Assertion message, or the CSS property name.<tr><td><a id="l993"></a><a href="#l993">993</a><td> * @param {string} b CSS property name, or the expected value.<tr><td><a id="l994"></a><a href="#l994">994</a><td> * @param {string} c The expected value, or the actual value.<tr><td><a id="l995"></a><a href="#l995">995</a><td> * @param {string=} opt_d The actual value.<tr><td><a id="l996"></a><a href="#l996">996</a><td> */<tr><td><a id="l997"></a><a href="#l997">997</a><td>var assertCSSValueEquals = function(a, b, c, opt_d) {<tr><td><a id="l998"></a><a href="#l998">998</a><td> _validateArguments(3, arguments);<tr><td><a id="l999"></a><a href="#l999">999</a><td> var propertyName = nonCommentArg(1, 3, arguments);<tr><td><a id="l1000"></a><a href="#l1000">1000</a><td> var expectedValue = nonCommentArg(2, 3, arguments);<tr><td><a id="l1001"></a><a href="#l1001">1001</a><td> var actualValue = nonCommentArg(3, 3, arguments);<tr><td><a id="l1002"></a><a href="#l1002">1002</a><td> var expectedValueStandardized =<tr><td><a id="l1003"></a><a href="#l1003">1003</a><td> standardizeCSSValue(propertyName, expectedValue);<tr><td><a id="l1004"></a><a href="#l1004">1004</a><td> var actualValueStandardized =<tr><td><a id="l1005"></a><a href="#l1005">1005</a><td> standardizeCSSValue(propertyName, actualValue);<tr><td><a id="l1006"></a><a href="#l1006">1006</a><td><tr><td><a id="l1007"></a><a href="#l1007">1007</a><td> _assert(commentArg(3, arguments),<tr><td><a id="l1008"></a><a href="#l1008">1008</a><td> expectedValueStandardized == actualValueStandardized,<tr><td><a id="l1009"></a><a href="#l1009">1009</a><td> goog.testing.asserts.getDefaultErrorMsg_(<tr><td><a id="l1010"></a><a href="#l1010">1010</a><td> expectedValueStandardized, actualValueStandardized));<tr><td><a id="l1011"></a><a href="#l1011">1011</a><td>};<tr><td><a id="l1012"></a><a href="#l1012">1012</a><td><tr><td><a id="l1013"></a><a href="#l1013">1013</a><td><tr><td><a id="l1014"></a><a href="#l1014">1014</a><td>/**<tr><td><a id="l1015"></a><a href="#l1015">1015</a><td> * @param {*} a The expected value (2 args) or the debug message (3 args).<tr><td><a id="l1016"></a><a href="#l1016">1016</a><td> * @param {*} b The actual value (2 args) or the expected value (3 args).<tr><td><a id="l1017"></a><a href="#l1017">1017</a><td> * @param {*=} opt_c The actual value (3 args only).<tr><td><a id="l1018"></a><a href="#l1018">1018</a><td> */<tr><td><a id="l1019"></a><a href="#l1019">1019</a><td>var assertHashEquals = function(a, b, opt_c) {<tr><td><a id="l1020"></a><a href="#l1020">1020</a><td> _validateArguments(2, arguments);<tr><td><a id="l1021"></a><a href="#l1021">1021</a><td> var var1 = nonCommentArg(1, 2, arguments);<tr><td><a id="l1022"></a><a href="#l1022">1022</a><td> var var2 = nonCommentArg(2, 2, arguments);<tr><td><a id="l1023"></a><a href="#l1023">1023</a><td> var message = commentArg(2, arguments);<tr><td><a id="l1024"></a><a href="#l1024">1024</a><td> for (var key in var1) {<tr><td><a id="l1025"></a><a href="#l1025">1025</a><td> _assert(message,<tr><td><a id="l1026"></a><a href="#l1026">1026</a><td> key in var2, &#39;Expected hash had key &#39; + key + &#39; that was not found&#39;);<tr><td><a id="l1027"></a><a href="#l1027">1027</a><td> _assert(message, var1[key] == var2[key], &#39;Value for key &#39; + key +<tr><td><a id="l1028"></a><a href="#l1028">1028</a><td> &#39; mismatch - expected = &#39; + var1[key] + &#39;, actual = &#39; + var2[key]);<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> for (var key in var2) {<tr><td><a id="l1032"></a><a href="#l1032">1032</a><td> _assert(message, key in var1, &#39;Actual hash had key &#39; + key +<tr><td><a id="l1033"></a><a href="#l1033">1033</a><td> &#39; that was not expected&#39;);<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>/**<tr><td><a id="l1039"></a><a href="#l1039">1039</a><td> * @param {*} a The expected value (3 args) or the debug message (4 args).<tr><td><a id="l1040"></a><a href="#l1040">1040</a><td> * @param {*} b The actual value (3 args) or the expected value (4 args).<tr><td><a id="l1041"></a><a href="#l1041">1041</a><td> * @param {*} c The tolerance (3 args) or the actual value (4 args).<tr><td><a id="l1042"></a><a href="#l1042">1042</a><td> * @param {*=} opt_d The tolerance (4 args only).<tr><td><a id="l1043"></a><a href="#l1043">1043</a><td> */<tr><td><a id="l1044"></a><a href="#l1044">1044</a><td>var assertRoughlyEquals = function(a, b, c, opt_d) {<tr><td><a id="l1045"></a><a href="#l1045">1045</a><td> _validateArguments(3, arguments);<tr><td><a id="l1046"></a><a href="#l1046">1046</a><td> var expected = nonCommentArg(1, 3, arguments);<tr><td><a id="l1047"></a><a href="#l1047">1047</a><td> var actual = nonCommentArg(2, 3, arguments);<tr><td><a id="l1048"></a><a href="#l1048">1048</a><td> var tolerance = nonCommentArg(3, 3, arguments);<tr><td><a id="l1049"></a><a href="#l1049">1049</a><td> _assert(commentArg(3, arguments),<tr><td><a id="l1050"></a><a href="#l1050">1050</a><td> goog.testing.asserts.numberRoughEqualityPredicate_(<tr><td><a id="l1051"></a><a href="#l1051">1051</a><td> expected, actual, tolerance),<tr><td><a id="l1052"></a><a href="#l1052">1052</a><td> &#39;Expected &#39; + expected + &#39;, but got &#39; + actual +<tr><td><a id="l1053"></a><a href="#l1053">1053</a><td> &#39; which was more than &#39; + tolerance + &#39; away&#39;);<tr><td><a id="l1054"></a><a href="#l1054">1054</a><td>};<tr><td><a id="l1055"></a><a href="#l1055">1055</a><td><tr><td><a id="l1056"></a><a href="#l1056">1056</a><td><tr><td><a id="l1057"></a><a href="#l1057">1057</a><td>/**<tr><td><a id="l1058"></a><a href="#l1058">1058</a><td> * Checks if the test value is a member of the given container. Uses<tr><td><a id="l1059"></a><a href="#l1059">1059</a><td> * container.indexOf as the underlying function, so this works for strings<tr><td><a id="l1060"></a><a href="#l1060">1060</a><td> * and arrays.<tr><td><a id="l1061"></a><a href="#l1061">1061</a><td> * @param {*} a Failure message (3 arguments) or the test value<tr><td><a id="l1062"></a><a href="#l1062">1062</a><td> * (2 arguments).<tr><td><a id="l1063"></a><a href="#l1063">1063</a><td> * @param {*} b The test value (3 arguments) or the container<tr><td><a id="l1064"></a><a href="#l1064">1064</a><td> * (2 arguments).<tr><td><a id="l1065"></a><a href="#l1065">1065</a><td> * @param {*=} opt_c The container.<tr><td><a id="l1066"></a><a href="#l1066">1066</a><td> */<tr><td><a id="l1067"></a><a href="#l1067">1067</a><td>var assertContains = function(a, b, opt_c) {<tr><td><a id="l1068"></a><a href="#l1068">1068</a><td> _validateArguments(2, arguments);<tr><td><a id="l1069"></a><a href="#l1069">1069</a><td> var contained = nonCommentArg(1, 2, arguments);<tr><td><a id="l1070"></a><a href="#l1070">1070</a><td> var container = nonCommentArg(2, 2, arguments);<tr><td><a id="l1071"></a><a href="#l1071">1071</a><td> _assert(commentArg(2, arguments),<tr><td><a id="l1072"></a><a href="#l1072">1072</a><td> goog.testing.asserts.contains_(container, contained),<tr><td><a id="l1073"></a><a href="#l1073">1073</a><td> &#39;Expected \&#39;&#39; + container + &#39;\&#39; to contain \&#39;&#39; + contained + &#39;\&#39;&#39;);<tr><td><a id="l1074"></a><a href="#l1074">1074</a><td>};<tr><td><a id="l1075"></a><a href="#l1075">1075</a><td><tr><td><a id="l1076"></a><a href="#l1076">1076</a><td><tr><td><a id="l1077"></a><a href="#l1077">1077</a><td>/**<tr><td><a id="l1078"></a><a href="#l1078">1078</a><td> * Checks if the given element is not the member of the given container.<tr><td><a id="l1079"></a><a href="#l1079">1079</a><td> * @param {*} a Failure message (3 arguments) or the contained element<tr><td><a id="l1080"></a><a href="#l1080">1080</a><td> * (2 arguments).<tr><td><a id="l1081"></a><a href="#l1081">1081</a><td> * @param {*} b The contained element (3 arguments) or the container<tr><td><a id="l1082"></a><a href="#l1082">1082</a><td> * (2 arguments).<tr><td><a id="l1083"></a><a href="#l1083">1083</a><td> * @param {*=} opt_c The container.<tr><td><a id="l1084"></a><a href="#l1084">1084</a><td> */<tr><td><a id="l1085"></a><a href="#l1085">1085</a><td>var assertNotContains = function(a, b, opt_c) {<tr><td><a id="l1086"></a><a href="#l1086">1086</a><td> _validateArguments(2, arguments);<tr><td><a id="l1087"></a><a href="#l1087">1087</a><td> var contained = nonCommentArg(1, 2, arguments);<tr><td><a id="l1088"></a><a href="#l1088">1088</a><td> var container = nonCommentArg(2, 2, arguments);<tr><td><a id="l1089"></a><a href="#l1089">1089</a><td> _assert(commentArg(2, arguments),<tr><td><a id="l1090"></a><a href="#l1090">1090</a><td> !goog.testing.asserts.contains_(container, contained),<tr><td><a id="l1091"></a><a href="#l1091">1091</a><td> &#39;Expected \&#39;&#39; + container + &#39;\&#39; not to contain \&#39;&#39; + contained + &#39;\&#39;&#39;);<tr><td><a id="l1092"></a><a href="#l1092">1092</a><td>};<tr><td><a id="l1093"></a><a href="#l1093">1093</a><td><tr><td><a id="l1094"></a><a href="#l1094">1094</a><td><tr><td><a id="l1095"></a><a href="#l1095">1095</a><td>/**<tr><td><a id="l1096"></a><a href="#l1096">1096</a><td> * Checks if the given string matches the given regular expression.<tr><td><a id="l1097"></a><a href="#l1097">1097</a><td> * @param {*} a Failure message (3 arguments) or the expected regular<tr><td><a id="l1098"></a><a href="#l1098">1098</a><td> * expression as a string or RegExp (2 arguments).<tr><td><a id="l1099"></a><a href="#l1099">1099</a><td> * @param {*} b The regular expression (3 arguments) or the string to test<tr><td><a id="l1100"></a><a href="#l1100">1100</a><td> * (2 arguments).<tr><td><a id="l1101"></a><a href="#l1101">1101</a><td> * @param {*=} opt_c The string to test.<tr><td><a id="l1102"></a><a href="#l1102">1102</a><td> */<tr><td><a id="l1103"></a><a href="#l1103">1103</a><td>var assertRegExp = function(a, b, opt_c) {<tr><td><a id="l1104"></a><a href="#l1104">1104</a><td> _validateArguments(2, arguments);<tr><td><a id="l1105"></a><a href="#l1105">1105</a><td> var regexp = nonCommentArg(1, 2, arguments);<tr><td><a id="l1106"></a><a href="#l1106">1106</a><td> var string = nonCommentArg(2, 2, arguments);<tr><td><a id="l1107"></a><a href="#l1107">1107</a><td> if (typeof(regexp) == &#39;string&#39;) {<tr><td><a id="l1108"></a><a href="#l1108">1108</a><td> regexp = new RegExp(regexp);<tr><td><a id="l1109"></a><a href="#l1109">1109</a><td> }<tr><td><a id="l1110"></a><a href="#l1110">1110</a><td> _assert(commentArg(2, arguments),<tr><td><a id="l1111"></a><a href="#l1111">1111</a><td> regexp.test(string),<tr><td><a id="l1112"></a><a href="#l1112">1112</a><td> &#39;Expected \&#39;&#39; + string + &#39;\&#39; to match RegExp &#39; + regexp.toString());<tr><td><a id="l1113"></a><a href="#l1113">1113</a><td>};<tr><td><a id="l1114"></a><a href="#l1114">1114</a><td><tr><td><a id="l1115"></a><a href="#l1115">1115</a><td><tr><td><a id="l1116"></a><a href="#l1116">1116</a><td>/**<tr><td><a id="l1117"></a><a href="#l1117">1117</a><td> * Converts an array like object to array or clones it if it&#39;s already array.<tr><td><a id="l1118"></a><a href="#l1118">1118</a><td> * @param {goog.testing.asserts.ArrayLike} arrayLike The collection.<tr><td><a id="l1119"></a><a href="#l1119">1119</a><td> * @return {!Array&lt;?&gt;} Copy of the collection as array.<tr><td><a id="l1120"></a><a href="#l1120">1120</a><td> * @private<tr><td><a id="l1121"></a><a href="#l1121">1121</a><td> */<tr><td><a id="l1122"></a><a href="#l1122">1122</a><td>goog.testing.asserts.toArray_ = function(arrayLike) {<tr><td><a id="l1123"></a><a href="#l1123">1123</a><td> var ret = [];<tr><td><a id="l1124"></a><a href="#l1124">1124</a><td> for (var i = 0; i &lt; arrayLike.length; i++) {<tr><td><a id="l1125"></a><a href="#l1125">1125</a><td> ret[i] = arrayLike[i];<tr><td><a id="l1126"></a><a href="#l1126">1126</a><td> }<tr><td><a id="l1127"></a><a href="#l1127">1127</a><td> return ret;<tr><td><a id="l1128"></a><a href="#l1128">1128</a><td>};<tr><td><a id="l1129"></a><a href="#l1129">1129</a><td><tr><td><a id="l1130"></a><a href="#l1130">1130</a><td><tr><td><a id="l1131"></a><a href="#l1131">1131</a><td>/**<tr><td><a id="l1132"></a><a href="#l1132">1132</a><td> * Finds the position of the first occurrence of an element in a container.<tr><td><a id="l1133"></a><a href="#l1133">1133</a><td> * @param {goog.testing.asserts.ArrayLike} container<tr><td><a id="l1134"></a><a href="#l1134">1134</a><td> * The array to find the element in.<tr><td><a id="l1135"></a><a href="#l1135">1135</a><td> * @param {*} contained Element to find.<tr><td><a id="l1136"></a><a href="#l1136">1136</a><td> * @return {number} Index of the first occurrence or -1 if not found.<tr><td><a id="l1137"></a><a href="#l1137">1137</a><td> * @private<tr><td><a id="l1138"></a><a href="#l1138">1138</a><td> */<tr><td><a id="l1139"></a><a href="#l1139">1139</a><td>goog.testing.asserts.indexOf_ = function(container, contained) {<tr><td><a id="l1140"></a><a href="#l1140">1140</a><td> if (container.indexOf) {<tr><td><a id="l1141"></a><a href="#l1141">1141</a><td> return container.indexOf(contained);<tr><td><a id="l1142"></a><a href="#l1142">1142</a><td> } else {<tr><td><a id="l1143"></a><a href="#l1143">1143</a><td> // IE6/7 do not have indexOf so do a search.<tr><td><a id="l1144"></a><a href="#l1144">1144</a><td> for (var i = 0; i &lt; container.length; i++) {<tr><td><a id="l1145"></a><a href="#l1145">1145</a><td> if (container[i] === contained) {<tr><td><a id="l1146"></a><a href="#l1146">1146</a><td> return i;<tr><td><a id="l1147"></a><a href="#l1147">1147</a><td> }<tr><td><a id="l1148"></a><a href="#l1148">1148</a><td> }<tr><td><a id="l1149"></a><a href="#l1149">1149</a><td> return -1;<tr><td><a id="l1150"></a><a href="#l1150">1150</a><td> }<tr><td><a id="l1151"></a><a href="#l1151">1151</a><td>};<tr><td><a id="l1152"></a><a href="#l1152">1152</a><td><tr><td><a id="l1153"></a><a href="#l1153">1153</a><td><tr><td><a id="l1154"></a><a href="#l1154">1154</a><td>/**<tr><td><a id="l1155"></a><a href="#l1155">1155</a><td> * Tells whether the array contains the given element.<tr><td><a id="l1156"></a><a href="#l1156">1156</a><td> * @param {goog.testing.asserts.ArrayLike} container The array to<tr><td><a id="l1157"></a><a href="#l1157">1157</a><td> * find the element in.<tr><td><a id="l1158"></a><a href="#l1158">1158</a><td> * @param {*} contained Element to find.<tr><td><a id="l1159"></a><a href="#l1159">1159</a><td> * @return {boolean} Whether the element is in the array.<tr><td><a id="l1160"></a><a href="#l1160">1160</a><td> * @private<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.asserts.contains_ = function(container, contained) {<tr><td><a id="l1163"></a><a href="#l1163">1163</a><td> // TODO(user): Can we check for container.contains as well?<tr><td><a id="l1164"></a><a href="#l1164">1164</a><td> // That would give us support for most goog.structs (though weird results<tr><td><a id="l1165"></a><a href="#l1165">1165</a><td> // with anything else with a contains method, like goog.math.Range). Falling<tr><td><a id="l1166"></a><a href="#l1166">1166</a><td> // back with container.some would catch all iterables, too.<tr><td><a id="l1167"></a><a href="#l1167">1167</a><td> return goog.testing.asserts.indexOf_(container, contained) != -1;<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>var standardizeHTML = function(html) {<tr><td><a id="l1171"></a><a href="#l1171">1171</a><td> var translator = document.createElement(&#39;DIV&#39;);<tr><td><a id="l1172"></a><a href="#l1172">1172</a><td> translator.innerHTML = html;<tr><td><a id="l1173"></a><a href="#l1173">1173</a><td><tr><td><a id="l1174"></a><a href="#l1174">1174</a><td> // Trim whitespace from result (without relying on goog.string)<tr><td><a id="l1175"></a><a href="#l1175">1175</a><td> return translator.innerHTML.replace(/^\s+|\s+$/g, &#39;&#39;);<tr><td><a id="l1176"></a><a href="#l1176">1176</a><td>};<tr><td><a id="l1177"></a><a href="#l1177">1177</a><td><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> * Standardizes a CSS value for a given property by applying it to an element<tr><td><a id="l1181"></a><a href="#l1181">1181</a><td> * and then reading it back.<tr><td><a id="l1182"></a><a href="#l1182">1182</a><td> * @param {string} propertyName CSS property name.<tr><td><a id="l1183"></a><a href="#l1183">1183</a><td> * @param {string} value CSS value.<tr><td><a id="l1184"></a><a href="#l1184">1184</a><td> * @return {string} Normalized CSS value.<tr><td><a id="l1185"></a><a href="#l1185">1185</a><td> */<tr><td><a id="l1186"></a><a href="#l1186">1186</a><td>var standardizeCSSValue = function(propertyName, value) {<tr><td><a id="l1187"></a><a href="#l1187">1187</a><td> var styleDeclaration = document.createElement(&#39;DIV&#39;).style;<tr><td><a id="l1188"></a><a href="#l1188">1188</a><td> styleDeclaration[propertyName] = value;<tr><td><a id="l1189"></a><a href="#l1189">1189</a><td> return styleDeclaration[propertyName];<tr><td><a id="l1190"></a><a href="#l1190">1190</a><td>};<tr><td><a id="l1191"></a><a href="#l1191">1191</a><td><tr><td><a id="l1192"></a><a href="#l1192">1192</a><td><tr><td><a id="l1193"></a><a href="#l1193">1193</a><td>/**<tr><td><a id="l1194"></a><a href="#l1194">1194</a><td> * Raises a JsUnit exception with the given comment.<tr><td><a id="l1195"></a><a href="#l1195">1195</a><td> * @param {string} comment A summary for the exception.<tr><td><a id="l1196"></a><a href="#l1196">1196</a><td> * @param {string=} opt_message A description of the exception.<tr><td><a id="l1197"></a><a href="#l1197">1197</a><td> */<tr><td><a id="l1198"></a><a href="#l1198">1198</a><td>goog.testing.asserts.raiseException = function(comment, opt_message) {<tr><td><a id="l1199"></a><a href="#l1199">1199</a><td> throw new goog.testing.JsUnitException(comment, opt_message);<tr><td><a id="l1200"></a><a href="#l1200">1200</a><td>};<tr><td><a id="l1201"></a><a href="#l1201">1201</a><td><tr><td><a id="l1202"></a><a href="#l1202">1202</a><td><tr><td><a id="l1203"></a><a href="#l1203">1203</a><td>/**<tr><td><a id="l1204"></a><a href="#l1204">1204</a><td> * Helper function for assertObjectEquals.<tr><td><a id="l1205"></a><a href="#l1205">1205</a><td> * @param {string} prop A property name.<tr><td><a id="l1206"></a><a href="#l1206">1206</a><td> * @return {boolean} If the property name is an array index.<tr><td><a id="l1207"></a><a href="#l1207">1207</a><td> * @private<tr><td><a id="l1208"></a><a href="#l1208">1208</a><td> */<tr><td><a id="l1209"></a><a href="#l1209">1209</a><td>goog.testing.asserts.isArrayIndexProp_ = function(prop) {<tr><td><a id="l1210"></a><a href="#l1210">1210</a><td> return (prop | 0) == prop;<tr><td><a id="l1211"></a><a href="#l1211">1211</a><td>};<tr><td><a id="l1212"></a><a href="#l1212">1212</a><td><tr><td><a id="l1213"></a><a href="#l1213">1213</a><td><tr><td><a id="l1214"></a><a href="#l1214">1214</a><td><tr><td><a id="l1215"></a><a href="#l1215">1215</a><td>/**<tr><td><a id="l1216"></a><a href="#l1216">1216</a><td> * @param {string} comment A summary for the exception.<tr><td><a id="l1217"></a><a href="#l1217">1217</a><td> * @param {?string=} opt_message A description of the exception.<tr><td><a id="l1218"></a><a href="#l1218">1218</a><td> * @constructor<tr><td><a id="l1219"></a><a href="#l1219">1219</a><td> * @extends {Error}<tr><td><a id="l1220"></a><a href="#l1220">1220</a><td> * @final<tr><td><a id="l1221"></a><a href="#l1221">1221</a><td> */<tr><td><a id="l1222"></a><a href="#l1222">1222</a><td>goog.testing.JsUnitException = function(comment, opt_message) {<tr><td><a id="l1223"></a><a href="#l1223">1223</a><td> this.isJsUnitException = true;<tr><td><a id="l1224"></a><a href="#l1224">1224</a><td> this.message = (comment ? comment : &#39;&#39;) +<tr><td><a id="l1225"></a><a href="#l1225">1225</a><td> (comment &amp;&amp; opt_message ? &#39;\n&#39; : &#39;&#39;) +<tr><td><a id="l1226"></a><a href="#l1226">1226</a><td> (opt_message ? opt_message : &#39;&#39;);<tr><td><a id="l1227"></a><a href="#l1227">1227</a><td> this.stackTrace = goog.testing.stacktrace.get();<tr><td><a id="l1228"></a><a href="#l1228">1228</a><td> // These fields are for compatibility with jsUnitTestManager.<tr><td><a id="l1229"></a><a href="#l1229">1229</a><td> this.comment = comment || null;<tr><td><a id="l1230"></a><a href="#l1230">1230</a><td> this.jsUnitMessage = opt_message || &#39;&#39;;<tr><td><a id="l1231"></a><a href="#l1231">1231</a><td><tr><td><a id="l1232"></a><a href="#l1232">1232</a><td> // Ensure there is a stack trace.<tr><td><a id="l1233"></a><a href="#l1233">1233</a><td> if (Error.captureStackTrace) {<tr><td><a id="l1234"></a><a href="#l1234">1234</a><td> Error.captureStackTrace(this, goog.testing.JsUnitException);<tr><td><a id="l1235"></a><a href="#l1235">1235</a><td> } else {<tr><td><a id="l1236"></a><a href="#l1236">1236</a><td> this.stack = new Error().stack || &#39;&#39;;<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>goog.inherits(goog.testing.JsUnitException, Error);<tr><td><a id="l1240"></a><a href="#l1240">1240</a><td><tr><td><a id="l1241"></a><a href="#l1241">1241</a><td><tr><td><a id="l1242"></a><a href="#l1242">1242</a><td>/** @override */<tr><td><a id="l1243"></a><a href="#l1243">1243</a><td>goog.testing.JsUnitException.prototype.toString = function() {<tr><td><a id="l1244"></a><a href="#l1244">1244</a><td> return this.message;<tr><td><a id="l1245"></a><a href="#l1245">1245</a><td>};<tr><td><a id="l1246"></a><a href="#l1246">1246</a><td><tr><td><a id="l1247"></a><a href="#l1247">1247</a><td><tr><td><a id="l1248"></a><a href="#l1248">1248</a><td>goog.exportSymbol(&#39;fail&#39;, fail);<tr><td><a id="l1249"></a><a href="#l1249">1249</a><td>goog.exportSymbol(&#39;assert&#39;, assert);<tr><td><a id="l1250"></a><a href="#l1250">1250</a><td>goog.exportSymbol(&#39;assertThrows&#39;, assertThrows);<tr><td><a id="l1251"></a><a href="#l1251">1251</a><td>goog.exportSymbol(&#39;assertNotThrows&#39;, assertNotThrows);<tr><td><a id="l1252"></a><a href="#l1252">1252</a><td>goog.exportSymbol(&#39;assertTrue&#39;, assertTrue);<tr><td><a id="l1253"></a><a href="#l1253">1253</a><td>goog.exportSymbol(&#39;assertFalse&#39;, assertFalse);<tr><td><a id="l1254"></a><a href="#l1254">1254</a><td>goog.exportSymbol(&#39;assertEquals&#39;, assertEquals);<tr><td><a id="l1255"></a><a href="#l1255">1255</a><td>goog.exportSymbol(&#39;assertNotEquals&#39;, assertNotEquals);<tr><td><a id="l1256"></a><a href="#l1256">1256</a><td>goog.exportSymbol(&#39;assertNull&#39;, assertNull);<tr><td><a id="l1257"></a><a href="#l1257">1257</a><td>goog.exportSymbol(&#39;assertNotNull&#39;, assertNotNull);<tr><td><a id="l1258"></a><a href="#l1258">1258</a><td>goog.exportSymbol(&#39;assertUndefined&#39;, assertUndefined);<tr><td><a id="l1259"></a><a href="#l1259">1259</a><td>goog.exportSymbol(&#39;assertNotUndefined&#39;, assertNotUndefined);<tr><td><a id="l1260"></a><a href="#l1260">1260</a><td>goog.exportSymbol(&#39;assertNotNullNorUndefined&#39;, assertNotNullNorUndefined);<tr><td><a id="l1261"></a><a href="#l1261">1261</a><td>goog.exportSymbol(&#39;assertNonEmptyString&#39;, assertNonEmptyString);<tr><td><a id="l1262"></a><a href="#l1262">1262</a><td>goog.exportSymbol(&#39;assertNaN&#39;, assertNaN);<tr><td><a id="l1263"></a><a href="#l1263">1263</a><td>goog.exportSymbol(&#39;assertNotNaN&#39;, assertNotNaN);<tr><td><a id="l1264"></a><a href="#l1264">1264</a><td>goog.exportSymbol(&#39;assertObjectEquals&#39;, assertObjectEquals);<tr><td><a id="l1265"></a><a href="#l1265">1265</a><td>goog.exportSymbol(&#39;assertObjectRoughlyEquals&#39;, assertObjectRoughlyEquals);<tr><td><a id="l1266"></a><a href="#l1266">1266</a><td>goog.exportSymbol(&#39;assertObjectNotEquals&#39;, assertObjectNotEquals);<tr><td><a id="l1267"></a><a href="#l1267">1267</a><td>goog.exportSymbol(&#39;assertArrayEquals&#39;, assertArrayEquals);<tr><td><a id="l1268"></a><a href="#l1268">1268</a><td>goog.exportSymbol(&#39;assertElementsEquals&#39;, assertElementsEquals);<tr><td><a id="l1269"></a><a href="#l1269">1269</a><td>goog.exportSymbol(&#39;assertElementsRoughlyEqual&#39;, assertElementsRoughlyEqual);<tr><td><a id="l1270"></a><a href="#l1270">1270</a><td>goog.exportSymbol(&#39;assertSameElements&#39;, assertSameElements);<tr><td><a id="l1271"></a><a href="#l1271">1271</a><td>goog.exportSymbol(&#39;assertEvaluatesToTrue&#39;, assertEvaluatesToTrue);<tr><td><a id="l1272"></a><a href="#l1272">1272</a><td>goog.exportSymbol(&#39;assertEvaluatesToFalse&#39;, assertEvaluatesToFalse);<tr><td><a id="l1273"></a><a href="#l1273">1273</a><td>goog.exportSymbol(&#39;assertHTMLEquals&#39;, assertHTMLEquals);<tr><td><a id="l1274"></a><a href="#l1274">1274</a><td>goog.exportSymbol(&#39;assertHashEquals&#39;, assertHashEquals);<tr><td><a id="l1275"></a><a href="#l1275">1275</a><td>goog.exportSymbol(&#39;assertRoughlyEquals&#39;, assertRoughlyEquals);<tr><td><a id="l1276"></a><a href="#l1276">1276</a><td>goog.exportSymbol(&#39;assertContains&#39;, assertContains);<tr><td><a id="l1277"></a><a href="#l1277">1277</a><td>goog.exportSymbol(&#39;assertNotContains&#39;, assertNotContains);<tr><td><a id="l1278"></a><a href="#l1278">1278</a><td>goog.exportSymbol(&#39;assertRegExp&#39;, assertRegExp);</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>