From 46cd3d438e725e80c4bdb86fd7813183824d2289 Mon Sep 17 00:00:00 2001 From: Brett Zamir <brettz9@yahoo.com> Date: Tue, 9 Dec 2014 18:35:48 -0700 Subject: [PATCH] Update tests and docs to use new class-based API with object arguments (clearer for readers of code) --- README.md | 6 +- test/test.arr.js | 10 +-- test/test.at_and_dollar.js | 32 ++++---- test/test.eval.js | 16 ++-- test/test.examples.js | 138 +++++++++++++++++------------------ test/test.html | 55 ++++++++------ test/test.intermixed.arr.js | 6 +- test/test.parent-selector.js | 22 +++--- 8 files changed, 146 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index 5b8c779..8186602 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ Usage In node.js: ```js -var jsonPath = require('JSONPath'); -jsonPath.eval(obj, path); +var JSONPath = require('JSONPath'); +JSONPath({json: obj, path: path}); ``` For browser usage you can directly include `lib/jsonpath.js`, no browserify @@ -24,7 +24,7 @@ magic necessary: ```html <script src="lib/jsonpath.js"></script> <script> - jsonPath.eval(obj, path); + JSONPath({json: obj, path: path}); </script> ``` diff --git a/test/test.arr.js b/test/test.arr.js index 4314fd2..d206071 100644 --- a/test/test.arr.js +++ b/test/test.arr.js @@ -1,4 +1,4 @@ -var jsonpath = require("../").eval, +var JSONPath = require('../'), testCase = require('nodeunit').testCase var json = { @@ -19,16 +19,16 @@ var json = { }; module.exports = testCase({ - "get single": function (test) { + 'get single': function (test) { var expected = json.store.book; - var result = jsonpath(json, "store.book", {flatten: true, wrap: false}); + var result = JSONPath({json: json, path: 'store.book', flatten: true, wrap: false}); test.deepEqual(expected, result); test.done(); }, - "get arr": function (test) { + 'get arr': function (test) { var expected = json.store.books; - var result = jsonpath(json, "store.books", {flatten: true, wrap: false}); + var result = JSONPath({json: json, path: 'store.books', flatten: true, wrap: false}); test.deepEqual(expected, result); test.done(); } diff --git a/test/test.at_and_dollar.js b/test/test.at_and_dollar.js index e99d7db..9c0eb42 100644 --- a/test/test.at_and_dollar.js +++ b/test/test.at_and_dollar.js @@ -1,5 +1,5 @@ -var jsonpath = require("../").eval - , testCase = require('nodeunit').testCase +var JSONPath = require('../'), + testCase = require('nodeunit').testCase var t1 = { @@ -22,29 +22,29 @@ module.exports = testCase({ // ============================================================================ - "test undefined, null": function(test) { + 'test undefined, null': function(test) { // ============================================================================ test.expect(5); - test.equal(undefined, jsonpath(undefined, "foo")); - test.equal(null, jsonpath(null, "foo")); - test.equal(undefined, jsonpath({}, "foo")[0]); - test.equal(undefined, jsonpath({ a: "b" }, "foo")[0]); - test.equal(undefined, jsonpath({ a: "b" }, "foo")[100]); + test.equal(undefined, JSONPath({json: undefined, path: 'foo'})); + test.equal(null, JSONPath({json: null, path: 'foo'})); + test.equal(undefined, JSONPath({json: {}, path: 'foo'})[0]); + test.equal(undefined, JSONPath({json: { a: 'b' }, path: 'foo'})[0]); + test.equal(undefined, JSONPath({json: { a: 'b' }, path: 'foo'})[100]); test.done(); }, // ============================================================================ - "test $ and @": function(test) { + 'test $ and @': function(test) { // ============================================================================ test.expect(7); - test.equal(t1["$"], jsonpath(t1, "\$")[0]); - test.equal(t1["$"], jsonpath(t1, "$")[0]); - test.equal(t1["a$a"], jsonpath(t1, "a$a")[0]); - test.equal(t1["@"], jsonpath(t1, "\@")[0]); - test.equal(t1["@"], jsonpath(t1, "@")[0]); - test.equal(t1["$"]["@"], jsonpath(t1, "$.$.@")[0]); - test.equal(undefined, jsonpath(t1, "\@")[1]); + test.equal(t1['$'], JSONPath({json: t1, path: '\$'})[0]); + test.equal(t1['$'], JSONPath({json: t1, path: '$'})[0]); + test.equal(t1['a$a'], JSONPath({json: t1, path: 'a$a'})[0]); + test.equal(t1['@'], JSONPath({json: t1, path: '\@'})[0]); + test.equal(t1['@'], JSONPath({json: t1, path: '@'})[0]); + test.equal(t1['$']['@'], JSONPath({json: t1, path: '$.$.@'})[0]); + test.equal(undefined, JSONPath({json: t1, path: '\@'})[1]); test.done(); } diff --git a/test/test.eval.js b/test/test.eval.js index 8da68e9..98b3459 100644 --- a/test/test.eval.js +++ b/test/test.eval.js @@ -1,4 +1,4 @@ -var jsonpath = require("../").eval, +var JSONPath = require('../'), testCase = require('nodeunit').testCase var json = { @@ -26,19 +26,19 @@ var json = { module.exports = testCase({ - "multi statement eval": function (test) { + 'multi statement eval': function (test) { var expected = json.store.books[0]; - var selector = "$..[?(" - + "var sum = @.price && @.price[0]+@.price[1];" - + "sum > 20;)]" - var result = jsonpath(json, selector, {wrap: false}); + var selector = '$..[?(' + + 'var sum = @.price && @.price[0]+@.price[1];' + + 'sum > 20;)]' + var result = JSONPath({json: json, path: selector, wrap: false}); test.deepEqual(expected, result); test.done(); }, - "accessing current path": function (test) { + 'accessing current path': function (test) { var expected = json.store.books[1]; - var result = jsonpath(json, "$..[?(@path==\"$['store']['books'][1]\")]", {wrap: false}); + var result = JSONPath({json: json, path: "$..[?(@path==\"$['store']['books'][1]\")]", wrap: false}); test.deepEqual(expected, result); test.done(); } diff --git a/test/test.examples.js b/test/test.examples.js index 0532725..a28e3bb 100644 --- a/test/test.examples.js +++ b/test/test.examples.js @@ -1,10 +1,10 @@ -var jsonpath = require("../").eval - , testCase = require('nodeunit').testCase +var JSONPath = require('../'), + testCase = require('nodeunit').testCase // tests based on examples at http://goessner.net/articles/JsonPath/ var json = {"store": { - "book": [ + "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", @@ -37,123 +37,123 @@ var json = {"store": { module.exports = testCase({ - - // ============================================================================ - "wildcards": function(test) { - // ============================================================================ + + // ============================================================================ + 'wildcards': function(test) { + // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[0].author, books[1].author, books[2].author, books[3].author]; - var result = jsonpath(json, "$.store.book[*].author"); + var result = JSONPath({json: json, path: '$.store.book[*].author'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "all properties, entire tree": function(test) { - // ============================================================================ + + // ============================================================================ + 'all properties, entire tree': function(test) { + // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[0].author, books[1].author, books[2].author, books[3].author]; - var result = jsonpath(json, "$..author"); + var result = JSONPath({json: json, path: '$..author'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "all sub properties, single level": function(test) { - // ============================================================================ + + // ============================================================================ + 'all sub properties, single level': function(test) { + // ============================================================================ test.expect(1); var expected = [json.store.book, json.store.bicycle]; - var result = jsonpath(json, "$.store.*"); + var result = JSONPath({json: json, path: '$.store.*'}); test.deepEqual(expected, result); - + test.done(); }, - // ============================================================================ - "all sub properties, entire tree": function(test) { - // ============================================================================ + // ============================================================================ + 'all sub properties, entire tree': function(test) { + // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[0].price, books[1].price, books[2].price, books[3].price, json.store.bicycle.price]; - var result = jsonpath(json, "$.store..price"); + var result = JSONPath({json: json, path: '$.store..price'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "n property of entire tree": function(test) { - // ============================================================================ + + // ============================================================================ + 'n property of entire tree': function(test) { + // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[2]]; - var result = jsonpath(json, "$..book[2]"); + var result = JSONPath({json: json, path: '$..book[2]'}); test.deepEqual(expected, result); - + test.done(); }, - // ============================================================================ - "last property of entire tree": function(test) { - // ============================================================================ + // ============================================================================ + 'last property of entire tree': function(test) { + // ============================================================================ test.expect(2); var books = json.store.book; var expected = [books[3]]; - var result = jsonpath(json, "$..book[(@.length-1)]"); + var result = JSONPath({json: json, path: '$..book[(@.length-1)]'}); test.deepEqual(expected, result); - - result = jsonpath(json, "$..book[-1:]"); + + result = JSONPath({json: json, path: '$..book[-1:]'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "range of property of entire tree": function(test) { - // ============================================================================ + + // ============================================================================ + 'range of property of entire tree': function(test) { + // ============================================================================ test.expect(2); var books = json.store.book; var expected = [books[0], books[1]]; - var result = jsonpath(json, "$..book[0,1]"); + var result = JSONPath({json: json, path: '$..book[0,1]'}); test.deepEqual(expected, result); - - result = jsonpath(json, "$..book[:2]"); + + result = JSONPath({json: json, path: '$..book[:2]'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "filter all properties if sub property exists,o entire tree": function(test) { - // ============================================================================ + + // ============================================================================ + 'filter all properties if sub property exists, of entire tree': function(test) { + // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[2], books[3]]; - var result = jsonpath(json, "$..book[?(@.isbn)]"); + var result = JSONPath({json: json, path: '$..book[?(@.isbn)]'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "filter all properties if sub property greater than of entire tree": function(test) { - // ============================================================================ + + // ============================================================================ + 'filter all properties if sub property greater than of entire tree': function(test) { + // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[0], books[2]]; - var result = jsonpath(json, "$..book[?(@.price<10)]"); + var result = JSONPath({json: json, path: '$..book[?(@.price<10)]'}); test.deepEqual(expected, result); - + test.done(); }, - - // ============================================================================ - "all properties of a json structure": function(test) { - // ============================================================================ + + // ============================================================================ + 'all properties of a JSON structure': function(test) { + // ============================================================================ // test.expect(1); var expected = [ json.store, @@ -165,13 +165,13 @@ module.exports = testCase({ expected.push(json.store.bicycle.color); expected.push(json.store.bicycle.price); - var result = jsonpath(json, "$..*"); + var result = JSONPath({json: json, path: '$..*'}); test.deepEqual(expected, result); - + test.done(); } - - - - + + + + }); diff --git a/test/test.html b/test/test.html index f908920..505fd4f 100644 --- a/test/test.html +++ b/test/test.html @@ -7,54 +7,61 @@ <script src="../node_modules/nodeunit/dist/browser/nodeunit.js"></script> <script src="../lib/jsonpath.js"></script> <script> + /*jslint nomen: true, white: true, browser:true, plusplus: true, evil:true*/ + /*global nodeunit, JSONPath, ActiveXObject*/ // helper to get all the test cases + 'use strict'; var suites = [], _testCase = nodeunit.testCase; nodeunit.testCase = function(tc) { - suites.push(tc); return _testCase(tc) }; + suites.push(tc); + return _testCase(tc); + }; // stubs to load nodejs tests function require(path) { - if (path === 'nodeunit') return nodeunit; - if (path.match(/^\.\.\/?$/)) return jsonPath; + if (path === 'nodeunit') {return nodeunit;} + if (path.match(/^\.\.\/?$/)) {return JSONPath;} } var module = {exports: {}}; - </script> - <script> + + // synchronous load function for JS code, uses XMLHttpRequest abstraction from // http://www.quirksmode.org/js/xmlhttp.html // Since the tests are written in node.js style we need to wrap their code into // a function, otherwise they would pollute the global NS and interfere with each // other function get(url, callback) { - function sendRequest(url,callback) { - var req = createXMLHTTPObject(); - req.open("GET",url,false/*sync*/); - req.onreadystatechange = function () { req.readyState == 4 && callback(req); } - if (req.readyState != 4) req.send(); - }; function createXMLHTTPObject() { - var XMLHttpFactories = [ - function () {return new XMLHttpRequest()}, - function () {return new ActiveXObject("Msxml2.XMLHTTP")}, - function () {return new ActiveXObject("Msxml3.XMLHTTP")}, - function () {return new ActiveXObject("Microsoft.XMLHTTP")}]; - for (var i=0;i<XMLHttpFactories.length;i++) - try { return XMLHttpFactories[i](); } catch (e) { } + var i, XMLHttpFactories = [ + function () {return new XMLHttpRequest();}, + function () {return new ActiveXObject('Msxml2.XMLHTTP');}, + function () {return new ActiveXObject('Msxml3.XMLHTTP');}, + function () {return new ActiveXObject('Microsoft.XMLHTTP');}]; + for (i = 0; i < XMLHttpFactories.length; i++) { + try {return XMLHttpFactories[i]();} + catch (ignore) {} + } return false; } + function sendRequest(url,callback) { + var req = createXMLHTTPObject(); + req.open('GET', url, false /*sync*/); + req.onreadystatechange = function () { if (req.readyState === 4) { callback(req); } }; + if (req.readyState !== 4) {req.send();} + } sendRequest(url, callback); } - function loadJS(url) { get(url, function(req) { new Function(req.responseText)(); })} + function loadJS(url) { get(url, function(req) { new Function(req.responseText)(); });} </script> </head> <body> <h1 id="nodeunit-header">JSONPath Tests</h1> <script> loadJS('test.arr.js'); - loadJS("test.at_and_dollar.js"); - loadJS("test.eval.js"); - loadJS("test.examples.js"); - loadJS("test.intermixed.arr.js"); - loadJS("test.parent-selector.js"); + loadJS('test.at_and_dollar.js'); + loadJS('test.eval.js'); + loadJS('test.examples.js'); + loadJS('test.intermixed.arr.js'); + loadJS('test.parent-selector.js'); nodeunit.run(suites); </script> </body> diff --git a/test/test.intermixed.arr.js b/test/test.intermixed.arr.js index 1cf622d..7a9eaa0 100644 --- a/test/test.intermixed.arr.js +++ b/test/test.intermixed.arr.js @@ -1,4 +1,4 @@ -var jsonpath = require("../").eval, +var JSONPath = require('../'), testCase = require('nodeunit').testCase // tests based on examples at http://goessner.net/articles/JsonPath/ @@ -39,13 +39,13 @@ var json = {"store":{ module.exports = testCase({ // ============================================================================ - "all sub properties, entire tree":function (test) { + 'all sub properties, entire tree': function (test) { // ============================================================================ test.expect(1); var books = json.store.book; var expected = [books[1].price, books[2].price, books[3].price, json.store.bicycle.price]; expected = books[0].price.concat(expected); - var result = jsonpath(json, "$.store..price", {flatten: true}); + var result = JSONPath({json: json, path: '$.store..price', flatten: true}); test.deepEqual(expected, result); test.done(); diff --git a/test/test.parent-selector.js b/test/test.parent-selector.js index 678c9e3..6f9c422 100644 --- a/test/test.parent-selector.js +++ b/test/test.parent-selector.js @@ -1,4 +1,4 @@ -var jsonpath = require("../").eval, +var JSONPath = require('../'), testCase = require('nodeunit').testCase var json = { @@ -14,49 +14,49 @@ var json = { module.exports = testCase({ // ============================================================================ - "simple parent selection": function(test) { + 'simple parent selection': function(test) { // ============================================================================ test.expect(1); - var result = jsonpath(json, "$.children[0]^", {flatten: true}); + var result = JSONPath({json: json, path: '$.children[0]^', flatten: true}); test.deepEqual(json.children, result); test.done(); }, // ============================================================================ - "parent selection with multiple matches": function(test) { + 'parent selection with multiple matches': function(test) { // ============================================================================ test.expect(1); var expected = [json.children,json.children]; - var result = jsonpath(json, "$.children[1:3]^"); + var result = JSONPath({json: json, path: '$.children[1:3]^'}); test.deepEqual(expected, result); test.done(); }, // ============================================================================ - "select sibling via parent": function(test) { + 'select sibling via parent': function(test) { // ============================================================================ test.expect(1); var expected = [{"name": "child3_2"}]; - var result = jsonpath(json, "$..[?(@.name && @.name.match(/3_1$/))]^[?(@.name.match(/_2$/))]"); + var result = JSONPath({json: json, path: '$..[?(@.name && @.name.match(/3_1$/))]^[?(@.name.match(/_2$/))]'}); test.deepEqual(expected, result); test.done(); }, // ============================================================================ - "parent parent parent": function(test) { + 'parent parent parent': function(test) { // ============================================================================ test.expect(1); var expected = json.children[0].children; - var result = jsonpath(json, "$..[?(@.name && @.name.match(/1_1$/))].name^^", {flatten: true}); + var result = JSONPath({json: json, path: '$..[?(@.name && @.name.match(/1_1$/))].name^^', flatten: true}); test.deepEqual(expected, result); test.done(); }, // ============================================================================ - "no such parent": function(test) { + 'no such parent': function(test) { // ============================================================================ test.expect(1); - var result = jsonpath(json, "name^^"); + var result = JSONPath({json: json, path: 'name^^'}); test.deepEqual([], result); test.done(); } -- GitLab