@@ -80,6 +80,19 @@ describe("Replacement", function() {
80
80
expect ( parse ( 'one {plural} ' ) [ 1 ] . arg ) . to . eql ( 'plural' ) ;
81
81
} ) ;
82
82
83
+ it ( "should correctly handle apostrophes" , function ( ) {
84
+ // This mirrors the default DOUBLE_OPTIONAL behavior of ICU.
85
+ expect ( parse ( "I see '{many}'" ) [ 0 ] ) . to . eql ( "I see {many}" ) ;
86
+ expect ( parse ( "I said '{''Wow!''}'" ) [ 0 ] ) . to . eql ( "I said {'Wow!'}" ) ;
87
+ expect ( parse ( "I don't know" ) [ 0 ] ) . to . eql ( "I don't know" ) ;
88
+ expect ( parse ( "I don''t know" ) [ 0 ] ) . to . eql ( "I don't know" ) ;
89
+ expect ( parse ( "A'a''a'A" ) [ 0 ] ) . to . eql ( "A'a'a'A" ) ;
90
+ expect ( parse ( "A'{a''a}'A" ) [ 0 ] ) . to . eql ( "A{a'a}A" ) ;
91
+
92
+ // # and | are not special here.
93
+ expect ( parse ( "A '#' A" ) [ 0 ] ) . to . eql ( "A '#' A" ) ;
94
+ expect ( parse ( "A '|' A" ) [ 0 ] ) . to . eql ( "A '|' A" ) ;
95
+ } ) ;
83
96
} ) ;
84
97
describe ( "Simple arguments" , function ( ) {
85
98
@@ -216,6 +229,30 @@ describe("Plurals", function() {
216
229
) . to . eql ( 4 ) ;
217
230
} ) ;
218
231
232
+ it ( "should support quoting" , function ( ) {
233
+ expect ( parse ( "{NUM, plural, one{{x,date,y-M-dd # '#'}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] . type ) . to . eql ( 'function' ) ;
234
+ expect ( parse ( "{NUM, plural, one{{x,date,y-M-dd # '#'}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] . arg ) . to . eql ( 'x' ) ;
235
+ expect ( parse ( "{NUM, plural, one{{x,date,y-M-dd # '#'}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] . key ) . to . eql ( 'date' ) ;
236
+ // Octothorpe is not special here regardless of strict number sign
237
+ expect ( parse ( "{NUM, plural, one{{x,date,y-M-dd # '#'}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-dd # '#'" ) ;
238
+
239
+ expect ( parse ( "{NUM, plural, one{# '' #} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] . type ) . to . eql ( 'octothorpe' ) ;
240
+ expect ( parse ( "{NUM, plural, one{# '' #} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 1 ] ) . to . eql ( " ' " ) ;
241
+ expect ( parse ( "{NUM, plural, one{# '' #} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 2 ] . type ) . to . eql ( 'octothorpe' ) ;
242
+ expect ( parse ( "{NUM, plural, one{# '#'} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] . type ) . to . eql ( 'octothorpe' ) ;
243
+ expect ( parse ( "{NUM, plural, one{# '#'} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 1 ] ) . to . eql ( " #" ) ;
244
+
245
+ expect ( parse ( "{NUM, plural, one{one#} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 0 ] ) . to . eql ( 'one' ) ;
246
+ expect ( parse ( "{NUM, plural, one{one#} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 1 ] . type ) . to . eql ( 'octothorpe' ) ;
247
+
248
+ // without strict number sign
249
+ expect ( parse ( "{NUM, plural, one{# {VAR,select,key{# '#' one#}}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 2 ] . cases [ 0 ] . tokens [ 0 ] . type ) . to . eql ( 'octothorpe' )
250
+ expect ( parse ( "{NUM, plural, one{# {VAR,select,key{# '#' one#}}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 2 ] . cases [ 0 ] . tokens [ 1 ] ) . to . eql ( ' # one' )
251
+ expect ( parse ( "{NUM, plural, one{# {VAR,select,key{# '#' one#}}} two{two}}" ) [ 0 ] . cases [ 0 ] . tokens [ 2 ] . cases [ 0 ] . tokens [ 2 ] . type ) . to . eql ( 'octothorpe' )
252
+ // with strict number sign
253
+ expect ( parse ( "{NUM, plural, one{# {VAR,select,key{# '#' one#}}} two{two}}" , { strictNumberSign : true } ) [ 0 ] . cases [ 0 ] . tokens [ 2 ] . cases [ 0 ] . tokens [ 0 ] ) . to . eql ( '# \'#\' one#' )
254
+ } ) ;
255
+
219
256
} ) ;
220
257
describe ( "Ordinals" , function ( ) {
221
258
@@ -239,6 +276,61 @@ describe("Ordinals", function() {
239
276
} ) ;
240
277
241
278
} ) ;
279
+ describe ( "Functions" , function ( ) {
280
+ it ( "should accept no parameters" , function ( ) {
281
+ expect ( parse ( '{var,date}' ) [ 0 ] . type ) . to . eql ( 'function' ) ;
282
+ expect ( parse ( '{var,date}' ) [ 0 ] . key ) . to . eql ( 'date' ) ;
283
+ expect ( parse ( '{var,date}' ) [ 0 ] . params ) . to . be . empty ;
284
+ } )
285
+
286
+ it ( "should accept parameters" , function ( ) {
287
+ expect ( parse ( '{var,date,long}' ) [ 0 ] . type ) . to . eql ( 'function' ) ;
288
+ expect ( parse ( '{var,date,long}' ) [ 0 ] . key ) . to . eql ( 'date' ) ;
289
+ expect ( parse ( '{var,date,long}' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'long' ) ;
290
+ expect ( parse ( '{var,date,long,short}' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'long' ) ;
291
+ expect ( parse ( '{var,date,long,short}' ) [ 0 ] . params [ 1 ] ) . to . eql ( 'short' ) ;
292
+ } )
293
+
294
+ it ( "should accept parameters with whitespace" , function ( ) {
295
+ expect ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) [ 0 ] . type ) . to . eql ( 'function' ) ;
296
+ expect ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) [ 0 ] . key ) . to . eql ( 'date' ) ;
297
+ expect ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'y-M-d HH:mm:ss zzzz' ) ;
298
+ // This is not how ICU works. ICU does not trim whitespace,
299
+ // but messageformat-parse must trim it to maintain backwards compatibility.
300
+ expect ( parse ( '{var,date, y-M-d HH:mm:ss zzzz }' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'y-M-d HH:mm:ss zzzz' ) ;
301
+ // This is how ICU works.
302
+ expect ( parse ( '{var,date, y-M-d HH:mm:ss zzzz }' , { strictFunctionParams : true } ) [ 0 ] . params [ 0 ] ) . to . eql ( ' y-M-d HH:mm:ss zzzz ' ) ;
303
+ } )
304
+
305
+ it ( "should accept parameters with special characters" , function ( ) {
306
+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz}" ) [ 0 ] . type ) . to . eql ( 'function' ) ;
307
+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz}" ) [ 0 ] . key ) . to . eql ( 'date' ) ;
308
+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d {,} ' HH:mm:ss zzzz" ) ;
309
+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz'}'}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d {,} ' HH:mm:ss zzzz}" ) ;
310
+ expect ( parse ( "{var,date,y-M-d # HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d # HH:mm:ss zzzz" ) ;
311
+ expect ( parse ( "{var,date,y-M-d '#' HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d '#' HH:mm:ss zzzz" ) ;
312
+ // This is not how ICU works.
313
+ expect ( parse ( "{var,date,y-M-d, HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d" ) ;
314
+ expect ( parse ( "{var,date,y-M-d, HH:mm:ss zzzz}" ) [ 0 ] . params [ 1 ] ) . to . eql ( "HH:mm:ss zzzz" ) ;
315
+ // This is how ICU works, but this only allows a single argStyle parameter.
316
+ expect ( parse ( "{var,date,y-M-d, HH:mm:ss zzzz}" , { strictFunctionParams : true } ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d, HH:mm:ss zzzz" ) ;
317
+ } )
318
+
319
+ it ( "should be gracious with whitespace" , function ( ) {
320
+ var firstRes = JSON . stringify ( parse ( '{var, date, long, short}' ) ) ;
321
+ expect ( JSON . stringify ( parse ( '{ var, date, long, short }' ) ) ) . to . eql ( firstRes ) ;
322
+ expect ( JSON . stringify ( parse ( '{var,date,long,short}' ) ) ) . to . eql ( firstRes ) ;
323
+ expect ( JSON . stringify ( parse ( '{\nvar, \ndate,\n long\n\n,\n short\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
324
+ expect ( JSON . stringify ( parse ( '{\tvar\t,\t\t\r date\t\n, \tlong\n, short\t\n\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
325
+
326
+ // This is not how ICU works. ICU does not trim whitespace.
327
+ firstRes = JSON . stringify ( parse ( '{var, date, y-M-d HH:mm:ss zzzz}' ) ) ;
328
+ expect ( JSON . stringify ( parse ( '{ var, date, y-M-d HH:mm:ss zzzz }' ) ) ) . to . eql ( firstRes ) ;
329
+ expect ( JSON . stringify ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) ) ) . to . eql ( firstRes ) ;
330
+ expect ( JSON . stringify ( parse ( '{\nvar, \ndate,\n \n\n\n y-M-d HH:mm:ss zzzz\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
331
+ expect ( JSON . stringify ( parse ( '{\tvar\t,\t\t\r date\t\n, \t\ny-M-d HH:mm:ss zzzz\t\n\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
332
+ } ) ;
333
+ } ) ;
242
334
describe ( "Nested/Recursive blocks" , function ( ) {
243
335
244
336
it ( "should allow a select statement inside of a select statement" , function ( ) {
0 commit comments