@masala/parser
Version:
172 lines (120 loc) • 5.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _index = require('../../lib/stream/index');
var _index2 = _interopRequireDefault(_index);
var _index3 = require('../../lib/parsec/index');
var _unit = require('../../lib/data/unit');
var _unit2 = _interopRequireDefault(_unit);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = {
setUp: function setUp(done) {
done();
},
'expect (chain) to be accepted': function expectChainToBeAccepted(test) {
var lower = _index3.C.char('x');
var upper = _index3.F.satisfy(function (val) {
return val === 'x';
});
var parser = lower.chain(upper);
var response = parser.parse(_index2.default.ofString('x'));
test.ok(response.isAccepted(), 'Should be accepted');
test.done();
},
'expect (chain) to be rejected': function expectChainToBeRejected(test) {
var lower = _index3.C.char('x');
var upper = _index3.F.satisfy(function (val) {
return val === 'y';
});
var parser = lower.chain(upper);
var response = parser.parse(_index2.default.ofString('x'));
test.ok(!response.isAccepted(), 'Should be rejected');
test.done();
},
'expect (chain) to be accepted and offset to have move': function expectChainToBeAcceptedAndOffsetToHaveMove(test) {
var lower = _index3.C.char('x');
// satisfy makes the stuff move only if accepted
var upper = _index3.F.satisfy(function (val) {
return val === 'x';
});
var parser = lower.chain(upper);
var response = parser.parse(_index2.default.ofString('x'));
test.ok(response.offset === 1, 'Should have moved');
test.done();
},
'expect (chain) to be accepted and offset to have move more': function expectChainToBeAcceptedAndOffsetToHaveMoveMore(test) {
var lower = _index3.C.string('xyz');
// satisfy makes the stuff move only if accepted
var upper = _index3.F.satisfy(function (val) {
return val === 'xyz';
});
var parser = lower.chain(upper.then(upper));
var response = parser.parse(_index2.default.ofString('xyzxyz'));
test.equal(response.offset, 2, 'Should have moved more');
test.done();
},
'expect (chain) to be find back the source offset': function expectChainToBeFindBackTheSourceOffset(test) {
var lower = _index3.C.string('xyz');
// satisfy makes the stuff move only if accepted
var upper = _index3.F.satisfy(function (val) {
return val === 'xyz';
});
var parser = lower.chain(upper.then(upper));
var response = parser.parse(_index2.default.ofString('xyzxyz'));
test.equal(response.input.source.offsets[response.offset], 6, 'Should have find stringStream offset');
test.done();
},
'expect (chain) to be accepted again': function expectChainToBeAcceptedAgain(test) {
test.expect(1);
var p1 = _index3.N.number().thenLeft(_index3.C.char(' ').opt()),
p2 = _index3.F.any().then(_index3.F.any()).thenLeft(_index3.F.eos()).map(function (r) {
return r[0] + r[1];
});
test.equal(p1.chain(p2).parse(_index2.default.ofString('12 34'), 0).isAccepted(), true, 'should be accepted.');
test.done();
},
'expect (chain) to return 46': function expectChainToReturn46(test) {
test.expect(1);
// tests here
var p1 = _index3.N.number().thenLeft(_index3.C.char(' ').opt()),
p2 = _index3.F.any().then(_index3.F.any()).thenLeft(_index3.F.eos()).array().map(function (r) {
return r[0] + r[1];
});
test.equal(p1.chain(p2).parse(_index2.default.ofString('12 34'), 0).value, 46);
test.done();
},
'expect (chain) to add multiple numbers ': function expectChainToAddMultipleNumbers(test) {
var token = _index3.N.number().then(spaces().opt().drop()).single();
var lex = _index3.F.satisfy(function (number) {
return number > 0;
}).rep().map(function (values) {
return values.array().reduce(function (acc, n) {
return acc + n;
}, 0);
});
var parsing = token.chain(lex).parse(_index2.default.ofString('10 12 44'), 0);
test.ok(parsing.isEos(), 'should have been consumed');
test.equal(parsing.value, 66);
test.done();
},
'expect (chain) to be not satisfied by upper level ': function expectChainToBeNotSatisfiedByUpperLevel(test) {
var token = _index3.N.number().then(spaces().opt().drop());
var lex = _index3.F.satisfy(function (number) {
return number > 0;
}).rep().map(function (values) {
return values.array().reduce(function (acc, n) {
return acc + n;
}, 0);
});
var parsing = token.chain(lex).parse(_index2.default.ofString('10 -12 44'), 0);
test.ok(!parsing.isEos(), 'should have been consumed');
test.done();
}
};
function spaces() {
return _index3.C.charIn(' \r\n\f\t').optrep().map(function () {
return _unit2.default;
});
}
//# sourceMappingURL=parser_chain_test.js.map