@@ -239,6 +239,61 @@ describe("Ordinals", function() {
239239 } ) ;
240240
241241} ) ;
242+ describe ( "Functions" , function ( ) {
243+ it ( "should accept no parameters" , function ( ) {
244+ expect ( parse ( '{var,date}' ) [ 0 ] . type ) . to . eql ( 'function' ) ;
245+ expect ( parse ( '{var,date}' ) [ 0 ] . key ) . to . eql ( 'date' ) ;
246+ expect ( parse ( '{var,date}' ) [ 0 ] . params ) . to . be . empty ;
247+ } )
248+
249+ it ( "should accept parameters" , function ( ) {
250+ expect ( parse ( '{var,date,long}' ) [ 0 ] . type ) . to . eql ( 'function' ) ;
251+ expect ( parse ( '{var,date,long}' ) [ 0 ] . key ) . to . eql ( 'date' ) ;
252+ expect ( parse ( '{var,date,long}' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'long' ) ;
253+ expect ( parse ( '{var,date,long,short}' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'long' ) ;
254+ expect ( parse ( '{var,date,long,short}' ) [ 0 ] . params [ 1 ] ) . to . eql ( 'short' ) ;
255+ } )
256+
257+ it ( "should accept parameters with whitespace" , function ( ) {
258+ expect ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) [ 0 ] . type ) . to . eql ( 'function' ) ;
259+ expect ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) [ 0 ] . key ) . to . eql ( 'date' ) ;
260+ expect ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'y-M-d HH:mm:ss zzzz' ) ;
261+ // This is not how ICU works. ICU does not trim whitespace,
262+ // but messageformat-parse must trim it to maintain backwards compatibility.
263+ expect ( parse ( '{var,date, y-M-d HH:mm:ss zzzz }' ) [ 0 ] . params [ 0 ] ) . to . eql ( 'y-M-d HH:mm:ss zzzz' ) ;
264+ // This is how ICU works.
265+ 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 ' ) ;
266+ } )
267+
268+ it ( "should accept parameters with special characters" , function ( ) {
269+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz}" ) [ 0 ] . type ) . to . eql ( 'function' ) ;
270+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz}" ) [ 0 ] . key ) . to . eql ( 'date' ) ;
271+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d {,} ' HH:mm:ss zzzz" ) ;
272+ expect ( parse ( "{var,date,y-M-d '{,}' '' HH:mm:ss zzzz'}'}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d {,} ' HH:mm:ss zzzz}" ) ;
273+ expect ( parse ( "{var,date,y-M-d # HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d # HH:mm:ss zzzz" ) ;
274+ expect ( parse ( "{var,date,y-M-d '#' HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d '#' HH:mm:ss zzzz" ) ;
275+ // This is not how ICU works.
276+ expect ( parse ( "{var,date,y-M-d, HH:mm:ss zzzz}" ) [ 0 ] . params [ 0 ] ) . to . eql ( "y-M-d" ) ;
277+ expect ( parse ( "{var,date,y-M-d, HH:mm:ss zzzz}" ) [ 0 ] . params [ 1 ] ) . to . eql ( "HH:mm:ss zzzz" ) ;
278+ // This is how ICU works, but this only allows a single argStyle parameter.
279+ 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" ) ;
280+ } )
281+
282+ it ( "should be gracious with whitespace" , function ( ) {
283+ var firstRes = JSON . stringify ( parse ( '{var, date, long, short}' ) ) ;
284+ expect ( JSON . stringify ( parse ( '{ var, date, long, short }' ) ) ) . to . eql ( firstRes ) ;
285+ expect ( JSON . stringify ( parse ( '{var,date,long,short}' ) ) ) . to . eql ( firstRes ) ;
286+ expect ( JSON . stringify ( parse ( '{\nvar, \ndate,\n long\n\n,\n short\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
287+ expect ( JSON . stringify ( parse ( '{\tvar\t,\t\t\r date\t\n, \tlong\n, short\t\n\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
288+
289+ // This is not how ICU works. ICU does not trim whitespace.
290+ firstRes = JSON . stringify ( parse ( '{var, date, y-M-d HH:mm:ss zzzz}' ) ) ;
291+ expect ( JSON . stringify ( parse ( '{ var, date, y-M-d HH:mm:ss zzzz }' ) ) ) . to . eql ( firstRes ) ;
292+ expect ( JSON . stringify ( parse ( '{var,date,y-M-d HH:mm:ss zzzz}' ) ) ) . to . eql ( firstRes ) ;
293+ expect ( JSON . stringify ( parse ( '{\nvar, \ndate,\n \n\n\n y-M-d HH:mm:ss zzzz\n\n\n}' ) ) ) . to . eql ( firstRes ) ;
294+ 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 ) ;
295+ } ) ;
296+ } ) ;
242297describe ( "Nested/Recursive blocks" , function ( ) {
243298
244299 it ( "should allow a select statement inside of a select statement" , function ( ) {
0 commit comments