@@ -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