diff options
| author | Zach Snow | 2013-04-22 17:42:34 -0700 |
|---|---|---|
| committer | Pete Bacon Darwin | 2013-05-16 22:30:37 +0100 |
| commit | 6798fec4390a72b7943a49505f8a245b6016c84b (patch) | |
| tree | 3aca336e3eda980ae8eb5d1ffd09993112ce071f /test/ng/parseSpec.js | |
| parent | cefbcd470d4c9020cc3487b2326d45058ef831e2 (diff) | |
| download | angular.js-6798fec4390a72b7943a49505f8a245b6016c84b.tar.bz2 | |
feat($parse): add support for ternary operators to parser
Add '?' token to lexer, add ternary rule to parser at
(hopefully) proper precedence and associativity (based
on https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence).
Since (exp1 && exp2 || exp3) is supported by the parser,
and (exp1 ? exp2 : exp3) works the same way, it seems
reasonable to add this minor form of control to templates
(see #719).
Diffstat (limited to 'test/ng/parseSpec.js')
| -rw-r--r-- | test/ng/parseSpec.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 96b3d909..113ec051 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -103,6 +103,14 @@ describe('parser', function() { expect(tokens[7].text).toEqual('==='); expect(tokens[8].text).toEqual('!=='); }); + + it('should tokenize logical and ternary', function() { + var tokens = lex("&& || ? :"); + expect(tokens[0].text).toEqual('&&'); + expect(tokens[1].text).toEqual('||'); + expect(tokens[2].text).toEqual('?'); + expect(tokens[3].text).toEqual(':'); + }); it('should tokenize statements', function() { var tokens = lex("a;b;"); @@ -220,6 +228,52 @@ describe('parser', function() { expect(scope.$eval("0||2")).toEqual(0||2); expect(scope.$eval("0||1&&2")).toEqual(0||1&&2); }); + + it('should parse ternary', function(){ + var f = scope.f = function(){ return true; }; + var g = scope.g = function(){ return false; }; + var h = scope.h = function(){ return 'asd'; }; + var i = scope.i = function(){ return 123; }; + var id = scope.id = function(x){ return x; }; + + // Simple. + expect(scope.$eval('0?0:2')).toEqual(0?0:2); + expect(scope.$eval('1?0:2')).toEqual(1?0:2); + + // Nested on the left. + expect(scope.$eval('0?0?0:0:2')).toEqual(0?0?0:0:2); + expect(scope.$eval('1?0?0:0:2')).toEqual(1?0?0:0:2); + expect(scope.$eval('0?1?0:0:2')).toEqual(0?1?0:0:2); + expect(scope.$eval('0?0?1:0:2')).toEqual(0?0?1:0:2); + expect(scope.$eval('0?0?0:2:3')).toEqual(0?0?0:2:3); + expect(scope.$eval('1?1?0:0:2')).toEqual(1?1?0:0:2); + expect(scope.$eval('1?1?1:0:2')).toEqual(1?1?1:0:2); + expect(scope.$eval('1?1?1:2:3')).toEqual(1?1?1:2:3); + expect(scope.$eval('1?1?1:2:3')).toEqual(1?1?1:2:3); + + // Nested on the right. + expect(scope.$eval('0?0:0?0:2')).toEqual(0?0:0?0:2); + expect(scope.$eval('1?0:0?0:2')).toEqual(1?0:0?0:2); + expect(scope.$eval('0?1:0?0:2')).toEqual(0?1:0?0:2); + expect(scope.$eval('0?0:1?0:2')).toEqual(0?0:1?0:2); + expect(scope.$eval('0?0:0?2:3')).toEqual(0?0:0?2:3); + expect(scope.$eval('1?1:0?0:2')).toEqual(1?1:0?0:2); + expect(scope.$eval('1?1:1?0:2')).toEqual(1?1:1?0:2); + expect(scope.$eval('1?1:1?2:3')).toEqual(1?1:1?2:3); + expect(scope.$eval('1?1:1?2:3')).toEqual(1?1:1?2:3); + + // Precedence with respect to logical operators. + expect(scope.$eval('0&&1?0:1')).toEqual(0&&1?0:1); + expect(scope.$eval('0&&1?0:1')).toEqual((0&&1)?0:1); + expect(scope.$eval('1||0?0:0')).toEqual(1||0?0:0); + expect(scope.$eval('1||0?0:0')).toEqual((1||0)?0:0); + + // Function calls. + expect(scope.$eval('f() ? h() : i()')).toEqual(f() ? h() : i()); + expect(scope.$eval('g() ? h() : i()')).toEqual(g() ? h() : i()); + expect(scope.$eval('f() ? h() : i()')).toEqual(f() ? h() : i()); + expect(scope.$eval('id(g() ? h() : i())')).toEqual(id(g() ? h() : i())); + }); it('should parse string', function() { expect(scope.$eval("'a' + 'b c'")).toEqual("ab c"); |
