Skip to content

Commit

Permalink
untested union implementation, test refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Afsin Ustundag committed Jun 24, 2015
1 parent 9a63ea2 commit dbb0d85
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 69 deletions.
49 changes: 49 additions & 0 deletions lib/jsonpath/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ var re4Integer = '-?(?:0|[1-9][0-9]*)';

var re = exports.re = {
identifier: new RegExp('^[a-zA-Z_\$]+[a-zA-Z0-9_]*'),
integer: new RegExp(re4Integer),
range: new RegExp(util.format('^(%s)(?:\\:(%s))?(?:\\:(%s))?', re4Integer, re4Integer, re4Integer)),
q_string: new RegExp('^\'(?:\\\\[\'bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\'\\\\])*\''),
qq_string: new RegExp('^\"(?:\\\\[\"bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\"\\\\])*\"')
Expand All @@ -26,6 +27,54 @@ var types = exports.types = {
}
};

var propertyUpdate = {
identifier: function (properties, reExecResult) {
properties.push(reExecResult[0]);
},
integer: function (properties, reExecResult) {
properties.push(reExecResult[0]);
},
q_string: function (properties, reExecResult) {
properties.push(reExecResult[1]);
},
qq_string: function (properties, reExecResult) {
properties.push(reExecResult[1]);
},
range: function (properties, reExecResult) {
var start = (reExecResult[1] && parseInt(reExecResult[1], 10)) || 0;
var end = (reExecResult[2] && parseInt(reExecResult[2], 10)) || null;
var step = (reExecResult[3] && parseInt(reExecResult[3], 10)) || 1;
properties.push({
start: start,
end: end,
step: step
});
}
};

var subscriptToProperties = function subscriptToProperties(subscript, properties) {
var reKeys = Object.keys(re);
var n = reKeys.length;
for (var i = 0; i < n; ++i) {
var key = reKeys[i];
var r = re[key];
var result = r.exec(subscript);
if (result) {
propertyUpdate[key](properties, result);
var nResult = result[0].length;
if (nResult === subscript.length) {
return true;
}
if (subscript[nResult] !== ',') {
throw new Error('Invalid character');
}
subscript = subscript.substring(nResult + 1);
return subscriptToProperties(subscript, properties);
}
}
return false;
};

var subscriptToNode = function (subscript) {
var n = subscript.length;
if (n === 0) {
Expand Down
95 changes: 26 additions & 69 deletions test/jsonpath/test-parser-re.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ describe('reqular expression', function () {
});
});

describe('range - index only', function () {
describe('integer', function () {
var expressions = [
'-1',
'0',
Expand All @@ -56,109 +56,66 @@ describe('reqular expression', function () {

expressions.forEach(function (expression) {
it(expression, function () {
var result = re.range.exec(expression);
expectSingleMatch(expression, result, 4);
expect(result[1]).to.equal(expression);
expect(result[2]).to.equal(undefined);
expect(result[3]).to.equal(undefined);
var result = re.integer.exec(expression);
expectSingleMatch(expression, result);
});

var withComma = expression + ',';
it(withComma, function () {
var result = re.range.exec(withComma);
expectSingleMatch(expression, result, 4);
expect(result[1]).to.equal(expression);
expect(result[2]).to.equal(undefined);
expect(result[3]).to.equal(undefined);
var result = re.integer.exec(withComma);
expectSingleMatch(expression, result);
});

var withCommaRepeat = expression + ',' + expression;
it(withCommaRepeat, function () {
var result = re.range.exec(withCommaRepeat);
expectSingleMatch(expression, result, 4);
expect(result[1]).to.equal(expression);
expect(result[2]).to.equal(undefined);
expect(result[3]).to.equal(undefined);
var result = re.integer.exec(withCommaRepeat);
expectSingleMatch(expression, result);
});
});
});

describe('range - start:end', function () {
describe('range', function () {
var expressions = [
'1:10',
'0:-4',
'2:5',
'9:11'
];

expressions.forEach(function (expression) {
it(expression, function () {
var result = re.range.exec(expression);
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':');
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(undefined);
});

var withComma = expression + ',';
it(withComma, function () {
var result = re.range.exec(withComma);
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':');
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(undefined);
});

var withCommaRepeat = expression + ',' + expression;
it(withCommaRepeat, function () {
var result = re.range.exec(withCommaRepeat);
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':');
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(undefined);
});
});
});

describe('range - start:step:end', function () {
var expressions = [
'9:11',
'1:1:10',
'0:2:-4',
'2:2:5',
'11:-2:0'
];

var expectRangeComponents = function (expression, result) {
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':').map(function (piece) {
if (piece === '') {
return undefined;
} else {
return piece;
}
});
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(actuals[2]);
};

expressions.forEach(function (expression) {
it(expression, function () {
var result = re.range.exec(expression);
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':');
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(actuals[2]);
expectRangeComponents(expression, result);
});

var withComma = expression + ',';
it(withComma, function () {
var result = re.range.exec(withComma);
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':');
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(actuals[2]);
expectRangeComponents(expression, result);
});

var withCommaRepeat = expression + ',' + expression;
it(withCommaRepeat, function () {
var result = re.range.exec(withCommaRepeat);
expectSingleMatch(expression, result, 4);
var actuals = expression.split(':');
expect(result[1]).to.equal(actuals[0]);
expect(result[2]).to.equal(actuals[1]);
expect(result[3]).to.equal(actuals[2]);
expectRangeComponents(expression, result);
});
});
});
Expand Down

0 comments on commit dbb0d85

Please sign in to comment.