@@ -103,6 +103,14 @@ describe('parser', function() {
103
103
expect ( tokens [ 7 ] . text ) . toEqual ( '===' ) ;
104
104
expect ( tokens [ 8 ] . text ) . toEqual ( '!==' ) ;
105
105
} ) ;
106
+
107
+ it ( 'should tokenize logical and ternary' , function ( ) {
108
+ var tokens = lex ( "&& || ? :" ) ;
109
+ expect ( tokens [ 0 ] . text ) . toEqual ( '&&' ) ;
110
+ expect ( tokens [ 1 ] . text ) . toEqual ( '||' ) ;
111
+ expect ( tokens [ 2 ] . text ) . toEqual ( '?' ) ;
112
+ expect ( tokens [ 3 ] . text ) . toEqual ( ':' ) ;
113
+ } ) ;
106
114
107
115
it ( 'should tokenize statements' , function ( ) {
108
116
var tokens = lex ( "a;b;" ) ;
@@ -220,6 +228,52 @@ describe('parser', function() {
220
228
expect ( scope . $eval ( "0||2" ) ) . toEqual ( 0 || 2 ) ;
221
229
expect ( scope . $eval ( "0||1&&2" ) ) . toEqual ( 0 || 1 && 2 ) ;
222
230
} ) ;
231
+
232
+ it ( 'should parse ternary' , function ( ) {
233
+ var f = scope . f = function ( ) { return true ; } ;
234
+ var g = scope . g = function ( ) { return false ; } ;
235
+ var h = scope . h = function ( ) { return 'asd' ; } ;
236
+ var i = scope . i = function ( ) { return 123 ; } ;
237
+ var id = scope . id = function ( x ) { return x ; } ;
238
+
239
+ // Simple.
240
+ expect ( scope . $eval ( '0?0:2' ) ) . toEqual ( 0 ?0 :2 ) ;
241
+ expect ( scope . $eval ( '1?0:2' ) ) . toEqual ( 1 ?0 :2 ) ;
242
+
243
+ // Nested on the left.
244
+ expect ( scope . $eval ( '0?0?0:0:2' ) ) . toEqual ( 0 ?0 ?0 :0 :2 ) ;
245
+ expect ( scope . $eval ( '1?0?0:0:2' ) ) . toEqual ( 1 ?0 ?0 :0 :2 ) ;
246
+ expect ( scope . $eval ( '0?1?0:0:2' ) ) . toEqual ( 0 ?1 ?0 :0 :2 ) ;
247
+ expect ( scope . $eval ( '0?0?1:0:2' ) ) . toEqual ( 0 ?0 ?1 :0 :2 ) ;
248
+ expect ( scope . $eval ( '0?0?0:2:3' ) ) . toEqual ( 0 ?0 ?0 :2 :3 ) ;
249
+ expect ( scope . $eval ( '1?1?0:0:2' ) ) . toEqual ( 1 ?1 ?0 :0 :2 ) ;
250
+ expect ( scope . $eval ( '1?1?1:0:2' ) ) . toEqual ( 1 ?1 ?1 :0 :2 ) ;
251
+ expect ( scope . $eval ( '1?1?1:2:3' ) ) . toEqual ( 1 ?1 ?1 :2 :3 ) ;
252
+ expect ( scope . $eval ( '1?1?1:2:3' ) ) . toEqual ( 1 ?1 ?1 :2 :3 ) ;
253
+
254
+ // Nested on the right.
255
+ expect ( scope . $eval ( '0?0:0?0:2' ) ) . toEqual ( 0 ?0 :0 ?0 :2 ) ;
256
+ expect ( scope . $eval ( '1?0:0?0:2' ) ) . toEqual ( 1 ?0 :0 ?0 :2 ) ;
257
+ expect ( scope . $eval ( '0?1:0?0:2' ) ) . toEqual ( 0 ?1 :0 ?0 :2 ) ;
258
+ expect ( scope . $eval ( '0?0:1?0:2' ) ) . toEqual ( 0 ?0 :1 ?0 :2 ) ;
259
+ expect ( scope . $eval ( '0?0:0?2:3' ) ) . toEqual ( 0 ?0 :0 ?2 :3 ) ;
260
+ expect ( scope . $eval ( '1?1:0?0:2' ) ) . toEqual ( 1 ?1 :0 ?0 :2 ) ;
261
+ expect ( scope . $eval ( '1?1:1?0:2' ) ) . toEqual ( 1 ?1 :1 ?0 :2 ) ;
262
+ expect ( scope . $eval ( '1?1:1?2:3' ) ) . toEqual ( 1 ?1 :1 ?2 :3 ) ;
263
+ expect ( scope . $eval ( '1?1:1?2:3' ) ) . toEqual ( 1 ?1 :1 ?2 :3 ) ;
264
+
265
+ // Precedence with respect to logical operators.
266
+ expect ( scope . $eval ( '0&&1?0:1' ) ) . toEqual ( 0 && 1 ?0 :1 ) ;
267
+ expect ( scope . $eval ( '0&&1?0:1' ) ) . toEqual ( ( 0 && 1 ) ?0 :1 ) ;
268
+ expect ( scope . $eval ( '1||0?0:0' ) ) . toEqual ( 1 || 0 ?0 :0 ) ;
269
+ expect ( scope . $eval ( '1||0?0:0' ) ) . toEqual ( ( 1 || 0 ) ?0 :0 ) ;
270
+
271
+ // Function calls.
272
+ expect ( scope . $eval ( 'f() ? h() : i()' ) ) . toEqual ( f ( ) ? h ( ) : i ( ) ) ;
273
+ expect ( scope . $eval ( 'g() ? h() : i()' ) ) . toEqual ( g ( ) ? h ( ) : i ( ) ) ;
274
+ expect ( scope . $eval ( 'f() ? h() : i()' ) ) . toEqual ( f ( ) ? h ( ) : i ( ) ) ;
275
+ expect ( scope . $eval ( 'id(g() ? h() : i())' ) ) . toEqual ( id ( g ( ) ? h ( ) : i ( ) ) ) ;
276
+ } ) ;
223
277
224
278
it ( 'should parse string' , function ( ) {
225
279
expect ( scope . $eval ( "'a' + 'b c'" ) ) . toEqual ( "ab c" ) ;
0 commit comments