You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by kx...@apache.org on 2015/02/09 21:00:05 UTC
[04/57] [abbrv] couchdb commit: updated
refs/heads/developer-preview-2.0 to 849b334
http://git-wip-us.apache.org/repos/asf/couchdb/blob/78f367cf/share/www/script/jquery.resizer.js
----------------------------------------------------------------------
diff --git a/share/www/script/jquery.resizer.js b/share/www/script/jquery.resizer.js
deleted file mode 100644
index 42f0cc7..0000000
--- a/share/www/script/jquery.resizer.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-(function($) {
-
- $.fn.makeResizable = function(options) {
- options = options || {};
- options.always = options.always || false;
- options.grippie = options.grippie || null;
- options.horizontal = options.horizontal || false;
- options.minWidth = options.minWidth || 100;
- options.maxWidth = options.maxWidth || null;
- options.vertical = options.vertical || false;
- options.minHeight = options.minHeight || 32;
- options.maxHeight = options.maxHeight || null;
-
- return this.each(function() {
- if ($(this).is("textarea") && !options.always &&
- $.browser.safari && parseInt($.browser.version) >= 522)
- return this; // safari3 and later provides textarea resizing natively
-
- var grippie = options.grippie;
- if (!grippie) grippie = $("<div></div>").appendTo(this.parentNode);
- grippie.addClass("grippie");
- if (options.horizontal && options.vertical) {
- grippie.css("cursor", "nwse-resize");
- } else if (options.horizontal) {
- grippie.css("cursor", "col-resize");
- } else if (options.vertical) {
- grippie.css("cursor", "row-resize");
- }
-
- var elem = $(this);
- grippie.mousedown(function(e) {
- var pos = {x: e.screenX, y: e.screenY};
- var dimensions = {width: elem.width(), height: elem.height()};
- $(document)
- .mousemove(function(e) {
- if (options.horizontal) {
- var offset = e.screenX - pos.x;
- if (offset) {
- var newWidth = dimensions.width + offset;
- if (newWidth >= options.minWidth &&
- (!options.maxWidth || newWidth <= options.maxWidth)) {
- elem.width(newWidth);
- dimensions.width = newWidth;
- }
- pos.x = e.screenX;
- }
- }
- if (options.vertical) {
- var offset = e.screenY - pos.y;
- if (offset) {
- var newHeight = dimensions.height + offset;
- if (newHeight >= options.minHeight &&
- (!options.maxHeight || newHeight <= options.maxHeight)) {
- elem.height(newHeight);
- dimensions.height = newHeight;
- }
- pos.y = e.screenY;
- }
- }
- document.onselectstart = function() { return false }; // for IE
- return false;
- })
- .one("mouseup", function() {
- $(document).unbind("mousemove");
- document.onselectstart = null; // for IE
- });
- return true;
- });
- });
- }
-
-})(jQuery);
http://git-wip-us.apache.org/repos/asf/couchdb/blob/78f367cf/share/www/script/jquery.suggest.js
----------------------------------------------------------------------
diff --git a/share/www/script/jquery.suggest.js b/share/www/script/jquery.suggest.js
deleted file mode 100644
index cad020d..0000000
--- a/share/www/script/jquery.suggest.js
+++ /dev/null
@@ -1,161 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-(function($) {
-
- function suggest(elem, options) {
- var timer = null;
- var prevVal = null;
- var cache = {};
- var cacheKeys = [];
-
- var input = $(elem).attr("autocomplete", "off");
- var dropdown = $('<ul style="display: none; position: absolute; z-index: 10000"></ul>')
- .addClass(options.dropdownClass).appendTo(document.body);
-
- input
- .blur(function() {
- if (timer) clearTimeout(timer);
- setTimeout(function() { dropdown.hide() }, 200);
- })
- .keydown(function(e) {
- if ($.inArray(e.keyCode, [16, 17, 18, 20, 144, 91, 93, 224]) != -1) {
- return; // ignore modifier keys
- }
- if (timer) clearTimeout(timer);
- if ($.inArray(e.keyCode, [38, 40]) != -1 ||
- (dropdown.is(":visible") && (e.keyCode == 27 ||
- ($.inArray(e.keyCode, [9, 13]) != -1 && getSelection())))) {
- switch(e.keyCode) {
- case 38: // up
- moveUp();
- break;
- case 40: // down
- moveDown();
- break;
- case 9: // tab
- case 13: // return
- commit();
- if (e.keyCode == 9) return true;
- break;
- case 27: // escape
- dropdown.hide();
- break;
- }
- e.preventDefault(); e.stopPropagation();
- return false;
- } else {
- timer = setTimeout(function() { suggest() }, options.delay);
- }
- });
-
- function suggest(force) {
- var newVal = $.trim(input.val());
- if (force || newVal != prevVal) {
- if (force || newVal.length >= options.minChars) {
- if (options.cache && cache.hasOwnProperty(newVal)) {
- show(cache[newVal].items, cache[newVal].render);
- } else {
- options.callback.apply(elem, [newVal, function(items, render) {
- if (options.cache) {
- if (cacheKeys.length >= options.cacheLimit) {
- delete cache[cacheKeys.shift()];
- }
- cache[newVal] = {items: items, render: render};
- cacheKeys.push(newVal);
- }
- show(items, render);
- }]);
- }
- } else {
- dropdown.hide();
- }
- prevVal = newVal;
- }
- }
-
- function show(items, render) {
- if (!items) return;
- if (!items.length) { dropdown.hide(); return; }
- var offset = input.offset();
- dropdown.empty().css({
- top: (offset.top + input.outerHeight()) + "px", left: offset.left + "px",
- minWidth: input.css("width")
- });
- render = render || function(idx, value) { return value; }
- for (var i = 0; i < items.length; i++) {
- var item = $("<li></li>").data("value", items[i]);
- var rendered = render(i, items[i]);
- if (typeof(rendered) == "string") {
- item.text(rendered);
- } else {
- item.append(rendered);
- }
- item.appendTo(dropdown);
- }
- dropdown.slideDown("fast");
- dropdown.children("li").click(function(e) {
- $(this).addClass("selected");
- commit();
- });
- }
-
- function commit() {
- var sel = getSelection();
- if (sel) {
- prevVal = sel.data("value");
- input.val(prevVal);
- if (options.select) {
- options.select.apply(elem, [prevVal]);
- }
- dropdown.hide();
- }
- if (timer) clearTimeout(timer)
- }
-
- function getSelection() {
- if (!dropdown.is(":visible")) return null;
- var sel = dropdown.children("li.selected");
- return sel.length ? sel : null;
- }
-
- function moveDown() {
- if (!dropdown.is(":visible")) suggest(true);
- var sel = getSelection();
- if (sel) sel.removeClass("selected").next().addClass("selected");
- else dropdown.children("li:first-child").addClass("selected");
- }
-
- function moveUp() {
- if (!dropdown.is(":visible")) suggest(true);
- var sel = getSelection();
- if (sel) sel.removeClass("selected").prev().addClass("selected");
- else dropdown.children("li:last-child").addClass("selected");
- }
- }
-
- $.fn.suggest = function(callback, options) {
- options = $.extend({
- cache: true,
- cacheLimit: 10,
- callback: callback,
- delay: 250,
- dropdownClass: "suggest-dropdown",
- minChars: 1,
- select: null
- }, options || {});
- return this.each(function() {
- suggest(this, options);
- });
- };
-
-})(jQuery);
http://git-wip-us.apache.org/repos/asf/couchdb/blob/78f367cf/share/www/script/json2.js
----------------------------------------------------------------------
diff --git a/share/www/script/json2.js b/share/www/script/json2.js
deleted file mode 100644
index a1a3b17..0000000
--- a/share/www/script/json2.js
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- http://www.JSON.org/json2.js
- 2010-03-20
-
- Public Domain.
-
- NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
- See http://www.JSON.org/js.html
-
-
- This code should be minified before deployment.
- See http://javascript.crockford.com/jsmin.html
-
- USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
- NOT CONTROL.
-
-
- This file creates a global JSON object containing two methods: stringify
- and parse.
-
- JSON.stringify(value, replacer, space)
- value any JavaScript value, usually an object or array.
-
- replacer an optional parameter that determines how object
- values are stringified for objects. It can be a
- function or an array of strings.
-
- space an optional parameter that specifies the indentation
- of nested structures. If it is omitted, the text will
- be packed without extra whitespace. If it is a number,
- it will specify the number of spaces to indent at each
- level. If it is a string (such as '\t' or ' '),
- it contains the characters used to indent at each level.
-
- This method produces a JSON text from a JavaScript value.
-
- When an object value is found, if the object contains a toJSON
- method, its toJSON method will be called and the result will be
- stringified. A toJSON method does not serialize: it returns the
- value represented by the name/value pair that should be serialized,
- or undefined if nothing should be serialized. The toJSON method
- will be passed the key associated with the value, and this will be
- bound to the value
-
- For example, this would serialize Dates as ISO strings.
-
- Date.prototype.toJSON = function (key) {
- function f(n) {
- // Format integers to have at least two digits.
- return n < 10 ? '0' + n : n;
- }
-
- return this.getUTCFullYear() + '-' +
- f(this.getUTCMonth() + 1) + '-' +
- f(this.getUTCDate()) + 'T' +
- f(this.getUTCHours()) + ':' +
- f(this.getUTCMinutes()) + ':' +
- f(this.getUTCSeconds()) + 'Z';
- };
-
- You can provide an optional replacer method. It will be passed the
- key and value of each member, with this bound to the containing
- object. The value that is returned from your method will be
- serialized. If your method returns undefined, then the member will
- be excluded from the serialization.
-
- If the replacer parameter is an array of strings, then it will be
- used to select the members to be serialized. It filters the results
- such that only members with keys listed in the replacer array are
- stringified.
-
- Values that do not have JSON representations, such as undefined or
- functions, will not be serialized. Such values in objects will be
- dropped; in arrays they will be replaced with null. You can use
- a replacer function to replace those with JSON values.
- JSON.stringify(undefined) returns undefined.
-
- The optional space parameter produces a stringification of the
- value that is filled with line breaks and indentation to make it
- easier to read.
-
- If the space parameter is a non-empty string, then that string will
- be used for indentation. If the space parameter is a number, then
- the indentation will be that many spaces.
-
- Example:
-
- text = JSON.stringify(['e', {pluribus: 'unum'}]);
- // text is '["e",{"pluribus":"unum"}]'
-
-
- text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
- // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
- text = JSON.stringify([new Date()], function (key, value) {
- return this[key] instanceof Date ?
- 'Date(' + this[key] + ')' : value;
- });
- // text is '["Date(---current time---)"]'
-
-
- JSON.parse(text, reviver)
- This method parses a JSON text to produce an object or array.
- It can throw a SyntaxError exception.
-
- The optional reviver parameter is a function that can filter and
- transform the results. It receives each of the keys and values,
- and its return value is used instead of the original value.
- If it returns what it received, then the structure is not modified.
- If it returns undefined then the member is deleted.
-
- Example:
-
- // Parse the text. Values that look like ISO date strings will
- // be converted to Date objects.
-
- myData = JSON.parse(text, function (key, value) {
- var a;
- if (typeof value === 'string') {
- a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
- if (a) {
- return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
- +a[5], +a[6]));
- }
- }
- return value;
- });
-
- myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
- var d;
- if (typeof value === 'string' &&
- value.slice(0, 5) === 'Date(' &&
- value.slice(-1) === ')') {
- d = new Date(value.slice(5, -1));
- if (d) {
- return d;
- }
- }
- return value;
- });
-
-
- This is a reference implementation. You are free to copy, modify, or
- redistribute.
-*/
-
-/*jslint evil: true, strict: false */
-
-/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
- call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
- getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
- lastIndex, length, parse, prototype, push, replace, slice, stringify,
- test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (!this.JSON) {
- this.JSON = {};
-}
-
-(function () {
-
- function f(n) {
- // Format integers to have at least two digits.
- return n < 10 ? '0' + n : n;
- }
-
- if (typeof Date.prototype.toJSON !== 'function') {
-
- Date.prototype.toJSON = function (key) {
-
- return isFinite(this.valueOf()) ?
- this.getUTCFullYear() + '-' +
- f(this.getUTCMonth() + 1) + '-' +
- f(this.getUTCDate()) + 'T' +
- f(this.getUTCHours()) + ':' +
- f(this.getUTCMinutes()) + ':' +
- f(this.getUTCSeconds()) + 'Z' : null;
- };
-
- String.prototype.toJSON =
- Number.prototype.toJSON =
- Boolean.prototype.toJSON = function (key) {
- return this.valueOf();
- };
- }
-
- var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
- escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
- gap,
- indent,
- meta = { // table of character substitutions
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
- },
- rep;
-
-
- function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
- escapable.lastIndex = 0;
- return escapable.test(string) ?
- '"' + string.replace(escapable, function (a) {
- var c = meta[a];
- return typeof c === 'string' ? c :
- '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- }) + '"' :
- '"' + string + '"';
- }
-
-
- function str(key, holder) {
-
-// Produce a string from holder[key].
-
- var i, // The loop counter.
- k, // The member key.
- v, // The member value.
- length,
- mind = gap,
- partial,
- value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
- if (value && typeof value === 'object' &&
- typeof value.toJSON === 'function') {
- value = value.toJSON(key);
- }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
- if (typeof rep === 'function') {
- value = rep.call(holder, key, value);
- }
-
-// What happens next depends on the value's type.
-
- switch (typeof value) {
- case 'string':
- return quote(value);
-
- case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
- return isFinite(value) ? String(value) : 'null';
-
- case 'boolean':
- case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
- return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
- case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
- if (!value) {
- return 'null';
- }
-
-// Make an array to hold the partial results of stringifying this object value.
-
- gap += indent;
- partial = [];
-
-// Is the value an array?
-
- if (Object.prototype.toString.apply(value) === '[object Array]') {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
- length = value.length;
- for (i = 0; i < length; i += 1) {
- partial[i] = str(i, value) || 'null';
- }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
- v = partial.length === 0 ? '[]' :
- gap ? '[\n' + gap +
- partial.join(',\n' + gap) + '\n' +
- mind + ']' :
- '[' + partial.join(',') + ']';
- gap = mind;
- return v;
- }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
- if (rep && typeof rep === 'object') {
- length = rep.length;
- for (i = 0; i < length; i += 1) {
- k = rep[i];
- if (typeof k === 'string') {
- v = str(k, value);
- if (v) {
- partial.push(quote(k) + (gap ? ': ' : ':') + v);
- }
- }
- }
- } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
- for (k in value) {
- if (Object.hasOwnProperty.call(value, k)) {
- v = str(k, value);
- if (v) {
- partial.push(quote(k) + (gap ? ': ' : ':') + v);
- }
- }
- }
- }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
- v = partial.length === 0 ? '{}' :
- gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
- mind + '}' : '{' + partial.join(',') + '}';
- gap = mind;
- return v;
- }
- }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
- if (typeof JSON.stringify !== 'function') {
- JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
- var i;
- gap = '';
- indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
- if (typeof space === 'number') {
- for (i = 0; i < space; i += 1) {
- indent += ' ';
- }
-
-// If the space parameter is a string, it will be used as the indent string.
-
- } else if (typeof space === 'string') {
- indent = space;
- }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
- rep = replacer;
- if (replacer && typeof replacer !== 'function' &&
- (typeof replacer !== 'object' ||
- typeof replacer.length !== 'number')) {
- throw new Error('JSON.stringify');
- }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
- return str('', {'': value});
- };
- }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
- if (typeof JSON.parse !== 'function') {
- JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
- var j;
-
- function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
- var k, v, value = holder[key];
- if (value && typeof value === 'object') {
- for (k in value) {
- if (Object.hasOwnProperty.call(value, k)) {
- v = walk(value, k);
- if (v !== undefined) {
- value[k] = v;
- } else {
- delete value[k];
- }
- }
- }
- }
- return reviver.call(holder, key, value);
- }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
- text = String(text);
- cx.lastIndex = 0;
- if (cx.test(text)) {
- text = text.replace(cx, function (a) {
- return '\\u' +
- ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- });
- }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
- if (/^[\],:{}\s]*$/.
-test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
- j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
- return typeof reviver === 'function' ?
- walk({'': j}, '') : j;
- }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
- throw new SyntaxError('JSON.parse');
- };
- }
-}());
http://git-wip-us.apache.org/repos/asf/couchdb/blob/78f367cf/share/www/script/jspec/jspec.css
----------------------------------------------------------------------
diff --git a/share/www/script/jspec/jspec.css b/share/www/script/jspec/jspec.css
deleted file mode 100644
index 629d41c..0000000
--- a/share/www/script/jspec/jspec.css
+++ /dev/null
@@ -1,149 +0,0 @@
-body.jspec {
- margin: 45px 0;
- font: 12px "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
- background: #efefef url(images/bg.png) top left repeat-x;
- text-align: center;
-}
-#jspec {
- margin: 0 auto;
- padding-top: 30px;
- width: 1008px;
- background: url(images/vr.png) top left repeat-y;
- text-align: left;
-}
-#jspec-top {
- position: relative;
- margin: 0 auto;
- width: 1008px;
- height: 40px;
- background: url(images/sprites.bg.png) top left no-repeat;
-}
-#jspec-bottom {
- margin: 0 auto;
- width: 1008px;
- height: 15px;
- background: url(images/sprites.bg.png) bottom left no-repeat;
-}
-#jspec .loading {
- margin-top: -45px;
- width: 1008px;
- height: 80px;
- background: url(images/loading.gif) 50% 50% no-repeat;
-}
-#jspec-title {
- position: absolute;
- top: 15px;
- left: 20px;
- width: 160px;
- font-size: 22px;
- font-weight: normal;
- background: url(images/sprites.png) 0 -126px no-repeat;
- text-align: center;
-}
-#jspec-title em {
- font-size: 10px;
- font-style: normal;
- color: #BCC8D1;
-}
-#jspec-report * {
- margin: 0;
- padding: 0;
- background: none;
- border: none;
-}
-#jspec-report {
- padding: 15px 40px;
- font: 11px "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
- color: #7B8D9B;
-}
-#jspec-report.has-failures {
- padding-bottom: 30px;
-}
-#jspec-report .hidden {
- display: none;
-}
-#jspec-report .heading {
- margin-bottom: 15px;
-}
-#jspec-report .heading span {
- padding-right: 10px;
-}
-#jspec-report .heading .passes em {
- color: #0ea0eb;
-}
-#jspec-report .heading .failures em {
- color: #FA1616;
-}
-#jspec-report table {
- font-size: 11px;
- border-collapse: collapse;
-}
-#jspec-report td {
- padding: 8px;
- text-indent: 30px;
- color: #7B8D9B;
-}
-#jspec-report tr.body {
- display: none;
-}
-#jspec-report tr.body pre {
- margin: 0;
- padding: 0 0 5px 25px;
-}
-#jspec-report tr.even:hover + tr.body,
-#jspec-report tr.odd:hover + tr.body {
- display: block;
-}
-#jspec-report tr td:first-child em {
- display: block;
- clear: both;
- font-style: normal;
- font-weight: normal;
- color: #7B8D9B;
-}
-#jspec-report tr.even:hover,
-#jspec-report tr.odd:hover {
- text-shadow: 1px 1px 1px #fff;
- background: #F2F5F7;
-}
-#jspec-report td + td {
- padding-right: 0;
- width: 15px;
-}
-#jspec-report td.pass {
- background: url(images/sprites.png) 3px -7px no-repeat;
-}
-#jspec-report td.fail {
- background: url(images/sprites.png) 3px -158px no-repeat;
- font-weight: bold;
- color: #FC0D0D;
-}
-#jspec-report td.requires-implementation {
- background: url(images/sprites.png) 3px -333px no-repeat;
-}
-#jspec-report tr.description td {
- margin-top: 25px;
- padding-top: 25px;
- font-size: 12px;
- font-weight: bold;
- text-indent: 0;
- color: #1a1a1a;
-}
-#jspec-report tr.description:first-child td {
- border-top: none;
-}
-#jspec-report .assertion {
- display: block;
- float: left;
- margin: 0 0 0 1px;
- padding: 0;
- width: 1px;
- height: 5px;
- background: #7B8D9B;
-}
-#jspec-report .assertion.failed {
- background: red;
-}
-.jspec-sandbox {
- display: none;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/couchdb/blob/78f367cf/share/www/script/jspec/jspec.jquery.js
----------------------------------------------------------------------
diff --git a/share/www/script/jspec/jspec.jquery.js b/share/www/script/jspec/jspec.jquery.js
deleted file mode 100644
index fcad7ab..0000000
--- a/share/www/script/jspec/jspec.jquery.js
+++ /dev/null
@@ -1,72 +0,0 @@
-
-// JSpec - jQuery - Copyright TJ Holowaychuk <tj...@vision-media.ca> (MIT Licensed)
-
-JSpec
-.requires('jQuery', 'when using jspec.jquery.js')
-.include({
- name: 'jQuery',
-
- // --- Initialize
-
- init : function() {
- jQuery.ajaxSetup({ async: false })
- },
-
- // --- Utilities
-
- utilities : {
- element: jQuery,
- elements: jQuery,
- sandbox : function() {
- return jQuery('<div class="sandbox"></div>')
- }
- },
-
- // --- Matchers
-
- matchers : {
- have_tag : "jQuery(expected, actual).length === 1",
- have_one : "alias have_tag",
- have_tags : "jQuery(expected, actual).length > 1",
- have_many : "alias have_tags",
- have_any : "alias have_tags",
- have_child : "jQuery(actual).children(expected).length === 1",
- have_children : "jQuery(actual).children(expected).length > 1",
- have_text : "jQuery(actual).text() === expected",
- have_value : "jQuery(actual).val() === expected",
- be_enabled : "!jQuery(actual).attr('disabled')",
- have_class : "jQuery(actual).hasClass(expected)",
-
- be_visible : function(actual) {
- return jQuery(actual).css('display') != 'none' &&
- jQuery(actual).css('visibility') != 'hidden' &&
- jQuery(actual).attr('type') != 'hidden'
- },
-
- be_hidden : function(actual) {
- return !JSpec.does(actual, 'be_visible')
- },
-
- have_classes : function(actual) {
- return !JSpec.any(JSpec.toArray(arguments, 1), function(arg){
- return !JSpec.does(actual, 'have_class', arg)
- })
- },
-
- have_attr : function(actual, attr, value) {
- return value ? jQuery(actual).attr(attr) == value:
- jQuery(actual).attr(attr)
- },
-
- 'be disabled selected checked' : function(attr) {
- return 'jQuery(actual).attr("' + attr + '")'
- },
-
- 'have type id title alt href src sel rev name target' : function(attr) {
- return function(actual, value) {
- return JSpec.does(actual, 'have_attr', attr, value)
- }
- }
- }
-})
-
http://git-wip-us.apache.org/repos/asf/couchdb/blob/78f367cf/share/www/script/jspec/jspec.js
----------------------------------------------------------------------
diff --git a/share/www/script/jspec/jspec.js b/share/www/script/jspec/jspec.js
deleted file mode 100644
index b2ea476..0000000
--- a/share/www/script/jspec/jspec.js
+++ /dev/null
@@ -1,1756 +0,0 @@
-
-// JSpec - Core - Copyright TJ Holowaychuk <tj...@vision-media.ca> (MIT Licensed)
-
-;(function(){
-
- JSpec = {
- version : '3.3.2',
- assert : true,
- cache : {},
- suites : [],
- modules : [],
- allSuites : [],
- matchers : {},
- stubbed : [],
- options : {},
- request : 'XMLHttpRequest' in this ? XMLHttpRequest : null,
- stats : { specs: 0, assertions: 0, failures: 0, passes: 0, specsFinished: 0, suitesFinished: 0 },
-
- /**
- * Default context in which bodies are evaluated.
- *
- * Replace context simply by setting JSpec.context
- * to your own like below:
- *
- * JSpec.context = { foo : 'bar' }
- *
- * Contexts can be changed within any body, this can be useful
- * in order to provide specific helper methods to specific suites.
- *
- * To reset (usually in after hook) simply set to null like below:
- *
- * JSpec.context = null
- *
- */
-
- defaultContext : {
-
- /**
- * Return an object used for proxy assertions.
- * This object is used to indicate that an object
- * should be an instance of _object_, not the constructor
- * itself.
- *
- * @param {function} constructor
- * @return {hash}
- * @api public
- */
-
- an_instance_of : function(constructor) {
- return { an_instance_of : constructor }
- },
-
- /**
- * Load fixture at _path_.
- *
- * Fixtures are resolved as:
- *
- * - <path>
- * - <path>.html
- *
- * @param {string} path
- * @return {string}
- * @api public
- */
-
- fixture : function(path) {
- if (JSpec.cache[path]) return JSpec.cache[path]
- return JSpec.cache[path] =
- JSpec.tryLoading(JSpec.options.fixturePath + '/' + path) ||
- JSpec.tryLoading(JSpec.options.fixturePath + '/' + path + '.html')
- }
- },
-
- // --- Objects
-
- reporters : {
-
- /**
- * Report to server.
- *
- * Options:
- * - uri specific uri to report to.
- * - verbose weither or not to output messages
- * - failuresOnly output failure messages only
- *
- * @api public
- */
-
- Server : function(results, options) {
- var uri = options.uri || window.location.protocol + "//" + window.location.host + '/results'
- JSpec.post(uri, {
- stats: JSpec.stats,
- options: options,
- results: map(results.allSuites, function(suite) {
- if (suite.hasSpecs())
- return {
- description: suite.description,
- specs: map(suite.specs, function(spec) {
- return {
- description: spec.description,
- message: !spec.passed() ? spec.failure().message : null,
- status: spec.requiresImplementation() ? 'pending' :
- spec.passed() ? 'pass' :
- 'fail',
- assertions: map(spec.assertions, function(assertion){
- return {
- passed: assertion.passed
- }
- })
- }
- })
- }
- })
- })
- if ('close' in main) main.close()
- },
-
- /**
- * Default reporter, outputting to the DOM.
- *
- * Options:
- * - reportToId id of element to output reports to, defaults to 'jspec'
- * - failuresOnly displays only suites with failing specs
- *
- * @api public
- */
-
- DOM : function(results, options) {
- var id = option('reportToId') || 'jspec',
- report = document.getElementById(id),
- failuresOnly = option('failuresOnly'),
- classes = results.stats.failures ? 'has-failures' : ''
- if (!report) throw 'JSpec requires the element #' + id + ' to output its reports'
-
- function bodyContents(body) {
- return JSpec.
- escape(JSpec.contentsOf(body)).
- replace(/^ */gm, function(a){ return (new Array(Math.round(a.length / 3))).join(' ') }).
- replace(/\r\n|\r|\n/gm, '<br/>')
- }
-
- report.innerHTML = '<div id="jspec-report" class="' + classes + '"><div class="heading"> \
- <span class="passes">Passes: <em>' + results.stats.passes + '</em></span> \
- <span class="failures">Failures: <em>' + results.stats.failures + '</em></span> \
- <span class="passes">Duration: <em>' + results.duration + '</em> ms</span> \
- </div><table class="suites">' + map(results.allSuites, function(suite) {
- var displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
- if (displaySuite && suite.hasSpecs())
- return '<tr class="description"><td colspan="2">' + escape(suite.description) + '</td></tr>' +
- map(suite.specs, function(i, spec) {
- return '<tr class="' + (i % 2 ? 'odd' : 'even') + '">' +
- (spec.requiresImplementation() ?
- '<td class="requires-implementation" colspan="2">' + escape(spec.description) + '</td>' :
- (spec.passed() && !failuresOnly) ?
- '<td class="pass">' + escape(spec.description)+ '</td><td>' + spec.assertionsGraph() + '</td>' :
- !spec.passed() ?
- '<td class="fail">' + escape(spec.description) +
- map(spec.failures(), function(a){ return '<em>' + escape(a.message) + '</em>' }).join('') +
- '</td><td>' + spec.assertionsGraph() + '</td>' :
- '') +
- '<tr class="body"><td colspan="2"><pre>' + bodyContents(spec.body) + '</pre></td></tr>'
- }).join('') + '</tr>'
- }).join('') + '</table></div>'
- },
-
- /**
- * Terminal reporter.
- *
- * @api public
- */
-
- Terminal : function(results, options) {
- var failuresOnly = option('failuresOnly')
- print(color("\n Passes: ", 'bold') + color(results.stats.passes, 'green') +
- color(" Failures: ", 'bold') + color(results.stats.failures, 'red') +
- color(" Duration: ", 'bold') + color(results.duration, 'green') + " ms \n")
-
- function indent(string) {
- return string.replace(/^(.)/gm, ' $1')
- }
-
- each(results.allSuites, function(suite) {
- var displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
- if (displaySuite && suite.hasSpecs()) {
- print(color(' ' + suite.description, 'bold'))
- each(suite.specs, function(spec){
- var assertionsGraph = inject(spec.assertions, '', function(graph, assertion){
- return graph + color('.', assertion.passed ? 'green' : 'red')
- })
- if (spec.requiresImplementation())
- print(color(' ' + spec.description, 'blue') + assertionsGraph)
- else if (spec.passed() && !failuresOnly)
- print(color(' ' + spec.description, 'green') + assertionsGraph)
- else if (!spec.passed())
- print(color(' ' + spec.description, 'red') + assertionsGraph +
- "\n" + indent(map(spec.failures(), function(a){ return a.message }).join("\n")) + "\n")
- })
- print("")
- }
- })
-
- quit(results.stats.failures)
- }
- },
-
- Assertion : function(matcher, actual, expected, negate) {
- extend(this, {
- message: '',
- passed: false,
- actual: actual,
- negate: negate,
- matcher: matcher,
- expected: expected,
-
- // Report assertion results
-
- report : function() {
- if (JSpec.assert)
- this.passed ? JSpec.stats.passes++ : JSpec.stats.failures++
- return this
- },
-
- // Run the assertion
-
- run : function() {
- // TODO: remove unshifting
- expected.unshift(actual)
- this.result = matcher.match.apply(this, expected)
- this.passed = negate ? !this.result : this.result
- if (!this.passed) this.message = matcher.message.call(this, actual, expected, negate, matcher.name)
- return this
- }
- })
- },
-
- ProxyAssertion : function(object, method, times, negate) {
- var self = this
- var old = object[method]
-
- // Proxy
-
- object[method] = function(){
- args = toArray(arguments)
- result = old.apply(object, args)
- self.calls.push({ args : args, result : result })
- return result
- }
-
- // Times
-
- this.times = {
- once : 1,
- twice : 2
- }[times] || times || 1
-
- extend(this, {
- calls: [],
- message: '',
- defer: true,
- passed: false,
- negate: negate,
- object: object,
- method: method,
-
- // Proxy return value
-
- and_return : function(result) {
- this.expectedResult = result
- return this
- },
-
- // Proxy arguments passed
-
- with_args : function() {
- this.expectedArgs = toArray(arguments)
- return this
- },
-
- // Check if any calls have failing results
-
- anyResultsFail : function() {
- return any(this.calls, function(call){
- return self.expectedResult.an_instance_of ?
- call.result.constructor != self.expectedResult.an_instance_of:
- !equal(self.expectedResult, call.result)
- })
- },
-
- // Check if any calls have passing results
-
- anyResultsPass : function() {
- return any(this.calls, function(call){
- return self.expectedResult.an_instance_of ?
- call.result.constructor == self.expectedResult.an_instance_of:
- equal(self.expectedResult, call.result)
- })
- },
-
- // Return the passing result
-
- passingResult : function() {
- return this.anyResultsPass().result
- },
-
- // Return the failing result
-
- failingResult : function() {
- return this.anyResultsFail().result
- },
-
- // Check if any arguments fail
-
- anyArgsFail : function() {
- return any(this.calls, function(call){
- return any(self.expectedArgs, function(i, arg){
- if (arg == null) return call.args[i] == null
- return arg.an_instance_of ?
- call.args[i].constructor != arg.an_instance_of:
- !equal(arg, call.args[i])
-
- })
- })
- },
-
- // Check if any arguments pass
-
- anyArgsPass : function() {
- return any(this.calls, function(call){
- return any(self.expectedArgs, function(i, arg){
- return arg.an_instance_of ?
- call.args[i].constructor == arg.an_instance_of:
- equal(arg, call.args[i])
-
- })
- })
- },
-
- // Return the passing args
-
- passingArgs : function() {
- return this.anyArgsPass().args
- },
-
- // Return the failing args
-
- failingArgs : function() {
- return this.anyArgsFail().args
- },
-
- // Report assertion results
-
- report : function() {
- if (JSpec.assert)
- this.passed ? ++JSpec.stats.passes : ++JSpec.stats.failures
- return this
- },
-
- // Run the assertion
-
- run : function() {
- var methodString = 'expected ' + object.toString() + '.' + method + '()' + (negate ? ' not' : '' )
-
- function times(n) {
- return n > 2 ? n + ' times' : { 1: 'once', 2: 'twice' }[n]
- }
-
- if (this.expectedResult != null && (negate ? this.anyResultsPass() : this.anyResultsFail()))
- this.message = methodString + ' to return ' + puts(this.expectedResult) +
- ' but ' + (negate ? 'it did' : 'got ' + puts(this.failingResult()))
-
- if (this.expectedArgs && (negate ? !this.expectedResult && this.anyArgsPass() : this.anyArgsFail()))
- this.message = methodString + ' to be called with ' + puts.apply(this, this.expectedArgs) +
- ' but was' + (negate ? '' : ' called with ' + puts.apply(this, this.failingArgs()))
-
- if (negate ? !this.expectedResult && !this.expectedArgs && this.calls.length >= this.times : this.calls.length != this.times)
- this.message = methodString + ' to be called ' + times(this.times) +
- ', but ' + (this.calls.length == 0 ? ' was not called' : ' was called ' + times(this.calls.length))
-
- if (!this.message.length)
- this.passed = true
-
- return this
- }
- })
- },
-
- /**
- * Specification Suite block object.
- *
- * @param {string} description
- * @param {function} body
- * @api private
- */
-
- Suite : function(description, body) {
- var self = this
- extend(this, {
- body: body,
- description: description,
- suites: [],
- specs: [],
- ran: false,
- hooks: { 'before' : [], 'after' : [], 'before_each' : [], 'after_each' : [] },
-
- // Add a spec to the suite
-
- addSpec : function(description, body) {
- var spec = new JSpec.Spec(description, body)
- this.specs.push(spec)
- JSpec.stats.specs++ // TODO: abstract
- spec.suite = this
- },
-
- // Add a hook to the suite
-
- addHook : function(hook, body) {
- this.hooks[hook].push(body)
- },
-
- // Add a nested suite
-
- addSuite : function(description, body) {
- var suite = new JSpec.Suite(description, body)
- JSpec.allSuites.push(suite)
- suite.name = suite.description
- suite.description = this.description + ' ' + suite.description
- this.suites.push(suite)
- suite.suite = this
- },
-
- // Invoke a hook in context to this suite
-
- hook : function(hook) {
- if (this.suite) this.suite.hook(hook)
- each(this.hooks[hook], function(body) {
- JSpec.evalBody(body, "Error in hook '" + hook + "', suite '" + self.description + "': ")
- })
- },
-
- // Check if nested suites are present
-
- hasSuites : function() {
- return this.suites.length
- },
-
- // Check if this suite has specs
-
- hasSpecs : function() {
- return this.specs.length
- },
-
- // Check if the entire suite passed
-
- passed : function() {
- return !any(this.specs, function(spec){
- return !spec.passed()
- })
- }
- })
- },
-
- /**
- * Specification block object.
- *
- * @param {string} description
- * @param {function} body
- * @api private
- */
-
- Spec : function(description, body) {
- extend(this, {
- body: body,
- description: description,
- assertions: [],
-
- // Add passing assertion
-
- pass : function(message) {
- this.assertions.push({ passed: true, message: message })
- if (JSpec.assert) ++JSpec.stats.passes
- },
-
- // Add failing assertion
-
- fail : function(message) {
- this.assertions.push({ passed: false, message: message })
- if (JSpec.assert) ++JSpec.stats.failures
- },
-
- // Run deferred assertions
-
- runDeferredAssertions : function() {
- each(this.assertions, function(assertion){
- if (assertion.defer) assertion.run().report(), hook('afterAssertion', assertion)
- })
- },
-
- // Find first failing assertion
-
- failure : function() {
- return find(this.assertions, function(assertion){
- return !assertion.passed
- })
- },
-
- // Find all failing assertions
-
- failures : function() {
- return select(this.assertions, function(assertion){
- return !assertion.passed
- })
- },
-
- // Weither or not the spec passed
-
- passed : function() {
- return !this.failure()
- },
-
- // Weither or not the spec requires implementation (no assertions)
-
- requiresImplementation : function() {
- return this.assertions.length == 0
- },
-
- // Sprite based assertions graph
-
- assertionsGraph : function() {
- return map(this.assertions, function(assertion){
- return '<span class="assertion ' + (assertion.passed ? 'passed' : 'failed') + '"></span>'
- }).join('')
- }
- })
- },
-
- Module : function(methods) {
- extend(this, methods)
- },
-
- JSON : {
-
- /**
- * Generic sequences.
- */
-
- meta : {
- '\b' : '\\b',
- '\t' : '\\t',
- '\n' : '\\n',
- '\f' : '\\f',
- '\r' : '\\r',
- '"' : '\\"',
- '\\' : '\\\\'
- },
-
- /**
- * Escapable sequences.
- */
-
- escapable : /[\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-
- /**
- * JSON encode _object_.
- *
- * @param {mixed} object
- * @return {string}
- * @api private
- */
-
- encode : function(object) {
- var self = this
- if (object == undefined || object == null) return 'null'
- if (object === true) return 'true'
- if (object === false) return 'false'
- switch (typeof object) {
- case 'number': return object
- case 'string': return this.escapable.test(object) ?
- '"' + object.replace(this.escapable, function (a) {
- return typeof self.meta[a] === 'string' ? self.meta[a] :
- '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4)
- }) + '"' :
- '"' + object + '"'
- case 'object':
- if (object.constructor == Array)
- return '[' + map(object, function(val){
- return self.encode(val)
- }).join(', ') + ']'
- else if (object)
- return '{' + map(object, function(key, val){
- return self.encode(key) + ':' + self.encode(val)
- }).join(', ') + '}'
- }
- return 'null'
- }
- },
-
- // --- DSLs
-
- DSLs : {
- snake : {
- expect : function(actual){
- return JSpec.expect(actual)
- },
-
- describe : function(description, body) {
- return JSpec.currentSuite.addSuite(description, body)
- },
-
- it : function(description, body) {
- return JSpec.currentSuite.addSpec(description, body)
- },
-
- before : function(body) {
- return JSpec.currentSuite.addHook('before', body)
- },
-
- after : function(body) {
- return JSpec.currentSuite.addHook('after', body)
- },
-
- before_each : function(body) {
- return JSpec.currentSuite.addHook('before_each', body)
- },
-
- after_each : function(body) {
- return JSpec.currentSuite.addHook('after_each', body)
- },
-
- should_behave_like : function(description) {
- return JSpec.shareBehaviorsOf(description)
- }
- }
- },
-
- // --- Methods
-
- /**
- * Check if _value_ is 'stop'. For use as a
- * utility callback function.
- *
- * @param {mixed} value
- * @return {bool}
- * @api public
- */
-
- haveStopped : function(value) {
- return value === 'stop'
- },
-
- /**
- * Include _object_ which may be a hash or Module instance.
- *
- * @param {hash, Module} object
- * @return {JSpec}
- * @api public
- */
-
- include : function(object) {
- var module = object.constructor == JSpec.Module ? object : new JSpec.Module(object)
- this.modules.push(module)
- if ('init' in module) module.init()
- if ('utilities' in module) extend(this.defaultContext, module.utilities)
- if ('matchers' in module) this.addMatchers(module.matchers)
- if ('reporters' in module) extend(this.reporters, module.reporters)
- if ('DSLs' in module)
- each(module.DSLs, function(name, methods){
- JSpec.DSLs[name] = JSpec.DSLs[name] || {}
- extend(JSpec.DSLs[name], methods)
- })
- return this
- },
-
- /**
- * Add a module hook _name_, which is immediately
- * called per module with the _args_ given. An array of
- * hook return values is returned.
- *
- * @param {name} string
- * @param {...} args
- * @return {array}
- * @api private
- */
-
- hook : function(name, args) {
- args = toArray(arguments, 1)
- return inject(JSpec.modules, [], function(results, module){
- if (typeof module[name] == 'function')
- results.push(JSpec.evalHook(module, name, args))
- })
- },
-
- /**
- * Eval _module_ hook _name_ with _args_. Evaluates in context
- * to the module itself, JSpec, and JSpec.context.
- *
- * @param {Module} module
- * @param {string} name
- * @param {array} args
- * @return {mixed}
- * @api private
- */
-
- evalHook : function(module, name, args) {
- hook('evaluatingHookBody', module, name)
- try { return module[name].apply(module, args) }
- catch(e) { error('Error in hook ' + module.name + '.' + name + ': ', e) }
- },
-
- /**
- * Same as hook() however accepts only one _arg_ which is
- * considered immutable. This function passes the arg
- * to the first module, then passes the return value of the last
- * module called, to the following module.
- *
- * @param {string} name
- * @param {mixed} arg
- * @return {mixed}
- * @api private
- */
-
- hookImmutable : function(name, arg) {
- return inject(JSpec.modules, arg, function(result, module){
- if (typeof module[name] == 'function')
- return JSpec.evalHook(module, name, [result])
- })
- },
-
- /**
- * Find a suite by its description or name.
- *
- * @param {string} description
- * @return {Suite}
- * @api private
- */
-
- findSuite : function(description) {
- return find(this.allSuites, function(suite){
- return suite.name == description || suite.description == description
- })
- },
-
- /**
- * Share behaviors (specs) of the given suite with
- * the current suite.
- *
- * @param {string} description
- * @api public
- */
-
- shareBehaviorsOf : function(description) {
- if (suite = this.findSuite(description)) this.copySpecs(suite, this.currentSuite)
- else throw 'failed to share behaviors. ' + puts(description) + ' is not a valid Suite name'
- },
-
- /**
- * Copy specs from one suite to another.
- *
- * @param {Suite} fromSuite
- * @param {Suite} toSuite
- * @api public
- */
-
- copySpecs : function(fromSuite, toSuite) {
- each(fromSuite.specs, function(spec){
- var newSpec = new Object();
- extend(newSpec, spec);
- newSpec.assertions = [];
- toSuite.specs.push(newSpec);
- })
- },
-
- /**
- * Convert arguments to an array.
- *
- * @param {object} arguments
- * @param {int} offset
- * @return {array}
- * @api public
- */
-
- toArray : function(arguments, offset) {
- return Array.prototype.slice.call(arguments, offset || 0)
- },
-
- /**
- * Return ANSI-escaped colored string.
- *
- * @param {string} string
- * @param {string} color
- * @return {string}
- * @api public
- */
-
- color : function(string, color) {
- return "\u001B[" + {
- bold : 1,
- black : 30,
- red : 31,
- green : 32,
- yellow : 33,
- blue : 34,
- magenta : 35,
- cyan : 36,
- white : 37
- }[color] + 'm' + string + "\u001B[0m"
- },
-
- /**
- * Default matcher message callback.
- *
- * @api private
- */
-
- defaultMatcherMessage : function(actual, expected, negate, name) {
- return 'expected ' + puts(actual) + ' to ' +
- (negate ? 'not ' : '') +
- name.replace(/_/g, ' ') +
- ' ' + (expected.length > 1 ?
- puts.apply(this, expected.slice(1)) :
- '')
- },
-
- /**
- * Normalize a matcher message.
- *
- * When no messge callback is present the defaultMatcherMessage
- * will be assigned, will suffice for most matchers.
- *
- * @param {hash} matcher
- * @return {hash}
- * @api public
- */
-
- normalizeMatcherMessage : function(matcher) {
- if (typeof matcher.message != 'function')
- matcher.message = this.defaultMatcherMessage
- return matcher
- },
-
- /**
- * Normalize a matcher body
- *
- * This process allows the following conversions until
- * the matcher is in its final normalized hash state.
- *
- * - '==' becomes 'actual == expected'
- * - 'actual == expected' becomes 'return actual == expected'
- * - function(actual, expected) { return actual == expected } becomes
- * { match : function(actual, expected) { return actual == expected }}
- *
- * @param {mixed} body
- * @return {hash}
- * @api public
- */
-
- normalizeMatcherBody : function(body) {
- switch (body.constructor) {
- case String:
- if (captures = body.match(/^alias (\w+)/)) return JSpec.matchers[last(captures)]
- if (body.length < 4) body = 'actual ' + body + ' expected'
- return { match: function(actual, expected) { return eval(body) }}
-
- case Function:
- return { match: body }
-
- default:
- return body
- }
- },
-
- /**
- * Get option value. This method first checks if
- * the option key has been set via the query string,
- * otherwise returning the options hash value.
- *
- * @param {string} key
- * @return {mixed}
- * @api public
- */
-
- option : function(key) {
- return (value = query(key)) !== null ? value :
- JSpec.options[key] || null
- },
-
- /**
- * Check if object _a_, is equal to object _b_.
- *
- * @param {object} a
- * @param {object} b
- * @return {bool}
- * @api private
- */
-
- equal: function(a, b) {
- if (typeof a != typeof b) return
- if (a === b) return true
- if (a instanceof RegExp)
- return a.toString() === b.toString()
- if (a instanceof Date)
- return Number(a) === Number(b)
- if (typeof a != 'object') return
- if (a.length !== undefined)
- if (a.length !== b.length) return
- else
- for (var i = 0, len = a.length; i < len; ++i)
- if (!equal(a[i], b[i]))
- return
- for (var key in a)
- if (!equal(a[key], b[key]))
- return
- return true
- },
-
- /**
- * Return last element of an array.
- *
- * @param {array} array
- * @return {object}
- * @api public
- */
-
- last : function(array) {
- return array[array.length - 1]
- },
-
- /**
- * Convert object(s) to a print-friend string.
- *
- * @param {...} object
- * @return {string}
- * @api public
- */
-
- puts : function(object) {
- if (arguments.length > 1)
- return map(toArray(arguments), function(arg){
- return puts(arg)
- }).join(', ')
- if (object === undefined) return 'undefined'
- if (object === null) return 'null'
- if (object === true) return 'true'
- if (object === false) return 'false'
- if (object.an_instance_of) return 'an instance of ' + object.an_instance_of.name
- if (object.jquery && object.selector.length > 0) return 'selector ' + puts(object.selector)
- if (object.jquery) return object.get(0).outerHTML
- if (object.nodeName) return object.outerHTML
- switch (object.constructor) {
- case Function: return object.name || object
- case String:
- return '"' + object
- .replace(/"/g, '\\"')
- .replace(/\n/g, '\\n')
- .replace(/\t/g, '\\t')
- + '"'
- case Array:
- return inject(object, '[', function(b, v){
- return b + ', ' + puts(v)
- }).replace('[,', '[') + ' ]'
- case Object:
- object.__hit__ = true
- return inject(object, '{', function(b, k, v) {
- if (k == '__hit__') return b
- return b + ', ' + k + ': ' + (v && v.__hit__ ? '<circular reference>' : puts(v))
- }).replace('{,', '{') + ' }'
- default:
- return object.toString()
- }
- },
-
- /**
- * Escape HTML.
- *
- * @param {string} html
- * @return {string}
- * @api public
- */
-
- escape : function(html) {
- return html.toString()
- .replace(/&/gmi, '&')
- .replace(/"/gmi, '"')
- .replace(/>/gmi, '>')
- .replace(/</gmi, '<')
- },
-
- /**
- * Perform an assertion without reporting.
- *
- * This method is primarily used for internal
- * matchers in order retain DRYness. May be invoked
- * like below:
- *
- * does('foo', 'eql', 'foo')
- * does([1,2], 'include', 1, 2)
- *
- * External hooks are not run for internal assertions
- * performed by does().
- *
- * @param {mixed} actual
- * @param {string} matcher
- * @param {...} expected
- * @return {mixed}
- * @api private
- */
-
- does : function(actual, matcher, expected) {
- var assertion = new JSpec.Assertion(JSpec.matchers[matcher], actual, toArray(arguments, 2))
- return assertion.run().result
- },
-
- /**
- * Perform an assertion.
- *
- * expect(true).to('be', true)
- * expect('foo').not_to('include', 'bar')
- * expect([1, [2]]).to('include', 1, [2])
- *
- * @param {mixed} actual
- * @return {hash}
- * @api public
- */
-
- expect : function(actual) {
- function assert(matcher, args, negate) {
- var expected = toArray(args, 1)
- matcher.negate = negate
- assertion = new JSpec.Assertion(matcher, actual, expected, negate)
- hook('beforeAssertion', assertion)
- if (matcher.defer) assertion.run()
- else JSpec.currentSpec.assertions.push(assertion.run().report()), hook('afterAssertion', assertion)
- return assertion.result
- }
-
- function to(matcher) {
- return assert(matcher, arguments, false)
- }
-
- function not_to(matcher) {
- return assert(matcher, arguments, true)
- }
-
- return {
- to : to,
- should : to,
- not_to: not_to,
- should_not : not_to
- }
- },
-
- /**
- * Strim whitespace or chars.
- *
- * @param {string} string
- * @param {string} chars
- * @return {string}
- * @api public
- */
-
- strip : function(string, chars) {
- return string.
- replace(new RegExp('[' + (chars || '\\s') + ']*$'), '').
- replace(new RegExp('^[' + (chars || '\\s') + ']*'), '')
- },
-
- /**
- * Call an iterator callback with arguments a, or b
- * depending on the arity of the callback.
- *
- * @param {function} callback
- * @param {mixed} a
- * @param {mixed} b
- * @return {mixed}
- * @api private
- */
-
- callIterator : function(callback, a, b) {
- return callback.length == 1 ? callback(b) : callback(a, b)
- },
-
- /**
- * Extend an object with another.
- *
- * @param {object} object
- * @param {object} other
- * @api public
- */
-
- extend : function(object, other) {
- each(other, function(property, value){
- object[property] = value
- })
- },
-
- /**
- * Iterate an object, invoking the given callback.
- *
- * @param {hash, array} object
- * @param {function} callback
- * @return {JSpec}
- * @api public
- */
-
- each : function(object, callback) {
- if (object.constructor == Array)
- for (var i = 0, len = object.length; i < len; ++i)
- callIterator(callback, i, object[i])
- else
- for (var key in object)
- if (object.hasOwnProperty(key))
- callIterator(callback, key, object[key])
- },
-
- /**
- * Iterate with memo.
- *
- * @param {hash, array} object
- * @param {object} memo
- * @param {function} callback
- * @return {object}
- * @api public
- */
-
- inject : function(object, memo, callback) {
- each(object, function(key, value){
- memo = (callback.length == 2 ?
- callback(memo, value):
- callback(memo, key, value)) ||
- memo
- })
- return memo
- },
-
- /**
- * Destub _object_'s _method_. When no _method_ is passed
- * all stubbed methods are destubbed. When no arguments
- * are passed every object found in JSpec.stubbed will be
- * destubbed.
- *
- * @param {mixed} object
- * @param {string} method
- * @api public
- */
-
- destub : function(object, method) {
- if (method) {
- if (object['__prototype__' + method])
- delete object[method]
- else
- object[method] = object['__original__' + method]
- delete object['__prototype__' + method]
- delete object['__original____' + method]
- }
- else if (object) {
- for (var key in object)
- if (captures = key.match(/^(?:__prototype__|__original__)(.*)/))
- destub(object, captures[1])
- }
- else
- while (JSpec.stubbed.length)
- destub(JSpec.stubbed.shift())
- },
-
- /**
- * Stub _object_'s _method_.
- *
- * stub(foo, 'toString').and_return('bar')
- *
- * @param {mixed} object
- * @param {string} method
- * @return {hash}
- * @api public
- */
-
- stub : function(object, method) {
- hook('stubbing', object, method)
- JSpec.stubbed.push(object)
- var type = object.hasOwnProperty(method) ? '__original__' : '__prototype__'
- object[type + method] = object[method]
- object[method] = function(){}
- return {
- and_return : function(value) {
- if (typeof value == 'function') object[method] = value
- else object[method] = function(){ return value }
- }
- }
- },
-
- /**
- * Map callback return values.
- *
- * @param {hash, array} object
- * @param {function} callback
- * @return {array}
- * @api public
- */
-
- map : function(object, callback) {
- return inject(object, [], function(memo, key, value){
- memo.push(callIterator(callback, key, value))
- })
- },
-
- /**
- * Returns the first matching expression or null.
- *
- * @param {hash, array} object
- * @param {function} callback
- * @return {mixed}
- * @api public
- */
-
- any : function(object, callback) {
- return inject(object, null, function(state, key, value){
- if (state == undefined)
- return callIterator(callback, key, value) ? value : state
- })
- },
-
- /**
- * Returns an array of values collected when the callback
- * given evaluates to true.
- *
- * @param {hash, array} object
- * @return {function} callback
- * @return {array}
- * @api public
- */
-
- select : function(object, callback) {
- return inject(object, [], function(selected, key, value){
- if (callIterator(callback, key, value))
- selected.push(value)
- })
- },
-
- /**
- * Define matchers.
- *
- * @param {hash} matchers
- * @api public
- */
-
- addMatchers : function(matchers) {
- each(matchers, function(name, body){
- JSpec.addMatcher(name, body)
- })
- },
-
- /**
- * Define a matcher.
- *
- * @param {string} name
- * @param {hash, function, string} body
- * @api public
- */
-
- addMatcher : function(name, body) {
- hook('addingMatcher', name, body)
- if (name.indexOf(' ') != -1) {
- var matchers = name.split(/\s+/)
- var prefix = matchers.shift()
- each(matchers, function(name) {
- JSpec.addMatcher(prefix + '_' + name, body(name))
- })
- }
- this.matchers[name] = this.normalizeMatcherMessage(this.normalizeMatcherBody(body))
- this.matchers[name].name = name
- },
-
- /**
- * Add a root suite to JSpec.
- *
- * @param {string} description
- * @param {body} function
- * @api public
- */
-
- describe : function(description, body) {
- var suite = new JSpec.Suite(description, body)
- hook('addingSuite', suite)
- this.allSuites.push(suite)
- this.suites.push(suite)
- },
-
- /**
- * Return the contents of a function body.
- *
- * @param {function} body
- * @return {string}
- * @api public
- */
-
- contentsOf : function(body) {
- return body.toString().match(/^[^\{]*{((.*\n*)*)}/m)[1]
- },
-
- /**
- * Evaluate a JSpec capture body.
- *
- * @param {function} body
- * @param {string} errorMessage (optional)
- * @return {Type}
- * @api private
- */
-
- evalBody : function(body, errorMessage) {
- var dsl = this.DSL || this.DSLs.snake
- var matchers = this.matchers
- var context = this.context || this.defaultContext
- var contents = this.contentsOf(body)
- hook('evaluatingBody', dsl, matchers, context, contents)
- try { with (dsl){ with (context) { with (matchers) { eval(contents) }}} }
- catch(e) { error(errorMessage, e) }
- },
-
- /**
- * Pre-process a string of JSpec.
- *
- * @param {string} input
- * @return {string}
- * @api private
- */
-
- preprocess : function(input) {
- if (typeof input != 'string') return
- input = hookImmutable('preprocessing', input)
- return input.
- replace(/\t/g, ' ').
- replace(/\r\n|\n|\r/g, '\n').
- split('__END__')[0].
- replace(/([\w\.]+)\.(stub|destub)\((.*?)\)$/gm, '$2($1, $3)').
- replace(/describe\s+(.*?)$/gm, 'describe($1, function(){').
- replace(/^\s+it\s+(.*?)$/gm, ' it($1, function(){').
- replace(/^ *(before_each|after_each|before|after)(?= |\n|$)/gm, 'JSpec.currentSuite.addHook("$1", function(){').
- replace(/^\s*end(?=\s|$)/gm, '});').
- replace(/-\{/g, 'function(){').
- replace(/(\d+)\.\.(\d+)/g, function(_, a, b){ return range(a, b) }).
- replace(/\.should([_\.]not)?[_\.](\w+)(?: |;|$)(.*)$/gm, '.should$1_$2($3)').
- replace(/([\/\s]*)(.+?)\.(should(?:[_\.]not)?)[_\.](\w+)\((.*)\)\s*;?$/gm, '$1 expect($2).$3($4, $5)').
- replace(/, \)/g, ')').
- replace(/should\.not/g, 'should_not')
- },
-
- /**
- * Create a range string which can be evaluated to a native array.
- *
- * @param {int} start
- * @param {int} end
- * @return {string}
- * @api public
- */
-
- range : function(start, end) {
- var current = parseInt(start), end = parseInt(end), values = [current]
- if (end > current) while (++current <= end) values.push(current)
- else while (--current >= end) values.push(current)
- return '[' + values + ']'
- },
-
- /**
- * Report on the results.
- *
- * @api public
- */
-
- report : function() {
- this.duration = Number(new Date) - this.start
- hook('reporting', JSpec.options)
- new (JSpec.options.reporter || JSpec.reporters.DOM)(JSpec, JSpec.options)
- },
-
- /**
- * Run the spec suites. Options are merged
- * with JSpec options when present.
- *
- * @param {hash} options
- * @return {JSpec}
- * @api public
- */
-
- run : function(options) {
- if (any(hook('running'), haveStopped)) return this
- if (options) extend(this.options, options)
- this.start = Number(new Date)
- each(this.suites, function(suite) { JSpec.runSuite(suite) })
- return this
- },
-
- /**
- * Run a suite.
- *
- * @param {Suite} suite
- * @api public
- */
-
- runSuite : function(suite) {
- this.currentSuite = suite
- this.evalBody(suite.body)
- suite.ran = true
- hook('beforeSuite', suite), suite.hook('before')
- each(suite.specs, function(spec) {
- hook('beforeSpec', spec)
- suite.hook('before_each')
- JSpec.runSpec(spec)
- hook('afterSpec', spec)
- suite.hook('after_each')
- })
- if (suite.hasSuites()) {
- each(suite.suites, function(suite) {
- JSpec.runSuite(suite)
- })
- }
- hook('afterSuite', suite), suite.hook('after')
- this.stats.suitesFinished++
- },
-
- /**
- * Report a failure for the current spec.
- *
- * @param {string} message
- * @api public
- */
-
- fail : function(message) {
- JSpec.currentSpec.fail(message)
- },
-
- /**
- * Report a passing assertion for the current spec.
- *
- * @param {string} message
- * @api public
- */
-
- pass : function(message) {
- JSpec.currentSpec.pass(message)
- },
-
- /**
- * Run a spec.
- *
- * @param {Spec} spec
- * @api public
- */
-
- runSpec : function(spec) {
- this.currentSpec = spec
- try { this.evalBody(spec.body) }
- catch (e) { fail(e) }
- spec.runDeferredAssertions()
- destub()
- this.stats.specsFinished++
- this.stats.assertions += spec.assertions.length
- },
-
- /**
- * Require a dependency, with optional message.
- *
- * @param {string} dependency
- * @param {string} message (optional)
- * @return {JSpec}
- * @api public
- */
-
- requires : function(dependency, message) {
- hook('requiring', dependency, message)
- try { eval(dependency) }
- catch (e) { throw 'JSpec depends on ' + dependency + ' ' + message }
- return this
- },
-
- /**
- * Query against the current query strings keys
- * or the queryString specified.
- *
- * @param {string} key
- * @param {string} queryString
- * @return {string, null}
- * @api private
- */
-
- query : function(key, queryString) {
- var queryString = (queryString || (main.location ? main.location.search : null) || '').substring(1)
- return inject(queryString.split('&'), null, function(value, pair){
- parts = pair.split('=')
- return parts[0] == key ? parts[1].replace(/%20|\+/gmi, ' ') : value
- })
- },
-
- /**
- * Throw a JSpec related error.
- *
- * @param {string} message
- * @param {Exception} e
- * @api public
- */
-
- error : function(message, e) {
- throw (message ? message : '') + e.toString() +
- (e.line ? ' near line ' + e.line : '')
- },
-
- /**
- * Ad-hoc POST request for JSpec server usage.
- *
- * @param {string} uri
- * @param {string} data
- * @api private
- */
-
- post : function(uri, data) {
- if (any(hook('posting', uri, data), haveStopped)) return
- var request = this.xhr()
- request.open('POST', uri, false)
- request.setRequestHeader('Content-Type', 'application/json')
- request.send(JSpec.JSON.encode(data))
- },
-
- /**
- * Instantiate an XMLHttpRequest.
- *
- * Here we utilize IE's lame ActiveXObjects first which
- * allow IE access serve files via the file: protocol, otherwise
- * we then default to XMLHttpRequest.
- *
- * @return {XMLHttpRequest, ActiveXObject}
- * @api private
- */
-
- xhr : function() {
- return this.ieXhr() || new JSpec.request
- },
-
- /**
- * Return Microsoft piece of crap ActiveXObject.
- *
- * @return {ActiveXObject}
- * @api public
- */
-
- ieXhr : function() {
- function object(str) {
- try { return new ActiveXObject(str) } catch(e) {}
- }
- return object('Msxml2.XMLHTTP.6.0') ||
- object('Msxml2.XMLHTTP.3.0') ||
- object('Msxml2.XMLHTTP') ||
- object('Microsoft.XMLHTTP')
- },
-
- /**
- * Check for HTTP request support.
- *
- * @return {bool}
- * @api private
- */
-
- hasXhr : function() {
- return JSpec.request || 'ActiveXObject' in main
- },
-
- /**
- * Try loading _file_ returning the contents
- * string or null. Chain to locate / read a file.
- *
- * @param {string} file
- * @return {string}
- * @api public
- */
-
- tryLoading : function(file) {
- try { return JSpec.load(file) } catch (e) {}
- },
-
- /**
- * Load a _file_'s contents.
- *
- * @param {string} file
- * @param {function} callback
- * @return {string}
- * @api public
- */
-
- load : function(file, callback) {
- if (any(hook('loading', file), haveStopped)) return
- if ('readFile' in main)
- return readFile(file)
- else if (this.hasXhr()) {
- var request = this.xhr()
- request.open('GET', file, false)
- request.send(null)
- if (request.readyState == 4 &&
- (request.status == 0 ||
- request.status.toString().charAt(0) == 2))
- return request.responseText
- }
- else
- error("failed to load `" + file + "'")
- },
-
- /**
- * Load, pre-process, and evaluate a file.
- *
- * @param {string} file
- * @param {JSpec}
- * @api public
- */
-
- exec : function(file) {
- if (any(hook('executing', file), haveStopped)) return this
- eval('with (JSpec){' + this.preprocess(this.load(file)) + '}')
- return this
- }
- }
-
- // --- Node.js support
-
- if (typeof GLOBAL === 'object' && typeof exports === 'object')
- quit = process.exit,
- print = require('sys').puts,
- readFile = require('fs').readFileSync
-
- // --- Utility functions
-
- var main = this,
- find = JSpec.any,
- utils = 'haveStopped stub hookImmutable hook destub map any last pass fail range each option inject select \
- error escape extend puts query strip color does addMatchers callIterator toArray equal'.split(/\s+/)
- while (utils.length) eval('var ' + utils[0] + ' = JSpec.' + utils.shift())
- if (!main.setTimeout) main.setTimeout = function(callback){ callback() }
-
- // --- Matchers
-
- addMatchers({
- equal : "===",
- eql : "equal(actual, expected)",
- be : "alias equal",
- be_greater_than : ">",
- be_less_than : "<",
- be_at_least : ">=",
- be_at_most : "<=",
- be_a : "actual.constructor == expected",
- be_an : "alias be_a",
- be_an_instance_of : "actual instanceof expected",
- be_null : "actual == null",
- be_true : "actual == true",
- be_false : "actual == false",
- be_undefined : "typeof actual == 'undefined'",
- be_type : "typeof actual == expected",
- match : "typeof actual == 'string' ? actual.match(expected) : false",
- respond_to : "typeof actual[expected] == 'function'",
- have_length : "actual.length == expected",
- be_within : "actual >= expected[0] && actual <= last(expected)",
- have_length_within : "actual.length >= expected[0] && actual.length <= last(expected)",
-
- receive : { defer : true, match : function(actual, method, times) {
- proxy = new JSpec.ProxyAssertion(actual, method, times, this.negate)
- JSpec.currentSpec.assertions.push(proxy)
- return proxy
- }},
-
- be_empty : function(actual) {
- if (actual.constructor == Object && actual.length == undefined)
- for (var key in actual)
- return false;
- return !actual.length
- },
-
- include : function(actual) {
- for (state = true, i = 1; i < arguments.length; i++) {
- arg = arguments[i]
- switch (actual.constructor) {
- case String:
- case Number:
- case RegExp:
- case Function:
- state = actual.toString().indexOf(arg) !== -1
- break
-
- case Object:
- state = arg in actual
- break
-
- case Array:
- state = any(actual, function(value){ return equal(value, arg) })
- break
- }
- if (!state) return false
- }
- return true
- },
-
- throw_error : { match : function(actual, expected, message) {
- try { actual() }
- catch (e) {
- this.e = e
- var assert = function(arg) {
- switch (arg.constructor) {
- case RegExp : return arg.test(e.message || e.toString())
- case String : return arg == (e.message || e.toString())
- case Function : return e instanceof arg || e.name == arg.name
- }
- }
- return message ? assert(expected) && assert(message) :
- expected ? assert(expected) :
- true
- }
- }, message : function(actual, expected, negate) {
- // TODO: refactor when actual is not in expected [0]
- var message_for = function(i) {
- if (expected[i] == undefined) return 'exception'
- switch (expected[i].constructor) {
- case RegExp : return 'exception matching ' + puts(expected[i])
- case String : return 'exception of ' + puts(expected[i])
- case Function : return expected[i].name || 'Error'
- }
- }
- exception = message_for(1) + (expected[2] ? ' and ' + message_for(2) : '')
- return 'expected ' + exception + (negate ? ' not ' : '' ) +
- ' to be thrown, but ' + (this.e ? 'got ' + puts(this.e) : 'nothing was')
- }},
-
- have : function(actual, length, property) {
- return actual[property].length == length
- },
-
- have_at_least : function(actual, length, property) {
- return actual[property].length >= length
- },
-
- have_at_most :function(actual, length, property) {
- return actual[property].length <= length
- },
-
- have_within : function(actual, range, property) {
- length = actual[property].length
- return length >= range.shift() && length <= range.pop()
- },
-
- have_prop : function(actual, property, value) {
- return actual[property] == null ||
- actual[property] instanceof Function ? false:
- value == null ? true:
- does(actual[property], 'eql', value)
- },
-
- have_property : function(actual, property, value) {
- return actual[property] == null ||
- actual[property] instanceof Function ? false:
- value == null ? true:
- value === actual[property]
- }
- })
-
-})()