aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Tymes2012-11-27 11:00:46 -0500
committerMisko Hevery2013-01-17 23:08:38 -0800
commita179a9a96eda5c566bda8a70ac8a75822c936a68 (patch)
tree42a1f70c0176a2957874a70781d64f268401240c
parent610a5a0c14a71be6cd147c665f80478515bfb576 (diff)
downloadangular.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.js18
-rw-r--r--test/ng/parseSpec.js16
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() {