var balanced = require('../index'),
fs = require('fs');
var examples = {
bracketsBasic: fs.readFileSync(__dirname + '/example-text/brackets-basic.txt', 'utf8'),
bracketsHead: fs.readFileSync(__dirname + '/example-text/brackets-head.txt', 'utf8'),
comments: fs.readFileSync(__dirname + '/example-text/brackets-comments.txt', 'utf8'),
comments2: fs.readFileSync(__dirname + '/example-text/brackets-comments2.txt', 'utf8')
};
describe('Matches', function() {
it('can perform simple string matches', function() {
expect(balanced.matches({source: examples.bracketsBasic, open: '{', close: '}'})).toEqual([
{ index: 7, length: 6, head: '{', tail: '}' },
{ index: 36, length: 9, head: '{', tail: '}' },
{ index: 68, length: 10, head: '{', tail: '}' },
{ index: 93, length: 25, head: '{', tail: '}' },
{ index: 141, length: 19, head: '{', tail: '}' }
]);
expect(balanced.matches({source: examples.bracketsBasic, open: '(', close: ')'})).toEqual([
{ index: 183, length: 6, head: '(', tail: ')' },
{ index: 212, length: 9, head: '(', tail: ')' },
{ index: 244, length: 10, head: '(', tail: ')' },
{ index: 269, length: 25, head: '(', tail: ')' },
{ index: 317, length: 19, head: '(', tail: ')' }
]);
expect(balanced.matches({source: examples.bracketsBasic, open: '[', close: ']'})).toEqual([
{ index: 359, length: 6, head: '[', tail: ']' },
{ index: 388, length: 9, head: '[', tail: ']' },
{ index: 420, length: 10, head: '[', tail: ']' },
{ index: 445, length: 25, head: '[', tail: ']' },
{ index: 493, length: 19, head: '[', tail: ']' }
]);
expect(balanced.matches({source: examples.bracketsBasic, open: '', close: ''})).toEqual([
{ index: 535, length: 15, head: '', tail: '' },
{ index: 573, length: 18, head: '', tail: '' },
{ index: 614, length: 37, head: '', tail: '' },
{ index: 666, length: 52, head: '', tail: '' },
{ index: 741, length: 46, head: '', tail: '' }
]);
});
it('can perform simple regexp matches', function() {
expect(balanced.matches({source: examples.bracketsBasic, open: /\[|\{|\(|/, close: /\]|\}|\)|<\/tag>/})).toEqual([
{ index: 7, length: 6, head: '{', tail: '}' },
{ index: 36, length: 9, head: '{', tail: '}' },
{ index: 68, length: 10, head: '{', tail: '}' },
{ index: 93, length: 25, head: '{', tail: '}' },
{ index: 141, length: 19, head: '{', tail: '}' },
{ index: 183, length: 6, head: '(', tail: ')' },
{ index: 212, length: 9, head: '(', tail: ')' },
{ index: 244, length: 10, head: '(', tail: ')' },
{ index: 269, length: 25, head: '(', tail: ')' },
{ index: 317, length: 19, head: '(', tail: ')' },
{ index: 359, length: 6, head: '[', tail: ']' },
{ index: 388, length: 9, head: '[', tail: ']' },
{ index: 420, length: 10, head: '[', tail: ']' },
{ index: 445, length: 25, head: '[', tail: ']' },
{ index: 493, length: 19, head: '[', tail: ']' },
{ index: 535, length: 15, head: '', tail: '' },
{ index: 573, length: 18, head: '', tail: '' },
{ index: 614, length: 37, head: '', tail: '' },
{ index: 666, length: 52, head: '', tail: '' },
{ index: 741, length: 46, head: '', tail: '' }
]);
});
it('can perform head matches', function () {
expect(balanced.matches({source: examples.bracketsHead, head: 'head (', open: '(', close: ')'})).toEqual([
{ index: 8, length: 39, head: 'head (', tail: ')' },
{ index: 120, length: 39, head: 'head (', tail: ')' }
]);
});
it('can perform regexp head matches', function () {
expect(balanced.matches({source: examples.bracketsHead, head: /head\d? \(/, open: '(', close: ')'})).toEqual([
{ index: 8, length: 39, head: 'head (', tail: ')' },
{ index: 63, length: 41, head: 'head2 (', tail: ')' },
{ index: 120, length: 39, head: 'head (', tail: ')' },
{ index: 175, length: 41, head: 'head2 (', tail: ')' }
]);
});
it('can ignore matches', function () {
var blockComments = balanced.matches({source: examples.comments, open: '/*', close: '*/'}),
singleLineComments = balanced.getRangesForMatch(examples.comments, /^\s*\/\/.+$/gim);
expect(balanced.matches({
source: examples.comments,
open: ['{', '[', '('],
close: ['}', ']', ')'],
ignore: Array.prototype.concat.call([], blockComments, singleLineComments)
})).toEqual([
{ index: 0, length: 71, head: '{', tail: '}' }
]);
expect(balanced.matches({
source: examples.comments,
open: ['{', '[', '('],
close: ['}', ']', ')'],
ignore: blockComments
})).toEqual([
{ index: 0, length: 71, head: '{', tail: '}' },
{ index: 75, length: 25, head: '{', tail: '}' }
]);
});
it('can ignore matches 2', function () {
var blockComments = balanced.matches({source: examples.comments2, open: '/*', close: '*/'}),
singleLineComments = balanced.getRangesForMatch(examples.comments2, /^\s*\/\/.+$/gim);
expect(balanced.matches({
source: examples.comments2,
open: ['{', '[', '('],
close: ['}', ']', ')'],
ignore: blockComments
})).toEqual([
{ index: 0, length: 2, head: '{', tail: '}' },
{ index: 14, length: 2, head: '{', tail: '}' },
{ index: 16, length: 2, head: '{', tail: '}' },
{ index: 18, length: 8, head: '{', tail: '}' }
]);
expect(balanced.matches({
source: examples.comments2,
open: ['{', '[', '('],
close: ['}', ']', ')'],
ignore: Array.prototype.concat.call([], blockComments, singleLineComments)
})).toEqual([
{ index: 0, length: 2, head: '{', tail: '}' }
]);
});
it('can match with complex custom ignore ', function () {
function getQuoteRanges (string, ignore) {
var quotes = balanced.getRangesForMatch(string, new RegExp('\'|"', 'g'));
// filter out ingored ranges
if (ignore) {
quotes = balanced.rangesWithout(quotes, ignore);
}
var currect = null,
ranges = [];
quotes.forEach(function (quote) {
if (currect && currect.match === quote.match) {
ranges.push({
index: currect.index,
length: quote.index - currect.index + 1
});
currect = null;
} else if (!currect) {
currect = quote;
}
});
return ranges;
}
var string =
'/* {}" */\n' +
'/* {}\' */\n' +
'// {}"\n' +
'// {}\'\n' +
'{}\n' +
'" /*{}*/ "\n' +
'\' /*{}*/ \'\n' +
'/* """ */\n' +
'/* \'\'\' */\n' +
'" {} "\n' +
'\' {} \'\n' +
'/* """ */\n' +
'/* \'\'\' */\n';
var blockComments = balanced.matches({source: string, open: '/*', close: '*/'}),
singleLineComments = balanced.getRangesForMatch(string, /^\s*\/\/.+$/gim),
ignores = Array.prototype.concat.call([], blockComments, singleLineComments),
quotes = getQuoteRanges(string, ignores);
// remove ignores inside of quotes
ignores = balanced.rangesWithout(ignores, quotes);
// option ignore code inside of quotes
ignores = ignores.concat(quotes);
expect(balanced.matches({
source: string,
open: ['{', '[', '('],
close: ['}', ']', ')'],
ignore: ignores
})).toEqual([
{ index : 34, length : 2, head : '{', tail : '}' }
]);
});
});