From b809e8eeb2720fe2cb05bcd15c59309a8ed0ef2b Mon Sep 17 00:00:00 2001 From: Luke Page Date: Sat, 11 Aug 2012 12:00:15 +0100 Subject: [PATCH] Fix #861 and introduce tests for errors --- lib/less/parser.js | 4 ++++ test/less-test.js | 27 +++++++++++++++++++++++ test/less/errors/comment-in-selector.less | 1 + test/less/errors/comment-in-selector.txt | 1 + 4 files changed, 33 insertions(+) create mode 100644 test/less/errors/comment-in-selector.less create mode 100644 test/less/errors/comment-in-selector.txt diff --git a/lib/less/parser.js b/lib/less/parser.js index 0fb424eb..bf47cf70 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -780,6 +780,8 @@ less.Parser = function Parser(env) { var elements = [], e, c, args = [], arg, index = i, s = input.charAt(i), name, value, important = false; if (s !== '.' && s !== '#') { return } + + save(); // stop us absorbing part of an invalid selector while (e = $(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)) { elements.push(new(tree.Element)(c, e, i)); @@ -818,6 +820,8 @@ less.Parser = function Parser(env) { if (elements.length > 0 && ($(';') || peek('}'))) { return new(tree.mixin.Call)(elements, args, index, env.filename, important); } + + restore(); }, // diff --git a/test/less-test.js b/test/less-test.js index 57f7aa3d..55034308 100644 --- a/test/less-test.js +++ b/test/less-test.js @@ -44,6 +44,33 @@ fs.readdirSync('test/less').forEach(function (file) { }); }); +fs.readdirSync('test/less/errors').forEach(function (file) { + if (! /\.less/.test(file)) { return } + + toCSS('test/less/errors/' + file, function (err, less) { + var name = path.basename(file, '.less'); + + fs.readFile(path.join('test/less/errors', name) + '.txt', 'utf-8', function (e, expectedErr) { + sys.print("- error/" + name + ": ") + if (err.message === expectedErr) { sys.print(stylize('OK', 'green')) } + else if (!err) { + sys.print(stylize("No Error", 'red')); + } else { + sys.print(stylize("FAIL", 'yellow') + '\n'); + + require('diff').diffLines(expectedErr, err.message).forEach(function(item) { + if(item.added || item.removed) { + sys.print(stylize(item.value, item.added ? 'green' : 'red')); + } else { + sys.print(item.value); + } + }) + } + sys.puts(""); + }); + }); +}); + function toCSS(path, callback) { var tree, css; fs.readFile(path, 'utf-8', function (e, str) { diff --git a/test/less/errors/comment-in-selector.less b/test/less/errors/comment-in-selector.less new file mode 100644 index 00000000..a7d26396 --- /dev/null +++ b/test/less/errors/comment-in-selector.less @@ -0,0 +1 @@ +#gaga /* Comment */ span { color: red } \ No newline at end of file diff --git a/test/less/errors/comment-in-selector.txt b/test/less/errors/comment-in-selector.txt new file mode 100644 index 00000000..c3cfdd06 --- /dev/null +++ b/test/less/errors/comment-in-selector.txt @@ -0,0 +1 @@ +Syntax Error on line 1 \ No newline at end of file