Skip to content

Commit

Permalink
feat($parse): allow strict equality in angular expressions
Browse files Browse the repository at this point in the history
Allows the parser to parse strict equality and inequality
in angular expressions.

Closes angular#908
  • Loading branch information
jtymes authored and jamessharp committed Jan 18, 2013
1 parent f484d3b commit 68959f5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 8 deletions.
18 changes: 13 additions & 5 deletions src/ng/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ var OPERATORS = {
'%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},
'^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},
'=':noop,
'===':function(self, locals, a, b){return a(self, locals)===b(self, locals);},
'!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);},
'==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},
'!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},
'<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},
Expand Down Expand Up @@ -70,9 +72,14 @@ function lex(text, csp){
continue;
} else {
var ch2 = ch + peek(),
ch3 = ch2 + peek(2),
fn = OPERATORS[ch],
fn2 = OPERATORS[ch2];
if (fn2) {
fn2 = OPERATORS[ch2],
fn3 = OPERATORS[ch3];
if (fn3) {
tokens.push({index:index, text:ch3, fn:fn3});
index += 3;
} else if (fn2) {
tokens.push({index:index, text:ch2, fn:fn2});
index += 2;
} else if (fn) {
Expand All @@ -94,8 +101,9 @@ function lex(text, csp){
return chars.indexOf(lastCh) != -1;
}

function peek() {
return index + 1 < text.length ? text.charAt(index + 1) : false;
function peek(i) {
var num = i || 1;
return index + num < text.length ? text.charAt(index + num) : false;
}
function isNumber(ch) {
return '0' <= ch && ch <= '9';
Expand Down Expand Up @@ -456,7 +464,7 @@ function parser(text, json, $filter, csp){
function equality() {
var left = relational();
var token;
if ((token = expect('==','!='))) {
if ((token = expect('==','!=','===','!=='))) {
left = binaryFn(left, token.fn, equality());
}
return left;
Expand Down
16 changes: 13 additions & 3 deletions test/ng/parseSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,17 @@ describe('parser', function() {
expect(tokens[1].text).toEqual('b');
});

it('should tokenize relation', function() {
var tokens = lex("! == != < > <= >=");
it('should tokenize relation and equality', function() {
var tokens = lex("! == != < > <= >= === !==");
expect(tokens[0].text).toEqual('!');
expect(tokens[1].text).toEqual('==');
expect(tokens[2].text).toEqual('!=');
expect(tokens[3].text).toEqual('<');
expect(tokens[4].text).toEqual('>');
expect(tokens[5].text).toEqual('<=');
expect(tokens[6].text).toEqual('>=');
expect(tokens[7].text).toEqual('===');
expect(tokens[8].text).toEqual('!==');
});

it('should tokenize statements', function() {
Expand Down Expand Up @@ -197,12 +199,20 @@ describe('parser', function() {
expect(scope.$eval("false")).toBeFalsy();
expect(scope.$eval("!true")).toBeFalsy();
expect(scope.$eval("1==1")).toBeTruthy();
expect(scope.$eval("1==true")).toBeTruthy();
expect(scope.$eval("1===1")).toBeTruthy();
expect(scope.$eval("1==='1'")).toBeFalsy();
expect(scope.$eval("1===true")).toBeFalsy();
expect(scope.$eval("'true'===true")).toBeFalsy();
expect(scope.$eval("1!==2")).toBeTruthy();
expect(scope.$eval("1!=='1'")).toBeTruthy();
expect(scope.$eval("1!=2")).toBeTruthy();
expect(scope.$eval("1<2")).toBeTruthy();
expect(scope.$eval("1<=1")).toBeTruthy();
expect(scope.$eval("1>2")).toEqual(1>2);
expect(scope.$eval("2>=1")).toEqual(2>=1);
expect(scope.$eval("true==2<3")).toEqual(true === 2<3);
expect(scope.$eval("true==2<3")).toEqual(true == 2<3);
expect(scope.$eval("true===2<3")).toEqual(true === 2<3);
});

it('should parse logical', function() {
Expand Down

0 comments on commit 68959f5

Please sign in to comment.