mdarray-sol 0.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
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
+ };