127 lines
4.6 KiB
JavaScript
127 lines
4.6 KiB
JavaScript
const assert = require('assert');
|
|
|
|
const types = require('../src/types.js');
|
|
const tokenizer = require('../src/tokenizer.js');
|
|
const parser = require('../src/parser.js');
|
|
|
|
describe('types.js', () => {
|
|
it('Has a Token child.', () => {
|
|
assert.equal(types.hasOwnProperty('Token'), true);
|
|
});
|
|
it('Has a Group child.', () => {
|
|
assert.equal(types.hasOwnProperty('Group'), true);
|
|
});
|
|
|
|
describe('Token', () => {
|
|
it('Works as a constructor', () => {
|
|
try {
|
|
let token = new types.Token('a', 'b', 'c');
|
|
} catch (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
it('Has values \'type\', \'subtype\', and \'value\'', () => {
|
|
try {
|
|
let token = new types.Token('a', 'b', 'c');
|
|
if (!token.hasOwnProperty('type') || !token.hasOwnProperty('subtype') || !token.hasOwnProperty('value'))
|
|
throw new Error('Token is missing \'type\', \'subtype\', or \'value\' properties.');
|
|
if (token.type != 'a' || token.subtype != 'b' || token.value != 'c')
|
|
throw new Error('Token incorrectly set \'type\', \'subtype\', or \'value\' properties.');
|
|
} catch (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
});
|
|
describe('Group', () => {
|
|
it('Works as a constructor', () => {
|
|
try {
|
|
let group = new types.Group('a', 'b');
|
|
} catch (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
it('Has values \'type\', \'subtype\', and \'tokens\'', () => {
|
|
try {
|
|
let group = new types.Group('a', 'b');
|
|
if (!group.hasOwnProperty('type') || !group.hasOwnProperty('subtype') || !group.hasOwnProperty('tokens'))
|
|
throw new Error('Group is missing \'type\', \'subtype\', or \'tokens\' properties.');
|
|
if (group.type != 'group' || group.subtype != 'a' || group.tokens != 'b')
|
|
throw new Error('Group incorrectly set \'type\', \'subtype\', or \'tokens\' properties.');
|
|
} catch (err) {
|
|
throw err;
|
|
}
|
|
});
|
|
});
|
|
});
|
|
describe('tokenizer.js', () => {
|
|
it('Has a tokenize child', () => {
|
|
assert.equal(tokenizer.hasOwnProperty('tokenize'), true);
|
|
});
|
|
it('Has a util child', () => {
|
|
assert.equal(tokenizer.hasOwnProperty('util'), true);
|
|
});
|
|
describe('util', () => {
|
|
it('combineEscapedChars works', () => {
|
|
assert.equal(tokenizer.util.combineEscapedChars(`let x = 'test\\nnewline';`.split('')).join(''), `let x = 'test\\nnewline';`);
|
|
});
|
|
it('removeComments works', () => {
|
|
assert.equal(tokenizer.util.removeComments(`// Comment\nlet i = 0;`.split('')).join(''), `let i = 0;`);
|
|
});
|
|
it('changeKeywords works', () => {
|
|
let tokens = tokenizer.util.changeKeywords([{
|
|
type: 'name',
|
|
subtype: 'variable',
|
|
value: 'let'
|
|
}, {
|
|
type: 'name',
|
|
subtype: 'variable',
|
|
value: 'x'
|
|
}]);
|
|
let correct = [{
|
|
type: 'name',
|
|
subtype: 'keyword',
|
|
value: 'let'
|
|
}, {
|
|
type: 'name',
|
|
subtype: 'variable',
|
|
value: 'x'
|
|
}];
|
|
let isCorrect = true;
|
|
tokens.forEach((t, i) => {
|
|
if (t.type != correct[i].type)
|
|
throw new Error('Changed type: Expected \''+ correct[i].type +'\' but got ' + t.type)
|
|
else if (t.subtype != correct[i].subtype)
|
|
throw new Error('Incorrectly changed subtype: Expected \''+ correct[i].subtype +'\' but got ' + t.subtype)
|
|
else if (t.value != correct[i].value)
|
|
throw new Error('Changed value: Expected \''+ correct[i].value +'\' but got ' + t.value)
|
|
});
|
|
});
|
|
it('getDelimiterToken works', () => {
|
|
let token = tokenizer.util.getDelimiterToken(')');
|
|
if (token.type != 'delimiter')
|
|
throw new Error('Incorrect type: Expected \'delimiter\' but got ' + token.type)
|
|
else if (token.subtype != 'right')
|
|
throw new Error('Incorrect subtype: Expected \'right\' but got ' + token.subtype)
|
|
else if (token.value != 'parenthesis')
|
|
throw new Error('Incorrect value: Expected \'parenthesis\' but got ' + token.value)
|
|
});
|
|
it('operatorType works', () => {
|
|
assert.equal(tokenizer.util.operatorType('++'), 'left');
|
|
assert.equal(tokenizer.util.operatorType(';'), 'none');
|
|
assert.equal(tokenizer.util.operatorType('+'), 'dual');
|
|
});
|
|
it('determineCharType works', () => {
|
|
assert.equal(tokenizer.util.determineCharType('+'), 'operator');
|
|
assert.equal(tokenizer.util.determineCharType('"'), 'string delimiter');
|
|
assert.equal(tokenizer.util.determineCharType('4'), 'digit');
|
|
});
|
|
it('determineType works', () => {
|
|
assert.equal(tokenizer.util.determineType('let'), 'keyword');
|
|
assert.equal(tokenizer.util.determineType('dog'), 'unknown');
|
|
});
|
|
});
|
|
});
|
|
describe('parser.js', () => {
|
|
|
|
});
|