1
0
Fork 0
arangodb/js/node/node_modules/buster-format/test/buster-format-test.js

381 lines
13 KiB
JavaScript

if (typeof module === "object" && typeof require === "function") {
var buster = {
assertions: require("buster-assertions"),
format: require("../lib/buster-format"),
util: require("buster-util")
};
}
(function () {
function F() {}
var create = Object.create || function (object) {
F.prototype = object;
return new F();
};
var assert = buster.assertions.assert;
var refute = buster.assertions.refute;
buster.util.testCase("AsciiFormatTest", {
"should format strings with quotes": function () {
assert.equals('"A string"', buster.format.ascii("A string"));
},
"should format booleans without quotes": function () {
assert.equals("true", buster.format.ascii(true));
assert.equals("false", buster.format.ascii(false));
},
"should format null and undefined without quotes": function () {
assert.equals("null", buster.format.ascii(null));
assert.equals("undefined", buster.format.ascii(undefined));
},
"should format numbers without quotes": function () {
assert.equals("3", buster.format.ascii(3));
assert.equals("3987.56", buster.format.ascii(3987.56));
assert.equals("-980", buster.format.ascii(-980.0));
assert.equals("NaN", buster.format.ascii(NaN));
assert.equals("Infinity", buster.format.ascii(Infinity));
assert.equals("-Infinity", buster.format.ascii(-Infinity));
},
"should format regexp using toString": function () {
assert.equals("/[a-zA-Z0-9]+\\.?/", buster.format.ascii(/[a-zA-Z0-9]+\.?/));
},
"should format functions with name": function () {
assert.equals("function doIt() {}", buster.format.ascii(function doIt() {}));
},
"should format functions without name": function () {
assert.equals("function () {}", buster.format.ascii(function () {}));
},
"should format functions with display name": function () {
function doIt() {}
doIt.displayName = "ohHai";
assert.equals("function ohHai() {}", buster.format.ascii(doIt));
},
"should shorten functions with long bodies": function () {
function doIt() {
var i;
function hey() {}
for (; i < 10; i++) {
}
}
assert.equals("function doIt() {}", buster.format.ascii(doIt));
},
"should format functions with no name or display name": function () {
function doIt() {}
doIt.name = "";
assert.equals("function doIt() {}", buster.format.ascii(doIt));
},
"should format arrays": function () {
function ohNo() { return "Oh yes!"; }
var array = ["String", 123, /a-z/, null];
var str = buster.format.ascii(array);
assert.equals('["String", 123, /a-z/, null]', str);
str = buster.format.ascii([ohNo, array]);
assert.equals('[function ohNo() {}, ["String", 123, /a-z/, null]]', str);
},
"should not trip on circular arrays": function () {
var array = ["String", 123, /a-z/];
array.push(array);
var str = buster.format.ascii(array);
assert.equals('["String", 123, /a-z/, [Circular]]', str);
},
"should format object": function () {
var object = {
id: 42,
hello: function () {},
prop: "Some",
more: "properties",
please: "Gimme some more",
"oh hi": 42,
seriously: "many properties"
};
var expected = "{\n hello: function () {},\n id: 42,\n " +
"more: \"properties\",\n \"oh hi\": 42,\n please: " +
"\"Gimme some more\",\n prop: \"Some\"," +
"\n seriously: \"many properties\"\n}";
assert.equals(expected, buster.format.ascii(object));
},
"should format short object on one line": function () {
var object = {
id: 42,
hello: function () {},
prop: "Some"
};
var expected = "{ hello: function () {}, id: 42, prop: \"Some\" }";
assert.equals(expected, buster.format.ascii(object));
},
"should format object with a non-function toString": function () {
var object = { toString: 42 };
assert.equals("{ toString: 42 }", buster.format.ascii(object));
},
"should format nested object": function () {
var object = {
id: 42,
hello: function () {},
prop: "Some",
obj: {
num: 23,
string: "Here you go you little mister"
}
};
var expected = "{\n hello: function () {},\n id: 42,\n obj" +
": { num: 23, string: \"Here you go you little mister\"" +
" },\n prop: \"Some\"\n}";
assert.equals(expected, buster.format.ascii(object));
},
"should include constructor if known and not Object": function () {
function Person(name) {
this.name = name;
}
var person = new Person("Christian");
assert.equals("[Person] { name: \"Christian\" }", buster.format.ascii(person));
},
"should not include one letter constructors": function () {
function F(name) {
this.name = name;
}
var person = new F("Christian");
assert.equals("{ name: \"Christian\" }", buster.format.ascii(person));
},
"should include one letter constructors when configured to do so": function () {
function C(name) {
this.name = name;
}
var person = new C("Christian");
var formatter = create(buster.format);
formatter.excludeConstructors = [];
assert.equals("[C] { name: \"Christian\" }", formatter.ascii(person));
},
"should exclude constructors when configured to do so": function () {
function Person(name) {
this.name = name;
}
var person = new Person("Christian");
var formatter = create(buster.format);
formatter.excludeConstructors = ["Person"];
assert.equals("{ name: \"Christian\" }", formatter.ascii(person));
},
"should exclude constructors by pattern when configured to do so": function () {
function Person(name) {
this.name = name;
}
function Ninja(name) {
this.name = name;
}
function Pervert(name) {
this.name = name;
}
var person = new Person("Christian");
var ninja = new Ninja("Haruhachi");
var pervert = new Pervert("Mr. Garrison");
var formatter = create(buster.format);
formatter.excludeConstructors = [/^Per/];
assert.equals("{ name: \"Christian\" }", formatter.ascii(person));
assert.equals("[Ninja] { name: \"Haruhachi\" }", formatter.ascii(ninja));
assert.equals("{ name: \"Mr. Garrison\" }", formatter.ascii(pervert));
},
"should exclude constructors when run on other objects": function () {
function Person(name) {
this.name = name;
}
var person = new Person("Christian");
var formatter = { ascii: buster.format.ascii };
formatter.excludeConstructors = ["Person"];
assert.equals("{ name: \"Christian\" }", formatter.ascii(person));
},
"should exclude default constructors when run on other objects": function () {
var person = { name: "Christian" };
var formatter = { ascii: buster.format.ascii };
assert.equals("{ name: \"Christian\" }", formatter.ascii(person));
},
"should not trip on circular formatting": function () {
var object = {};
object.foo = object;
assert.equals("{ foo: [Circular] }", buster.format.ascii(object));
},
"should not trip on indirect circular formatting": function () {
var object = { someProp: {} };
object.someProp.foo = object;
assert.equals("{ someProp: { foo: [Circular] } }", buster.format.ascii(object));
},
"should format nested array nicely": function () {
var object = { people: ["Chris", "August"] };
assert.equals("{ people: [\"Chris\", \"August\"] }",
buster.format.ascii(object));
},
"should not rely on object's hasOwnProperty": function () {
// Create object with no "own" properties to get past
// Object.keys test and no .hasOwnProperty() function
var Obj = function () {};
Obj.prototype = { hasOwnProperty: undefined };
var object = new Obj();
assert.equals("{ }", buster.format.ascii(object));
},
"handles cyclic structures": function () {
var obj = {};
obj.list1 = [obj];
obj.list2 = [obj];
obj.list3 = [{ prop: obj }];
refute.exception(function () {
buster.format.ascii(obj);
});
}
});
buster.util.testCase("UnquotedStringsTest", {
setUp: function () {
this.formatter = create(buster.format);
this.formatter.quoteStrings = false;
},
"should not quote strings": function () {
assert.equals("Hey there", this.formatter.ascii("Hey there"));
},
"should quote string properties": function () {
var obj = { hey: "Mister" };
assert.equals("{ hey: \"Mister\" }", this.formatter.ascii(obj));
}
});
if (typeof document != "undefined") {
buster.util.testCase("AsciiFormatDOMElementTest", {
"should format dom element": function () {
var element = document.createElement("div");
assert.equals("<div></div>", buster.format.ascii(element));
},
"should format dom element with attributes": function () {
var element = document.createElement("div");
element.className = "hey there";
element.id = "ohyeah";
var str = buster.format.ascii(element);
assert(str, /<div (.*)><\/div>/);
assert(str, /class="hey there"/);
assert(str, /id="ohyeah"/);
},
"should format dom element with content": function () {
var element = document.createElement("div");
element.innerHTML = "Oh hi!";
assert.equals("<div>Oh hi!</div>",
buster.format.ascii(element));
},
"should truncate dom element content": function () {
var element = document.createElement("div");
element.innerHTML = "Oh hi! I'm Christian, and this is a lot of content";
assert.equals("<div>Oh hi! I'm Christian[...]</div>",
buster.format.ascii(element));
},
"should include attributes and truncated content": function () {
var element = document.createElement("div");
element.id = "anid";
element.lang = "en"
element.innerHTML = "Oh hi! I'm Christian, and this is a lot of content";
var str = buster.format.ascii(element);
assert(str, /<div (.*)>Oh hi! I'm Christian\[\.\.\.\]<\/div>/);
assert(str, /lang="en"/);
assert(str, /id="anid"/);
},
"should format document object as toString": function () {
var str;
buster.assertions.refute.exception(function () {
str = buster.format.ascii(document);
});
assert.equals("[object HTMLDocument]", str);
},
"should format window object as toString": function () {
var str;
buster.assertions.refute.exception(function () {
str = buster.format.ascii(window);
});
assert.equals("[object Window]", str);
}
});
}
if (typeof global != "undefined") {
buster.util.testCase("AsciiFormatGlobalTest", {
"should format global object as toString": function () {
var str;
buster.assertions.refute.exception(function () {
str = buster.format.ascii(global);
});
assert.equals("[object global]", str);
}
});
}
}());