diff options
| author | Jeremy Tymes | 2012-11-27 11:00:46 -0500 |
|---|---|---|
| committer | Misko Hevery | 2013-01-17 23:08:38 -0800 |
| commit | a179a9a96eda5c566bda8a70ac8a75822c936a68 (patch) | |
| tree | 42a1f70c0176a2957874a70781d64f268401240c | |
| parent | 610a5a0c14a71be6cd147c665f80478515bfb576 (diff) | |
| download | angular.js-a179a9a96eda5c566bda8a70ac8a75822c936a68.tar.bz2 | |
feat($parse): allow strict equality in angular expressions
Allows the parser to parse strict equality and inequality
in angular expressions.
Closes #908
| -rw-r--r-- | src/ng/parse.js | 18 | ||||
| -rw-r--r-- | test/ng/parseSpec.js | 16 |
2 files changed, 26 insertions, 8 deletions
diff --git a/src/ng/parse.js b/src/ng/parse.js index 97aba113..5a70979a 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -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);}, @@ -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) { @@ -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'; @@ -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; diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 2bbbb836..a6f43282 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -91,8 +91,8 @@ 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('!='); @@ -100,6 +100,8 @@ describe('parser', function() { 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() { @@ -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() { |
