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') }; describe('Replacements', function() { it('can perform simple string replacements', function() { expect(balanced.replacements({source: examples.bracketsBasic, open: '{', close: '}', replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGE{{TEXT}}GARBAGE\nGARBAGE\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\nGARBAGE\nGARBAGE\nGARBAGE\n\t{TEXT}\n\t{TEXT}\nGARBAGE\nGARBAGE\nGARBAGE(TEXT)GARBAGE\nGARBAGE\nGARBAGE(\n\tTEXT\n)GARBAGE\nGARBAGE\nGARBAGE(((TEXT)))GARBAGE\nGARBAGE(\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n)GARBAGE\nGARBAGE\nGARBAGE(\n\t(TEXT)\n\t(TEXT)\n)GARBAGE\nGARBAGE\nGARBAGE[TEXT]GARBAGE\nGARBAGE\nGARBAGE[\n\tTEXT\n]GARBAGE\nGARBAGE\nGARBAGE[[[TEXT]]]GARBAGE\nGARBAGE[\n\t[\n\t\t[\n\t\t\tTEXT\n\t\t]\n\t]\n]GARBAGE\nGARBAGE\nGARBAGE[\n\t[TEXT]\n\t[TEXT]\n]GARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\n\t\n\t\t\n\t\t\tTEXT\n\t\t\n\t\nGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\n\tTEXT\nGARBAGE\nGARBAGE' ); expect(balanced.replacements({source: examples.bracketsBasic, open: '(', close: ')', replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGE{TEXT}GARBAGE\nGARBAGE\nGARBAGE{\n\tTEXT\n}GARBAGE\nGARBAGE\nGARBAGE{{{TEXT}}}GARBAGE\nGARBAGE{\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n}GARBAGE\nGARBAGE\nGARBAGE{\n\t{TEXT}\n\t{TEXT}\n}GARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGE((TEXT))GARBAGE\nGARBAGE\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\nGARBAGE\nGARBAGE\nGARBAGE\n\t(TEXT)\n\t(TEXT)\nGARBAGE\nGARBAGE\nGARBAGE[TEXT]GARBAGE\nGARBAGE\nGARBAGE[\n\tTEXT\n]GARBAGE\nGARBAGE\nGARBAGE[[[TEXT]]]GARBAGE\nGARBAGE[\n\t[\n\t\t[\n\t\t\tTEXT\n\t\t]\n\t]\n]GARBAGE\nGARBAGE\nGARBAGE[\n\t[TEXT]\n\t[TEXT]\n]GARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\n\t\n\t\t\n\t\t\tTEXT\n\t\t\n\t\nGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\n\tTEXT\nGARBAGE\nGARBAGE' ); expect(balanced.replacements({source: examples.bracketsBasic, open: '[', close: ']', replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGE{TEXT}GARBAGE\nGARBAGE\nGARBAGE{\n\tTEXT\n}GARBAGE\nGARBAGE\nGARBAGE{{{TEXT}}}GARBAGE\nGARBAGE{\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n}GARBAGE\nGARBAGE\nGARBAGE{\n\t{TEXT}\n\t{TEXT}\n}GARBAGE\nGARBAGE\nGARBAGE(TEXT)GARBAGE\nGARBAGE\nGARBAGE(\n\tTEXT\n)GARBAGE\nGARBAGE\nGARBAGE(((TEXT)))GARBAGE\nGARBAGE(\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n)GARBAGE\nGARBAGE\nGARBAGE(\n\t(TEXT)\n\t(TEXT)\n)GARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGE[[TEXT]]GARBAGE\nGARBAGE\n\t[\n\t\t[\n\t\t\tTEXT\n\t\t]\n\t]\nGARBAGE\nGARBAGE\nGARBAGE\n\t[TEXT]\n\t[TEXT]\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\n\t\n\t\t\n\t\t\tTEXT\n\t\t\n\t\nGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\n\tTEXT\nGARBAGE\nGARBAGE' ); expect(balanced.replacements({source: examples.bracketsBasic, open: '', close: '', replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGE{TEXT}GARBAGE\nGARBAGE\nGARBAGE{\n\tTEXT\n}GARBAGE\nGARBAGE\nGARBAGE{{{TEXT}}}GARBAGE\nGARBAGE{\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n}GARBAGE\nGARBAGE\nGARBAGE{\n\t{TEXT}\n\t{TEXT}\n}GARBAGE\nGARBAGE\nGARBAGE(TEXT)GARBAGE\nGARBAGE\nGARBAGE(\n\tTEXT\n)GARBAGE\nGARBAGE\nGARBAGE(((TEXT)))GARBAGE\nGARBAGE(\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n)GARBAGE\nGARBAGE\nGARBAGE(\n\t(TEXT)\n\t(TEXT)\n)GARBAGE\nGARBAGE\nGARBAGE[TEXT]GARBAGE\nGARBAGE\nGARBAGE[\n\tTEXT\n]GARBAGE\nGARBAGE\nGARBAGE[[[TEXT]]]GARBAGE\nGARBAGE[\n\t[\n\t\t[\n\t\t\tTEXT\n\t\t]\n\t]\n]GARBAGE\nGARBAGE\nGARBAGE[\n\t[TEXT]\n\t[TEXT]\n]GARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\n\t\n\t\t\n\t\t\tTEXT\n\t\t\n\t\nGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\n\tTEXT\nGARBAGE\nGARBAGE' ); }); it('can perform simple regexp replacements', function() { expect(balanced.replacements({source: examples.bracketsBasic, open: /\[|\{|\(|/, close: /\]|\}|\)|<\/tag>/, replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGE{{TEXT}}GARBAGE\nGARBAGE\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\nGARBAGE\nGARBAGE\nGARBAGE\n\t{TEXT}\n\t{TEXT}\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGE((TEXT))GARBAGE\nGARBAGE\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\nGARBAGE\nGARBAGE\nGARBAGE\n\t(TEXT)\n\t(TEXT)\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGE[[TEXT]]GARBAGE\nGARBAGE\n\t[\n\t\t[\n\t\t\tTEXT\n\t\t]\n\t]\nGARBAGE\nGARBAGE\nGARBAGE\n\t[TEXT]\n\t[TEXT]\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\nGARBAGE\nGARBAGE\nGARBAGETEXTGARBAGE\nGARBAGE\n\t\n\t\t\n\t\t\tTEXT\n\t\t\n\t\nGARBAGE\nGARBAGE\nGARBAGE\n\tTEXT\n\tTEXT\nGARBAGE\nGARBAGE' ); }); it('can perform head replacements', function () { expect(balanced.replacements({source: examples.bracketsHead, head: 'head (', open: '(', close: ')', replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGE \n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead ()\nGARBAGE\nGARBAGE head2 (\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead2 ()\n)GARBAGE\nGARBAGE \n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead ()\nGARBAGE\nGARBAGE head2 (\n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead2 ()\n)GARBAGE' ); }); it('can perform regexp head matches', function () { expect(balanced.replacements({source: examples.bracketsHead, head: /head\d? \(/, open: '(', close: ')', replace: function (source, head, tail) { return '' + source + ''; }})).toEqual( 'GARBAGE \n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead ()\nGARBAGE\nGARBAGE \n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead2 ()\nGARBAGE\nGARBAGE \n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead ()\nGARBAGE\nGARBAGE \n\t(\n\t\t(\n\t\t\tTEXT\n\t\t)\n\t)\n\thead2 ()\nGARBAGE' ); }); it('can ignore matches', function () { var blockComments = balanced.matches({source: examples.comments, open: '/*', close: '*/'}), singleLineComments = balanced.getRangesForMatch(examples.comments, /^\s*\/\/.+$/gim); expect(balanced.replacements({ source: examples.comments, open: ['{', '[', '('], close: ['}', ']', ')'], ignore: Array.prototype.concat.call([], blockComments, singleLineComments), replace: function (source, head, tail) { return '' + source + ''; } })).toEqual( '\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n\n\ta {\n\n\t}\n\n\ta [\n\n\t]\n\n\ta (\n\n\t)\n\n// {{TEXT}{TEXT}}a{}a[]a()\n/*\n{\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n\n\ta {\n\n\t}\n\n\ta [\n\n\t\n\n\ta (\n\n\t)\n}\n*/' ); }); it('can ignore matches 2', function () { var blockComments = balanced.matches({source: examples.comments, open: '/*', close: '*/'}); expect(balanced.replacements({ source: examples.comments, open: ['{', '[', '('], close: ['}', ']', ')'], ignore: blockComments, replace: function (source, head, tail) { return '' + source + ''; } })).toEqual( '\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n\n\ta {\n\n\t}\n\n\ta [\n\n\t]\n\n\ta (\n\n\t)\n\n// {{TEXT}{TEXT}}a{}a[]a()\n/*\n{\n\t{\n\t\t{\n\t\t\tTEXT\n\t\t\n\t\t{\n\t\t\tTEXT\n\t\t}\n\t}\n\n\ta {\n\n\t}\n\n\ta [\n\n\t\n\n\ta (\n\n\t)\n}\n*/' ); }); });