mdarray-sol 0.1.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +35 -0
- data/LICENSE.txt~ +73 -0
- data/README.md +140 -0
- data/README.md~ +290 -0
- data/Rakefile +80 -0
- data/config.rb +223 -0
- data/doc/Nashorn.html +1406 -0
- data/doc/Sol.html +692 -0
- data/doc/Sol/BarChart.html +181 -0
- data/doc/Sol/BaseChart.html +799 -0
- data/doc/Sol/Bootstrap.html +1134 -0
- data/doc/Sol/Bridge.html +448 -0
- data/doc/Sol/Chart.html +1162 -0
- data/doc/Sol/CoordinateChart.html +673 -0
- data/doc/Sol/DCFX.html +807 -0
- data/doc/Sol/Dashboard.html +1967 -0
- data/doc/Sol/ExecMessages.html +332 -0
- data/doc/Sol/GuiCommunication.html +230 -0
- data/doc/Sol/Interval.html +1213 -0
- data/doc/Sol/JS.html +448 -0
- data/doc/Sol/LineChart.html +344 -0
- data/doc/Sol/LinearScale.html +334 -0
- data/doc/Sol/Margins.html +219 -0
- data/doc/Sol/OrdinalScale.html +263 -0
- data/doc/Sol/ReadBuffer.html +302 -0
- data/doc/Sol/Scale.html +462 -0
- data/doc/Sol/Stack.html +199 -0
- data/doc/Sol/TimeScale.html +396 -0
- data/doc/_index.html +362 -0
- data/doc/class_list.html +58 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +95 -0
- data/doc/file_list.html +60 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +95 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +181 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +849 -0
- data/doc/top-level-namespace.html +135 -0
- data/examples/bar_chart/bar_chart.rb +268 -0
- data/examples/bar_plot.rb +96 -0
- data/examples/charts/area.rb +25 -0
- data/examples/charts/area_script.rb +69 -0
- data/examples/charts/env.rb +8 -0
- data/examples/charts/monthly-move.csv +6725 -0
- data/examples/charts/morley.csv +101 -0
- data/examples/charts/morley2.csv +81 -0
- data/examples/charts/morley3.csv +121 -0
- data/examples/d3_tutorial.rb +98 -0
- data/examples/sc_plot.rb +57 -0
- data/examples/scatterplot/axes.rb +111 -0
- data/examples/scatterplot/scatterplot.rb +221 -0
- data/examples/us_states/map.rb +90 -0
- data/examples/us_states/us-ag-productivity2004.csv +49 -0
- data/examples/us_states/us-cities.csv +51 -0
- data/examples/util/linear_scale.rb +83 -0
- data/examples/util/ordinal_scale.rb +72 -0
- data/init.rb +39 -0
- data/lib/jx/array_handler.js +70 -0
- data/lib/jx/callback.rb +255 -0
- data/lib/jx/hash_handler.js +87 -0
- data/lib/jx/irbobject.rb +121 -0
- data/lib/jx/js.rb +442 -0
- data/lib/jx/js_array.rb +31 -0
- data/lib/jx/js_hash.rb +76 -0
- data/lib/jx/js_init.rb +62 -0
- data/lib/jx/jsarray.rb +66 -0
- data/lib/jx/jsfunction.rb +73 -0
- data/lib/jx/jsobject.rb +188 -0
- data/lib/jx/jsstyle_sheet.rb +231 -0
- data/lib/jx/jsundefined.rb +46 -0
- data/lib/jx/proxy_array.rb +62 -0
- data/lib/jx/rbobject.rb +80 -0
- data/lib/jx/ruby_proxy.js +176 -0
- data/lib/jx/ruby_rich.js +70 -0
- data/lib/jx/sol.rb +109 -0
- data/lib/mdarray-sol.rb +34 -0
- data/lib/mdarray/jsmdarray.rb +39 -0
- data/lib/ruby_rich/bootstrap.rb +230 -0
- data/lib/ruby_rich/config.html +22 -0
- data/lib/ruby_rich/dashboard.rb +299 -0
- data/lib/ruby_rich/ruby_rich.rb +120 -0
- data/lib/sol/bar_chart.rb +35 -0
- data/lib/sol/base_chart.rb +148 -0
- data/lib/sol/chart.rb +138 -0
- data/lib/sol/coordinate_chart.rb +128 -0
- data/lib/sol/interval.rb +156 -0
- data/lib/sol/line_chart.rb +58 -0
- data/lib/sol/margins.rb +52 -0
- data/lib/sol/scale.rb +212 -0
- data/lib/sol/stack.rb +44 -0
- data/node_modules/bootstrap/Gruntfile.js +533 -0
- data/node_modules/bootstrap/dist/js/bootstrap.js +2363 -0
- data/node_modules/bootstrap/dist/js/bootstrap.min.js +7 -0
- data/node_modules/bootstrap/dist/js/npm.js +13 -0
- data/node_modules/bootstrap/grunt/bs-commonjs-generator.js +30 -0
- data/node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js +42 -0
- data/node_modules/bootstrap/grunt/bs-lessdoc-parser.js +237 -0
- data/node_modules/bootstrap/grunt/bs-raw-files-generator.js +44 -0
- data/node_modules/bootstrap/js/affix.js +162 -0
- data/node_modules/bootstrap/js/alert.js +94 -0
- data/node_modules/bootstrap/js/button.js +120 -0
- data/node_modules/bootstrap/js/carousel.js +237 -0
- data/node_modules/bootstrap/js/collapse.js +211 -0
- data/node_modules/bootstrap/js/dropdown.js +165 -0
- data/node_modules/bootstrap/js/modal.js +337 -0
- data/node_modules/bootstrap/js/popover.js +108 -0
- data/node_modules/bootstrap/js/scrollspy.js +172 -0
- data/node_modules/bootstrap/js/tab.js +155 -0
- data/node_modules/bootstrap/js/tooltip.js +514 -0
- data/node_modules/bootstrap/js/transition.js +59 -0
- data/node_modules/chai/chai.js +6142 -0
- data/node_modules/chai/index.js +1 -0
- data/node_modules/chai/karma.conf.js +28 -0
- data/node_modules/chai/karma.sauce.js +41 -0
- data/node_modules/chai/lib/chai.js +93 -0
- data/node_modules/chai/lib/chai/assertion.js +131 -0
- data/node_modules/chai/lib/chai/config.js +55 -0
- data/node_modules/chai/lib/chai/core/assertions.js +1860 -0
- data/node_modules/chai/lib/chai/interface/assert.js +1645 -0
- data/node_modules/chai/lib/chai/interface/expect.js +34 -0
- data/node_modules/chai/lib/chai/interface/should.js +201 -0
- data/node_modules/chai/lib/chai/utils/addChainableMethod.js +112 -0
- data/node_modules/chai/lib/chai/utils/addMethod.js +44 -0
- data/node_modules/chai/lib/chai/utils/addProperty.js +48 -0
- data/node_modules/chai/lib/chai/utils/expectTypes.js +42 -0
- data/node_modules/chai/lib/chai/utils/flag.js +33 -0
- data/node_modules/chai/lib/chai/utils/getActual.js +20 -0
- data/node_modules/chai/lib/chai/utils/getEnumerableProperties.js +26 -0
- data/node_modules/chai/lib/chai/utils/getMessage.js +51 -0
- data/node_modules/chai/lib/chai/utils/getName.js +22 -0
- data/node_modules/chai/lib/chai/utils/getPathInfo.js +111 -0
- data/node_modules/chai/lib/chai/utils/getPathValue.js +43 -0
- data/node_modules/chai/lib/chai/utils/getProperties.js +36 -0
- data/node_modules/chai/lib/chai/utils/hasProperty.js +64 -0
- data/node_modules/chai/lib/chai/utils/index.js +130 -0
- data/node_modules/chai/lib/chai/utils/inspect.js +335 -0
- data/node_modules/chai/lib/chai/utils/objDisplay.js +50 -0
- data/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js +54 -0
- data/node_modules/chai/lib/chai/utils/overwriteMethod.js +52 -0
- data/node_modules/chai/lib/chai/utils/overwriteProperty.js +55 -0
- data/node_modules/chai/lib/chai/utils/test.js +28 -0
- data/node_modules/chai/lib/chai/utils/transferFlags.js +45 -0
- data/node_modules/chai/node_modules/assertion-error/index.js +116 -0
- data/node_modules/chai/node_modules/deep-eql/index.js +1 -0
- data/node_modules/chai/node_modules/deep-eql/karma.conf.js +20 -0
- data/node_modules/chai/node_modules/deep-eql/lib/eql.js +257 -0
- data/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/index.js +1 -0
- data/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/lib/type.js +142 -0
- data/node_modules/chai/node_modules/type-detect/index.js +1 -0
- data/node_modules/chai/node_modules/type-detect/lib/type.js +134 -0
- data/node_modules/chai/sauce.browsers.js +128 -0
- data/node_modules/dc/Gruntfile.js +437 -0
- data/node_modules/dc/dc.js +10477 -0
- data/node_modules/dc/dc.min.js +23 -0
- data/node_modules/dc/docs/coverage.js +203 -0
- data/node_modules/dc/grunt/format-file-list.js +33 -0
- data/node_modules/dc/index.js +5 -0
- data/node_modules/dc/node_modules/crossfilter2/crossfilter.js +1401 -0
- data/node_modules/dc/node_modules/crossfilter2/crossfilter.min.js +1 -0
- data/node_modules/dc/node_modules/crossfilter2/index.js +1 -0
- data/node_modules/dc/node_modules/crossfilter2/src/array.js +46 -0
- data/node_modules/dc/node_modules/crossfilter2/src/bisect.js +44 -0
- data/node_modules/dc/node_modules/crossfilter2/src/crossfilter.js +872 -0
- data/node_modules/dc/node_modules/crossfilter2/src/filter.js +19 -0
- data/node_modules/dc/node_modules/crossfilter2/src/heap.js +44 -0
- data/node_modules/dc/node_modules/crossfilter2/src/heapselect.js +36 -0
- data/node_modules/dc/node_modules/crossfilter2/src/identity.js +3 -0
- data/node_modules/dc/node_modules/crossfilter2/src/insertionsort.js +18 -0
- data/node_modules/dc/node_modules/crossfilter2/src/null.js +3 -0
- data/node_modules/dc/node_modules/crossfilter2/src/permute.js +8 -0
- data/node_modules/dc/node_modules/crossfilter2/src/quicksort.js +283 -0
- data/node_modules/dc/node_modules/crossfilter2/src/reduce.js +19 -0
- data/node_modules/dc/node_modules/crossfilter2/src/zero.js +3 -0
- data/node_modules/dc/node_modules/d3/d3.js +9554 -0
- data/node_modules/dc/node_modules/d3/d3.min.js +5 -0
- data/node_modules/dc/node_modules/d3/package.js +13 -0
- data/node_modules/dc/node_modules/d3/src/arrays/ascending.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/bisect.js +36 -0
- data/node_modules/dc/node_modules/d3/src/arrays/descending.js +3 -0
- data/node_modules/dc/node_modules/d3/src/arrays/deviation.js +6 -0
- data/node_modules/dc/node_modules/d3/src/arrays/entries.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/extent.js +21 -0
- data/node_modules/dc/node_modules/d3/src/arrays/index.js +25 -0
- data/node_modules/dc/node_modules/d3/src/arrays/keys.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/map.js +84 -0
- data/node_modules/dc/node_modules/d3/src/arrays/max.js +14 -0
- data/node_modules/dc/node_modules/d3/src/arrays/mean.js +15 -0
- data/node_modules/dc/node_modules/d3/src/arrays/median.js +16 -0
- data/node_modules/dc/node_modules/d3/src/arrays/merge.js +21 -0
- data/node_modules/dc/node_modules/d3/src/arrays/min.js +14 -0
- data/node_modules/dc/node_modules/d3/src/arrays/nest.js +97 -0
- data/node_modules/dc/node_modules/d3/src/arrays/pairs.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/permute.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/quantile.js +8 -0
- data/node_modules/dc/node_modules/d3/src/arrays/range.js +26 -0
- data/node_modules/dc/node_modules/d3/src/arrays/set.js +27 -0
- data/node_modules/dc/node_modules/d3/src/arrays/shuffle.js +9 -0
- data/node_modules/dc/node_modules/d3/src/arrays/sum.js +14 -0
- data/node_modules/dc/node_modules/d3/src/arrays/transpose.js +15 -0
- data/node_modules/dc/node_modules/d3/src/arrays/values.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/variance.js +29 -0
- data/node_modules/dc/node_modules/d3/src/arrays/zip.js +5 -0
- data/node_modules/dc/node_modules/d3/src/behavior/behavior.js +1 -0
- data/node_modules/dc/node_modules/d3/src/behavior/drag.js +88 -0
- data/node_modules/dc/node_modules/d3/src/behavior/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/behavior/zoom.js +348 -0
- data/node_modules/dc/node_modules/d3/src/color/color.js +7 -0
- data/node_modules/dc/node_modules/d3/src/color/hcl.js +34 -0
- data/node_modules/dc/node_modules/d3/src/color/hsl.js +56 -0
- data/node_modules/dc/node_modules/d3/src/color/index.js +6 -0
- data/node_modules/dc/node_modules/d3/src/color/lab.js +60 -0
- data/node_modules/dc/node_modules/d3/src/color/rgb.js +301 -0
- data/node_modules/dc/node_modules/d3/src/color/xyz.js +7 -0
- data/node_modules/dc/node_modules/d3/src/compat/array.js +15 -0
- data/node_modules/dc/node_modules/d3/src/compat/date.js +3 -0
- data/node_modules/dc/node_modules/d3/src/compat/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/compat/style.js +23 -0
- data/node_modules/dc/node_modules/d3/src/core/array.js +2 -0
- data/node_modules/dc/node_modules/d3/src/core/class.js +8 -0
- data/node_modules/dc/node_modules/d3/src/core/document.js +15 -0
- data/node_modules/dc/node_modules/d3/src/core/functor.js +5 -0
- data/node_modules/dc/node_modules/d3/src/core/identity.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/noop.js +1 -0
- data/node_modules/dc/node_modules/d3/src/core/ns.js +18 -0
- data/node_modules/dc/node_modules/d3/src/core/rebind.js +16 -0
- data/node_modules/dc/node_modules/d3/src/core/source.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/subclass.js +11 -0
- data/node_modules/dc/node_modules/d3/src/core/target.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/true.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/vendor.js +10 -0
- data/node_modules/dc/node_modules/d3/src/core/zero.js +3 -0
- data/node_modules/dc/node_modules/d3/src/d3.js +23 -0
- data/node_modules/dc/node_modules/d3/src/dsv/csv.js +3 -0
- data/node_modules/dc/node_modules/d3/src/dsv/dsv.js +136 -0
- data/node_modules/dc/node_modules/d3/src/dsv/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/dsv/tsv.js +3 -0
- data/node_modules/dc/node_modules/d3/src/end.js +4 -0
- data/node_modules/dc/node_modules/d3/src/event/dispatch.js +69 -0
- data/node_modules/dc/node_modules/d3/src/event/drag.js +36 -0
- data/node_modules/dc/node_modules/d3/src/event/event.js +50 -0
- data/node_modules/dc/node_modules/d3/src/event/index.js +6 -0
- data/node_modules/dc/node_modules/d3/src/event/mouse.js +39 -0
- data/node_modules/dc/node_modules/d3/src/event/timer.js +82 -0
- data/node_modules/dc/node_modules/d3/src/event/touch.js +11 -0
- data/node_modules/dc/node_modules/d3/src/event/touches.js +12 -0
- data/node_modules/dc/node_modules/d3/src/format/collapse.js +3 -0
- data/node_modules/dc/node_modules/d3/src/format/format.js +3 -0
- data/node_modules/dc/node_modules/d3/src/format/formatPrefix.js +24 -0
- data/node_modules/dc/node_modules/d3/src/format/index.js +4 -0
- data/node_modules/dc/node_modules/d3/src/format/precision.js +3 -0
- data/node_modules/dc/node_modules/d3/src/format/requote.js +5 -0
- data/node_modules/dc/node_modules/d3/src/format/round.js +5 -0
- data/node_modules/dc/node_modules/d3/src/geo/albers-usa.js +129 -0
- data/node_modules/dc/node_modules/d3/src/geo/albers.js +11 -0
- data/node_modules/dc/node_modules/d3/src/geo/area.js +69 -0
- data/node_modules/dc/node_modules/d3/src/geo/azimuthal-equal-area.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/azimuthal-equidistant.js +13 -0
- data/node_modules/dc/node_modules/d3/src/geo/azimuthal.js +25 -0
- data/node_modules/dc/node_modules/d3/src/geo/bounds.js +168 -0
- data/node_modules/dc/node_modules/d3/src/geo/cartesian.js +47 -0
- data/node_modules/dc/node_modules/d3/src/geo/centroid.js +149 -0
- data/node_modules/dc/node_modules/d3/src/geo/circle.js +81 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-antimeridian.js +95 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-circle.js +178 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-extent.js +196 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-polygon.js +104 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip.js +149 -0
- data/node_modules/dc/node_modules/d3/src/geo/compose.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic-conformal.js +39 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic-equal-area.js +33 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic-equidistant.js +36 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic.js +16 -0
- data/node_modules/dc/node_modules/d3/src/geo/distance.js +13 -0
- data/node_modules/dc/node_modules/d3/src/geo/equirectangular.js +10 -0
- data/node_modules/dc/node_modules/d3/src/geo/geo.js +1 -0
- data/node_modules/dc/node_modules/d3/src/geo/gnomonic.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/graticule.js +103 -0
- data/node_modules/dc/node_modules/d3/src/geo/greatArc.js +42 -0
- data/node_modules/dc/node_modules/d3/src/geo/index.js +33 -0
- data/node_modules/dc/node_modules/d3/src/geo/interpolate.js +38 -0
- data/node_modules/dc/node_modules/d3/src/geo/length.js +44 -0
- data/node_modules/dc/node_modules/d3/src/geo/mercator.js +48 -0
- data/node_modules/dc/node_modules/d3/src/geo/orthographic.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-area.js +41 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-bounds.js +21 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-buffer.js +59 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-centroid.js +78 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-context.js +49 -0
- data/node_modules/dc/node_modules/d3/src/geo/path.js +87 -0
- data/node_modules/dc/node_modules/d3/src/geo/point-in-polygon.js +71 -0
- data/node_modules/dc/node_modules/d3/src/geo/projection.js +121 -0
- data/node_modules/dc/node_modules/d3/src/geo/resample.js +109 -0
- data/node_modules/dc/node_modules/d3/src/geo/rotation.js +79 -0
- data/node_modules/dc/node_modules/d3/src/geo/spherical.js +13 -0
- data/node_modules/dc/node_modules/d3/src/geo/stereographic.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/stream.js +71 -0
- data/node_modules/dc/node_modules/d3/src/geo/transform.js +36 -0
- data/node_modules/dc/node_modules/d3/src/geo/transverse-mercator.js +31 -0
- data/node_modules/dc/node_modules/d3/src/geom/clip-line.js +66 -0
- data/node_modules/dc/node_modules/d3/src/geom/delaunay.js +6 -0
- data/node_modules/dc/node_modules/d3/src/geom/geom.js +1 -0
- data/node_modules/dc/node_modules/d3/src/geom/hull.js +91 -0
- data/node_modules/dc/node_modules/d3/src/geom/index.js +6 -0
- data/node_modules/dc/node_modules/d3/src/geom/point.js +7 -0
- data/node_modules/dc/node_modules/d3/src/geom/polygon.js +105 -0
- data/node_modules/dc/node_modules/d3/src/geom/quadtree.js +243 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi.js +110 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/beach.js +186 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/cell.js +64 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/circle.js +73 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/clip.js +80 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/edge.js +50 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/index.js +59 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/red-black.js +235 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/array.js +19 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/ease.js +111 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/hcl.js +20 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/hsl.js +20 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/index.js +14 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/interpolate.js +26 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/lab.js +17 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/number.js +6 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/object.js +25 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/rgb.js +20 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/round.js +6 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/string.js +54 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/transform.js +59 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/uninterpolate.js +9 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/zoom.js +53 -0
- data/node_modules/dc/node_modules/d3/src/layout/bundle.js +59 -0
- data/node_modules/dc/node_modules/d3/src/layout/chord.js +157 -0
- data/node_modules/dc/node_modules/d3/src/layout/cluster.js +92 -0
- data/node_modules/dc/node_modules/d3/src/layout/force.js +372 -0
- data/node_modules/dc/node_modules/d3/src/layout/hierarchy.js +136 -0
- data/node_modules/dc/node_modules/d3/src/layout/histogram.js +110 -0
- data/node_modules/dc/node_modules/d3/src/layout/index.js +13 -0
- data/node_modules/dc/node_modules/d3/src/layout/layout.js +1 -0
- data/node_modules/dc/node_modules/d3/src/layout/pack.js +211 -0
- data/node_modules/dc/node_modules/d3/src/layout/partition.js +51 -0
- data/node_modules/dc/node_modules/d3/src/layout/pie.js +78 -0
- data/node_modules/dc/node_modules/d3/src/layout/stack.js +247 -0
- data/node_modules/dc/node_modules/d3/src/layout/tree.js +240 -0
- data/node_modules/dc/node_modules/d3/src/layout/treemap.js +229 -0
- data/node_modules/dc/node_modules/d3/src/locale/ca-ES.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/de-CH.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/de-DE.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/en-CA.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/en-GB.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/en-US.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/es-ES.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/fi-FI.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/fr-CA.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/fr-FR.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/he-IL.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/hu-HU.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/it-IT.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/ja-JP.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/ko-KR.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/locale.js +9 -0
- data/node_modules/dc/node_modules/d3/src/locale/mk-MK.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/nl-NL.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/number-format.js +155 -0
- data/node_modules/dc/node_modules/d3/src/locale/pl-PL.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/pt-BR.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/ru-RU.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/sv-SE.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/time-format.js +370 -0
- data/node_modules/dc/node_modules/d3/src/locale/time-scale.js +0 -0
- data/node_modules/dc/node_modules/d3/src/locale/zh-CN.js +16 -0
- data/node_modules/dc/node_modules/d3/src/math/abs.js +1 -0
- data/node_modules/dc/node_modules/d3/src/math/adder.js +34 -0
- data/node_modules/dc/node_modules/d3/src/math/index.js +2 -0
- data/node_modules/dc/node_modules/d3/src/math/number.js +7 -0
- data/node_modules/dc/node_modules/d3/src/math/random.js +34 -0
- data/node_modules/dc/node_modules/d3/src/math/transform.js +64 -0
- data/node_modules/dc/node_modules/d3/src/math/trigonometry.js +44 -0
- data/node_modules/dc/node_modules/d3/src/scale/bilinear.js +7 -0
- data/node_modules/dc/node_modules/d3/src/scale/category.js +58 -0
- data/node_modules/dc/node_modules/d3/src/scale/identity.js +33 -0
- data/node_modules/dc/node_modules/d3/src/scale/index.js +11 -0
- data/node_modules/dc/node_modules/d3/src/scale/linear.js +160 -0
- data/node_modules/dc/node_modules/d3/src/scale/log.js +92 -0
- data/node_modules/dc/node_modules/d3/src/scale/nice.js +30 -0
- data/node_modules/dc/node_modules/d3/src/scale/ordinal.js +102 -0
- data/node_modules/dc/node_modules/d3/src/scale/polylinear.js +24 -0
- data/node_modules/dc/node_modules/d3/src/scale/pow.js +57 -0
- data/node_modules/dc/node_modules/d3/src/scale/quantile.js +55 -0
- data/node_modules/dc/node_modules/d3/src/scale/quantize.js +44 -0
- data/node_modules/dc/node_modules/d3/src/scale/scale.js +10 -0
- data/node_modules/dc/node_modules/d3/src/scale/sqrt.js +6 -0
- data/node_modules/dc/node_modules/d3/src/scale/threshold.js +36 -0
- data/node_modules/dc/node_modules/d3/src/selection/append.js +28 -0
- data/node_modules/dc/node_modules/d3/src/selection/attr.js +62 -0
- data/node_modules/dc/node_modules/d3/src/selection/call.js +8 -0
- data/node_modules/dc/node_modules/d3/src/selection/classed.js +76 -0
- data/node_modules/dc/node_modules/d3/src/selection/data.js +117 -0
- data/node_modules/dc/node_modules/d3/src/selection/datum.js +7 -0
- data/node_modules/dc/node_modules/d3/src/selection/each.js +16 -0
- data/node_modules/dc/node_modules/d3/src/selection/empty.js +5 -0
- data/node_modules/dc/node_modules/d3/src/selection/enter-insert.js +20 -0
- data/node_modules/dc/node_modules/d3/src/selection/enter-select.js +27 -0
- data/node_modules/dc/node_modules/d3/src/selection/enter.js +21 -0
- data/node_modules/dc/node_modules/d3/src/selection/filter.js +28 -0
- data/node_modules/dc/node_modules/d3/src/selection/html.js +10 -0
- data/node_modules/dc/node_modules/d3/src/selection/index.js +1 -0
- data/node_modules/dc/node_modules/d3/src/selection/insert.js +9 -0
- data/node_modules/dc/node_modules/d3/src/selection/interrupt.js +27 -0
- data/node_modules/dc/node_modules/d3/src/selection/node.js +11 -0
- data/node_modules/dc/node_modules/d3/src/selection/on.js +106 -0
- data/node_modules/dc/node_modules/d3/src/selection/order.js +13 -0
- data/node_modules/dc/node_modules/d3/src/selection/property.js +43 -0
- data/node_modules/dc/node_modules/d3/src/selection/remove.js +13 -0
- data/node_modules/dc/node_modules/d3/src/selection/select.js +32 -0
- data/node_modules/dc/node_modules/d3/src/selection/selectAll.js +27 -0
- data/node_modules/dc/node_modules/d3/src/selection/selection.js +81 -0
- data/node_modules/dc/node_modules/d3/src/selection/size.js +7 -0
- data/node_modules/dc/node_modules/d3/src/selection/sort.js +15 -0
- data/node_modules/dc/node_modules/d3/src/selection/style.js +59 -0
- data/node_modules/dc/node_modules/d3/src/selection/text.js +10 -0
- data/node_modules/dc/node_modules/d3/src/selection/transition.js +21 -0
- data/node_modules/dc/node_modules/d3/src/start.js +2 -0
- data/node_modules/dc/node_modules/d3/src/svg/arc.js +292 -0
- data/node_modules/dc/node_modules/d3/src/svg/area-radial.js +14 -0
- data/node_modules/dc/node_modules/d3/src/svg/area.js +121 -0
- data/node_modules/dc/node_modules/d3/src/svg/axis.js +160 -0
- data/node_modules/dc/node_modules/d3/src/svg/brush.js +429 -0
- data/node_modules/dc/node_modules/d3/src/svg/chord.js +90 -0
- data/node_modules/dc/node_modules/d3/src/svg/diagonal-radial.js +27 -0
- data/node_modules/dc/node_modules/d3/src/svg/diagonal.js +43 -0
- data/node_modules/dc/node_modules/d3/src/svg/index.js +12 -0
- data/node_modules/dc/node_modules/d3/src/svg/line-radial.js +27 -0
- data/node_modules/dc/node_modules/d3/src/svg/line.js +432 -0
- data/node_modules/dc/node_modules/d3/src/svg/svg.js +1 -0
- data/node_modules/dc/node_modules/d3/src/svg/symbol.js +105 -0
- data/node_modules/dc/node_modules/d3/src/time/day.js +21 -0
- data/node_modules/dc/node_modules/d3/src/time/format-iso.js +19 -0
- data/node_modules/dc/node_modules/d3/src/time/format-utc.js +3 -0
- data/node_modules/dc/node_modules/d3/src/time/format.js +4 -0
- data/node_modules/dc/node_modules/d3/src/time/hour.js +14 -0
- data/node_modules/dc/node_modules/d3/src/time/index.js +14 -0
- data/node_modules/dc/node_modules/d3/src/time/interval.js +71 -0
- data/node_modules/dc/node_modules/d3/src/time/minute.js +13 -0
- data/node_modules/dc/node_modules/d3/src/time/month.js +16 -0
- data/node_modules/dc/node_modules/d3/src/time/scale-utc.js +25 -0
- data/node_modules/dc/node_modules/d3/src/time/scale.js +155 -0
- data/node_modules/dc/node_modules/d3/src/time/second.js +13 -0
- data/node_modules/dc/node_modules/d3/src/time/time.js +33 -0
- data/node_modules/dc/node_modules/d3/src/time/week.js +31 -0
- data/node_modules/dc/node_modules/d3/src/time/year.js +16 -0
- data/node_modules/dc/node_modules/d3/src/transition/attr.js +58 -0
- data/node_modules/dc/node_modules/d3/src/transition/delay.js +10 -0
- data/node_modules/dc/node_modules/d3/src/transition/duration.js +10 -0
- data/node_modules/dc/node_modules/d3/src/transition/each.js +26 -0
- data/node_modules/dc/node_modules/d3/src/transition/ease.js +10 -0
- data/node_modules/dc/node_modules/d3/src/transition/filter.js +22 -0
- data/node_modules/dc/node_modules/d3/src/transition/index.js +1 -0
- data/node_modules/dc/node_modules/d3/src/transition/remove.js +9 -0
- data/node_modules/dc/node_modules/d3/src/transition/select.js +28 -0
- data/node_modules/dc/node_modules/d3/src/transition/selectAll.js +31 -0
- data/node_modules/dc/node_modules/d3/src/transition/style.js +53 -0
- data/node_modules/dc/node_modules/d3/src/transition/subtransition.js +25 -0
- data/node_modules/dc/node_modules/d3/src/transition/text.js +11 -0
- data/node_modules/dc/node_modules/d3/src/transition/transition.js +161 -0
- data/node_modules/dc/node_modules/d3/src/transition/tween.js +17 -0
- data/node_modules/dc/node_modules/d3/src/xhr/html.js +12 -0
- data/node_modules/dc/node_modules/d3/src/xhr/index.js +5 -0
- data/node_modules/dc/node_modules/d3/src/xhr/json.js +9 -0
- data/node_modules/dc/node_modules/d3/src/xhr/text.js +5 -0
- data/node_modules/dc/node_modules/d3/src/xhr/xhr.js +126 -0
- data/node_modules/dc/node_modules/d3/src/xhr/xml.js +5 -0
- data/node_modules/dc/regression/inject-serializer.js +6 -0
- data/node_modules/dc/regression/stock-regression-test.js +140 -0
- data/node_modules/dc/spec/bar-chart-spec.js +1230 -0
- data/node_modules/dc/spec/base-mixin-spec.js +611 -0
- data/node_modules/dc/spec/biggish-data-spec.js +136 -0
- data/node_modules/dc/spec/box-plot-spec.js +211 -0
- data/node_modules/dc/spec/bubble-chart-spec.js +450 -0
- data/node_modules/dc/spec/bubble-overlay-spec.js +102 -0
- data/node_modules/dc/spec/color-spec.js +89 -0
- data/node_modules/dc/spec/composite-chart-spec.js +691 -0
- data/node_modules/dc/spec/coordinate-grid-chart-spec.js +962 -0
- data/node_modules/dc/spec/core-spec.js +301 -0
- data/node_modules/dc/spec/data-addition-spec.js +122 -0
- data/node_modules/dc/spec/data-count-spec.js +180 -0
- data/node_modules/dc/spec/data-grid-spec.js +124 -0
- data/node_modules/dc/spec/data-table-spec.js +251 -0
- data/node_modules/dc/spec/event-spec.js +41 -0
- data/node_modules/dc/spec/filter-dates-spec.js +92 -0
- data/node_modules/dc/spec/filters-spec.js +140 -0
- data/node_modules/dc/spec/geo-choropleth-chart-spec.js +225 -0
- data/node_modules/dc/spec/heatmap-spec.js +363 -0
- data/node_modules/dc/spec/helpers/custom_matchers.js +213 -0
- data/node_modules/dc/spec/helpers/fixtures.js +81 -0
- data/node_modules/dc/spec/helpers/geoFixtures.js +113 -0
- data/node_modules/dc/spec/helpers/load-jsreporter.js +37 -0
- data/node_modules/dc/spec/helpers/spec-helper.js +53 -0
- data/node_modules/dc/spec/legend-spec.js +266 -0
- data/node_modules/dc/spec/line-chart-spec.js +709 -0
- data/node_modules/dc/spec/logger-spec.js +80 -0
- data/node_modules/dc/spec/number-display-spec.js +168 -0
- data/node_modules/dc/spec/pie-chart-spec.js +677 -0
- data/node_modules/dc/spec/row-chart-spec.js +362 -0
- data/node_modules/dc/spec/scatter-plot-spec.js +336 -0
- data/node_modules/dc/spec/series-chart-spec.js +133 -0
- data/node_modules/dc/spec/utils-spec.js +110 -0
- data/node_modules/dc/src/banner.js +2 -0
- data/node_modules/dc/src/bar-chart.js +374 -0
- data/node_modules/dc/src/base-mixin.js +1478 -0
- data/node_modules/dc/src/box-plot.js +240 -0
- data/node_modules/dc/src/bubble-chart.js +177 -0
- data/node_modules/dc/src/bubble-mixin.js +244 -0
- data/node_modules/dc/src/bubble-overlay.js +207 -0
- data/node_modules/dc/src/cap-mixin.js +151 -0
- data/node_modules/dc/src/color-mixin.js +172 -0
- data/node_modules/dc/src/composite-chart.js +544 -0
- data/node_modules/dc/src/coordinate-grid-mixin.js +1300 -0
- data/node_modules/dc/src/core.js +425 -0
- data/node_modules/dc/src/d3.box.js +317 -0
- data/node_modules/dc/src/data-count.js +110 -0
- data/node_modules/dc/src/data-grid.js +243 -0
- data/node_modules/dc/src/data-table.js +419 -0
- data/node_modules/dc/src/errors.js +28 -0
- data/node_modules/dc/src/events.js +37 -0
- data/node_modules/dc/src/filters.js +124 -0
- data/node_modules/dc/src/footer.js +35 -0
- data/node_modules/dc/src/geo-choropleth-chart.js +279 -0
- data/node_modules/dc/src/heatmap.js +378 -0
- data/node_modules/dc/src/legend.js +277 -0
- data/node_modules/dc/src/line-chart.js +504 -0
- data/node_modules/dc/src/logger.js +40 -0
- data/node_modules/dc/src/margin-mixin.js +44 -0
- data/node_modules/dc/src/number-display.js +141 -0
- data/node_modules/dc/src/pie-chart.js +571 -0
- data/node_modules/dc/src/row-chart.js +425 -0
- data/node_modules/dc/src/scatter-plot.js +338 -0
- data/node_modules/dc/src/series-chart.js +192 -0
- data/node_modules/dc/src/stack-mixin.js +319 -0
- data/node_modules/dc/src/utils.js +290 -0
- data/node_modules/dc/web/docs/html/scripts/docstrap.lib.js +11 -0
- data/node_modules/dc/web/docs/html/scripts/fulltext-search-ui.js +89 -0
- data/node_modules/dc/web/docs/html/scripts/fulltext-search.js +36 -0
- data/node_modules/dc/web/docs/html/scripts/lunr.min.js +7 -0
- data/node_modules/dc/web/docs/html/scripts/prettify/jquery.min.js +6 -0
- data/node_modules/dc/web/docs/html/scripts/prettify/lang-css.js +21 -0
- data/node_modules/dc/web/docs/html/scripts/prettify/prettify.js +496 -0
- data/node_modules/dc/web/docs/html/scripts/sunlight.js +1157 -0
- data/node_modules/dc/web/docs/html/scripts/toc.js +203 -0
- data/node_modules/dc/web/ep/list.js +106 -0
- data/node_modules/dc/web/examples/lysenko-interval-tree.js +447 -0
- data/node_modules/dc/web/highlighter/shAutoloader.js +17 -0
- data/node_modules/dc/web/highlighter/shBrushJScript.js +52 -0
- data/node_modules/dc/web/highlighter/shBrushXml.js +69 -0
- data/node_modules/dc/web/highlighter/shCore.js +17 -0
- data/node_modules/dc/web/js/colorbrewer.js +1 -0
- data/node_modules/dc/web/js/crossfilter.js +1401 -0
- data/node_modules/dc/web/js/d3.js +9554 -0
- data/node_modules/dc/web/js/dc.js +10477 -0
- data/node_modules/dc/web/js/dc.min.js +23 -0
- data/node_modules/dc/web/js/env-data.js +218 -0
- data/node_modules/dc/web/js/jasmine-jsreporter.js +394 -0
- data/node_modules/dc/web/stock.js +685 -0
- data/node_modules/dc/web/transitions/transition-test.js +45 -0
- data/node_modules/jquery/dist/jquery.js +9814 -0
- data/node_modules/jquery/dist/jquery.min.js +4 -0
- data/node_modules/jquery/external/sizzle/dist/sizzle.js +2143 -0
- data/node_modules/jquery/external/sizzle/dist/sizzle.min.js +3 -0
- data/node_modules/jquery/src/ajax.js +845 -0
- data/node_modules/jquery/src/ajax/jsonp.js +100 -0
- data/node_modules/jquery/src/ajax/load.js +83 -0
- data/node_modules/jquery/src/ajax/parseJSON.js +13 -0
- data/node_modules/jquery/src/ajax/parseXML.js +27 -0
- data/node_modules/jquery/src/ajax/script.js +68 -0
- data/node_modules/jquery/src/ajax/var/location.js +3 -0
- data/node_modules/jquery/src/ajax/var/nonce.js +5 -0
- data/node_modules/jquery/src/ajax/var/rquery.js +3 -0
- data/node_modules/jquery/src/ajax/xhr.js +167 -0
- data/node_modules/jquery/src/attributes.js +11 -0
- data/node_modules/jquery/src/attributes/attr.js +142 -0
- data/node_modules/jquery/src/attributes/classes.js +177 -0
- data/node_modules/jquery/src/attributes/prop.js +125 -0
- data/node_modules/jquery/src/attributes/support.js +36 -0
- data/node_modules/jquery/src/attributes/val.js +177 -0
- data/node_modules/jquery/src/callbacks.js +232 -0
- data/node_modules/jquery/src/core.js +494 -0
- data/node_modules/jquery/src/core/access.js +65 -0
- data/node_modules/jquery/src/core/init.js +134 -0
- data/node_modules/jquery/src/core/parseHTML.js +41 -0
- data/node_modules/jquery/src/core/ready.js +103 -0
- data/node_modules/jquery/src/core/var/rsingleTag.js +5 -0
- data/node_modules/jquery/src/css.js +502 -0
- data/node_modules/jquery/src/css/addGetHookIf.js +24 -0
- data/node_modules/jquery/src/css/adjustCSS.js +65 -0
- data/node_modules/jquery/src/css/curCSS.js +60 -0
- data/node_modules/jquery/src/css/defaultDisplay.js +72 -0
- data/node_modules/jquery/src/css/hiddenVisibleSelectors.js +18 -0
- data/node_modules/jquery/src/css/showHide.js +48 -0
- data/node_modules/jquery/src/css/support.js +121 -0
- data/node_modules/jquery/src/css/var/cssExpand.js +3 -0
- data/node_modules/jquery/src/css/var/getStyles.js +15 -0
- data/node_modules/jquery/src/css/var/isHidden.js +16 -0
- data/node_modules/jquery/src/css/var/rmargin.js +3 -0
- data/node_modules/jquery/src/css/var/rnumnonpx.js +5 -0
- data/node_modules/jquery/src/css/var/swap.js +24 -0
- data/node_modules/jquery/src/data.js +187 -0
- data/node_modules/jquery/src/data/Data.js +200 -0
- data/node_modules/jquery/src/data/var/acceptData.js +18 -0
- data/node_modules/jquery/src/data/var/dataPriv.js +5 -0
- data/node_modules/jquery/src/data/var/dataUser.js +5 -0
- data/node_modules/jquery/src/deferred.js +158 -0
- data/node_modules/jquery/src/deprecated.js +32 -0
- data/node_modules/jquery/src/dimensions.js +54 -0
- data/node_modules/jquery/src/effects.js +629 -0
- data/node_modules/jquery/src/effects/Tween.js +121 -0
- data/node_modules/jquery/src/effects/animatedSelector.js +13 -0
- data/node_modules/jquery/src/event.js +711 -0
- data/node_modules/jquery/src/event/ajax.js +20 -0
- data/node_modules/jquery/src/event/alias.js +27 -0
- data/node_modules/jquery/src/event/focusin.js +53 -0
- data/node_modules/jquery/src/event/support.js +9 -0
- data/node_modules/jquery/src/event/trigger.js +183 -0
- data/node_modules/jquery/src/exports/amd.js +24 -0
- data/node_modules/jquery/src/exports/global.js +26 -0
- data/node_modules/jquery/src/intro.js +44 -0
- data/node_modules/jquery/src/jquery.js +37 -0
- data/node_modules/jquery/src/manipulation.js +481 -0
- data/node_modules/jquery/src/manipulation/_evalUrl.js +20 -0
- data/node_modules/jquery/src/manipulation/buildFragment.js +102 -0
- data/node_modules/jquery/src/manipulation/getAll.js +21 -0
- data/node_modules/jquery/src/manipulation/setGlobalEval.js +20 -0
- data/node_modules/jquery/src/manipulation/support.js +33 -0
- data/node_modules/jquery/src/manipulation/var/rcheckableType.js +3 -0
- data/node_modules/jquery/src/manipulation/var/rscriptType.js +3 -0
- data/node_modules/jquery/src/manipulation/var/rtagName.js +3 -0
- data/node_modules/jquery/src/manipulation/wrapMap.js +27 -0
- data/node_modules/jquery/src/offset.js +218 -0
- data/node_modules/jquery/src/outro.js +2 -0
- data/node_modules/jquery/src/queue.js +143 -0
- data/node_modules/jquery/src/queue/delay.js +22 -0
- data/node_modules/jquery/src/selector-native.js +211 -0
- data/node_modules/jquery/src/selector-sizzle.js +14 -0
- data/node_modules/jquery/src/selector.js +1 -0
- data/node_modules/jquery/src/serialize.js +125 -0
- data/node_modules/jquery/src/traversing.js +175 -0
- data/node_modules/jquery/src/traversing/findFilter.js +100 -0
- data/node_modules/jquery/src/traversing/var/dir.js +20 -0
- data/node_modules/jquery/src/traversing/var/rneedsContext.js +6 -0
- data/node_modules/jquery/src/traversing/var/siblings.js +15 -0
- data/node_modules/jquery/src/var/arr.js +3 -0
- data/node_modules/jquery/src/var/class2type.js +5 -0
- data/node_modules/jquery/src/var/concat.js +5 -0
- data/node_modules/jquery/src/var/document.js +3 -0
- data/node_modules/jquery/src/var/documentElement.js +5 -0
- data/node_modules/jquery/src/var/hasOwn.js +5 -0
- data/node_modules/jquery/src/var/indexOf.js +5 -0
- data/node_modules/jquery/src/var/pnum.js +3 -0
- data/node_modules/jquery/src/var/push.js +5 -0
- data/node_modules/jquery/src/var/rcssNum.js +7 -0
- data/node_modules/jquery/src/var/rnotwhite.js +3 -0
- data/node_modules/jquery/src/var/slice.js +5 -0
- data/node_modules/jquery/src/var/support.js +5 -0
- data/node_modules/jquery/src/var/toString.js +5 -0
- data/node_modules/jquery/src/wrap.js +79 -0
- data/target/mdarray_sol.jar +0 -0
- data/test/jx/test_complete.rb +35 -0
- data/test/jx/test_js.rb +543 -0
- data/test/jx/test_proxy_array.rb +239 -0
- data/test/jx/test_proxy_hash.rb +160 -0
- data/test/jx/test_proxy_lambda.rb +80 -0
- data/test/jx/test_rb_js_compat.rb +135 -0
- data/test/jx/test_style_sheets.rb +90 -0
- data/test/mdarray/test_mdarray.rb +75 -0
- data/util/cacert.pem +4095 -0
- data/util/download.rb +256 -0
- data/vendor/jxbrowser-6.8.jar +0 -0
- data/vendor/licence.jar +0 -0
- data/version.rb +2 -0
- 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
|
+
};
|