UNPKG

@masala/parser

Version:
289 lines (211 loc) 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _parsec = require("../../lib/parsec"); var _genlex = require("../../lib/genlex/genlex"); var _stream = require("../../lib/stream"); var _stream2 = _interopRequireDefault(_stream); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = { setUp: function setUp(done) { done(); }, 'genlex find offsets when success': function genlexFindOffsetsWhenSuccess(test) { var genlex = new _genlex.GenLex(); var plus = genlex.tokenize('+'); var minus = genlex.tokenize('-'); var grammar = plus.or(minus).rep().thenEos(); var parser = genlex.use(grammar); var text = '+ + - --'; var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isEos(), 'input is consumed'); test.equal(5, parsing.offset, 'there are 5 keywords'); test.equal(8, parsing.input.location(parsing.offset), 'there are 8 chars'); test.done(); }, 'genlex find offsets when fail': function genlexFindOffsetsWhenFail(test) { var genlex = new _genlex.GenLex(); var plus = genlex.tokenize('+'); var minus = genlex.tokenize('-'); var grammar = plus.or(minus).rep().thenEos(); var parser = genlex.use(grammar); var text = '+ + +* --'; // 0 1 23 var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(!parsing.isEos(), 'an error should have occurred'); test.equal(3, parsing.getOffset(), 'Failed at the third token'); test.equal(7, parsing.location(), 'fail is not 3: it must be the char offset before the error'); test.done(); }, 'expect Genlex to be constructed with spaces ': function expectGenlexToBeConstructedWithSpaces(test) { var genlex = new _genlex.GenLex(); test.ok(genlex.spaces !== undefined); test.ok(genlex.definitions.length === 0); test.done(); }, 'expect tokenize() to add on definition': function expectTokenizeToAddOnDefinition(test) { var genlex = new _genlex.GenLex(); genlex.tokenize(_parsec.N.number(), 'number', 500); test.ok(genlex.definitions.length === 1); test.done(); }, 'expect use() to sort definitions by revert precedence': function expectUseToSortDefinitionsByRevertPrecedence(test) { var genlex = new _genlex.GenLex(); var tkNumber = genlex.tokenize(_parsec.N.number(), 'number'); var tkDate = genlex.tokenize(date(), 'date', 800); var tkChar = genlex.tokenize(_parsec.C.charLiteral(), 'char', 1200); var grammar = tkDate.then(tkNumber.rep().or(tkChar)); test.notEqual(genlex.definitions[0].name, 'date'); genlex.use(grammar); test.equal(genlex.definitions[2].name, 'date'); test.equal(genlex.definitions[0].name, 'char'); test.done(); }, 'expect use() to create an easy tokenizer': function expectUseToCreateAnEasyTokenizer(test) { var genlex = new _genlex.GenLex(); var tkNumber = genlex.tokenize(_parsec.N.number(), 'number'); var grammar = tkNumber.rep(); var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString('34 23')); test.ok(parsing.isAccepted()); test.done(); }, 'a Genlex can update its precedence': function aGenlexCanUpdateItsPrecedence(test) { var genlex = new _genlex.GenLex(); var tkNumber = genlex.tokenize(_parsec.N.number(), 'number'); var tkDate = genlex.tokenize(date(), 'date', 800); var content = '10/05/2014 34 23'; genlex.setSeparators(' /'); genlex.updatePrecedence('number', 10); var grammar = tkDate.or(tkNumber).rep(); var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(content)); test.deepEqual(parsing.value.array(), [10, 5, 2014, 34, 23]); test.done(); }, 'GenLex can tokenize keywords': function GenLexCanTokenizeKeywords(test) { var genlex = new _genlex.GenLex(); var plus = genlex.tokenize('+'); var grammar = plus.rep().then(_parsec.F.eos().drop()); var parser = genlex.use(grammar); var text = '+++++'; var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isAccepted(), 'GenLex can tokenize keywords'); test.done(); }, 'tokenize mixes with keywords': function tokenizeMixesWithKeywords(test) { var genlex = new _genlex.GenLex(); var number = genlex.tokenize(_parsec.N.number(), 'number'); var plus = genlex.tokenize('+'); var grammar = plus.or(number).rep().then(_parsec.F.eos().drop()); var parser = genlex.use(grammar); var text = '++77++4+'; var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isEos(), 'tokenize mixes with keywords'); test.done(); }, 'getMathGenLex() gives a simple genlex': function getMathGenLexGivesASimpleGenlex(test) { var genlex = (0, _genlex.getMathGenLex)(); var number = genlex.get('number'); var grammar = number.rep(); var text = '15 14'; var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(text)); test.deepEqual(parsing.value.array(), ['15', '14'], 'getMathGenLex() gives a simple genlex'); test.done(); }, 'getMathGenLex can be enhanced with a parser': function getMathGenLexCanBeEnhancedWithAParser(test) { var genlex = (0, _genlex.getMathGenLex)(); genlex.remove('-'); var number = genlex.get('number'); //const digits = genlex.get('digits'); var tkDate = genlex.tokenize(date(), 'date', 800); var grammar = tkDate.rep().then(number).then(_parsec.F.eos()); var text = '15-12-2018 12-02-2020 12 '; var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isAccepted()); test.done(); }, 'getMathGenLex can be enhanced with a string': function getMathGenLexCanBeEnhancedWithAString(test) { var genlex = (0, _genlex.getMathGenLex)(); var number = genlex.get('number'); var dol = genlex.tokenize('$', 'dol'); var grammar = number.then(dol).rep().then(_parsec.F.eos()); var text = '15 $ '; var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isEos()); test.done(); }, 'getMathGenLex can be enhanced with a string and no name': function getMathGenLexCanBeEnhancedWithAStringAndNoName(test) { var genlex = (0, _genlex.getMathGenLex)(); var number = genlex.get('number'); genlex.tokenize('$'); var dol = genlex.get('$'); var grammar = number.then(dol).rep().then(_parsec.F.eos()); var text = '15 $ '; var parsing = genlex.use(grammar).parse(_stream2.default.ofString(text)); test.ok(parsing.isEos()); test.done(); }, 'genlex can change separators with a given string': function genlexCanChangeSeparatorsWithAGivenString(test) { var genlex = (0, _genlex.getMathGenLex)(); var number = genlex.get('number'); var grammar = number.rep().then(_parsec.F.eos().drop()); genlex.setSeparators('-'); var text = '15-12-35--'; var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isAccepted()); test.deepEqual(parsing.value.array(), [15, 12, 35]); test.done(); }, 'genlex separators must be a string': function genlexSeparatorsMustBeAString(test) { var genlex = (0, _genlex.getMathGenLex)(); var found = false; try { genlex.setSeparators(_parsec.C.char('-')); } catch (e) { found = true; } test.ok(found); test.done(); }, 'genlex can change separators with a full Parser': function genlexCanChangeSeparatorsWithAFullParser(test) { var genlex = (0, _genlex.getMathGenLex)(); var number = genlex.get('number'); var grammar = number.rep().then(_parsec.F.eos().drop()); var separatorParser = _parsec.C.char('-').then(_parsec.C.char('/').opt()); genlex.setSeparatorsParser(separatorParser); var text = '15-12-/35--10'; var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isAccepted()); test.deepEqual(parsing.value.array(), [15, 12, 35, 10]); test.done(); }, 'genlex provide all named tokens': function genlexProvideAllNamedTokens(test) { var genlex = (0, _genlex.getMathGenLex)(); var _genlex$tokens = genlex.tokens(), number = _genlex$tokens.number, plus = _genlex$tokens.plus, mult = _genlex$tokens.mult, open = _genlex$tokens.open, close = _genlex$tokens.close; //const number = genlex.get('number'); var grammar = number.or(plus).or(open).or(close).or(mult).rep().then(_parsec.F.eos().drop()); var text = '12+ 35'; var parser = genlex.use(grammar); var parsing = parser.parse(_stream2.default.ofString(text)); test.ok(parsing.isAccepted()); test.deepEqual(parsing.value.array(), [12, '+', 35]); test.done(); } }; function date() { return _parsec.N.digits().then(_parsec.C.charIn('-/').returns('-')).then(_parsec.N.digits()).then(_parsec.C.charIn('-/').returns('-')).then(_parsec.N.digits()).map(function (dateValues) { return dateValues[4] > 2000 ? dateValues.reverse() : dateValues; }).map(function (dateArray) { return dateArray.join(''); }); } //# sourceMappingURL=genlex-test.js.map