Skip to content

Commit

Permalink
test for syntax parse exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
lahmatiy committed Oct 19, 2016
1 parent 00e6298 commit 409a53b
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 29 deletions.
56 changes: 27 additions & 29 deletions lib/syntax/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ function readWord(str, start) {
end++;
}

if (start === end) {
error(str, start, 'Expect a keyword');
}

return str.substring(start, end);
}

Expand Down Expand Up @@ -111,14 +115,12 @@ function readMultiplier(str, pos) {

if (charAt(str, pos) === '{') {
var range = readMultiplierRange(str, pos);
if (range) {
return {
comma: true,
min: range.min,
max: range.max,
value: str.substring(start, range.pos)
};
}
return {
comma: true,
min: range.min,
max: range.max,
value: str.substring(start, range.pos)
};
}

return {
Expand All @@ -132,15 +134,12 @@ function readMultiplier(str, pos) {
var start = pos;
var range = readMultiplierRange(str, pos);

if (range) {
return {
comma: false,
min: range.min,
max: range.max,
value: str.substring(start, range.pos)
};
}
break;
return {
comma: false,
min: range.min,
max: range.max,
value: str.substring(start, range.pos)
};
}

return {
Expand All @@ -159,7 +158,7 @@ function readProperty(str, start) {
end += eat(str, end, '<');
end += eat(str, end, '\'');

name = readWord(str, end) || error(str, end);
name = readWord(str, end);
end += name.length;

end += eat(str, end, '\'');
Expand All @@ -185,7 +184,7 @@ function readType(str, start) {

end += eat(str, end, '<');

name = readWord(str, end) || error(str, end);
name = readWord(str, end);
end += name.length;

if (charAt(str, end) === '(' && charAt(str, end + 1) === ')') {
Expand Down Expand Up @@ -214,7 +213,7 @@ function readKeywordOrFunction(str, start) {
var multiplier;
var name;

name = readWord(str, end) || error(str, end);
name = readWord(str, end);
end += name.length;

if (charAt(str, end) === '(') {
Expand Down Expand Up @@ -300,7 +299,7 @@ function readSequence(str, start) {
if (token.type === 'Combinator') {
// check for combinator in group beginning and double combinator sequence
if (!lastToken || lastToken.type === 'Combinator') {
error(str, end);
error(str, end, 'Unexpected combinator');
}

combinators[token.value] = true;
Expand All @@ -321,7 +320,7 @@ function readSequence(str, start) {

// check for combinator in group ending
if (lastToken && lastToken.type === 'Combinator') {
error(str, end - lastToken.value.length);
error(str, end - lastToken.value.length, 'Unexpected combinator');
}

return {
Expand Down Expand Up @@ -409,13 +408,12 @@ function peek(str, start) {
};

case '&':
if (charAt(str, end) === '&') {
return {
type: 'Combinator',
value: '&&'
};
}
break;
eat(str, end, '&');

return {
type: 'Combinator',
value: '&&'
};

case ',':
return {
Expand Down
67 changes: 67 additions & 0 deletions test/syntax.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,73 @@ describe('CSS syntax', function() {
assert.equal(stringify(ast, true), '[ [ a b ] | [ c || [ d && [ e f ] ] ] ]');
});

describe('bad syntax', function() {
it('expected a quote', function() {
assert.throws(function() {
parse('\'x');
}, /^SyntaxParseError: Expect a quote\n/);
});

it('expected a number', function() {
var tests = [
'<x>{}',
'<x>{,2}',
'<x>{ 2}',
'<x>{1, }'
];
tests.forEach(function(test) {
assert.throws(function() {
parse(test);
}, /^SyntaxParseError: Expect a number\n/, test);
});
});

it('missed keyword', function() {
var tests = [
'<>',
'<\'\'>'
];
tests.forEach(function(test) {
assert.throws(function() {
parse(test);
}, /^SyntaxParseError: Expect a keyword\n/, test);
});
});

it('unexpected combinator', function() {
var tests = [
'<x>&&',
'&&<x>',
'<x>&&||'
];
tests.forEach(function(test) {
assert.throws(function() {
parse(test);
}, /^SyntaxParseError: Unexpected combinator\n/, test);
});
});

it('unexpected input', function() {
assert.throws(function() {
parse('!');
}, /^SyntaxParseError: Unexpected input\n/);
});

it('bad syntax', function() {
var tests = [
'a&b',
'<a',
'b(',
'[a'
];
tests.forEach(function(test) {
assert.throws(function() {
parse(test);
}, /^SyntaxParseError: Expect `.`\n/, test);
});
});
});

describe('Syntax', function() {
it('validate', function() {
var syntax = createSyntax({
Expand Down

0 comments on commit 409a53b

Please sign in to comment.