@masala/parser
Version:
218 lines (141 loc) • 7.39 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _index = require('../../lib/stream/index');
var _index2 = _interopRequireDefault(_index);
var _charsBundle = require('../../lib/parsec/chars-bundle');
var _charsBundle2 = _interopRequireDefault(_charsBundle);
var _numbersBundle = require('../../lib/parsec/numbers-bundle');
var _numbersBundle2 = _interopRequireDefault(_numbersBundle);
var _stream = require('../../lib/stream');
var _stream2 = _interopRequireDefault(_stream);
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();
},
'endOfStream for empty stream': function endOfStreamForEmptyStream(test) {
var p = _charsBundle2.default.char(' ').optrep().thenRight(_numbersBundle2.default.number());
test.ok(_index2.default.ofParser(p, _index2.default.ofString('')).endOfStream(0), 'should be endOfStream.');
test.done();
},
'endOfStream for non empty stream': function endOfStreamForNonEmptyStream(test) {
var p = _charsBundle2.default.char(' ').optrep().thenRight(_numbersBundle2.default.number());
test.ok(_index2.default.ofParser(p, _index2.default.ofString('1')).endOfStream(1), 'should be endOfStream.');
test.done();
},
'no endOfStream for non empty stream': function noEndOfStreamForNonEmptyStream(test) {
var p = _charsBundle2.default.char(' ').optrep().thenRight(_numbersBundle2.default.number());
test.equal(_index2.default.ofParser(p, _index2.default.ofString('1')).endOfStream(0), false, 'should be endOfStream.');
test.done();
},
'get from stream': function getFromStream(test) {
var p = _charsBundle2.default.char(' ').optrep().thenRight(_numbersBundle2.default.number());
test.equal(_index2.default.ofParser(p, _index2.default.ofString('1')).get(0).isSuccess(), true, 'should be a success.');
test.done();
},
'do not get from empty stream': function doNotGetFromEmptyStream(test) {
var p = _charsBundle2.default.char(' ').optrep().thenRight(_numbersBundle2.default.number());
test.equal(_index2.default.ofParser(p, _index2.default.ofString('1')).get(1).isSuccess(), false, 'should be a failure.');
test.done();
},
'get from stream number 123': function getFromStreamNumber123(test) {
var p = _charsBundle2.default.char(' ').optrep().thenRight(_numbersBundle2.default.number()).single();
test.equal(_index2.default.ofParser(p, _index2.default.ofString('123')).get(0).success(), 123, 'should be a 123.');
test.done();
},
'Offset are found in series of numbers': function OffsetAreFoundInSeriesOfNumbers(test) {
var p = _numbersBundle2.default.number().then(_charsBundle2.default.char(' ').optrep().drop()).single();
var parserStream = _index2.default.ofParser(p, _index2.default.ofString('123 14137'));
// index: ^0 ^6
var first = parserStream.get(0).success(); //>> 123
test.equal(first, 123);
var second = parserStream.get(1).success(); //>> 114
test.equal(second, 14137);
test.deepEqual(parserStream.offsets, [0, 6, 11]);
// Offset after reading start (1) is related to index after 123 (3)
// Offset after reading at 6 (7) is related to index after '123 14137'(11)
test.done();
},
'failing series of numbers': function failingSeriesOfNumbers(test) {
var p = _numbersBundle2.default.number().then(_charsBundle2.default.char(' ').optrep().drop()).single();
var parserStream = _index2.default.ofParser(p, _index2.default.ofString('123 a'));
// index: ^0 ^6
var first = parserStream.get(0).success(); //>> 123
test.equal(first, 123);
test.deepEqual(parserStream.offsets, [0, 6]);
var second = parserStream.get(1); // try 'a'
test.ok(second.isFailure());
test.deepEqual(parserStream.offsets, [0, 6]);
test.done();
},
'having correct location when success': function havingCorrectLocationWhenSuccess(test) {
var p = _numbersBundle2.default.number().then(_charsBundle2.default.char(' ').optrep().drop()).single();
var parserStream = _index2.default.ofParser(p, _index2.default.ofString('123 14137'));
// index: ^0 ^6
var first = parserStream.get(0).success(); //>> 123
test.equal(first, 123);
test.equal(0, parserStream.location(0));
var second = parserStream.get(1).success(); //>> 114
test.equal(second, 14137);
test.equal(6, parserStream.location(1));
test.done();
},
'searching illegal location will fail': function searchingIllegalLocationWillFail(test) {
var p = _numbersBundle2.default.number().then(_charsBundle2.default.char(' ').optrep().drop()).single();
var parserStream = _index2.default.ofParser(p, _index2.default.ofString('123 14137'));
// index: ^0 ^6
var first = parserStream.get(0).success(); //>> 123
test.equal(first, 123);
var foundError = false;
try {
test.equal(0, parserStream.location(4));
} catch (e) {
foundError = true;
}
test.ok(foundError);
test.done();
},
'having correct location when fail': function havingCorrectLocationWhenFail(test) {
var p = _numbersBundle2.default.number();
var parserStream = _index2.default.ofParser(p, _index2.default.ofString('1234 14137'));
// index: ^0 ^4
var first = parserStream.get(0).success(); //>> 123
test.equal(first, 1234);
test.equal(0, parserStream.location(0));
parserStream.get(1); //>> fail
test.equal(4, parserStream.location(1));
test.done();
},
'unsafe_get can see next element': function unsafe_getCanSeeNextElement(test) {
var lower = _numbersBundle2.default.number().then(spaces().opt().drop()).single();
var lowerStream = _stream2.default.ofString('10 12 44');
var parserStream = _stream2.default.ofParser(lower, lowerStream);
parserStream.unsafeGet(0);
var value = parserStream.unsafeGet(1);
test.equal(12, value);
test.done();
},
'unsafe_get cannot see beyond next element': function unsafe_getCannotSeeBeyondNextElement(test) {
var lower = _numbersBundle2.default.number().then(spaces().opt().drop());
var lowerStream = _stream2.default.ofString('10 12 44');
var parserStream = _stream2.default.ofParser(lower, lowerStream);
var found = false;
try {
parserStream.unsafeGet(1);
} catch (e) {
found = true;
}
test.ok(found);
test.done();
}
};
function spaces() {
return _charsBundle2.default.charIn(' \r\n\f\t').optrep().map(function () {
return _unit2.default;
});
}
//# sourceMappingURL=parser_stream_test.js.map