blob: 2a215da826a788cf266f7cbe32e034304038ef7f [file] [log] [blame]
var assert = require("assert"),
fs = require("fs"),
traverse = require("traverse")
select = require("../index");
var people = {
"george": {
age : 35,
movies: [{
name: "Repo Man",
stars: 5
}]
},
"mary": {
age: 15,
movies: [{
name: "Twilight",
stars: 3
},
{
name: "Trudy",
stars: 2
},
{
name: "The Fighter",
stars: 4
}]
},
"chris" : {
car: null,
male: true
}
};
var people2, obj;
assert.deepEqual(select(people, "*").nodes(), [{"george":{"age":35,"movies":[{"name":"Repo Man","stars":5}]},"mary":{"age":15,"movies":[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]},"chris":{"car":null,"male":true}},{"age":35,"movies":[{"name":"Repo Man","stars":5}]},35,[{"name":"Repo Man","stars":5}],{"name":"Repo Man","stars":5},"Repo Man",5,{"age":15,"movies":[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]},15,[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}],{"name":"Twilight","stars":3},"Twilight",3,{"name":"Trudy","stars":2},"Trudy",2,{"name":"The Fighter","stars":4},"The Fighter",4,{"car":null,"male":true},null,true]);
assert.deepEqual(select(people, ".george").nodes(), [{"age":35,"movies":[{"name":"Repo Man","stars":5}]}]);
assert.deepEqual(select(people, ".george .age").nodes(), [35]);
assert.deepEqual(select(people, ".george .name").nodes(), ["Repo Man"]);
assert.deepEqual(select(people, ".george *").nodes(), [35,[{"name":"Repo Man","stars":5}],{"name":"Repo Man","stars":5},"Repo Man",5])
assert.deepEqual(select(people, ".george > *").nodes(), [35,[{"name":"Repo Man","stars":5}]]);
assert.deepEqual(select(people, ".george > .name").nodes(), []);
assert.deepEqual(select(people, ":first-child").nodes(), [{"name":"Repo Man","stars":5},{"name":"Twilight","stars":3}]);
assert.deepEqual(select(people, ":nth-child(1)").nodes(), select(people, ":first-child").nodes());
assert.deepEqual(select(people, ":nth-child(2)").nodes(), [{"name":"Trudy","stars":2}]);
assert.deepEqual(select(people, ":nth-child(odd)").nodes(), [{"name":"Repo Man","stars":5},{"name":"Twilight","stars":3},{"name":"The Fighter","stars":4}]);
assert.deepEqual(select(people, ":nth-child(even)").nodes(), [{"name":"Trudy","stars":2}]);
assert.deepEqual(select(people, ":nth-child(-n+1)").nodes(), select(people, ":first-child").nodes());
assert.deepEqual(select(people, ":nth-child(-n+2)").nodes(), [{"name":"Repo Man","stars":5},{"name":"Twilight","stars":3},{"name":"Trudy","stars":2}]);
assert.deepEqual(select(people, ":nth-child(n)").nodes(), [{"name":"Repo Man","stars":5},{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]);
assert.deepEqual(select(people, ":nth-child(n-1)").nodes(), select(people, ":nth-child(n)").nodes());
assert.deepEqual(select(people, ":nth-child(n-2)").nodes(), [{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]);
assert.deepEqual(select(people, ":last-child").nodes(), [{"name":"Repo Man","stars":5},{"name":"The Fighter","stars":4}]);
assert.deepEqual(select(people, ":nth-last-child(1)").nodes(), select(people, ":last-child").nodes());
assert.deepEqual(select(people, ":nth-last-child(2)").nodes(), [{"name":"Trudy","stars":2}]);
assert.deepEqual(select(people, ":only-child").nodes(), [{"name":"Repo Man","stars":5}]);
assert.deepEqual(select(people, ":root").nodes(),[{"george":{"age":35,"movies":[{"name":"Repo Man","stars":5}]},"mary":{"age":15,"movies":[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]},"chris":{"car":null,"male":true}}])
assert.deepEqual(select(people, "string").nodes(),["Repo Man","Twilight","Trudy","The Fighter"]);
assert.deepEqual(select(people, "number").nodes(),[35,5,15,3,2,4]);
assert.deepEqual(select(people, "boolean").nodes(),[true]);
assert.deepEqual(select(people, "object").nodes(),[{"george":{"age":35,"movies":[{"name":"Repo Man","stars":5}]},"mary":{"age":15,"movies":[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]},"chris":{"car":null,"male":true}},{"age":35,"movies":[{"name":"Repo Man","stars":5}]},{"name":"Repo Man","stars":5},{"age":15,"movies":[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]},{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4},{"car":null,"male":true}]);
assert.deepEqual(select(people, "array").nodes(),[[{"name":"Repo Man","stars":5}],[{"name":"Twilight","stars":3},{"name":"Trudy","stars":2},{"name":"The Fighter","stars":4}]]);
assert.deepEqual(select(people, "null").nodes(),[null]);
assert.deepEqual(select(people, "number, string, boolean").nodes(), [35,"Repo Man",5,15,"Twilight",3,"Trudy",2,"The Fighter",4,true])
assert.deepEqual(select(people, ":has(.car) > .male").nodes(), [true]);
assert.deepEqual(select(people, ".male ~ .car").nodes(), [null])
assert.deepEqual(select(people, ':val("Twilight")').nodes(), ["Twilight"])
assert.deepEqual(select(people, ':val("Twi")').nodes(), [])
assert.deepEqual(select(people, ':contains("Twi")').nodes(), ["Twilight"])
assert.deepEqual(select(people, ':contains("weif")').nodes(), [])
// invalid
assert.deepEqual(select(people, ".hmmm").nodes(), []);
assert.throws(function() {
select(people, "afcjwiojwe9q28*C@!(# (!#R($R)))").nodes();
});
// update()
people2 = traverse.clone(people);
select(people2, ".age").update(function(age) {
return age - 5;
})
assert.deepEqual(select(people2, ".age").nodes(), [30, 10]);
obj = select(people2, ".age").update(3)
assert.deepEqual(select(people2, ".age").nodes(), [3, 3]);
assert.deepEqual(obj, people2);
// remove()
people2 = traverse.clone(people);
obj = select(people2, ".age").remove();
assert.deepEqual(select(people2, ".age").nodes(), []);
assert.deepEqual(obj, people2);
// condense()
people2 = traverse.clone(people);
select(people2, ".george").condense();
assert.deepEqual(people2, {"george": {age: 35, movies: [{name: "Repo Man", stars: 5}]}});
people2 = traverse.clone(people);
select(people2, ".hmmm").condense();
assert.deepEqual(people2, {});
people2 = traverse.clone(people);
obj = select(people2, ".stars").condense();
assert.deepEqual(people2, {"george": {movies: [{stars: 5}]}, "mary": {movies: [{stars: 3},{stars: 2},{stars: 4}]}});
assert.deepEqual(obj, people2);
// forEach()
people2 = traverse.clone(people);
obj = select(people2, ".age").forEach(function(age) {
this.update(age - 5);
})
assert.deepEqual(select(people2, ".age").nodes(), [30, 10]);
assert.deepEqual(obj, people2);
// this.matches()
people2 = traverse.clone(people);
select(people2).forEach(function(node) {
if (this.matches(".age")) {
this.update(node + 10);
}
});
assert.deepEqual(select(people2, ".age").nodes(), [45, 25])
// bigger stuff
var timeline = require("./timeline.js");
console.time("select time");
assert.equal(select(timeline, ".bug .id").nodes().length, 126);
assert.equal(select(timeline, ".id").nodes().length, 141);
assert.equal(select(timeline, ".comments .id").nodes().length, 115);
assert.equal(select(timeline, ":nth-child(n-2)").nodes().length, 335);
assert.equal(select(timeline, "object").nodes().length, 927);
assert.equal(select(timeline, "*").nodes().length, 3281);
console.timeEnd("select time")
var sel = require("JSONSelect");
console.time("JSONSelect time")
assert.equal(sel.match(".bug .id", timeline).length, 126);
assert.equal(sel.match(".id", timeline).length, 141);
assert.equal(sel.match(".comments .id", timeline).length, 115);
assert.equal(sel.match(":nth-child(n-2)", timeline).length, 335);
assert.equal(sel.match("object", timeline).length, 927);
assert.equal(sel.match("*", timeline).length, 3281);
console.timeEnd("JSONSelect time")