mdarray-sol 0.1.0-java

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 (683) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +35 -0
  3. data/LICENSE.txt~ +73 -0
  4. data/README.md +140 -0
  5. data/README.md~ +290 -0
  6. data/Rakefile +80 -0
  7. data/config.rb +223 -0
  8. data/doc/Nashorn.html +1406 -0
  9. data/doc/Sol.html +692 -0
  10. data/doc/Sol/BarChart.html +181 -0
  11. data/doc/Sol/BaseChart.html +799 -0
  12. data/doc/Sol/Bootstrap.html +1134 -0
  13. data/doc/Sol/Bridge.html +448 -0
  14. data/doc/Sol/Chart.html +1162 -0
  15. data/doc/Sol/CoordinateChart.html +673 -0
  16. data/doc/Sol/DCFX.html +807 -0
  17. data/doc/Sol/Dashboard.html +1967 -0
  18. data/doc/Sol/ExecMessages.html +332 -0
  19. data/doc/Sol/GuiCommunication.html +230 -0
  20. data/doc/Sol/Interval.html +1213 -0
  21. data/doc/Sol/JS.html +448 -0
  22. data/doc/Sol/LineChart.html +344 -0
  23. data/doc/Sol/LinearScale.html +334 -0
  24. data/doc/Sol/Margins.html +219 -0
  25. data/doc/Sol/OrdinalScale.html +263 -0
  26. data/doc/Sol/ReadBuffer.html +302 -0
  27. data/doc/Sol/Scale.html +462 -0
  28. data/doc/Sol/Stack.html +199 -0
  29. data/doc/Sol/TimeScale.html +396 -0
  30. data/doc/_index.html +362 -0
  31. data/doc/class_list.html +58 -0
  32. data/doc/css/common.css +1 -0
  33. data/doc/css/full_list.css +57 -0
  34. data/doc/css/style.css +339 -0
  35. data/doc/file.README.html +95 -0
  36. data/doc/file_list.html +60 -0
  37. data/doc/frames.html +26 -0
  38. data/doc/index.html +95 -0
  39. data/doc/js/app.js +219 -0
  40. data/doc/js/full_list.js +181 -0
  41. data/doc/js/jquery.js +4 -0
  42. data/doc/method_list.html +849 -0
  43. data/doc/top-level-namespace.html +135 -0
  44. data/examples/bar_chart/bar_chart.rb +268 -0
  45. data/examples/bar_plot.rb +96 -0
  46. data/examples/charts/area.rb +25 -0
  47. data/examples/charts/area_script.rb +69 -0
  48. data/examples/charts/env.rb +8 -0
  49. data/examples/charts/monthly-move.csv +6725 -0
  50. data/examples/charts/morley.csv +101 -0
  51. data/examples/charts/morley2.csv +81 -0
  52. data/examples/charts/morley3.csv +121 -0
  53. data/examples/d3_tutorial.rb +98 -0
  54. data/examples/sc_plot.rb +57 -0
  55. data/examples/scatterplot/axes.rb +111 -0
  56. data/examples/scatterplot/scatterplot.rb +221 -0
  57. data/examples/us_states/map.rb +90 -0
  58. data/examples/us_states/us-ag-productivity2004.csv +49 -0
  59. data/examples/us_states/us-cities.csv +51 -0
  60. data/examples/util/linear_scale.rb +83 -0
  61. data/examples/util/ordinal_scale.rb +72 -0
  62. data/init.rb +39 -0
  63. data/lib/jx/array_handler.js +70 -0
  64. data/lib/jx/callback.rb +255 -0
  65. data/lib/jx/hash_handler.js +87 -0
  66. data/lib/jx/irbobject.rb +121 -0
  67. data/lib/jx/js.rb +442 -0
  68. data/lib/jx/js_array.rb +31 -0
  69. data/lib/jx/js_hash.rb +76 -0
  70. data/lib/jx/js_init.rb +62 -0
  71. data/lib/jx/jsarray.rb +66 -0
  72. data/lib/jx/jsfunction.rb +73 -0
  73. data/lib/jx/jsobject.rb +188 -0
  74. data/lib/jx/jsstyle_sheet.rb +231 -0
  75. data/lib/jx/jsundefined.rb +46 -0
  76. data/lib/jx/proxy_array.rb +62 -0
  77. data/lib/jx/rbobject.rb +80 -0
  78. data/lib/jx/ruby_proxy.js +176 -0
  79. data/lib/jx/ruby_rich.js +70 -0
  80. data/lib/jx/sol.rb +109 -0
  81. data/lib/mdarray-sol.rb +34 -0
  82. data/lib/mdarray/jsmdarray.rb +39 -0
  83. data/lib/ruby_rich/bootstrap.rb +230 -0
  84. data/lib/ruby_rich/config.html +22 -0
  85. data/lib/ruby_rich/dashboard.rb +299 -0
  86. data/lib/ruby_rich/ruby_rich.rb +120 -0
  87. data/lib/sol/bar_chart.rb +35 -0
  88. data/lib/sol/base_chart.rb +148 -0
  89. data/lib/sol/chart.rb +138 -0
  90. data/lib/sol/coordinate_chart.rb +128 -0
  91. data/lib/sol/interval.rb +156 -0
  92. data/lib/sol/line_chart.rb +58 -0
  93. data/lib/sol/margins.rb +52 -0
  94. data/lib/sol/scale.rb +212 -0
  95. data/lib/sol/stack.rb +44 -0
  96. data/node_modules/bootstrap/Gruntfile.js +533 -0
  97. data/node_modules/bootstrap/dist/js/bootstrap.js +2363 -0
  98. data/node_modules/bootstrap/dist/js/bootstrap.min.js +7 -0
  99. data/node_modules/bootstrap/dist/js/npm.js +13 -0
  100. data/node_modules/bootstrap/grunt/bs-commonjs-generator.js +30 -0
  101. data/node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js +42 -0
  102. data/node_modules/bootstrap/grunt/bs-lessdoc-parser.js +237 -0
  103. data/node_modules/bootstrap/grunt/bs-raw-files-generator.js +44 -0
  104. data/node_modules/bootstrap/js/affix.js +162 -0
  105. data/node_modules/bootstrap/js/alert.js +94 -0
  106. data/node_modules/bootstrap/js/button.js +120 -0
  107. data/node_modules/bootstrap/js/carousel.js +237 -0
  108. data/node_modules/bootstrap/js/collapse.js +211 -0
  109. data/node_modules/bootstrap/js/dropdown.js +165 -0
  110. data/node_modules/bootstrap/js/modal.js +337 -0
  111. data/node_modules/bootstrap/js/popover.js +108 -0
  112. data/node_modules/bootstrap/js/scrollspy.js +172 -0
  113. data/node_modules/bootstrap/js/tab.js +155 -0
  114. data/node_modules/bootstrap/js/tooltip.js +514 -0
  115. data/node_modules/bootstrap/js/transition.js +59 -0
  116. data/node_modules/chai/chai.js +6142 -0
  117. data/node_modules/chai/index.js +1 -0
  118. data/node_modules/chai/karma.conf.js +28 -0
  119. data/node_modules/chai/karma.sauce.js +41 -0
  120. data/node_modules/chai/lib/chai.js +93 -0
  121. data/node_modules/chai/lib/chai/assertion.js +131 -0
  122. data/node_modules/chai/lib/chai/config.js +55 -0
  123. data/node_modules/chai/lib/chai/core/assertions.js +1860 -0
  124. data/node_modules/chai/lib/chai/interface/assert.js +1645 -0
  125. data/node_modules/chai/lib/chai/interface/expect.js +34 -0
  126. data/node_modules/chai/lib/chai/interface/should.js +201 -0
  127. data/node_modules/chai/lib/chai/utils/addChainableMethod.js +112 -0
  128. data/node_modules/chai/lib/chai/utils/addMethod.js +44 -0
  129. data/node_modules/chai/lib/chai/utils/addProperty.js +48 -0
  130. data/node_modules/chai/lib/chai/utils/expectTypes.js +42 -0
  131. data/node_modules/chai/lib/chai/utils/flag.js +33 -0
  132. data/node_modules/chai/lib/chai/utils/getActual.js +20 -0
  133. data/node_modules/chai/lib/chai/utils/getEnumerableProperties.js +26 -0
  134. data/node_modules/chai/lib/chai/utils/getMessage.js +51 -0
  135. data/node_modules/chai/lib/chai/utils/getName.js +22 -0
  136. data/node_modules/chai/lib/chai/utils/getPathInfo.js +111 -0
  137. data/node_modules/chai/lib/chai/utils/getPathValue.js +43 -0
  138. data/node_modules/chai/lib/chai/utils/getProperties.js +36 -0
  139. data/node_modules/chai/lib/chai/utils/hasProperty.js +64 -0
  140. data/node_modules/chai/lib/chai/utils/index.js +130 -0
  141. data/node_modules/chai/lib/chai/utils/inspect.js +335 -0
  142. data/node_modules/chai/lib/chai/utils/objDisplay.js +50 -0
  143. data/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js +54 -0
  144. data/node_modules/chai/lib/chai/utils/overwriteMethod.js +52 -0
  145. data/node_modules/chai/lib/chai/utils/overwriteProperty.js +55 -0
  146. data/node_modules/chai/lib/chai/utils/test.js +28 -0
  147. data/node_modules/chai/lib/chai/utils/transferFlags.js +45 -0
  148. data/node_modules/chai/node_modules/assertion-error/index.js +116 -0
  149. data/node_modules/chai/node_modules/deep-eql/index.js +1 -0
  150. data/node_modules/chai/node_modules/deep-eql/karma.conf.js +20 -0
  151. data/node_modules/chai/node_modules/deep-eql/lib/eql.js +257 -0
  152. data/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/index.js +1 -0
  153. data/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/lib/type.js +142 -0
  154. data/node_modules/chai/node_modules/type-detect/index.js +1 -0
  155. data/node_modules/chai/node_modules/type-detect/lib/type.js +134 -0
  156. data/node_modules/chai/sauce.browsers.js +128 -0
  157. data/node_modules/dc/Gruntfile.js +437 -0
  158. data/node_modules/dc/dc.js +10477 -0
  159. data/node_modules/dc/dc.min.js +23 -0
  160. data/node_modules/dc/docs/coverage.js +203 -0
  161. data/node_modules/dc/grunt/format-file-list.js +33 -0
  162. data/node_modules/dc/index.js +5 -0
  163. data/node_modules/dc/node_modules/crossfilter2/crossfilter.js +1401 -0
  164. data/node_modules/dc/node_modules/crossfilter2/crossfilter.min.js +1 -0
  165. data/node_modules/dc/node_modules/crossfilter2/index.js +1 -0
  166. data/node_modules/dc/node_modules/crossfilter2/src/array.js +46 -0
  167. data/node_modules/dc/node_modules/crossfilter2/src/bisect.js +44 -0
  168. data/node_modules/dc/node_modules/crossfilter2/src/crossfilter.js +872 -0
  169. data/node_modules/dc/node_modules/crossfilter2/src/filter.js +19 -0
  170. data/node_modules/dc/node_modules/crossfilter2/src/heap.js +44 -0
  171. data/node_modules/dc/node_modules/crossfilter2/src/heapselect.js +36 -0
  172. data/node_modules/dc/node_modules/crossfilter2/src/identity.js +3 -0
  173. data/node_modules/dc/node_modules/crossfilter2/src/insertionsort.js +18 -0
  174. data/node_modules/dc/node_modules/crossfilter2/src/null.js +3 -0
  175. data/node_modules/dc/node_modules/crossfilter2/src/permute.js +8 -0
  176. data/node_modules/dc/node_modules/crossfilter2/src/quicksort.js +283 -0
  177. data/node_modules/dc/node_modules/crossfilter2/src/reduce.js +19 -0
  178. data/node_modules/dc/node_modules/crossfilter2/src/zero.js +3 -0
  179. data/node_modules/dc/node_modules/d3/d3.js +9554 -0
  180. data/node_modules/dc/node_modules/d3/d3.min.js +5 -0
  181. data/node_modules/dc/node_modules/d3/package.js +13 -0
  182. data/node_modules/dc/node_modules/d3/src/arrays/ascending.js +5 -0
  183. data/node_modules/dc/node_modules/d3/src/arrays/bisect.js +36 -0
  184. data/node_modules/dc/node_modules/d3/src/arrays/descending.js +3 -0
  185. data/node_modules/dc/node_modules/d3/src/arrays/deviation.js +6 -0
  186. data/node_modules/dc/node_modules/d3/src/arrays/entries.js +5 -0
  187. data/node_modules/dc/node_modules/d3/src/arrays/extent.js +21 -0
  188. data/node_modules/dc/node_modules/d3/src/arrays/index.js +25 -0
  189. data/node_modules/dc/node_modules/d3/src/arrays/keys.js +5 -0
  190. data/node_modules/dc/node_modules/d3/src/arrays/map.js +84 -0
  191. data/node_modules/dc/node_modules/d3/src/arrays/max.js +14 -0
  192. data/node_modules/dc/node_modules/d3/src/arrays/mean.js +15 -0
  193. data/node_modules/dc/node_modules/d3/src/arrays/median.js +16 -0
  194. data/node_modules/dc/node_modules/d3/src/arrays/merge.js +21 -0
  195. data/node_modules/dc/node_modules/d3/src/arrays/min.js +14 -0
  196. data/node_modules/dc/node_modules/d3/src/arrays/nest.js +97 -0
  197. data/node_modules/dc/node_modules/d3/src/arrays/pairs.js +5 -0
  198. data/node_modules/dc/node_modules/d3/src/arrays/permute.js +5 -0
  199. data/node_modules/dc/node_modules/d3/src/arrays/quantile.js +8 -0
  200. data/node_modules/dc/node_modules/d3/src/arrays/range.js +26 -0
  201. data/node_modules/dc/node_modules/d3/src/arrays/set.js +27 -0
  202. data/node_modules/dc/node_modules/d3/src/arrays/shuffle.js +9 -0
  203. data/node_modules/dc/node_modules/d3/src/arrays/sum.js +14 -0
  204. data/node_modules/dc/node_modules/d3/src/arrays/transpose.js +15 -0
  205. data/node_modules/dc/node_modules/d3/src/arrays/values.js +5 -0
  206. data/node_modules/dc/node_modules/d3/src/arrays/variance.js +29 -0
  207. data/node_modules/dc/node_modules/d3/src/arrays/zip.js +5 -0
  208. data/node_modules/dc/node_modules/d3/src/behavior/behavior.js +1 -0
  209. data/node_modules/dc/node_modules/d3/src/behavior/drag.js +88 -0
  210. data/node_modules/dc/node_modules/d3/src/behavior/index.js +3 -0
  211. data/node_modules/dc/node_modules/d3/src/behavior/zoom.js +348 -0
  212. data/node_modules/dc/node_modules/d3/src/color/color.js +7 -0
  213. data/node_modules/dc/node_modules/d3/src/color/hcl.js +34 -0
  214. data/node_modules/dc/node_modules/d3/src/color/hsl.js +56 -0
  215. data/node_modules/dc/node_modules/d3/src/color/index.js +6 -0
  216. data/node_modules/dc/node_modules/d3/src/color/lab.js +60 -0
  217. data/node_modules/dc/node_modules/d3/src/color/rgb.js +301 -0
  218. data/node_modules/dc/node_modules/d3/src/color/xyz.js +7 -0
  219. data/node_modules/dc/node_modules/d3/src/compat/array.js +15 -0
  220. data/node_modules/dc/node_modules/d3/src/compat/date.js +3 -0
  221. data/node_modules/dc/node_modules/d3/src/compat/index.js +3 -0
  222. data/node_modules/dc/node_modules/d3/src/compat/style.js +23 -0
  223. data/node_modules/dc/node_modules/d3/src/core/array.js +2 -0
  224. data/node_modules/dc/node_modules/d3/src/core/class.js +8 -0
  225. data/node_modules/dc/node_modules/d3/src/core/document.js +15 -0
  226. data/node_modules/dc/node_modules/d3/src/core/functor.js +5 -0
  227. data/node_modules/dc/node_modules/d3/src/core/identity.js +3 -0
  228. data/node_modules/dc/node_modules/d3/src/core/index.js +3 -0
  229. data/node_modules/dc/node_modules/d3/src/core/noop.js +1 -0
  230. data/node_modules/dc/node_modules/d3/src/core/ns.js +18 -0
  231. data/node_modules/dc/node_modules/d3/src/core/rebind.js +16 -0
  232. data/node_modules/dc/node_modules/d3/src/core/source.js +3 -0
  233. data/node_modules/dc/node_modules/d3/src/core/subclass.js +11 -0
  234. data/node_modules/dc/node_modules/d3/src/core/target.js +3 -0
  235. data/node_modules/dc/node_modules/d3/src/core/true.js +3 -0
  236. data/node_modules/dc/node_modules/d3/src/core/vendor.js +10 -0
  237. data/node_modules/dc/node_modules/d3/src/core/zero.js +3 -0
  238. data/node_modules/dc/node_modules/d3/src/d3.js +23 -0
  239. data/node_modules/dc/node_modules/d3/src/dsv/csv.js +3 -0
  240. data/node_modules/dc/node_modules/d3/src/dsv/dsv.js +136 -0
  241. data/node_modules/dc/node_modules/d3/src/dsv/index.js +3 -0
  242. data/node_modules/dc/node_modules/d3/src/dsv/tsv.js +3 -0
  243. data/node_modules/dc/node_modules/d3/src/end.js +4 -0
  244. data/node_modules/dc/node_modules/d3/src/event/dispatch.js +69 -0
  245. data/node_modules/dc/node_modules/d3/src/event/drag.js +36 -0
  246. data/node_modules/dc/node_modules/d3/src/event/event.js +50 -0
  247. data/node_modules/dc/node_modules/d3/src/event/index.js +6 -0
  248. data/node_modules/dc/node_modules/d3/src/event/mouse.js +39 -0
  249. data/node_modules/dc/node_modules/d3/src/event/timer.js +82 -0
  250. data/node_modules/dc/node_modules/d3/src/event/touch.js +11 -0
  251. data/node_modules/dc/node_modules/d3/src/event/touches.js +12 -0
  252. data/node_modules/dc/node_modules/d3/src/format/collapse.js +3 -0
  253. data/node_modules/dc/node_modules/d3/src/format/format.js +3 -0
  254. data/node_modules/dc/node_modules/d3/src/format/formatPrefix.js +24 -0
  255. data/node_modules/dc/node_modules/d3/src/format/index.js +4 -0
  256. data/node_modules/dc/node_modules/d3/src/format/precision.js +3 -0
  257. data/node_modules/dc/node_modules/d3/src/format/requote.js +5 -0
  258. data/node_modules/dc/node_modules/d3/src/format/round.js +5 -0
  259. data/node_modules/dc/node_modules/d3/src/geo/albers-usa.js +129 -0
  260. data/node_modules/dc/node_modules/d3/src/geo/albers.js +11 -0
  261. data/node_modules/dc/node_modules/d3/src/geo/area.js +69 -0
  262. data/node_modules/dc/node_modules/d3/src/geo/azimuthal-equal-area.js +12 -0
  263. data/node_modules/dc/node_modules/d3/src/geo/azimuthal-equidistant.js +13 -0
  264. data/node_modules/dc/node_modules/d3/src/geo/azimuthal.js +25 -0
  265. data/node_modules/dc/node_modules/d3/src/geo/bounds.js +168 -0
  266. data/node_modules/dc/node_modules/d3/src/geo/cartesian.js +47 -0
  267. data/node_modules/dc/node_modules/d3/src/geo/centroid.js +149 -0
  268. data/node_modules/dc/node_modules/d3/src/geo/circle.js +81 -0
  269. data/node_modules/dc/node_modules/d3/src/geo/clip-antimeridian.js +95 -0
  270. data/node_modules/dc/node_modules/d3/src/geo/clip-circle.js +178 -0
  271. data/node_modules/dc/node_modules/d3/src/geo/clip-extent.js +196 -0
  272. data/node_modules/dc/node_modules/d3/src/geo/clip-polygon.js +104 -0
  273. data/node_modules/dc/node_modules/d3/src/geo/clip.js +149 -0
  274. data/node_modules/dc/node_modules/d3/src/geo/compose.js +12 -0
  275. data/node_modules/dc/node_modules/d3/src/geo/conic-conformal.js +39 -0
  276. data/node_modules/dc/node_modules/d3/src/geo/conic-equal-area.js +33 -0
  277. data/node_modules/dc/node_modules/d3/src/geo/conic-equidistant.js +36 -0
  278. data/node_modules/dc/node_modules/d3/src/geo/conic.js +16 -0
  279. data/node_modules/dc/node_modules/d3/src/geo/distance.js +13 -0
  280. data/node_modules/dc/node_modules/d3/src/geo/equirectangular.js +10 -0
  281. data/node_modules/dc/node_modules/d3/src/geo/geo.js +1 -0
  282. data/node_modules/dc/node_modules/d3/src/geo/gnomonic.js +12 -0
  283. data/node_modules/dc/node_modules/d3/src/geo/graticule.js +103 -0
  284. data/node_modules/dc/node_modules/d3/src/geo/greatArc.js +42 -0
  285. data/node_modules/dc/node_modules/d3/src/geo/index.js +33 -0
  286. data/node_modules/dc/node_modules/d3/src/geo/interpolate.js +38 -0
  287. data/node_modules/dc/node_modules/d3/src/geo/length.js +44 -0
  288. data/node_modules/dc/node_modules/d3/src/geo/mercator.js +48 -0
  289. data/node_modules/dc/node_modules/d3/src/geo/orthographic.js +12 -0
  290. data/node_modules/dc/node_modules/d3/src/geo/path-area.js +41 -0
  291. data/node_modules/dc/node_modules/d3/src/geo/path-bounds.js +21 -0
  292. data/node_modules/dc/node_modules/d3/src/geo/path-buffer.js +59 -0
  293. data/node_modules/dc/node_modules/d3/src/geo/path-centroid.js +78 -0
  294. data/node_modules/dc/node_modules/d3/src/geo/path-context.js +49 -0
  295. data/node_modules/dc/node_modules/d3/src/geo/path.js +87 -0
  296. data/node_modules/dc/node_modules/d3/src/geo/point-in-polygon.js +71 -0
  297. data/node_modules/dc/node_modules/d3/src/geo/projection.js +121 -0
  298. data/node_modules/dc/node_modules/d3/src/geo/resample.js +109 -0
  299. data/node_modules/dc/node_modules/d3/src/geo/rotation.js +79 -0
  300. data/node_modules/dc/node_modules/d3/src/geo/spherical.js +13 -0
  301. data/node_modules/dc/node_modules/d3/src/geo/stereographic.js +12 -0
  302. data/node_modules/dc/node_modules/d3/src/geo/stream.js +71 -0
  303. data/node_modules/dc/node_modules/d3/src/geo/transform.js +36 -0
  304. data/node_modules/dc/node_modules/d3/src/geo/transverse-mercator.js +31 -0
  305. data/node_modules/dc/node_modules/d3/src/geom/clip-line.js +66 -0
  306. data/node_modules/dc/node_modules/d3/src/geom/delaunay.js +6 -0
  307. data/node_modules/dc/node_modules/d3/src/geom/geom.js +1 -0
  308. data/node_modules/dc/node_modules/d3/src/geom/hull.js +91 -0
  309. data/node_modules/dc/node_modules/d3/src/geom/index.js +6 -0
  310. data/node_modules/dc/node_modules/d3/src/geom/point.js +7 -0
  311. data/node_modules/dc/node_modules/d3/src/geom/polygon.js +105 -0
  312. data/node_modules/dc/node_modules/d3/src/geom/quadtree.js +243 -0
  313. data/node_modules/dc/node_modules/d3/src/geom/voronoi.js +110 -0
  314. data/node_modules/dc/node_modules/d3/src/geom/voronoi/beach.js +186 -0
  315. data/node_modules/dc/node_modules/d3/src/geom/voronoi/cell.js +64 -0
  316. data/node_modules/dc/node_modules/d3/src/geom/voronoi/circle.js +73 -0
  317. data/node_modules/dc/node_modules/d3/src/geom/voronoi/clip.js +80 -0
  318. data/node_modules/dc/node_modules/d3/src/geom/voronoi/edge.js +50 -0
  319. data/node_modules/dc/node_modules/d3/src/geom/voronoi/index.js +59 -0
  320. data/node_modules/dc/node_modules/d3/src/geom/voronoi/red-black.js +235 -0
  321. data/node_modules/dc/node_modules/d3/src/interpolate/array.js +19 -0
  322. data/node_modules/dc/node_modules/d3/src/interpolate/ease.js +111 -0
  323. data/node_modules/dc/node_modules/d3/src/interpolate/hcl.js +20 -0
  324. data/node_modules/dc/node_modules/d3/src/interpolate/hsl.js +20 -0
  325. data/node_modules/dc/node_modules/d3/src/interpolate/index.js +14 -0
  326. data/node_modules/dc/node_modules/d3/src/interpolate/interpolate.js +26 -0
  327. data/node_modules/dc/node_modules/d3/src/interpolate/lab.js +17 -0
  328. data/node_modules/dc/node_modules/d3/src/interpolate/number.js +6 -0
  329. data/node_modules/dc/node_modules/d3/src/interpolate/object.js +25 -0
  330. data/node_modules/dc/node_modules/d3/src/interpolate/rgb.js +20 -0
  331. data/node_modules/dc/node_modules/d3/src/interpolate/round.js +6 -0
  332. data/node_modules/dc/node_modules/d3/src/interpolate/string.js +54 -0
  333. data/node_modules/dc/node_modules/d3/src/interpolate/transform.js +59 -0
  334. data/node_modules/dc/node_modules/d3/src/interpolate/uninterpolate.js +9 -0
  335. data/node_modules/dc/node_modules/d3/src/interpolate/zoom.js +53 -0
  336. data/node_modules/dc/node_modules/d3/src/layout/bundle.js +59 -0
  337. data/node_modules/dc/node_modules/d3/src/layout/chord.js +157 -0
  338. data/node_modules/dc/node_modules/d3/src/layout/cluster.js +92 -0
  339. data/node_modules/dc/node_modules/d3/src/layout/force.js +372 -0
  340. data/node_modules/dc/node_modules/d3/src/layout/hierarchy.js +136 -0
  341. data/node_modules/dc/node_modules/d3/src/layout/histogram.js +110 -0
  342. data/node_modules/dc/node_modules/d3/src/layout/index.js +13 -0
  343. data/node_modules/dc/node_modules/d3/src/layout/layout.js +1 -0
  344. data/node_modules/dc/node_modules/d3/src/layout/pack.js +211 -0
  345. data/node_modules/dc/node_modules/d3/src/layout/partition.js +51 -0
  346. data/node_modules/dc/node_modules/d3/src/layout/pie.js +78 -0
  347. data/node_modules/dc/node_modules/d3/src/layout/stack.js +247 -0
  348. data/node_modules/dc/node_modules/d3/src/layout/tree.js +240 -0
  349. data/node_modules/dc/node_modules/d3/src/layout/treemap.js +229 -0
  350. data/node_modules/dc/node_modules/d3/src/locale/ca-ES.js +16 -0
  351. data/node_modules/dc/node_modules/d3/src/locale/de-CH.js +16 -0
  352. data/node_modules/dc/node_modules/d3/src/locale/de-DE.js +16 -0
  353. data/node_modules/dc/node_modules/d3/src/locale/en-CA.js +16 -0
  354. data/node_modules/dc/node_modules/d3/src/locale/en-GB.js +16 -0
  355. data/node_modules/dc/node_modules/d3/src/locale/en-US.js +16 -0
  356. data/node_modules/dc/node_modules/d3/src/locale/es-ES.js +16 -0
  357. data/node_modules/dc/node_modules/d3/src/locale/fi-FI.js +16 -0
  358. data/node_modules/dc/node_modules/d3/src/locale/fr-CA.js +16 -0
  359. data/node_modules/dc/node_modules/d3/src/locale/fr-FR.js +16 -0
  360. data/node_modules/dc/node_modules/d3/src/locale/he-IL.js +16 -0
  361. data/node_modules/dc/node_modules/d3/src/locale/hu-HU.js +16 -0
  362. data/node_modules/dc/node_modules/d3/src/locale/it-IT.js +16 -0
  363. data/node_modules/dc/node_modules/d3/src/locale/ja-JP.js +16 -0
  364. data/node_modules/dc/node_modules/d3/src/locale/ko-KR.js +16 -0
  365. data/node_modules/dc/node_modules/d3/src/locale/locale.js +9 -0
  366. data/node_modules/dc/node_modules/d3/src/locale/mk-MK.js +16 -0
  367. data/node_modules/dc/node_modules/d3/src/locale/nl-NL.js +16 -0
  368. data/node_modules/dc/node_modules/d3/src/locale/number-format.js +155 -0
  369. data/node_modules/dc/node_modules/d3/src/locale/pl-PL.js +16 -0
  370. data/node_modules/dc/node_modules/d3/src/locale/pt-BR.js +16 -0
  371. data/node_modules/dc/node_modules/d3/src/locale/ru-RU.js +16 -0
  372. data/node_modules/dc/node_modules/d3/src/locale/sv-SE.js +16 -0
  373. data/node_modules/dc/node_modules/d3/src/locale/time-format.js +370 -0
  374. data/node_modules/dc/node_modules/d3/src/locale/time-scale.js +0 -0
  375. data/node_modules/dc/node_modules/d3/src/locale/zh-CN.js +16 -0
  376. data/node_modules/dc/node_modules/d3/src/math/abs.js +1 -0
  377. data/node_modules/dc/node_modules/d3/src/math/adder.js +34 -0
  378. data/node_modules/dc/node_modules/d3/src/math/index.js +2 -0
  379. data/node_modules/dc/node_modules/d3/src/math/number.js +7 -0
  380. data/node_modules/dc/node_modules/d3/src/math/random.js +34 -0
  381. data/node_modules/dc/node_modules/d3/src/math/transform.js +64 -0
  382. data/node_modules/dc/node_modules/d3/src/math/trigonometry.js +44 -0
  383. data/node_modules/dc/node_modules/d3/src/scale/bilinear.js +7 -0
  384. data/node_modules/dc/node_modules/d3/src/scale/category.js +58 -0
  385. data/node_modules/dc/node_modules/d3/src/scale/identity.js +33 -0
  386. data/node_modules/dc/node_modules/d3/src/scale/index.js +11 -0
  387. data/node_modules/dc/node_modules/d3/src/scale/linear.js +160 -0
  388. data/node_modules/dc/node_modules/d3/src/scale/log.js +92 -0
  389. data/node_modules/dc/node_modules/d3/src/scale/nice.js +30 -0
  390. data/node_modules/dc/node_modules/d3/src/scale/ordinal.js +102 -0
  391. data/node_modules/dc/node_modules/d3/src/scale/polylinear.js +24 -0
  392. data/node_modules/dc/node_modules/d3/src/scale/pow.js +57 -0
  393. data/node_modules/dc/node_modules/d3/src/scale/quantile.js +55 -0
  394. data/node_modules/dc/node_modules/d3/src/scale/quantize.js +44 -0
  395. data/node_modules/dc/node_modules/d3/src/scale/scale.js +10 -0
  396. data/node_modules/dc/node_modules/d3/src/scale/sqrt.js +6 -0
  397. data/node_modules/dc/node_modules/d3/src/scale/threshold.js +36 -0
  398. data/node_modules/dc/node_modules/d3/src/selection/append.js +28 -0
  399. data/node_modules/dc/node_modules/d3/src/selection/attr.js +62 -0
  400. data/node_modules/dc/node_modules/d3/src/selection/call.js +8 -0
  401. data/node_modules/dc/node_modules/d3/src/selection/classed.js +76 -0
  402. data/node_modules/dc/node_modules/d3/src/selection/data.js +117 -0
  403. data/node_modules/dc/node_modules/d3/src/selection/datum.js +7 -0
  404. data/node_modules/dc/node_modules/d3/src/selection/each.js +16 -0
  405. data/node_modules/dc/node_modules/d3/src/selection/empty.js +5 -0
  406. data/node_modules/dc/node_modules/d3/src/selection/enter-insert.js +20 -0
  407. data/node_modules/dc/node_modules/d3/src/selection/enter-select.js +27 -0
  408. data/node_modules/dc/node_modules/d3/src/selection/enter.js +21 -0
  409. data/node_modules/dc/node_modules/d3/src/selection/filter.js +28 -0
  410. data/node_modules/dc/node_modules/d3/src/selection/html.js +10 -0
  411. data/node_modules/dc/node_modules/d3/src/selection/index.js +1 -0
  412. data/node_modules/dc/node_modules/d3/src/selection/insert.js +9 -0
  413. data/node_modules/dc/node_modules/d3/src/selection/interrupt.js +27 -0
  414. data/node_modules/dc/node_modules/d3/src/selection/node.js +11 -0
  415. data/node_modules/dc/node_modules/d3/src/selection/on.js +106 -0
  416. data/node_modules/dc/node_modules/d3/src/selection/order.js +13 -0
  417. data/node_modules/dc/node_modules/d3/src/selection/property.js +43 -0
  418. data/node_modules/dc/node_modules/d3/src/selection/remove.js +13 -0
  419. data/node_modules/dc/node_modules/d3/src/selection/select.js +32 -0
  420. data/node_modules/dc/node_modules/d3/src/selection/selectAll.js +27 -0
  421. data/node_modules/dc/node_modules/d3/src/selection/selection.js +81 -0
  422. data/node_modules/dc/node_modules/d3/src/selection/size.js +7 -0
  423. data/node_modules/dc/node_modules/d3/src/selection/sort.js +15 -0
  424. data/node_modules/dc/node_modules/d3/src/selection/style.js +59 -0
  425. data/node_modules/dc/node_modules/d3/src/selection/text.js +10 -0
  426. data/node_modules/dc/node_modules/d3/src/selection/transition.js +21 -0
  427. data/node_modules/dc/node_modules/d3/src/start.js +2 -0
  428. data/node_modules/dc/node_modules/d3/src/svg/arc.js +292 -0
  429. data/node_modules/dc/node_modules/d3/src/svg/area-radial.js +14 -0
  430. data/node_modules/dc/node_modules/d3/src/svg/area.js +121 -0
  431. data/node_modules/dc/node_modules/d3/src/svg/axis.js +160 -0
  432. data/node_modules/dc/node_modules/d3/src/svg/brush.js +429 -0
  433. data/node_modules/dc/node_modules/d3/src/svg/chord.js +90 -0
  434. data/node_modules/dc/node_modules/d3/src/svg/diagonal-radial.js +27 -0
  435. data/node_modules/dc/node_modules/d3/src/svg/diagonal.js +43 -0
  436. data/node_modules/dc/node_modules/d3/src/svg/index.js +12 -0
  437. data/node_modules/dc/node_modules/d3/src/svg/line-radial.js +27 -0
  438. data/node_modules/dc/node_modules/d3/src/svg/line.js +432 -0
  439. data/node_modules/dc/node_modules/d3/src/svg/svg.js +1 -0
  440. data/node_modules/dc/node_modules/d3/src/svg/symbol.js +105 -0
  441. data/node_modules/dc/node_modules/d3/src/time/day.js +21 -0
  442. data/node_modules/dc/node_modules/d3/src/time/format-iso.js +19 -0
  443. data/node_modules/dc/node_modules/d3/src/time/format-utc.js +3 -0
  444. data/node_modules/dc/node_modules/d3/src/time/format.js +4 -0
  445. data/node_modules/dc/node_modules/d3/src/time/hour.js +14 -0
  446. data/node_modules/dc/node_modules/d3/src/time/index.js +14 -0
  447. data/node_modules/dc/node_modules/d3/src/time/interval.js +71 -0
  448. data/node_modules/dc/node_modules/d3/src/time/minute.js +13 -0
  449. data/node_modules/dc/node_modules/d3/src/time/month.js +16 -0
  450. data/node_modules/dc/node_modules/d3/src/time/scale-utc.js +25 -0
  451. data/node_modules/dc/node_modules/d3/src/time/scale.js +155 -0
  452. data/node_modules/dc/node_modules/d3/src/time/second.js +13 -0
  453. data/node_modules/dc/node_modules/d3/src/time/time.js +33 -0
  454. data/node_modules/dc/node_modules/d3/src/time/week.js +31 -0
  455. data/node_modules/dc/node_modules/d3/src/time/year.js +16 -0
  456. data/node_modules/dc/node_modules/d3/src/transition/attr.js +58 -0
  457. data/node_modules/dc/node_modules/d3/src/transition/delay.js +10 -0
  458. data/node_modules/dc/node_modules/d3/src/transition/duration.js +10 -0
  459. data/node_modules/dc/node_modules/d3/src/transition/each.js +26 -0
  460. data/node_modules/dc/node_modules/d3/src/transition/ease.js +10 -0
  461. data/node_modules/dc/node_modules/d3/src/transition/filter.js +22 -0
  462. data/node_modules/dc/node_modules/d3/src/transition/index.js +1 -0
  463. data/node_modules/dc/node_modules/d3/src/transition/remove.js +9 -0
  464. data/node_modules/dc/node_modules/d3/src/transition/select.js +28 -0
  465. data/node_modules/dc/node_modules/d3/src/transition/selectAll.js +31 -0
  466. data/node_modules/dc/node_modules/d3/src/transition/style.js +53 -0
  467. data/node_modules/dc/node_modules/d3/src/transition/subtransition.js +25 -0
  468. data/node_modules/dc/node_modules/d3/src/transition/text.js +11 -0
  469. data/node_modules/dc/node_modules/d3/src/transition/transition.js +161 -0
  470. data/node_modules/dc/node_modules/d3/src/transition/tween.js +17 -0
  471. data/node_modules/dc/node_modules/d3/src/xhr/html.js +12 -0
  472. data/node_modules/dc/node_modules/d3/src/xhr/index.js +5 -0
  473. data/node_modules/dc/node_modules/d3/src/xhr/json.js +9 -0
  474. data/node_modules/dc/node_modules/d3/src/xhr/text.js +5 -0
  475. data/node_modules/dc/node_modules/d3/src/xhr/xhr.js +126 -0
  476. data/node_modules/dc/node_modules/d3/src/xhr/xml.js +5 -0
  477. data/node_modules/dc/regression/inject-serializer.js +6 -0
  478. data/node_modules/dc/regression/stock-regression-test.js +140 -0
  479. data/node_modules/dc/spec/bar-chart-spec.js +1230 -0
  480. data/node_modules/dc/spec/base-mixin-spec.js +611 -0
  481. data/node_modules/dc/spec/biggish-data-spec.js +136 -0
  482. data/node_modules/dc/spec/box-plot-spec.js +211 -0
  483. data/node_modules/dc/spec/bubble-chart-spec.js +450 -0
  484. data/node_modules/dc/spec/bubble-overlay-spec.js +102 -0
  485. data/node_modules/dc/spec/color-spec.js +89 -0
  486. data/node_modules/dc/spec/composite-chart-spec.js +691 -0
  487. data/node_modules/dc/spec/coordinate-grid-chart-spec.js +962 -0
  488. data/node_modules/dc/spec/core-spec.js +301 -0
  489. data/node_modules/dc/spec/data-addition-spec.js +122 -0
  490. data/node_modules/dc/spec/data-count-spec.js +180 -0
  491. data/node_modules/dc/spec/data-grid-spec.js +124 -0
  492. data/node_modules/dc/spec/data-table-spec.js +251 -0
  493. data/node_modules/dc/spec/event-spec.js +41 -0
  494. data/node_modules/dc/spec/filter-dates-spec.js +92 -0
  495. data/node_modules/dc/spec/filters-spec.js +140 -0
  496. data/node_modules/dc/spec/geo-choropleth-chart-spec.js +225 -0
  497. data/node_modules/dc/spec/heatmap-spec.js +363 -0
  498. data/node_modules/dc/spec/helpers/custom_matchers.js +213 -0
  499. data/node_modules/dc/spec/helpers/fixtures.js +81 -0
  500. data/node_modules/dc/spec/helpers/geoFixtures.js +113 -0
  501. data/node_modules/dc/spec/helpers/load-jsreporter.js +37 -0
  502. data/node_modules/dc/spec/helpers/spec-helper.js +53 -0
  503. data/node_modules/dc/spec/legend-spec.js +266 -0
  504. data/node_modules/dc/spec/line-chart-spec.js +709 -0
  505. data/node_modules/dc/spec/logger-spec.js +80 -0
  506. data/node_modules/dc/spec/number-display-spec.js +168 -0
  507. data/node_modules/dc/spec/pie-chart-spec.js +677 -0
  508. data/node_modules/dc/spec/row-chart-spec.js +362 -0
  509. data/node_modules/dc/spec/scatter-plot-spec.js +336 -0
  510. data/node_modules/dc/spec/series-chart-spec.js +133 -0
  511. data/node_modules/dc/spec/utils-spec.js +110 -0
  512. data/node_modules/dc/src/banner.js +2 -0
  513. data/node_modules/dc/src/bar-chart.js +374 -0
  514. data/node_modules/dc/src/base-mixin.js +1478 -0
  515. data/node_modules/dc/src/box-plot.js +240 -0
  516. data/node_modules/dc/src/bubble-chart.js +177 -0
  517. data/node_modules/dc/src/bubble-mixin.js +244 -0
  518. data/node_modules/dc/src/bubble-overlay.js +207 -0
  519. data/node_modules/dc/src/cap-mixin.js +151 -0
  520. data/node_modules/dc/src/color-mixin.js +172 -0
  521. data/node_modules/dc/src/composite-chart.js +544 -0
  522. data/node_modules/dc/src/coordinate-grid-mixin.js +1300 -0
  523. data/node_modules/dc/src/core.js +425 -0
  524. data/node_modules/dc/src/d3.box.js +317 -0
  525. data/node_modules/dc/src/data-count.js +110 -0
  526. data/node_modules/dc/src/data-grid.js +243 -0
  527. data/node_modules/dc/src/data-table.js +419 -0
  528. data/node_modules/dc/src/errors.js +28 -0
  529. data/node_modules/dc/src/events.js +37 -0
  530. data/node_modules/dc/src/filters.js +124 -0
  531. data/node_modules/dc/src/footer.js +35 -0
  532. data/node_modules/dc/src/geo-choropleth-chart.js +279 -0
  533. data/node_modules/dc/src/heatmap.js +378 -0
  534. data/node_modules/dc/src/legend.js +277 -0
  535. data/node_modules/dc/src/line-chart.js +504 -0
  536. data/node_modules/dc/src/logger.js +40 -0
  537. data/node_modules/dc/src/margin-mixin.js +44 -0
  538. data/node_modules/dc/src/number-display.js +141 -0
  539. data/node_modules/dc/src/pie-chart.js +571 -0
  540. data/node_modules/dc/src/row-chart.js +425 -0
  541. data/node_modules/dc/src/scatter-plot.js +338 -0
  542. data/node_modules/dc/src/series-chart.js +192 -0
  543. data/node_modules/dc/src/stack-mixin.js +319 -0
  544. data/node_modules/dc/src/utils.js +290 -0
  545. data/node_modules/dc/web/docs/html/scripts/docstrap.lib.js +11 -0
  546. data/node_modules/dc/web/docs/html/scripts/fulltext-search-ui.js +89 -0
  547. data/node_modules/dc/web/docs/html/scripts/fulltext-search.js +36 -0
  548. data/node_modules/dc/web/docs/html/scripts/lunr.min.js +7 -0
  549. data/node_modules/dc/web/docs/html/scripts/prettify/jquery.min.js +6 -0
  550. data/node_modules/dc/web/docs/html/scripts/prettify/lang-css.js +21 -0
  551. data/node_modules/dc/web/docs/html/scripts/prettify/prettify.js +496 -0
  552. data/node_modules/dc/web/docs/html/scripts/sunlight.js +1157 -0
  553. data/node_modules/dc/web/docs/html/scripts/toc.js +203 -0
  554. data/node_modules/dc/web/ep/list.js +106 -0
  555. data/node_modules/dc/web/examples/lysenko-interval-tree.js +447 -0
  556. data/node_modules/dc/web/highlighter/shAutoloader.js +17 -0
  557. data/node_modules/dc/web/highlighter/shBrushJScript.js +52 -0
  558. data/node_modules/dc/web/highlighter/shBrushXml.js +69 -0
  559. data/node_modules/dc/web/highlighter/shCore.js +17 -0
  560. data/node_modules/dc/web/js/colorbrewer.js +1 -0
  561. data/node_modules/dc/web/js/crossfilter.js +1401 -0
  562. data/node_modules/dc/web/js/d3.js +9554 -0
  563. data/node_modules/dc/web/js/dc.js +10477 -0
  564. data/node_modules/dc/web/js/dc.min.js +23 -0
  565. data/node_modules/dc/web/js/env-data.js +218 -0
  566. data/node_modules/dc/web/js/jasmine-jsreporter.js +394 -0
  567. data/node_modules/dc/web/stock.js +685 -0
  568. data/node_modules/dc/web/transitions/transition-test.js +45 -0
  569. data/node_modules/jquery/dist/jquery.js +9814 -0
  570. data/node_modules/jquery/dist/jquery.min.js +4 -0
  571. data/node_modules/jquery/external/sizzle/dist/sizzle.js +2143 -0
  572. data/node_modules/jquery/external/sizzle/dist/sizzle.min.js +3 -0
  573. data/node_modules/jquery/src/ajax.js +845 -0
  574. data/node_modules/jquery/src/ajax/jsonp.js +100 -0
  575. data/node_modules/jquery/src/ajax/load.js +83 -0
  576. data/node_modules/jquery/src/ajax/parseJSON.js +13 -0
  577. data/node_modules/jquery/src/ajax/parseXML.js +27 -0
  578. data/node_modules/jquery/src/ajax/script.js +68 -0
  579. data/node_modules/jquery/src/ajax/var/location.js +3 -0
  580. data/node_modules/jquery/src/ajax/var/nonce.js +5 -0
  581. data/node_modules/jquery/src/ajax/var/rquery.js +3 -0
  582. data/node_modules/jquery/src/ajax/xhr.js +167 -0
  583. data/node_modules/jquery/src/attributes.js +11 -0
  584. data/node_modules/jquery/src/attributes/attr.js +142 -0
  585. data/node_modules/jquery/src/attributes/classes.js +177 -0
  586. data/node_modules/jquery/src/attributes/prop.js +125 -0
  587. data/node_modules/jquery/src/attributes/support.js +36 -0
  588. data/node_modules/jquery/src/attributes/val.js +177 -0
  589. data/node_modules/jquery/src/callbacks.js +232 -0
  590. data/node_modules/jquery/src/core.js +494 -0
  591. data/node_modules/jquery/src/core/access.js +65 -0
  592. data/node_modules/jquery/src/core/init.js +134 -0
  593. data/node_modules/jquery/src/core/parseHTML.js +41 -0
  594. data/node_modules/jquery/src/core/ready.js +103 -0
  595. data/node_modules/jquery/src/core/var/rsingleTag.js +5 -0
  596. data/node_modules/jquery/src/css.js +502 -0
  597. data/node_modules/jquery/src/css/addGetHookIf.js +24 -0
  598. data/node_modules/jquery/src/css/adjustCSS.js +65 -0
  599. data/node_modules/jquery/src/css/curCSS.js +60 -0
  600. data/node_modules/jquery/src/css/defaultDisplay.js +72 -0
  601. data/node_modules/jquery/src/css/hiddenVisibleSelectors.js +18 -0
  602. data/node_modules/jquery/src/css/showHide.js +48 -0
  603. data/node_modules/jquery/src/css/support.js +121 -0
  604. data/node_modules/jquery/src/css/var/cssExpand.js +3 -0
  605. data/node_modules/jquery/src/css/var/getStyles.js +15 -0
  606. data/node_modules/jquery/src/css/var/isHidden.js +16 -0
  607. data/node_modules/jquery/src/css/var/rmargin.js +3 -0
  608. data/node_modules/jquery/src/css/var/rnumnonpx.js +5 -0
  609. data/node_modules/jquery/src/css/var/swap.js +24 -0
  610. data/node_modules/jquery/src/data.js +187 -0
  611. data/node_modules/jquery/src/data/Data.js +200 -0
  612. data/node_modules/jquery/src/data/var/acceptData.js +18 -0
  613. data/node_modules/jquery/src/data/var/dataPriv.js +5 -0
  614. data/node_modules/jquery/src/data/var/dataUser.js +5 -0
  615. data/node_modules/jquery/src/deferred.js +158 -0
  616. data/node_modules/jquery/src/deprecated.js +32 -0
  617. data/node_modules/jquery/src/dimensions.js +54 -0
  618. data/node_modules/jquery/src/effects.js +629 -0
  619. data/node_modules/jquery/src/effects/Tween.js +121 -0
  620. data/node_modules/jquery/src/effects/animatedSelector.js +13 -0
  621. data/node_modules/jquery/src/event.js +711 -0
  622. data/node_modules/jquery/src/event/ajax.js +20 -0
  623. data/node_modules/jquery/src/event/alias.js +27 -0
  624. data/node_modules/jquery/src/event/focusin.js +53 -0
  625. data/node_modules/jquery/src/event/support.js +9 -0
  626. data/node_modules/jquery/src/event/trigger.js +183 -0
  627. data/node_modules/jquery/src/exports/amd.js +24 -0
  628. data/node_modules/jquery/src/exports/global.js +26 -0
  629. data/node_modules/jquery/src/intro.js +44 -0
  630. data/node_modules/jquery/src/jquery.js +37 -0
  631. data/node_modules/jquery/src/manipulation.js +481 -0
  632. data/node_modules/jquery/src/manipulation/_evalUrl.js +20 -0
  633. data/node_modules/jquery/src/manipulation/buildFragment.js +102 -0
  634. data/node_modules/jquery/src/manipulation/getAll.js +21 -0
  635. data/node_modules/jquery/src/manipulation/setGlobalEval.js +20 -0
  636. data/node_modules/jquery/src/manipulation/support.js +33 -0
  637. data/node_modules/jquery/src/manipulation/var/rcheckableType.js +3 -0
  638. data/node_modules/jquery/src/manipulation/var/rscriptType.js +3 -0
  639. data/node_modules/jquery/src/manipulation/var/rtagName.js +3 -0
  640. data/node_modules/jquery/src/manipulation/wrapMap.js +27 -0
  641. data/node_modules/jquery/src/offset.js +218 -0
  642. data/node_modules/jquery/src/outro.js +2 -0
  643. data/node_modules/jquery/src/queue.js +143 -0
  644. data/node_modules/jquery/src/queue/delay.js +22 -0
  645. data/node_modules/jquery/src/selector-native.js +211 -0
  646. data/node_modules/jquery/src/selector-sizzle.js +14 -0
  647. data/node_modules/jquery/src/selector.js +1 -0
  648. data/node_modules/jquery/src/serialize.js +125 -0
  649. data/node_modules/jquery/src/traversing.js +175 -0
  650. data/node_modules/jquery/src/traversing/findFilter.js +100 -0
  651. data/node_modules/jquery/src/traversing/var/dir.js +20 -0
  652. data/node_modules/jquery/src/traversing/var/rneedsContext.js +6 -0
  653. data/node_modules/jquery/src/traversing/var/siblings.js +15 -0
  654. data/node_modules/jquery/src/var/arr.js +3 -0
  655. data/node_modules/jquery/src/var/class2type.js +5 -0
  656. data/node_modules/jquery/src/var/concat.js +5 -0
  657. data/node_modules/jquery/src/var/document.js +3 -0
  658. data/node_modules/jquery/src/var/documentElement.js +5 -0
  659. data/node_modules/jquery/src/var/hasOwn.js +5 -0
  660. data/node_modules/jquery/src/var/indexOf.js +5 -0
  661. data/node_modules/jquery/src/var/pnum.js +3 -0
  662. data/node_modules/jquery/src/var/push.js +5 -0
  663. data/node_modules/jquery/src/var/rcssNum.js +7 -0
  664. data/node_modules/jquery/src/var/rnotwhite.js +3 -0
  665. data/node_modules/jquery/src/var/slice.js +5 -0
  666. data/node_modules/jquery/src/var/support.js +5 -0
  667. data/node_modules/jquery/src/var/toString.js +5 -0
  668. data/node_modules/jquery/src/wrap.js +79 -0
  669. data/target/mdarray_sol.jar +0 -0
  670. data/test/jx/test_complete.rb +35 -0
  671. data/test/jx/test_js.rb +543 -0
  672. data/test/jx/test_proxy_array.rb +239 -0
  673. data/test/jx/test_proxy_hash.rb +160 -0
  674. data/test/jx/test_proxy_lambda.rb +80 -0
  675. data/test/jx/test_rb_js_compat.rb +135 -0
  676. data/test/jx/test_style_sheets.rb +90 -0
  677. data/test/mdarray/test_mdarray.rb +75 -0
  678. data/util/cacert.pem +4095 -0
  679. data/util/download.rb +256 -0
  680. data/vendor/jxbrowser-6.8.jar +0 -0
  681. data/vendor/licence.jar +0 -0
  682. data/version.rb +2 -0
  683. metadata +817 -0
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/chai');
@@ -0,0 +1,28 @@
1
+ module.exports = function(config) {
2
+ config.set({
3
+ frameworks: [ 'mocha' ]
4
+ , files: [
5
+ 'chai.js'
6
+ , 'test/bootstrap/karma.js'
7
+ , 'test/*.js'
8
+ ]
9
+ , reporters: [ 'progress' ]
10
+ , colors: true
11
+ , logLevel: config.LOG_INFO
12
+ , autoWatch: false
13
+ , browsers: [ 'PhantomJS' ]
14
+ , browserDisconnectTimeout: 10000
15
+ , browserDisconnectTolerance: 2
16
+ , browserNoActivityTimeout: 20000
17
+ , singleRun: true
18
+ });
19
+
20
+ switch (process.env.CHAI_TEST_ENV) {
21
+ case 'sauce':
22
+ require('./karma.sauce')(config);
23
+ break;
24
+ default:
25
+ // ...
26
+ break;
27
+ };
28
+ };
@@ -0,0 +1,41 @@
1
+ var version = require('./package.json').version;
2
+ var ts = new Date().getTime();
3
+
4
+ module.exports = function(config) {
5
+ var auth;
6
+
7
+ try {
8
+ auth = require('./test/auth/index');
9
+ } catch(ex) {
10
+ auth = {};
11
+ auth.SAUCE_USERNAME = process.env.SAUCE_USERNAME || null;
12
+ auth.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY || null;
13
+ }
14
+
15
+ if (!auth.SAUCE_USERNAME || !auth.SAUCE_ACCESS_KEY) return;
16
+ if (process.env.SKIP_SAUCE) return;
17
+
18
+ var branch = process.env.TRAVIS_BRANCH || 'local'
19
+ var browserConfig = require('./sauce.browsers');
20
+ var browsers = Object.keys(browserConfig);
21
+ var tags = [ 'chaijs_' + version, auth.SAUCE_USERNAME + '@' + branch ];
22
+ var tunnel = process.env.TRAVIS_JOB_NUMBER || ts;
23
+
24
+ if (process.env.TRAVIS_JOB_NUMBER) {
25
+ tags.push('travis@' + process.env.TRAVIS_JOB_NUMBER);
26
+ }
27
+
28
+ config.browsers = config.browsers.concat(browsers);
29
+ config.customLaunchers = browserConfig;
30
+ config.reporters.push('saucelabs');
31
+ config.transports = [ 'xhr-polling' ];
32
+
33
+ config.sauceLabs = {
34
+ username: auth.SAUCE_USERNAME
35
+ , accessKey: auth.SAUCE_ACCESS_KEY
36
+ , startConnect: true
37
+ , tags: tags
38
+ , testName: 'ChaiJS'
39
+ , tunnelIdentifier: tunnel
40
+ };
41
+ };
@@ -0,0 +1,93 @@
1
+ /*!
2
+ * chai
3
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
4
+ * MIT Licensed
5
+ */
6
+
7
+ var used = []
8
+ , exports = module.exports = {};
9
+
10
+ /*!
11
+ * Chai version
12
+ */
13
+
14
+ exports.version = '3.5.0';
15
+
16
+ /*!
17
+ * Assertion Error
18
+ */
19
+
20
+ exports.AssertionError = require('assertion-error');
21
+
22
+ /*!
23
+ * Utils for plugins (not exported)
24
+ */
25
+
26
+ var util = require('./chai/utils');
27
+
28
+ /**
29
+ * # .use(function)
30
+ *
31
+ * Provides a way to extend the internals of Chai
32
+ *
33
+ * @param {Function}
34
+ * @returns {this} for chaining
35
+ * @api public
36
+ */
37
+
38
+ exports.use = function (fn) {
39
+ if (!~used.indexOf(fn)) {
40
+ fn(this, util);
41
+ used.push(fn);
42
+ }
43
+
44
+ return this;
45
+ };
46
+
47
+ /*!
48
+ * Utility Functions
49
+ */
50
+
51
+ exports.util = util;
52
+
53
+ /*!
54
+ * Configuration
55
+ */
56
+
57
+ var config = require('./chai/config');
58
+ exports.config = config;
59
+
60
+ /*!
61
+ * Primary `Assertion` prototype
62
+ */
63
+
64
+ var assertion = require('./chai/assertion');
65
+ exports.use(assertion);
66
+
67
+ /*!
68
+ * Core Assertions
69
+ */
70
+
71
+ var core = require('./chai/core/assertions');
72
+ exports.use(core);
73
+
74
+ /*!
75
+ * Expect interface
76
+ */
77
+
78
+ var expect = require('./chai/interface/expect');
79
+ exports.use(expect);
80
+
81
+ /*!
82
+ * Should interface
83
+ */
84
+
85
+ var should = require('./chai/interface/should');
86
+ exports.use(should);
87
+
88
+ /*!
89
+ * Assert interface
90
+ */
91
+
92
+ var assert = require('./chai/interface/assert');
93
+ exports.use(assert);
@@ -0,0 +1,131 @@
1
+ /*!
2
+ * chai
3
+ * http://chaijs.com
4
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
5
+ * MIT Licensed
6
+ */
7
+
8
+ var config = require('./config');
9
+
10
+ module.exports = function (_chai, util) {
11
+ /*!
12
+ * Module dependencies.
13
+ */
14
+
15
+ var AssertionError = _chai.AssertionError
16
+ , flag = util.flag;
17
+
18
+ /*!
19
+ * Module export.
20
+ */
21
+
22
+ _chai.Assertion = Assertion;
23
+
24
+ /*!
25
+ * Assertion Constructor
26
+ *
27
+ * Creates object for chaining.
28
+ *
29
+ * @api private
30
+ */
31
+
32
+ function Assertion (obj, msg, stack) {
33
+ flag(this, 'ssfi', stack || arguments.callee);
34
+ flag(this, 'object', obj);
35
+ flag(this, 'message', msg);
36
+ }
37
+
38
+ Object.defineProperty(Assertion, 'includeStack', {
39
+ get: function() {
40
+ console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
41
+ return config.includeStack;
42
+ },
43
+ set: function(value) {
44
+ console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
45
+ config.includeStack = value;
46
+ }
47
+ });
48
+
49
+ Object.defineProperty(Assertion, 'showDiff', {
50
+ get: function() {
51
+ console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
52
+ return config.showDiff;
53
+ },
54
+ set: function(value) {
55
+ console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
56
+ config.showDiff = value;
57
+ }
58
+ });
59
+
60
+ Assertion.addProperty = function (name, fn) {
61
+ util.addProperty(this.prototype, name, fn);
62
+ };
63
+
64
+ Assertion.addMethod = function (name, fn) {
65
+ util.addMethod(this.prototype, name, fn);
66
+ };
67
+
68
+ Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
69
+ util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
70
+ };
71
+
72
+ Assertion.overwriteProperty = function (name, fn) {
73
+ util.overwriteProperty(this.prototype, name, fn);
74
+ };
75
+
76
+ Assertion.overwriteMethod = function (name, fn) {
77
+ util.overwriteMethod(this.prototype, name, fn);
78
+ };
79
+
80
+ Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
81
+ util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
82
+ };
83
+
84
+ /**
85
+ * ### .assert(expression, message, negateMessage, expected, actual, showDiff)
86
+ *
87
+ * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
88
+ *
89
+ * @name assert
90
+ * @param {Philosophical} expression to be tested
91
+ * @param {String|Function} message or function that returns message to display if expression fails
92
+ * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails
93
+ * @param {Mixed} expected value (remember to check for negation)
94
+ * @param {Mixed} actual (optional) will default to `this.obj`
95
+ * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
96
+ * @api private
97
+ */
98
+
99
+ Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
100
+ var ok = util.test(this, arguments);
101
+ if (true !== showDiff) showDiff = false;
102
+ if (true !== config.showDiff) showDiff = false;
103
+
104
+ if (!ok) {
105
+ var msg = util.getMessage(this, arguments)
106
+ , actual = util.getActual(this, arguments);
107
+ throw new AssertionError(msg, {
108
+ actual: actual
109
+ , expected: expected
110
+ , showDiff: showDiff
111
+ }, (config.includeStack) ? this.assert : flag(this, 'ssfi'));
112
+ }
113
+ };
114
+
115
+ /*!
116
+ * ### ._obj
117
+ *
118
+ * Quick reference to stored `actual` value for plugin developers.
119
+ *
120
+ * @api private
121
+ */
122
+
123
+ Object.defineProperty(Assertion.prototype, '_obj',
124
+ { get: function () {
125
+ return flag(this, 'object');
126
+ }
127
+ , set: function (val) {
128
+ flag(this, 'object', val);
129
+ }
130
+ });
131
+ };
@@ -0,0 +1,55 @@
1
+ module.exports = {
2
+
3
+ /**
4
+ * ### config.includeStack
5
+ *
6
+ * User configurable property, influences whether stack trace
7
+ * is included in Assertion error message. Default of false
8
+ * suppresses stack trace in the error message.
9
+ *
10
+ * chai.config.includeStack = true; // enable stack on error
11
+ *
12
+ * @param {Boolean}
13
+ * @api public
14
+ */
15
+
16
+ includeStack: false,
17
+
18
+ /**
19
+ * ### config.showDiff
20
+ *
21
+ * User configurable property, influences whether or not
22
+ * the `showDiff` flag should be included in the thrown
23
+ * AssertionErrors. `false` will always be `false`; `true`
24
+ * will be true when the assertion has requested a diff
25
+ * be shown.
26
+ *
27
+ * @param {Boolean}
28
+ * @api public
29
+ */
30
+
31
+ showDiff: true,
32
+
33
+ /**
34
+ * ### config.truncateThreshold
35
+ *
36
+ * User configurable property, sets length threshold for actual and
37
+ * expected values in assertion errors. If this threshold is exceeded, for
38
+ * example for large data structures, the value is replaced with something
39
+ * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.
40
+ *
41
+ * Set it to zero if you want to disable truncating altogether.
42
+ *
43
+ * This is especially userful when doing assertions on arrays: having this
44
+ * set to a reasonable large value makes the failure messages readily
45
+ * inspectable.
46
+ *
47
+ * chai.config.truncateThreshold = 0; // disable truncating
48
+ *
49
+ * @param {Number}
50
+ * @api public
51
+ */
52
+
53
+ truncateThreshold: 40
54
+
55
+ };
@@ -0,0 +1,1860 @@
1
+ /*!
2
+ * chai
3
+ * http://chaijs.com
4
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
5
+ * MIT Licensed
6
+ */
7
+
8
+ module.exports = function (chai, _) {
9
+ var Assertion = chai.Assertion
10
+ , toString = Object.prototype.toString
11
+ , flag = _.flag;
12
+
13
+ /**
14
+ * ### Language Chains
15
+ *
16
+ * The following are provided as chainable getters to
17
+ * improve the readability of your assertions. They
18
+ * do not provide testing capabilities unless they
19
+ * have been overwritten by a plugin.
20
+ *
21
+ * **Chains**
22
+ *
23
+ * - to
24
+ * - be
25
+ * - been
26
+ * - is
27
+ * - that
28
+ * - which
29
+ * - and
30
+ * - has
31
+ * - have
32
+ * - with
33
+ * - at
34
+ * - of
35
+ * - same
36
+ *
37
+ * @name language chains
38
+ * @namespace BDD
39
+ * @api public
40
+ */
41
+
42
+ [ 'to', 'be', 'been'
43
+ , 'is', 'and', 'has', 'have'
44
+ , 'with', 'that', 'which', 'at'
45
+ , 'of', 'same' ].forEach(function (chain) {
46
+ Assertion.addProperty(chain, function () {
47
+ return this;
48
+ });
49
+ });
50
+
51
+ /**
52
+ * ### .not
53
+ *
54
+ * Negates any of assertions following in the chain.
55
+ *
56
+ * expect(foo).to.not.equal('bar');
57
+ * expect(goodFn).to.not.throw(Error);
58
+ * expect({ foo: 'baz' }).to.have.property('foo')
59
+ * .and.not.equal('bar');
60
+ *
61
+ * @name not
62
+ * @namespace BDD
63
+ * @api public
64
+ */
65
+
66
+ Assertion.addProperty('not', function () {
67
+ flag(this, 'negate', true);
68
+ });
69
+
70
+ /**
71
+ * ### .deep
72
+ *
73
+ * Sets the `deep` flag, later used by the `equal` and
74
+ * `property` assertions.
75
+ *
76
+ * expect(foo).to.deep.equal({ bar: 'baz' });
77
+ * expect({ foo: { bar: { baz: 'quux' } } })
78
+ * .to.have.deep.property('foo.bar.baz', 'quux');
79
+ *
80
+ * `.deep.property` special characters can be escaped
81
+ * by adding two slashes before the `.` or `[]`.
82
+ *
83
+ * var deepCss = { '.link': { '[target]': 42 }};
84
+ * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42);
85
+ *
86
+ * @name deep
87
+ * @namespace BDD
88
+ * @api public
89
+ */
90
+
91
+ Assertion.addProperty('deep', function () {
92
+ flag(this, 'deep', true);
93
+ });
94
+
95
+ /**
96
+ * ### .any
97
+ *
98
+ * Sets the `any` flag, (opposite of the `all` flag)
99
+ * later used in the `keys` assertion.
100
+ *
101
+ * expect(foo).to.have.any.keys('bar', 'baz');
102
+ *
103
+ * @name any
104
+ * @namespace BDD
105
+ * @api public
106
+ */
107
+
108
+ Assertion.addProperty('any', function () {
109
+ flag(this, 'any', true);
110
+ flag(this, 'all', false)
111
+ });
112
+
113
+
114
+ /**
115
+ * ### .all
116
+ *
117
+ * Sets the `all` flag (opposite of the `any` flag)
118
+ * later used by the `keys` assertion.
119
+ *
120
+ * expect(foo).to.have.all.keys('bar', 'baz');
121
+ *
122
+ * @name all
123
+ * @namespace BDD
124
+ * @api public
125
+ */
126
+
127
+ Assertion.addProperty('all', function () {
128
+ flag(this, 'all', true);
129
+ flag(this, 'any', false);
130
+ });
131
+
132
+ /**
133
+ * ### .a(type)
134
+ *
135
+ * The `a` and `an` assertions are aliases that can be
136
+ * used either as language chains or to assert a value's
137
+ * type.
138
+ *
139
+ * // typeof
140
+ * expect('test').to.be.a('string');
141
+ * expect({ foo: 'bar' }).to.be.an('object');
142
+ * expect(null).to.be.a('null');
143
+ * expect(undefined).to.be.an('undefined');
144
+ * expect(new Error).to.be.an('error');
145
+ * expect(new Promise).to.be.a('promise');
146
+ * expect(new Float32Array()).to.be.a('float32array');
147
+ * expect(Symbol()).to.be.a('symbol');
148
+ *
149
+ * // es6 overrides
150
+ * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo');
151
+ *
152
+ * // language chain
153
+ * expect(foo).to.be.an.instanceof(Foo);
154
+ *
155
+ * @name a
156
+ * @alias an
157
+ * @param {String} type
158
+ * @param {String} message _optional_
159
+ * @namespace BDD
160
+ * @api public
161
+ */
162
+
163
+ function an (type, msg) {
164
+ if (msg) flag(this, 'message', msg);
165
+ type = type.toLowerCase();
166
+ var obj = flag(this, 'object')
167
+ , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';
168
+
169
+ this.assert(
170
+ type === _.type(obj)
171
+ , 'expected #{this} to be ' + article + type
172
+ , 'expected #{this} not to be ' + article + type
173
+ );
174
+ }
175
+
176
+ Assertion.addChainableMethod('an', an);
177
+ Assertion.addChainableMethod('a', an);
178
+
179
+ /**
180
+ * ### .include(value)
181
+ *
182
+ * The `include` and `contain` assertions can be used as either property
183
+ * based language chains or as methods to assert the inclusion of an object
184
+ * in an array or a substring in a string. When used as language chains,
185
+ * they toggle the `contains` flag for the `keys` assertion.
186
+ *
187
+ * expect([1,2,3]).to.include(2);
188
+ * expect('foobar').to.contain('foo');
189
+ * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
190
+ *
191
+ * @name include
192
+ * @alias contain
193
+ * @alias includes
194
+ * @alias contains
195
+ * @param {Object|String|Number} obj
196
+ * @param {String} message _optional_
197
+ * @namespace BDD
198
+ * @api public
199
+ */
200
+
201
+ function includeChainingBehavior () {
202
+ flag(this, 'contains', true);
203
+ }
204
+
205
+ function include (val, msg) {
206
+ _.expectTypes(this, ['array', 'object', 'string']);
207
+
208
+ if (msg) flag(this, 'message', msg);
209
+ var obj = flag(this, 'object');
210
+ var expected = false;
211
+
212
+ if (_.type(obj) === 'array' && _.type(val) === 'object') {
213
+ for (var i in obj) {
214
+ if (_.eql(obj[i], val)) {
215
+ expected = true;
216
+ break;
217
+ }
218
+ }
219
+ } else if (_.type(val) === 'object') {
220
+ if (!flag(this, 'negate')) {
221
+ for (var k in val) new Assertion(obj).property(k, val[k]);
222
+ return;
223
+ }
224
+ var subset = {};
225
+ for (var k in val) subset[k] = obj[k];
226
+ expected = _.eql(subset, val);
227
+ } else {
228
+ expected = (obj != undefined) && ~obj.indexOf(val);
229
+ }
230
+ this.assert(
231
+ expected
232
+ , 'expected #{this} to include ' + _.inspect(val)
233
+ , 'expected #{this} to not include ' + _.inspect(val));
234
+ }
235
+
236
+ Assertion.addChainableMethod('include', include, includeChainingBehavior);
237
+ Assertion.addChainableMethod('contain', include, includeChainingBehavior);
238
+ Assertion.addChainableMethod('contains', include, includeChainingBehavior);
239
+ Assertion.addChainableMethod('includes', include, includeChainingBehavior);
240
+
241
+ /**
242
+ * ### .ok
243
+ *
244
+ * Asserts that the target is truthy.
245
+ *
246
+ * expect('everything').to.be.ok;
247
+ * expect(1).to.be.ok;
248
+ * expect(false).to.not.be.ok;
249
+ * expect(undefined).to.not.be.ok;
250
+ * expect(null).to.not.be.ok;
251
+ *
252
+ * @name ok
253
+ * @namespace BDD
254
+ * @api public
255
+ */
256
+
257
+ Assertion.addProperty('ok', function () {
258
+ this.assert(
259
+ flag(this, 'object')
260
+ , 'expected #{this} to be truthy'
261
+ , 'expected #{this} to be falsy');
262
+ });
263
+
264
+ /**
265
+ * ### .true
266
+ *
267
+ * Asserts that the target is `true`.
268
+ *
269
+ * expect(true).to.be.true;
270
+ * expect(1).to.not.be.true;
271
+ *
272
+ * @name true
273
+ * @namespace BDD
274
+ * @api public
275
+ */
276
+
277
+ Assertion.addProperty('true', function () {
278
+ this.assert(
279
+ true === flag(this, 'object')
280
+ , 'expected #{this} to be true'
281
+ , 'expected #{this} to be false'
282
+ , this.negate ? false : true
283
+ );
284
+ });
285
+
286
+ /**
287
+ * ### .false
288
+ *
289
+ * Asserts that the target is `false`.
290
+ *
291
+ * expect(false).to.be.false;
292
+ * expect(0).to.not.be.false;
293
+ *
294
+ * @name false
295
+ * @namespace BDD
296
+ * @api public
297
+ */
298
+
299
+ Assertion.addProperty('false', function () {
300
+ this.assert(
301
+ false === flag(this, 'object')
302
+ , 'expected #{this} to be false'
303
+ , 'expected #{this} to be true'
304
+ , this.negate ? true : false
305
+ );
306
+ });
307
+
308
+ /**
309
+ * ### .null
310
+ *
311
+ * Asserts that the target is `null`.
312
+ *
313
+ * expect(null).to.be.null;
314
+ * expect(undefined).to.not.be.null;
315
+ *
316
+ * @name null
317
+ * @namespace BDD
318
+ * @api public
319
+ */
320
+
321
+ Assertion.addProperty('null', function () {
322
+ this.assert(
323
+ null === flag(this, 'object')
324
+ , 'expected #{this} to be null'
325
+ , 'expected #{this} not to be null'
326
+ );
327
+ });
328
+
329
+ /**
330
+ * ### .undefined
331
+ *
332
+ * Asserts that the target is `undefined`.
333
+ *
334
+ * expect(undefined).to.be.undefined;
335
+ * expect(null).to.not.be.undefined;
336
+ *
337
+ * @name undefined
338
+ * @namespace BDD
339
+ * @api public
340
+ */
341
+
342
+ Assertion.addProperty('undefined', function () {
343
+ this.assert(
344
+ undefined === flag(this, 'object')
345
+ , 'expected #{this} to be undefined'
346
+ , 'expected #{this} not to be undefined'
347
+ );
348
+ });
349
+
350
+ /**
351
+ * ### .NaN
352
+ * Asserts that the target is `NaN`.
353
+ *
354
+ * expect('foo').to.be.NaN;
355
+ * expect(4).not.to.be.NaN;
356
+ *
357
+ * @name NaN
358
+ * @namespace BDD
359
+ * @api public
360
+ */
361
+
362
+ Assertion.addProperty('NaN', function () {
363
+ this.assert(
364
+ isNaN(flag(this, 'object'))
365
+ , 'expected #{this} to be NaN'
366
+ , 'expected #{this} not to be NaN'
367
+ );
368
+ });
369
+
370
+ /**
371
+ * ### .exist
372
+ *
373
+ * Asserts that the target is neither `null` nor `undefined`.
374
+ *
375
+ * var foo = 'hi'
376
+ * , bar = null
377
+ * , baz;
378
+ *
379
+ * expect(foo).to.exist;
380
+ * expect(bar).to.not.exist;
381
+ * expect(baz).to.not.exist;
382
+ *
383
+ * @name exist
384
+ * @namespace BDD
385
+ * @api public
386
+ */
387
+
388
+ Assertion.addProperty('exist', function () {
389
+ this.assert(
390
+ null != flag(this, 'object')
391
+ , 'expected #{this} to exist'
392
+ , 'expected #{this} to not exist'
393
+ );
394
+ });
395
+
396
+
397
+ /**
398
+ * ### .empty
399
+ *
400
+ * Asserts that the target's length is `0`. For arrays and strings, it checks
401
+ * the `length` property. For objects, it gets the count of
402
+ * enumerable keys.
403
+ *
404
+ * expect([]).to.be.empty;
405
+ * expect('').to.be.empty;
406
+ * expect({}).to.be.empty;
407
+ *
408
+ * @name empty
409
+ * @namespace BDD
410
+ * @api public
411
+ */
412
+
413
+ Assertion.addProperty('empty', function () {
414
+ var obj = flag(this, 'object')
415
+ , expected = obj;
416
+
417
+ if (Array.isArray(obj) || 'string' === typeof object) {
418
+ expected = obj.length;
419
+ } else if (typeof obj === 'object') {
420
+ expected = Object.keys(obj).length;
421
+ }
422
+
423
+ this.assert(
424
+ !expected
425
+ , 'expected #{this} to be empty'
426
+ , 'expected #{this} not to be empty'
427
+ );
428
+ });
429
+
430
+ /**
431
+ * ### .arguments
432
+ *
433
+ * Asserts that the target is an arguments object.
434
+ *
435
+ * function test () {
436
+ * expect(arguments).to.be.arguments;
437
+ * }
438
+ *
439
+ * @name arguments
440
+ * @alias Arguments
441
+ * @namespace BDD
442
+ * @api public
443
+ */
444
+
445
+ function checkArguments () {
446
+ var obj = flag(this, 'object')
447
+ , type = Object.prototype.toString.call(obj);
448
+ this.assert(
449
+ '[object Arguments]' === type
450
+ , 'expected #{this} to be arguments but got ' + type
451
+ , 'expected #{this} to not be arguments'
452
+ );
453
+ }
454
+
455
+ Assertion.addProperty('arguments', checkArguments);
456
+ Assertion.addProperty('Arguments', checkArguments);
457
+
458
+ /**
459
+ * ### .equal(value)
460
+ *
461
+ * Asserts that the target is strictly equal (`===`) to `value`.
462
+ * Alternately, if the `deep` flag is set, asserts that
463
+ * the target is deeply equal to `value`.
464
+ *
465
+ * expect('hello').to.equal('hello');
466
+ * expect(42).to.equal(42);
467
+ * expect(1).to.not.equal(true);
468
+ * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });
469
+ * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
470
+ *
471
+ * @name equal
472
+ * @alias equals
473
+ * @alias eq
474
+ * @alias deep.equal
475
+ * @param {Mixed} value
476
+ * @param {String} message _optional_
477
+ * @namespace BDD
478
+ * @api public
479
+ */
480
+
481
+ function assertEqual (val, msg) {
482
+ if (msg) flag(this, 'message', msg);
483
+ var obj = flag(this, 'object');
484
+ if (flag(this, 'deep')) {
485
+ return this.eql(val);
486
+ } else {
487
+ this.assert(
488
+ val === obj
489
+ , 'expected #{this} to equal #{exp}'
490
+ , 'expected #{this} to not equal #{exp}'
491
+ , val
492
+ , this._obj
493
+ , true
494
+ );
495
+ }
496
+ }
497
+
498
+ Assertion.addMethod('equal', assertEqual);
499
+ Assertion.addMethod('equals', assertEqual);
500
+ Assertion.addMethod('eq', assertEqual);
501
+
502
+ /**
503
+ * ### .eql(value)
504
+ *
505
+ * Asserts that the target is deeply equal to `value`.
506
+ *
507
+ * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });
508
+ * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);
509
+ *
510
+ * @name eql
511
+ * @alias eqls
512
+ * @param {Mixed} value
513
+ * @param {String} message _optional_
514
+ * @namespace BDD
515
+ * @api public
516
+ */
517
+
518
+ function assertEql(obj, msg) {
519
+ if (msg) flag(this, 'message', msg);
520
+ this.assert(
521
+ _.eql(obj, flag(this, 'object'))
522
+ , 'expected #{this} to deeply equal #{exp}'
523
+ , 'expected #{this} to not deeply equal #{exp}'
524
+ , obj
525
+ , this._obj
526
+ , true
527
+ );
528
+ }
529
+
530
+ Assertion.addMethod('eql', assertEql);
531
+ Assertion.addMethod('eqls', assertEql);
532
+
533
+ /**
534
+ * ### .above(value)
535
+ *
536
+ * Asserts that the target is greater than `value`.
537
+ *
538
+ * expect(10).to.be.above(5);
539
+ *
540
+ * Can also be used in conjunction with `length` to
541
+ * assert a minimum length. The benefit being a
542
+ * more informative error message than if the length
543
+ * was supplied directly.
544
+ *
545
+ * expect('foo').to.have.length.above(2);
546
+ * expect([ 1, 2, 3 ]).to.have.length.above(2);
547
+ *
548
+ * @name above
549
+ * @alias gt
550
+ * @alias greaterThan
551
+ * @param {Number} value
552
+ * @param {String} message _optional_
553
+ * @namespace BDD
554
+ * @api public
555
+ */
556
+
557
+ function assertAbove (n, msg) {
558
+ if (msg) flag(this, 'message', msg);
559
+ var obj = flag(this, 'object');
560
+ if (flag(this, 'doLength')) {
561
+ new Assertion(obj, msg).to.have.property('length');
562
+ var len = obj.length;
563
+ this.assert(
564
+ len > n
565
+ , 'expected #{this} to have a length above #{exp} but got #{act}'
566
+ , 'expected #{this} to not have a length above #{exp}'
567
+ , n
568
+ , len
569
+ );
570
+ } else {
571
+ this.assert(
572
+ obj > n
573
+ , 'expected #{this} to be above ' + n
574
+ , 'expected #{this} to be at most ' + n
575
+ );
576
+ }
577
+ }
578
+
579
+ Assertion.addMethod('above', assertAbove);
580
+ Assertion.addMethod('gt', assertAbove);
581
+ Assertion.addMethod('greaterThan', assertAbove);
582
+
583
+ /**
584
+ * ### .least(value)
585
+ *
586
+ * Asserts that the target is greater than or equal to `value`.
587
+ *
588
+ * expect(10).to.be.at.least(10);
589
+ *
590
+ * Can also be used in conjunction with `length` to
591
+ * assert a minimum length. The benefit being a
592
+ * more informative error message than if the length
593
+ * was supplied directly.
594
+ *
595
+ * expect('foo').to.have.length.of.at.least(2);
596
+ * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);
597
+ *
598
+ * @name least
599
+ * @alias gte
600
+ * @param {Number} value
601
+ * @param {String} message _optional_
602
+ * @namespace BDD
603
+ * @api public
604
+ */
605
+
606
+ function assertLeast (n, msg) {
607
+ if (msg) flag(this, 'message', msg);
608
+ var obj = flag(this, 'object');
609
+ if (flag(this, 'doLength')) {
610
+ new Assertion(obj, msg).to.have.property('length');
611
+ var len = obj.length;
612
+ this.assert(
613
+ len >= n
614
+ , 'expected #{this} to have a length at least #{exp} but got #{act}'
615
+ , 'expected #{this} to have a length below #{exp}'
616
+ , n
617
+ , len
618
+ );
619
+ } else {
620
+ this.assert(
621
+ obj >= n
622
+ , 'expected #{this} to be at least ' + n
623
+ , 'expected #{this} to be below ' + n
624
+ );
625
+ }
626
+ }
627
+
628
+ Assertion.addMethod('least', assertLeast);
629
+ Assertion.addMethod('gte', assertLeast);
630
+
631
+ /**
632
+ * ### .below(value)
633
+ *
634
+ * Asserts that the target is less than `value`.
635
+ *
636
+ * expect(5).to.be.below(10);
637
+ *
638
+ * Can also be used in conjunction with `length` to
639
+ * assert a maximum length. The benefit being a
640
+ * more informative error message than if the length
641
+ * was supplied directly.
642
+ *
643
+ * expect('foo').to.have.length.below(4);
644
+ * expect([ 1, 2, 3 ]).to.have.length.below(4);
645
+ *
646
+ * @name below
647
+ * @alias lt
648
+ * @alias lessThan
649
+ * @param {Number} value
650
+ * @param {String} message _optional_
651
+ * @namespace BDD
652
+ * @api public
653
+ */
654
+
655
+ function assertBelow (n, msg) {
656
+ if (msg) flag(this, 'message', msg);
657
+ var obj = flag(this, 'object');
658
+ if (flag(this, 'doLength')) {
659
+ new Assertion(obj, msg).to.have.property('length');
660
+ var len = obj.length;
661
+ this.assert(
662
+ len < n
663
+ , 'expected #{this} to have a length below #{exp} but got #{act}'
664
+ , 'expected #{this} to not have a length below #{exp}'
665
+ , n
666
+ , len
667
+ );
668
+ } else {
669
+ this.assert(
670
+ obj < n
671
+ , 'expected #{this} to be below ' + n
672
+ , 'expected #{this} to be at least ' + n
673
+ );
674
+ }
675
+ }
676
+
677
+ Assertion.addMethod('below', assertBelow);
678
+ Assertion.addMethod('lt', assertBelow);
679
+ Assertion.addMethod('lessThan', assertBelow);
680
+
681
+ /**
682
+ * ### .most(value)
683
+ *
684
+ * Asserts that the target is less than or equal to `value`.
685
+ *
686
+ * expect(5).to.be.at.most(5);
687
+ *
688
+ * Can also be used in conjunction with `length` to
689
+ * assert a maximum length. The benefit being a
690
+ * more informative error message than if the length
691
+ * was supplied directly.
692
+ *
693
+ * expect('foo').to.have.length.of.at.most(4);
694
+ * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);
695
+ *
696
+ * @name most
697
+ * @alias lte
698
+ * @param {Number} value
699
+ * @param {String} message _optional_
700
+ * @namespace BDD
701
+ * @api public
702
+ */
703
+
704
+ function assertMost (n, msg) {
705
+ if (msg) flag(this, 'message', msg);
706
+ var obj = flag(this, 'object');
707
+ if (flag(this, 'doLength')) {
708
+ new Assertion(obj, msg).to.have.property('length');
709
+ var len = obj.length;
710
+ this.assert(
711
+ len <= n
712
+ , 'expected #{this} to have a length at most #{exp} but got #{act}'
713
+ , 'expected #{this} to have a length above #{exp}'
714
+ , n
715
+ , len
716
+ );
717
+ } else {
718
+ this.assert(
719
+ obj <= n
720
+ , 'expected #{this} to be at most ' + n
721
+ , 'expected #{this} to be above ' + n
722
+ );
723
+ }
724
+ }
725
+
726
+ Assertion.addMethod('most', assertMost);
727
+ Assertion.addMethod('lte', assertMost);
728
+
729
+ /**
730
+ * ### .within(start, finish)
731
+ *
732
+ * Asserts that the target is within a range.
733
+ *
734
+ * expect(7).to.be.within(5,10);
735
+ *
736
+ * Can also be used in conjunction with `length` to
737
+ * assert a length range. The benefit being a
738
+ * more informative error message than if the length
739
+ * was supplied directly.
740
+ *
741
+ * expect('foo').to.have.length.within(2,4);
742
+ * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
743
+ *
744
+ * @name within
745
+ * @param {Number} start lowerbound inclusive
746
+ * @param {Number} finish upperbound inclusive
747
+ * @param {String} message _optional_
748
+ * @namespace BDD
749
+ * @api public
750
+ */
751
+
752
+ Assertion.addMethod('within', function (start, finish, msg) {
753
+ if (msg) flag(this, 'message', msg);
754
+ var obj = flag(this, 'object')
755
+ , range = start + '..' + finish;
756
+ if (flag(this, 'doLength')) {
757
+ new Assertion(obj, msg).to.have.property('length');
758
+ var len = obj.length;
759
+ this.assert(
760
+ len >= start && len <= finish
761
+ , 'expected #{this} to have a length within ' + range
762
+ , 'expected #{this} to not have a length within ' + range
763
+ );
764
+ } else {
765
+ this.assert(
766
+ obj >= start && obj <= finish
767
+ , 'expected #{this} to be within ' + range
768
+ , 'expected #{this} to not be within ' + range
769
+ );
770
+ }
771
+ });
772
+
773
+ /**
774
+ * ### .instanceof(constructor)
775
+ *
776
+ * Asserts that the target is an instance of `constructor`.
777
+ *
778
+ * var Tea = function (name) { this.name = name; }
779
+ * , Chai = new Tea('chai');
780
+ *
781
+ * expect(Chai).to.be.an.instanceof(Tea);
782
+ * expect([ 1, 2, 3 ]).to.be.instanceof(Array);
783
+ *
784
+ * @name instanceof
785
+ * @param {Constructor} constructor
786
+ * @param {String} message _optional_
787
+ * @alias instanceOf
788
+ * @namespace BDD
789
+ * @api public
790
+ */
791
+
792
+ function assertInstanceOf (constructor, msg) {
793
+ if (msg) flag(this, 'message', msg);
794
+ var name = _.getName(constructor);
795
+ this.assert(
796
+ flag(this, 'object') instanceof constructor
797
+ , 'expected #{this} to be an instance of ' + name
798
+ , 'expected #{this} to not be an instance of ' + name
799
+ );
800
+ };
801
+
802
+ Assertion.addMethod('instanceof', assertInstanceOf);
803
+ Assertion.addMethod('instanceOf', assertInstanceOf);
804
+
805
+ /**
806
+ * ### .property(name, [value])
807
+ *
808
+ * Asserts that the target has a property `name`, optionally asserting that
809
+ * the value of that property is strictly equal to `value`.
810
+ * If the `deep` flag is set, you can use dot- and bracket-notation for deep
811
+ * references into objects and arrays.
812
+ *
813
+ * // simple referencing
814
+ * var obj = { foo: 'bar' };
815
+ * expect(obj).to.have.property('foo');
816
+ * expect(obj).to.have.property('foo', 'bar');
817
+ *
818
+ * // deep referencing
819
+ * var deepObj = {
820
+ * green: { tea: 'matcha' }
821
+ * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]
822
+ * };
823
+ *
824
+ * expect(deepObj).to.have.deep.property('green.tea', 'matcha');
825
+ * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');
826
+ * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');
827
+ *
828
+ * You can also use an array as the starting point of a `deep.property`
829
+ * assertion, or traverse nested arrays.
830
+ *
831
+ * var arr = [
832
+ * [ 'chai', 'matcha', 'konacha' ]
833
+ * , [ { tea: 'chai' }
834
+ * , { tea: 'matcha' }
835
+ * , { tea: 'konacha' } ]
836
+ * ];
837
+ *
838
+ * expect(arr).to.have.deep.property('[0][1]', 'matcha');
839
+ * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');
840
+ *
841
+ * Furthermore, `property` changes the subject of the assertion
842
+ * to be the value of that property from the original object. This
843
+ * permits for further chainable assertions on that property.
844
+ *
845
+ * expect(obj).to.have.property('foo')
846
+ * .that.is.a('string');
847
+ * expect(deepObj).to.have.property('green')
848
+ * .that.is.an('object')
849
+ * .that.deep.equals({ tea: 'matcha' });
850
+ * expect(deepObj).to.have.property('teas')
851
+ * .that.is.an('array')
852
+ * .with.deep.property('[2]')
853
+ * .that.deep.equals({ tea: 'konacha' });
854
+ *
855
+ * Note that dots and bracket in `name` must be backslash-escaped when
856
+ * the `deep` flag is set, while they must NOT be escaped when the `deep`
857
+ * flag is not set.
858
+ *
859
+ * // simple referencing
860
+ * var css = { '.link[target]': 42 };
861
+ * expect(css).to.have.property('.link[target]', 42);
862
+ *
863
+ * // deep referencing
864
+ * var deepCss = { '.link': { '[target]': 42 }};
865
+ * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42);
866
+ *
867
+ * @name property
868
+ * @alias deep.property
869
+ * @param {String} name
870
+ * @param {Mixed} value (optional)
871
+ * @param {String} message _optional_
872
+ * @returns value of property for chaining
873
+ * @namespace BDD
874
+ * @api public
875
+ */
876
+
877
+ Assertion.addMethod('property', function (name, val, msg) {
878
+ if (msg) flag(this, 'message', msg);
879
+
880
+ var isDeep = !!flag(this, 'deep')
881
+ , descriptor = isDeep ? 'deep property ' : 'property '
882
+ , negate = flag(this, 'negate')
883
+ , obj = flag(this, 'object')
884
+ , pathInfo = isDeep ? _.getPathInfo(name, obj) : null
885
+ , hasProperty = isDeep
886
+ ? pathInfo.exists
887
+ : _.hasProperty(name, obj)
888
+ , value = isDeep
889
+ ? pathInfo.value
890
+ : obj[name];
891
+
892
+ if (negate && arguments.length > 1) {
893
+ if (undefined === value) {
894
+ msg = (msg != null) ? msg + ': ' : '';
895
+ throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));
896
+ }
897
+ } else {
898
+ this.assert(
899
+ hasProperty
900
+ , 'expected #{this} to have a ' + descriptor + _.inspect(name)
901
+ , 'expected #{this} to not have ' + descriptor + _.inspect(name));
902
+ }
903
+
904
+ if (arguments.length > 1) {
905
+ this.assert(
906
+ val === value
907
+ , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'
908
+ , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'
909
+ , val
910
+ , value
911
+ );
912
+ }
913
+
914
+ flag(this, 'object', value);
915
+ });
916
+
917
+
918
+ /**
919
+ * ### .ownProperty(name)
920
+ *
921
+ * Asserts that the target has an own property `name`.
922
+ *
923
+ * expect('test').to.have.ownProperty('length');
924
+ *
925
+ * @name ownProperty
926
+ * @alias haveOwnProperty
927
+ * @param {String} name
928
+ * @param {String} message _optional_
929
+ * @namespace BDD
930
+ * @api public
931
+ */
932
+
933
+ function assertOwnProperty (name, msg) {
934
+ if (msg) flag(this, 'message', msg);
935
+ var obj = flag(this, 'object');
936
+ this.assert(
937
+ obj.hasOwnProperty(name)
938
+ , 'expected #{this} to have own property ' + _.inspect(name)
939
+ , 'expected #{this} to not have own property ' + _.inspect(name)
940
+ );
941
+ }
942
+
943
+ Assertion.addMethod('ownProperty', assertOwnProperty);
944
+ Assertion.addMethod('haveOwnProperty', assertOwnProperty);
945
+
946
+ /**
947
+ * ### .ownPropertyDescriptor(name[, descriptor[, message]])
948
+ *
949
+ * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.
950
+ *
951
+ * expect('test').to.have.ownPropertyDescriptor('length');
952
+ * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });
953
+ * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });
954
+ * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);
955
+ * expect('test').ownPropertyDescriptor('length').to.have.keys('value');
956
+ *
957
+ * @name ownPropertyDescriptor
958
+ * @alias haveOwnPropertyDescriptor
959
+ * @param {String} name
960
+ * @param {Object} descriptor _optional_
961
+ * @param {String} message _optional_
962
+ * @namespace BDD
963
+ * @api public
964
+ */
965
+
966
+ function assertOwnPropertyDescriptor (name, descriptor, msg) {
967
+ if (typeof descriptor === 'string') {
968
+ msg = descriptor;
969
+ descriptor = null;
970
+ }
971
+ if (msg) flag(this, 'message', msg);
972
+ var obj = flag(this, 'object');
973
+ var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
974
+ if (actualDescriptor && descriptor) {
975
+ this.assert(
976
+ _.eql(descriptor, actualDescriptor)
977
+ , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)
978
+ , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)
979
+ , descriptor
980
+ , actualDescriptor
981
+ , true
982
+ );
983
+ } else {
984
+ this.assert(
985
+ actualDescriptor
986
+ , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)
987
+ , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)
988
+ );
989
+ }
990
+ flag(this, 'object', actualDescriptor);
991
+ }
992
+
993
+ Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);
994
+ Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);
995
+
996
+ /**
997
+ * ### .length
998
+ *
999
+ * Sets the `doLength` flag later used as a chain precursor to a value
1000
+ * comparison for the `length` property.
1001
+ *
1002
+ * expect('foo').to.have.length.above(2);
1003
+ * expect([ 1, 2, 3 ]).to.have.length.above(2);
1004
+ * expect('foo').to.have.length.below(4);
1005
+ * expect([ 1, 2, 3 ]).to.have.length.below(4);
1006
+ * expect('foo').to.have.length.within(2,4);
1007
+ * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
1008
+ *
1009
+ * *Deprecation notice:* Using `length` as an assertion will be deprecated
1010
+ * in version 2.4.0 and removed in 3.0.0. Code using the old style of
1011
+ * asserting for `length` property value using `length(value)` should be
1012
+ * switched to use `lengthOf(value)` instead.
1013
+ *
1014
+ * @name length
1015
+ * @namespace BDD
1016
+ * @api public
1017
+ */
1018
+
1019
+ /**
1020
+ * ### .lengthOf(value[, message])
1021
+ *
1022
+ * Asserts that the target's `length` property has
1023
+ * the expected value.
1024
+ *
1025
+ * expect([ 1, 2, 3]).to.have.lengthOf(3);
1026
+ * expect('foobar').to.have.lengthOf(6);
1027
+ *
1028
+ * @name lengthOf
1029
+ * @param {Number} length
1030
+ * @param {String} message _optional_
1031
+ * @namespace BDD
1032
+ * @api public
1033
+ */
1034
+
1035
+ function assertLengthChain () {
1036
+ flag(this, 'doLength', true);
1037
+ }
1038
+
1039
+ function assertLength (n, msg) {
1040
+ if (msg) flag(this, 'message', msg);
1041
+ var obj = flag(this, 'object');
1042
+ new Assertion(obj, msg).to.have.property('length');
1043
+ var len = obj.length;
1044
+
1045
+ this.assert(
1046
+ len == n
1047
+ , 'expected #{this} to have a length of #{exp} but got #{act}'
1048
+ , 'expected #{this} to not have a length of #{act}'
1049
+ , n
1050
+ , len
1051
+ );
1052
+ }
1053
+
1054
+ Assertion.addChainableMethod('length', assertLength, assertLengthChain);
1055
+ Assertion.addMethod('lengthOf', assertLength);
1056
+
1057
+ /**
1058
+ * ### .match(regexp)
1059
+ *
1060
+ * Asserts that the target matches a regular expression.
1061
+ *
1062
+ * expect('foobar').to.match(/^foo/);
1063
+ *
1064
+ * @name match
1065
+ * @alias matches
1066
+ * @param {RegExp} RegularExpression
1067
+ * @param {String} message _optional_
1068
+ * @namespace BDD
1069
+ * @api public
1070
+ */
1071
+ function assertMatch(re, msg) {
1072
+ if (msg) flag(this, 'message', msg);
1073
+ var obj = flag(this, 'object');
1074
+ this.assert(
1075
+ re.exec(obj)
1076
+ , 'expected #{this} to match ' + re
1077
+ , 'expected #{this} not to match ' + re
1078
+ );
1079
+ }
1080
+
1081
+ Assertion.addMethod('match', assertMatch);
1082
+ Assertion.addMethod('matches', assertMatch);
1083
+
1084
+ /**
1085
+ * ### .string(string)
1086
+ *
1087
+ * Asserts that the string target contains another string.
1088
+ *
1089
+ * expect('foobar').to.have.string('bar');
1090
+ *
1091
+ * @name string
1092
+ * @param {String} string
1093
+ * @param {String} message _optional_
1094
+ * @namespace BDD
1095
+ * @api public
1096
+ */
1097
+
1098
+ Assertion.addMethod('string', function (str, msg) {
1099
+ if (msg) flag(this, 'message', msg);
1100
+ var obj = flag(this, 'object');
1101
+ new Assertion(obj, msg).is.a('string');
1102
+
1103
+ this.assert(
1104
+ ~obj.indexOf(str)
1105
+ , 'expected #{this} to contain ' + _.inspect(str)
1106
+ , 'expected #{this} to not contain ' + _.inspect(str)
1107
+ );
1108
+ });
1109
+
1110
+
1111
+ /**
1112
+ * ### .keys(key1, [key2], [...])
1113
+ *
1114
+ * Asserts that the target contains any or all of the passed-in keys.
1115
+ * Use in combination with `any`, `all`, `contains`, or `have` will affect
1116
+ * what will pass.
1117
+ *
1118
+ * When used in conjunction with `any`, at least one key that is passed
1119
+ * in must exist in the target object. This is regardless whether or not
1120
+ * the `have` or `contain` qualifiers are used. Note, either `any` or `all`
1121
+ * should be used in the assertion. If neither are used, the assertion is
1122
+ * defaulted to `all`.
1123
+ *
1124
+ * When both `all` and `contain` are used, the target object must have at
1125
+ * least all of the passed-in keys but may have more keys not listed.
1126
+ *
1127
+ * When both `all` and `have` are used, the target object must both contain
1128
+ * all of the passed-in keys AND the number of keys in the target object must
1129
+ * match the number of keys passed in (in other words, a target object must
1130
+ * have all and only all of the passed-in keys).
1131
+ *
1132
+ * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');
1133
+ * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');
1134
+ * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');
1135
+ * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);
1136
+ * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});
1137
+ * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);
1138
+ * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});
1139
+ * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);
1140
+ * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});
1141
+ *
1142
+ *
1143
+ * @name keys
1144
+ * @alias key
1145
+ * @param {...String|Array|Object} keys
1146
+ * @namespace BDD
1147
+ * @api public
1148
+ */
1149
+
1150
+ function assertKeys (keys) {
1151
+ var obj = flag(this, 'object')
1152
+ , str
1153
+ , ok = true
1154
+ , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';
1155
+
1156
+ switch (_.type(keys)) {
1157
+ case "array":
1158
+ if (arguments.length > 1) throw (new Error(mixedArgsMsg));
1159
+ break;
1160
+ case "object":
1161
+ if (arguments.length > 1) throw (new Error(mixedArgsMsg));
1162
+ keys = Object.keys(keys);
1163
+ break;
1164
+ default:
1165
+ keys = Array.prototype.slice.call(arguments);
1166
+ }
1167
+
1168
+ if (!keys.length) throw new Error('keys required');
1169
+
1170
+ var actual = Object.keys(obj)
1171
+ , expected = keys
1172
+ , len = keys.length
1173
+ , any = flag(this, 'any')
1174
+ , all = flag(this, 'all');
1175
+
1176
+ if (!any && !all) {
1177
+ all = true;
1178
+ }
1179
+
1180
+ // Has any
1181
+ if (any) {
1182
+ var intersection = expected.filter(function(key) {
1183
+ return ~actual.indexOf(key);
1184
+ });
1185
+ ok = intersection.length > 0;
1186
+ }
1187
+
1188
+ // Has all
1189
+ if (all) {
1190
+ ok = keys.every(function(key){
1191
+ return ~actual.indexOf(key);
1192
+ });
1193
+ if (!flag(this, 'negate') && !flag(this, 'contains')) {
1194
+ ok = ok && keys.length == actual.length;
1195
+ }
1196
+ }
1197
+
1198
+ // Key string
1199
+ if (len > 1) {
1200
+ keys = keys.map(function(key){
1201
+ return _.inspect(key);
1202
+ });
1203
+ var last = keys.pop();
1204
+ if (all) {
1205
+ str = keys.join(', ') + ', and ' + last;
1206
+ }
1207
+ if (any) {
1208
+ str = keys.join(', ') + ', or ' + last;
1209
+ }
1210
+ } else {
1211
+ str = _.inspect(keys[0]);
1212
+ }
1213
+
1214
+ // Form
1215
+ str = (len > 1 ? 'keys ' : 'key ') + str;
1216
+
1217
+ // Have / include
1218
+ str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;
1219
+
1220
+ // Assertion
1221
+ this.assert(
1222
+ ok
1223
+ , 'expected #{this} to ' + str
1224
+ , 'expected #{this} to not ' + str
1225
+ , expected.slice(0).sort()
1226
+ , actual.sort()
1227
+ , true
1228
+ );
1229
+ }
1230
+
1231
+ Assertion.addMethod('keys', assertKeys);
1232
+ Assertion.addMethod('key', assertKeys);
1233
+
1234
+ /**
1235
+ * ### .throw(constructor)
1236
+ *
1237
+ * Asserts that the function target will throw a specific error, or specific type of error
1238
+ * (as determined using `instanceof`), optionally with a RegExp or string inclusion test
1239
+ * for the error's message.
1240
+ *
1241
+ * var err = new ReferenceError('This is a bad function.');
1242
+ * var fn = function () { throw err; }
1243
+ * expect(fn).to.throw(ReferenceError);
1244
+ * expect(fn).to.throw(Error);
1245
+ * expect(fn).to.throw(/bad function/);
1246
+ * expect(fn).to.not.throw('good function');
1247
+ * expect(fn).to.throw(ReferenceError, /bad function/);
1248
+ * expect(fn).to.throw(err);
1249
+ *
1250
+ * Please note that when a throw expectation is negated, it will check each
1251
+ * parameter independently, starting with error constructor type. The appropriate way
1252
+ * to check for the existence of a type of error but for a message that does not match
1253
+ * is to use `and`.
1254
+ *
1255
+ * expect(fn).to.throw(ReferenceError)
1256
+ * .and.not.throw(/good function/);
1257
+ *
1258
+ * @name throw
1259
+ * @alias throws
1260
+ * @alias Throw
1261
+ * @param {ErrorConstructor} constructor
1262
+ * @param {String|RegExp} expected error message
1263
+ * @param {String} message _optional_
1264
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
1265
+ * @returns error for chaining (null if no error)
1266
+ * @namespace BDD
1267
+ * @api public
1268
+ */
1269
+
1270
+ function assertThrows (constructor, errMsg, msg) {
1271
+ if (msg) flag(this, 'message', msg);
1272
+ var obj = flag(this, 'object');
1273
+ new Assertion(obj, msg).is.a('function');
1274
+
1275
+ var thrown = false
1276
+ , desiredError = null
1277
+ , name = null
1278
+ , thrownError = null;
1279
+
1280
+ if (arguments.length === 0) {
1281
+ errMsg = null;
1282
+ constructor = null;
1283
+ } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {
1284
+ errMsg = constructor;
1285
+ constructor = null;
1286
+ } else if (constructor && constructor instanceof Error) {
1287
+ desiredError = constructor;
1288
+ constructor = null;
1289
+ errMsg = null;
1290
+ } else if (typeof constructor === 'function') {
1291
+ name = constructor.prototype.name;
1292
+ if (!name || (name === 'Error' && constructor !== Error)) {
1293
+ name = constructor.name || (new constructor()).name;
1294
+ }
1295
+ } else {
1296
+ constructor = null;
1297
+ }
1298
+
1299
+ try {
1300
+ obj();
1301
+ } catch (err) {
1302
+ // first, check desired error
1303
+ if (desiredError) {
1304
+ this.assert(
1305
+ err === desiredError
1306
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
1307
+ , 'expected #{this} to not throw #{exp}'
1308
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
1309
+ , (err instanceof Error ? err.toString() : err)
1310
+ );
1311
+
1312
+ flag(this, 'object', err);
1313
+ return this;
1314
+ }
1315
+
1316
+ // next, check constructor
1317
+ if (constructor) {
1318
+ this.assert(
1319
+ err instanceof constructor
1320
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
1321
+ , 'expected #{this} to not throw #{exp} but #{act} was thrown'
1322
+ , name
1323
+ , (err instanceof Error ? err.toString() : err)
1324
+ );
1325
+
1326
+ if (!errMsg) {
1327
+ flag(this, 'object', err);
1328
+ return this;
1329
+ }
1330
+ }
1331
+
1332
+ // next, check message
1333
+ var message = 'error' === _.type(err) && "message" in err
1334
+ ? err.message
1335
+ : '' + err;
1336
+
1337
+ if ((message != null) && errMsg && errMsg instanceof RegExp) {
1338
+ this.assert(
1339
+ errMsg.exec(message)
1340
+ , 'expected #{this} to throw error matching #{exp} but got #{act}'
1341
+ , 'expected #{this} to throw error not matching #{exp}'
1342
+ , errMsg
1343
+ , message
1344
+ );
1345
+
1346
+ flag(this, 'object', err);
1347
+ return this;
1348
+ } else if ((message != null) && errMsg && 'string' === typeof errMsg) {
1349
+ this.assert(
1350
+ ~message.indexOf(errMsg)
1351
+ , 'expected #{this} to throw error including #{exp} but got #{act}'
1352
+ , 'expected #{this} to throw error not including #{act}'
1353
+ , errMsg
1354
+ , message
1355
+ );
1356
+
1357
+ flag(this, 'object', err);
1358
+ return this;
1359
+ } else {
1360
+ thrown = true;
1361
+ thrownError = err;
1362
+ }
1363
+ }
1364
+
1365
+ var actuallyGot = ''
1366
+ , expectedThrown = name !== null
1367
+ ? name
1368
+ : desiredError
1369
+ ? '#{exp}' //_.inspect(desiredError)
1370
+ : 'an error';
1371
+
1372
+ if (thrown) {
1373
+ actuallyGot = ' but #{act} was thrown'
1374
+ }
1375
+
1376
+ this.assert(
1377
+ thrown === true
1378
+ , 'expected #{this} to throw ' + expectedThrown + actuallyGot
1379
+ , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
1380
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
1381
+ , (thrownError instanceof Error ? thrownError.toString() : thrownError)
1382
+ );
1383
+
1384
+ flag(this, 'object', thrownError);
1385
+ };
1386
+
1387
+ Assertion.addMethod('throw', assertThrows);
1388
+ Assertion.addMethod('throws', assertThrows);
1389
+ Assertion.addMethod('Throw', assertThrows);
1390
+
1391
+ /**
1392
+ * ### .respondTo(method)
1393
+ *
1394
+ * Asserts that the object or class target will respond to a method.
1395
+ *
1396
+ * Klass.prototype.bar = function(){};
1397
+ * expect(Klass).to.respondTo('bar');
1398
+ * expect(obj).to.respondTo('bar');
1399
+ *
1400
+ * To check if a constructor will respond to a static function,
1401
+ * set the `itself` flag.
1402
+ *
1403
+ * Klass.baz = function(){};
1404
+ * expect(Klass).itself.to.respondTo('baz');
1405
+ *
1406
+ * @name respondTo
1407
+ * @alias respondsTo
1408
+ * @param {String} method
1409
+ * @param {String} message _optional_
1410
+ * @namespace BDD
1411
+ * @api public
1412
+ */
1413
+
1414
+ function respondTo (method, msg) {
1415
+ if (msg) flag(this, 'message', msg);
1416
+ var obj = flag(this, 'object')
1417
+ , itself = flag(this, 'itself')
1418
+ , context = ('function' === _.type(obj) && !itself)
1419
+ ? obj.prototype[method]
1420
+ : obj[method];
1421
+
1422
+ this.assert(
1423
+ 'function' === typeof context
1424
+ , 'expected #{this} to respond to ' + _.inspect(method)
1425
+ , 'expected #{this} to not respond to ' + _.inspect(method)
1426
+ );
1427
+ }
1428
+
1429
+ Assertion.addMethod('respondTo', respondTo);
1430
+ Assertion.addMethod('respondsTo', respondTo);
1431
+
1432
+ /**
1433
+ * ### .itself
1434
+ *
1435
+ * Sets the `itself` flag, later used by the `respondTo` assertion.
1436
+ *
1437
+ * function Foo() {}
1438
+ * Foo.bar = function() {}
1439
+ * Foo.prototype.baz = function() {}
1440
+ *
1441
+ * expect(Foo).itself.to.respondTo('bar');
1442
+ * expect(Foo).itself.not.to.respondTo('baz');
1443
+ *
1444
+ * @name itself
1445
+ * @namespace BDD
1446
+ * @api public
1447
+ */
1448
+
1449
+ Assertion.addProperty('itself', function () {
1450
+ flag(this, 'itself', true);
1451
+ });
1452
+
1453
+ /**
1454
+ * ### .satisfy(method)
1455
+ *
1456
+ * Asserts that the target passes a given truth test.
1457
+ *
1458
+ * expect(1).to.satisfy(function(num) { return num > 0; });
1459
+ *
1460
+ * @name satisfy
1461
+ * @alias satisfies
1462
+ * @param {Function} matcher
1463
+ * @param {String} message _optional_
1464
+ * @namespace BDD
1465
+ * @api public
1466
+ */
1467
+
1468
+ function satisfy (matcher, msg) {
1469
+ if (msg) flag(this, 'message', msg);
1470
+ var obj = flag(this, 'object');
1471
+ var result = matcher(obj);
1472
+ this.assert(
1473
+ result
1474
+ , 'expected #{this} to satisfy ' + _.objDisplay(matcher)
1475
+ , 'expected #{this} to not satisfy' + _.objDisplay(matcher)
1476
+ , this.negate ? false : true
1477
+ , result
1478
+ );
1479
+ }
1480
+
1481
+ Assertion.addMethod('satisfy', satisfy);
1482
+ Assertion.addMethod('satisfies', satisfy);
1483
+
1484
+ /**
1485
+ * ### .closeTo(expected, delta)
1486
+ *
1487
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
1488
+ *
1489
+ * expect(1.5).to.be.closeTo(1, 0.5);
1490
+ *
1491
+ * @name closeTo
1492
+ * @alias approximately
1493
+ * @param {Number} expected
1494
+ * @param {Number} delta
1495
+ * @param {String} message _optional_
1496
+ * @namespace BDD
1497
+ * @api public
1498
+ */
1499
+
1500
+ function closeTo(expected, delta, msg) {
1501
+ if (msg) flag(this, 'message', msg);
1502
+ var obj = flag(this, 'object');
1503
+
1504
+ new Assertion(obj, msg).is.a('number');
1505
+ if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {
1506
+ throw new Error('the arguments to closeTo or approximately must be numbers');
1507
+ }
1508
+
1509
+ this.assert(
1510
+ Math.abs(obj - expected) <= delta
1511
+ , 'expected #{this} to be close to ' + expected + ' +/- ' + delta
1512
+ , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta
1513
+ );
1514
+ }
1515
+
1516
+ Assertion.addMethod('closeTo', closeTo);
1517
+ Assertion.addMethod('approximately', closeTo);
1518
+
1519
+ function isSubsetOf(subset, superset, cmp) {
1520
+ return subset.every(function(elem) {
1521
+ if (!cmp) return superset.indexOf(elem) !== -1;
1522
+
1523
+ return superset.some(function(elem2) {
1524
+ return cmp(elem, elem2);
1525
+ });
1526
+ })
1527
+ }
1528
+
1529
+ /**
1530
+ * ### .members(set)
1531
+ *
1532
+ * Asserts that the target is a superset of `set`,
1533
+ * or that the target and `set` have the same strictly-equal (===) members.
1534
+ * Alternately, if the `deep` flag is set, set members are compared for deep
1535
+ * equality.
1536
+ *
1537
+ * expect([1, 2, 3]).to.include.members([3, 2]);
1538
+ * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
1539
+ *
1540
+ * expect([4, 2]).to.have.members([2, 4]);
1541
+ * expect([5, 2]).to.not.have.members([5, 2, 1]);
1542
+ *
1543
+ * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);
1544
+ *
1545
+ * @name members
1546
+ * @param {Array} set
1547
+ * @param {String} message _optional_
1548
+ * @namespace BDD
1549
+ * @api public
1550
+ */
1551
+
1552
+ Assertion.addMethod('members', function (subset, msg) {
1553
+ if (msg) flag(this, 'message', msg);
1554
+ var obj = flag(this, 'object');
1555
+
1556
+ new Assertion(obj).to.be.an('array');
1557
+ new Assertion(subset).to.be.an('array');
1558
+
1559
+ var cmp = flag(this, 'deep') ? _.eql : undefined;
1560
+
1561
+ if (flag(this, 'contains')) {
1562
+ return this.assert(
1563
+ isSubsetOf(subset, obj, cmp)
1564
+ , 'expected #{this} to be a superset of #{act}'
1565
+ , 'expected #{this} to not be a superset of #{act}'
1566
+ , obj
1567
+ , subset
1568
+ );
1569
+ }
1570
+
1571
+ this.assert(
1572
+ isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)
1573
+ , 'expected #{this} to have the same members as #{act}'
1574
+ , 'expected #{this} to not have the same members as #{act}'
1575
+ , obj
1576
+ , subset
1577
+ );
1578
+ });
1579
+
1580
+ /**
1581
+ * ### .oneOf(list)
1582
+ *
1583
+ * Assert that a value appears somewhere in the top level of array `list`.
1584
+ *
1585
+ * expect('a').to.be.oneOf(['a', 'b', 'c']);
1586
+ * expect(9).to.not.be.oneOf(['z']);
1587
+ * expect([3]).to.not.be.oneOf([1, 2, [3]]);
1588
+ *
1589
+ * var three = [3];
1590
+ * // for object-types, contents are not compared
1591
+ * expect(three).to.not.be.oneOf([1, 2, [3]]);
1592
+ * // comparing references works
1593
+ * expect(three).to.be.oneOf([1, 2, three]);
1594
+ *
1595
+ * @name oneOf
1596
+ * @param {Array<*>} list
1597
+ * @param {String} message _optional_
1598
+ * @namespace BDD
1599
+ * @api public
1600
+ */
1601
+
1602
+ function oneOf (list, msg) {
1603
+ if (msg) flag(this, 'message', msg);
1604
+ var expected = flag(this, 'object');
1605
+ new Assertion(list).to.be.an('array');
1606
+
1607
+ this.assert(
1608
+ list.indexOf(expected) > -1
1609
+ , 'expected #{this} to be one of #{exp}'
1610
+ , 'expected #{this} to not be one of #{exp}'
1611
+ , list
1612
+ , expected
1613
+ );
1614
+ }
1615
+
1616
+ Assertion.addMethod('oneOf', oneOf);
1617
+
1618
+
1619
+ /**
1620
+ * ### .change(function)
1621
+ *
1622
+ * Asserts that a function changes an object property
1623
+ *
1624
+ * var obj = { val: 10 };
1625
+ * var fn = function() { obj.val += 3 };
1626
+ * var noChangeFn = function() { return 'foo' + 'bar'; }
1627
+ * expect(fn).to.change(obj, 'val');
1628
+ * expect(noChangeFn).to.not.change(obj, 'val')
1629
+ *
1630
+ * @name change
1631
+ * @alias changes
1632
+ * @alias Change
1633
+ * @param {String} object
1634
+ * @param {String} property name
1635
+ * @param {String} message _optional_
1636
+ * @namespace BDD
1637
+ * @api public
1638
+ */
1639
+
1640
+ function assertChanges (object, prop, msg) {
1641
+ if (msg) flag(this, 'message', msg);
1642
+ var fn = flag(this, 'object');
1643
+ new Assertion(object, msg).to.have.property(prop);
1644
+ new Assertion(fn).is.a('function');
1645
+
1646
+ var initial = object[prop];
1647
+ fn();
1648
+
1649
+ this.assert(
1650
+ initial !== object[prop]
1651
+ , 'expected .' + prop + ' to change'
1652
+ , 'expected .' + prop + ' to not change'
1653
+ );
1654
+ }
1655
+
1656
+ Assertion.addChainableMethod('change', assertChanges);
1657
+ Assertion.addChainableMethod('changes', assertChanges);
1658
+
1659
+ /**
1660
+ * ### .increase(function)
1661
+ *
1662
+ * Asserts that a function increases an object property
1663
+ *
1664
+ * var obj = { val: 10 };
1665
+ * var fn = function() { obj.val = 15 };
1666
+ * expect(fn).to.increase(obj, 'val');
1667
+ *
1668
+ * @name increase
1669
+ * @alias increases
1670
+ * @alias Increase
1671
+ * @param {String} object
1672
+ * @param {String} property name
1673
+ * @param {String} message _optional_
1674
+ * @namespace BDD
1675
+ * @api public
1676
+ */
1677
+
1678
+ function assertIncreases (object, prop, msg) {
1679
+ if (msg) flag(this, 'message', msg);
1680
+ var fn = flag(this, 'object');
1681
+ new Assertion(object, msg).to.have.property(prop);
1682
+ new Assertion(fn).is.a('function');
1683
+
1684
+ var initial = object[prop];
1685
+ fn();
1686
+
1687
+ this.assert(
1688
+ object[prop] - initial > 0
1689
+ , 'expected .' + prop + ' to increase'
1690
+ , 'expected .' + prop + ' to not increase'
1691
+ );
1692
+ }
1693
+
1694
+ Assertion.addChainableMethod('increase', assertIncreases);
1695
+ Assertion.addChainableMethod('increases', assertIncreases);
1696
+
1697
+ /**
1698
+ * ### .decrease(function)
1699
+ *
1700
+ * Asserts that a function decreases an object property
1701
+ *
1702
+ * var obj = { val: 10 };
1703
+ * var fn = function() { obj.val = 5 };
1704
+ * expect(fn).to.decrease(obj, 'val');
1705
+ *
1706
+ * @name decrease
1707
+ * @alias decreases
1708
+ * @alias Decrease
1709
+ * @param {String} object
1710
+ * @param {String} property name
1711
+ * @param {String} message _optional_
1712
+ * @namespace BDD
1713
+ * @api public
1714
+ */
1715
+
1716
+ function assertDecreases (object, prop, msg) {
1717
+ if (msg) flag(this, 'message', msg);
1718
+ var fn = flag(this, 'object');
1719
+ new Assertion(object, msg).to.have.property(prop);
1720
+ new Assertion(fn).is.a('function');
1721
+
1722
+ var initial = object[prop];
1723
+ fn();
1724
+
1725
+ this.assert(
1726
+ object[prop] - initial < 0
1727
+ , 'expected .' + prop + ' to decrease'
1728
+ , 'expected .' + prop + ' to not decrease'
1729
+ );
1730
+ }
1731
+
1732
+ Assertion.addChainableMethod('decrease', assertDecreases);
1733
+ Assertion.addChainableMethod('decreases', assertDecreases);
1734
+
1735
+ /**
1736
+ * ### .extensible
1737
+ *
1738
+ * Asserts that the target is extensible (can have new properties added to
1739
+ * it).
1740
+ *
1741
+ * var nonExtensibleObject = Object.preventExtensions({});
1742
+ * var sealedObject = Object.seal({});
1743
+ * var frozenObject = Object.freeze({});
1744
+ *
1745
+ * expect({}).to.be.extensible;
1746
+ * expect(nonExtensibleObject).to.not.be.extensible;
1747
+ * expect(sealedObject).to.not.be.extensible;
1748
+ * expect(frozenObject).to.not.be.extensible;
1749
+ *
1750
+ * @name extensible
1751
+ * @namespace BDD
1752
+ * @api public
1753
+ */
1754
+
1755
+ Assertion.addProperty('extensible', function() {
1756
+ var obj = flag(this, 'object');
1757
+
1758
+ // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
1759
+ // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.
1760
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
1761
+ // The following provides ES6 behavior when a TypeError is thrown under ES5.
1762
+
1763
+ var isExtensible;
1764
+
1765
+ try {
1766
+ isExtensible = Object.isExtensible(obj);
1767
+ } catch (err) {
1768
+ if (err instanceof TypeError) isExtensible = false;
1769
+ else throw err;
1770
+ }
1771
+
1772
+ this.assert(
1773
+ isExtensible
1774
+ , 'expected #{this} to be extensible'
1775
+ , 'expected #{this} to not be extensible'
1776
+ );
1777
+ });
1778
+
1779
+ /**
1780
+ * ### .sealed
1781
+ *
1782
+ * Asserts that the target is sealed (cannot have new properties added to it
1783
+ * and its existing properties cannot be removed).
1784
+ *
1785
+ * var sealedObject = Object.seal({});
1786
+ * var frozenObject = Object.freeze({});
1787
+ *
1788
+ * expect(sealedObject).to.be.sealed;
1789
+ * expect(frozenObject).to.be.sealed;
1790
+ * expect({}).to.not.be.sealed;
1791
+ *
1792
+ * @name sealed
1793
+ * @namespace BDD
1794
+ * @api public
1795
+ */
1796
+
1797
+ Assertion.addProperty('sealed', function() {
1798
+ var obj = flag(this, 'object');
1799
+
1800
+ // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
1801
+ // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.
1802
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
1803
+ // The following provides ES6 behavior when a TypeError is thrown under ES5.
1804
+
1805
+ var isSealed;
1806
+
1807
+ try {
1808
+ isSealed = Object.isSealed(obj);
1809
+ } catch (err) {
1810
+ if (err instanceof TypeError) isSealed = true;
1811
+ else throw err;
1812
+ }
1813
+
1814
+ this.assert(
1815
+ isSealed
1816
+ , 'expected #{this} to be sealed'
1817
+ , 'expected #{this} to not be sealed'
1818
+ );
1819
+ });
1820
+
1821
+ /**
1822
+ * ### .frozen
1823
+ *
1824
+ * Asserts that the target is frozen (cannot have new properties added to it
1825
+ * and its existing properties cannot be modified).
1826
+ *
1827
+ * var frozenObject = Object.freeze({});
1828
+ *
1829
+ * expect(frozenObject).to.be.frozen;
1830
+ * expect({}).to.not.be.frozen;
1831
+ *
1832
+ * @name frozen
1833
+ * @namespace BDD
1834
+ * @api public
1835
+ */
1836
+
1837
+ Assertion.addProperty('frozen', function() {
1838
+ var obj = flag(this, 'object');
1839
+
1840
+ // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
1841
+ // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.
1842
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
1843
+ // The following provides ES6 behavior when a TypeError is thrown under ES5.
1844
+
1845
+ var isFrozen;
1846
+
1847
+ try {
1848
+ isFrozen = Object.isFrozen(obj);
1849
+ } catch (err) {
1850
+ if (err instanceof TypeError) isFrozen = true;
1851
+ else throw err;
1852
+ }
1853
+
1854
+ this.assert(
1855
+ isFrozen
1856
+ , 'expected #{this} to be frozen'
1857
+ , 'expected #{this} to not be frozen'
1858
+ );
1859
+ });
1860
+ };