gluon-web-remote

Web remote Administration for big size of gluon routers
git clone git://archive.git.mtrnord.blog/MTRNord/gluon-web-remote.git
Log | Files | Refs | README

YtsSpecificationExamples.yml (41578B)


      1 --- %YAML:1.0
      2 test: Sequence of scalars
      3 spec: 2.1
      4 yaml: |
      5   - Mark McGwire
      6   - Sammy Sosa
      7   - Ken Griffey
      8 php: |
      9   array('Mark McGwire', 'Sammy Sosa', 'Ken Griffey')
     10 ---
     11 test: Mapping of scalars to scalars
     12 spec: 2.2
     13 yaml: |
     14   hr:  65
     15   avg: 0.278
     16   rbi: 147
     17 php: |
     18   array('hr' => 65, 'avg' => 0.278, 'rbi' => 147)
     19 ---
     20 test: Mapping of scalars to sequences
     21 spec: 2.3
     22 yaml: |
     23     american:
     24        - Boston Red Sox
     25        - Detroit Tigers
     26        - New York Yankees
     27     national:
     28        - New York Mets
     29        - Chicago Cubs
     30        - Atlanta Braves
     31 php: |
     32     array('american' =>
     33         array( 'Boston Red Sox', 'Detroit Tigers',
     34           'New York Yankees' ),
     35       'national' =>
     36         array( 'New York Mets', 'Chicago Cubs',
     37           'Atlanta Braves' )
     38     )
     39 ---
     40 test: Sequence of mappings
     41 spec: 2.4
     42 yaml: |
     43     -
     44       name: Mark McGwire
     45       hr:   65
     46       avg:  0.278
     47     -
     48       name: Sammy Sosa
     49       hr:   63
     50       avg:  0.288
     51 php: |
     52     array(
     53       array('name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278),
     54       array('name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288)
     55     )
     56 ---
     57 test: Legacy A5
     58 todo: true
     59 spec: legacy_A5
     60 yaml: |
     61     ?
     62         - New York Yankees
     63         - Atlanta Braves
     64     :
     65       - 2001-07-02
     66       - 2001-08-12
     67       - 2001-08-14
     68     ?
     69         - Detroit Tigers
     70         - Chicago Cubs
     71     :
     72       - 2001-07-23
     73 perl-busted: >
     74     YAML.pm will be able to emulate this behavior soon. In this regard
     75     it may be somewhat more correct than Python's native behaviour which
     76     can only use tuples as mapping keys. PyYAML will also need to figure
     77     out some clever way to roundtrip structured keys.
     78 python: |
     79     [
     80     {
     81         ('New York Yankees', 'Atlanta Braves'):
     82             [yaml.timestamp('2001-07-02'),
     83              yaml.timestamp('2001-08-12'),
     84              yaml.timestamp('2001-08-14')],
     85         ('Detroit Tigers', 'Chicago Cubs'):
     86         [yaml.timestamp('2001-07-23')]
     87     }
     88     ]
     89 ruby: |
     90     {
     91       [ 'New York Yankees', 'Atlanta Braves' ] =>
     92         [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ],
     93       [ 'Detroit Tigers', 'Chicago Cubs' ] =>
     94         [ Date.new( 2001, 7, 23 ) ]
     95     }
     96 syck: |
     97   struct test_node seq1[] = {
     98       { T_STR, 0, "New York Yankees" },
     99       { T_STR, 0, "Atlanta Braves" },
    100       end_node
    101   };
    102   struct test_node seq2[] = {
    103       { T_STR, 0, "2001-07-02" },
    104       { T_STR, 0, "2001-08-12" },
    105       { T_STR, 0, "2001-08-14" },
    106       end_node
    107   };
    108   struct test_node seq3[] = {
    109       { T_STR, 0, "Detroit Tigers" },
    110       { T_STR, 0, "Chicago Cubs" },
    111       end_node
    112   };
    113   struct test_node seq4[] = {
    114       { T_STR, 0, "2001-07-23" },
    115       end_node
    116   };
    117   struct test_node map[] = {
    118       { T_SEQ, 0, 0, seq1 },
    119       { T_SEQ, 0, 0, seq2 },
    120       { T_SEQ, 0, 0, seq3 },
    121       { T_SEQ, 0, 0, seq4 },
    122       end_node
    123   };
    124   struct test_node stream[] = {
    125       { T_MAP, 0, 0, map },
    126       end_node
    127   };
    128 
    129 ---
    130 test: Sequence of sequences
    131 spec: 2.5
    132 yaml: |
    133   - [ name         , hr , avg   ]
    134   - [ Mark McGwire , 65 , 0.278 ]
    135   - [ Sammy Sosa   , 63 , 0.288 ]
    136 php: |
    137   array(
    138     array( 'name', 'hr', 'avg' ),
    139     array( 'Mark McGwire', 65, 0.278 ),
    140     array( 'Sammy Sosa', 63, 0.288 )
    141   )
    142 ---
    143 test: Mapping of mappings
    144 todo: true
    145 spec: 2.6
    146 yaml: |
    147   Mark McGwire: {hr: 65, avg: 0.278}
    148   Sammy Sosa: {
    149       hr: 63,
    150       avg: 0.288
    151     }
    152 php: |
    153   array(
    154     'Mark McGwire' =>
    155       array( 'hr' => 65, 'avg' => 0.278 ),
    156     'Sammy Sosa' =>
    157       array( 'hr' => 63, 'avg' => 0.288 )
    158   )
    159 ---
    160 test: Two documents in a stream each with a leading comment
    161 todo: true
    162 spec: 2.7
    163 yaml: |
    164   # Ranking of 1998 home runs
    165   ---
    166   - Mark McGwire
    167   - Sammy Sosa
    168   - Ken Griffey
    169 
    170   # Team ranking
    171   ---
    172   - Chicago Cubs
    173   - St Louis Cardinals
    174 ruby: |
    175   y = YAML::Stream.new
    176   y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] )
    177   y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] )
    178 documents: 2
    179 
    180 ---
    181 test: Play by play feed from a game
    182 todo: true
    183 spec: 2.8
    184 yaml: |
    185   ---
    186   time: 20:03:20
    187   player: Sammy Sosa
    188   action: strike (miss)
    189   ...
    190   ---
    191   time: 20:03:47
    192   player: Sammy Sosa
    193   action: grand slam
    194   ...
    195 perl: |
    196   [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]
    197 documents: 2
    198 
    199 ---
    200 test: Single document with two comments
    201 spec: 2.9
    202 yaml: |
    203   hr: # 1998 hr ranking
    204     - Mark McGwire
    205     - Sammy Sosa
    206   rbi:
    207     # 1998 rbi ranking
    208     - Sammy Sosa
    209     - Ken Griffey
    210 php: |
    211   array(
    212     'hr' => array( 'Mark McGwire', 'Sammy Sosa' ),
    213     'rbi' => array( 'Sammy Sosa', 'Ken Griffey' )
    214   )
    215 ---
    216 test: Node for Sammy Sosa appears twice in this document
    217 spec: 2.10
    218 yaml: |
    219    ---
    220    hr:
    221       - Mark McGwire
    222       # Following node labeled SS
    223       - &SS Sammy Sosa
    224    rbi:
    225       - *SS # Subsequent occurrence
    226       - Ken Griffey
    227 php: |
    228    array(
    229       'hr' =>
    230          array('Mark McGwire', 'Sammy Sosa'),
    231       'rbi' =>
    232          array('Sammy Sosa', 'Ken Griffey')
    233    )
    234 ---
    235 test: Mapping between sequences
    236 todo: true
    237 spec: 2.11
    238 yaml: |
    239    ? # PLAY SCHEDULE
    240      - Detroit Tigers
    241      - Chicago Cubs
    242    :
    243      - 2001-07-23
    244 
    245    ? [ New York Yankees,
    246        Atlanta Braves ]
    247    : [ 2001-07-02, 2001-08-12,
    248        2001-08-14 ]
    249 ruby: |
    250    {
    251       [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ],
    252       [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ]
    253    }
    254 syck: |
    255   struct test_node seq1[] = {
    256       { T_STR, 0, "New York Yankees" },
    257       { T_STR, 0, "Atlanta Braves" },
    258       end_node
    259   };
    260   struct test_node seq2[] = {
    261       { T_STR, 0, "2001-07-02" },
    262       { T_STR, 0, "2001-08-12" },
    263       { T_STR, 0, "2001-08-14" },
    264       end_node
    265   };
    266   struct test_node seq3[] = {
    267       { T_STR, 0, "Detroit Tigers" },
    268       { T_STR, 0, "Chicago Cubs" },
    269       end_node
    270   };
    271   struct test_node seq4[] = {
    272       { T_STR, 0, "2001-07-23" },
    273       end_node
    274   };
    275   struct test_node map[] = {
    276       { T_SEQ, 0, 0, seq3 },
    277       { T_SEQ, 0, 0, seq4 },
    278       { T_SEQ, 0, 0, seq1 },
    279       { T_SEQ, 0, 0, seq2 },
    280       end_node
    281   };
    282   struct test_node stream[] = {
    283       { T_MAP, 0, 0, map },
    284       end_node
    285   };
    286 
    287 ---
    288 test: Sequence key shortcut
    289 spec: 2.12
    290 yaml: |
    291   ---
    292   # products purchased
    293   - item    : Super Hoop
    294     quantity: 1
    295   - item    : Basketball
    296     quantity: 4
    297   - item    : Big Shoes
    298     quantity: 1
    299 php: |
    300   array (
    301     array (
    302       'item' => 'Super Hoop',
    303       'quantity' => 1,
    304     ),
    305     array (
    306       'item' => 'Basketball',
    307       'quantity' => 4,
    308     ),
    309     array (
    310       'item' => 'Big Shoes',
    311       'quantity' => 1,
    312     )
    313   )
    314 perl: |
    315   [
    316      { item => 'Super Hoop', quantity => 1 },
    317      { item => 'Basketball', quantity => 4 },
    318      { item => 'Big Shoes',  quantity => 1 }
    319   ]
    320 
    321 ruby: |
    322   [
    323      { 'item' => 'Super Hoop', 'quantity' => 1 },
    324      { 'item' => 'Basketball', 'quantity' => 4 },
    325      { 'item' => 'Big Shoes', 'quantity' => 1 }
    326   ]
    327 python: |
    328   [
    329        { 'item': 'Super Hoop', 'quantity': 1 },
    330        { 'item': 'Basketball', 'quantity': 4 },
    331        { 'item': 'Big Shoes',  'quantity': 1 }
    332   ]
    333 syck: |
    334   struct test_node map1[] = {
    335       { T_STR, 0, "item" },
    336           { T_STR, 0, "Super Hoop" },
    337       { T_STR, 0, "quantity" },
    338           { T_STR, 0, "1" },
    339       end_node
    340   };
    341   struct test_node map2[] = {
    342       { T_STR, 0, "item" },
    343           { T_STR, 0, "Basketball" },
    344       { T_STR, 0, "quantity" },
    345           { T_STR, 0, "4" },
    346       end_node
    347   };
    348   struct test_node map3[] = {
    349       { T_STR, 0, "item" },
    350           { T_STR, 0, "Big Shoes" },
    351       { T_STR, 0, "quantity" },
    352           { T_STR, 0, "1" },
    353       end_node
    354   };
    355   struct test_node seq[] = {
    356       { T_MAP, 0, 0, map1 },
    357       { T_MAP, 0, 0, map2 },
    358       { T_MAP, 0, 0, map3 },
    359       end_node
    360   };
    361   struct test_node stream[] = {
    362       { T_SEQ, 0, 0, seq },
    363       end_node
    364   };
    365 
    366 
    367 ---
    368 test: Literal perserves newlines
    369 todo: true
    370 spec: 2.13
    371 yaml: |
    372   # ASCII Art
    373   --- |
    374     \//||\/||
    375     // ||  ||_
    376 perl: |
    377   "\\//||\\/||\n// ||  ||_\n"
    378 ruby: |
    379   "\\//||\\/||\n// ||  ||_\n"
    380 python: |
    381     [
    382         flushLeft(
    383         """
    384         \//||\/||
    385         // ||  ||_
    386         """
    387         )
    388     ]
    389 syck: |
    390   struct test_node stream[] = {
    391       { T_STR, 0, "\\//||\\/||\n// ||  ||_\n" },
    392       end_node
    393   };
    394 
    395 ---
    396 test: Folded treats newlines as a space
    397 todo: true
    398 spec: 2.14
    399 yaml: |
    400   ---
    401     Mark McGwire's
    402     year was crippled
    403     by a knee injury.
    404 perl: |
    405   "Mark McGwire's year was crippled by a knee injury."
    406 ruby: |
    407   "Mark McGwire's year was crippled by a knee injury."
    408 python: |
    409     [ "Mark McGwire's year was crippled by a knee injury." ]
    410 syck: |
    411   struct test_node stream[] = {
    412       { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." },
    413       end_node
    414   };
    415 
    416 ---
    417 test: Newlines preserved for indented and blank lines
    418 todo: true
    419 spec: 2.15
    420 yaml: |
    421   --- >
    422    Sammy Sosa completed another
    423    fine season with great stats.
    424 
    425      63 Home Runs
    426      0.288 Batting Average
    427 
    428    What a year!
    429 perl: |
    430   "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!\n"
    431 ruby: |
    432   "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!\n"
    433 python: |
    434     [
    435         flushLeft(
    436         """
    437         Sammy Sosa completed another fine season with great stats.
    438 
    439           63 Home Runs
    440           0.288 Batting Average
    441 
    442         What a year!
    443         """
    444         )
    445     ]
    446 syck: |
    447   struct test_node stream[] = {
    448       { T_STR, 0, "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!\n" },
    449       end_node
    450   };
    451 
    452 
    453 ---
    454 test: Indentation determines scope
    455 spec: 2.16
    456 yaml: |
    457   name: Mark McGwire
    458   accomplishment: >
    459      Mark set a major league
    460      home run record in 1998.
    461   stats: |
    462      65 Home Runs
    463      0.278 Batting Average
    464 php: |
    465   array(
    466     'name' => 'Mark McGwire',
    467     'accomplishment' => "Mark set a major league home run record in 1998.\n",
    468     'stats' => "65 Home Runs\n0.278 Batting Average\n"
    469   )
    470 ---
    471 test: Quoted scalars
    472 todo: true
    473 spec: 2.17
    474 yaml: |
    475   unicode: "Sosa did fine.\u263A"
    476   control: "\b1998\t1999\t2000\n"
    477   hexesc:  "\x0D\x0A is \r\n"
    478 
    479   single: '"Howdy!" he cried.'
    480   quoted: ' # not a ''comment''.'
    481   tie-fighter: '|\-*-/|'
    482 ruby: |
    483   {
    484     "tie-fighter" => "|\\-*-/|",
    485     "control"=>"\0101998\t1999\t2000\n",
    486     "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'),
    487     "quoted"=>" # not a 'comment'.",
    488     "single"=>"\"Howdy!\" he cried.",
    489     "hexesc"=>"\r\n is \r\n"
    490   }
    491 ---
    492 test: Multiline flow scalars
    493 todo: true
    494 spec: 2.18
    495 yaml: |
    496   plain:
    497     This unquoted scalar
    498     spans many lines.
    499 
    500   quoted: "So does this
    501     quoted scalar.\n"
    502 ruby: |
    503   {
    504     'plain' => 'This unquoted scalar spans many lines.',
    505     'quoted' => "So does this quoted scalar.\n"
    506   }
    507 ---
    508 test: Integers
    509 spec: 2.19
    510 yaml: |
    511   canonical: 12345
    512   decimal: +12,345
    513   octal: 014
    514   hexadecimal: 0xC
    515 php: |
    516   array(
    517     'canonical' => 12345,
    518     'decimal' => 12345,
    519     'octal' => 014,
    520     'hexadecimal' => 0xC
    521   )
    522 ---
    523 # FIX: spec shows parens around -inf and NaN
    524 test: Floating point
    525 spec: 2.20
    526 yaml: |
    527   canonical: 1.23015e+3
    528   exponential: 12.3015e+02
    529   fixed: 1,230.15
    530   negative infinity: -.inf
    531   not a number: .NaN
    532   float as whole number: !!float 1
    533 php: |
    534   array(
    535     'canonical' => 1230.15,
    536     'exponential' => 1230.15,
    537     'fixed' => 1230.15,
    538     'negative infinity' => log(0),
    539     'not a number' => -log(0),
    540     'float as whole number' => (float) 1
    541   )
    542 ---
    543 test: Miscellaneous
    544 spec: 2.21
    545 yaml: |
    546   null: ~
    547   true: true
    548   false: false
    549   string: '12345'
    550 php: |
    551   array(
    552     '' => null,
    553     1 => true,
    554     0 => false,
    555     'string' => '12345'
    556   )
    557 ---
    558 test: Timestamps
    559 todo: true
    560 spec: 2.22
    561 yaml: |
    562   canonical: 2001-12-15T02:59:43.1Z
    563   iso8601:  2001-12-14t21:59:43.10-05:00
    564   spaced:  2001-12-14 21:59:43.10 -05:00
    565   date:   2002-12-14 # Time is noon UTC
    566 php: |
    567   array(
    568     'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
    569     'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
    570     'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
    571     'date' => Date.new( 2002, 12, 14 )
    572   )
    573 ---
    574 test: legacy Timestamps test
    575 todo: true
    576 spec: legacy D4
    577 yaml: |
    578     canonical: 2001-12-15T02:59:43.00Z
    579     iso8601:  2001-02-28t21:59:43.00-05:00
    580     spaced:  2001-12-14 21:59:43.00 -05:00
    581     date:   2002-12-14
    582 php: |
    583    array(
    584      'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ),
    585      'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ),
    586      'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ),
    587      'date' => Date.new( 2002, 12, 14 )
    588    )
    589 ---
    590 test: Various explicit families
    591 todo: true
    592 spec: 2.23
    593 yaml: |
    594   not-date: !str 2002-04-28
    595   picture: !binary |
    596    R0lGODlhDAAMAIQAAP//9/X
    597    17unp5WZmZgAAAOfn515eXv
    598    Pz7Y6OjuDg4J+fn5OTk6enp
    599    56enmleECcgggoBADs=
    600 
    601   application specific tag: !!something |
    602    The semantics of the tag
    603    above may be different for
    604    different documents.
    605 
    606 ruby-setup: |
    607   YAML.add_private_type( "something" ) do |type, val|
    608     "SOMETHING: #{val}"
    609   end
    610 ruby: |
    611   {
    612     'not-date' => '2002-04-28',
    613     'picture' => "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236i^\020' \202\n\001\000;",
    614     'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n"
    615   }
    616 ---
    617 test: Application specific family
    618 todo: true
    619 spec: 2.24
    620 yaml: |
    621   # Establish a tag prefix
    622   --- !clarkevans.com,2002/graph/^shape
    623     # Use the prefix: shorthand for
    624     # !clarkevans.com,2002/graph/circle
    625   - !^circle
    626     center: &ORIGIN {x: 73, 'y': 129}
    627     radius: 7
    628   - !^line # !clarkevans.com,2002/graph/line
    629     start: *ORIGIN
    630     finish: { x: 89, 'y': 102 }
    631   - !^label
    632     start: *ORIGIN
    633     color: 0xFFEEBB
    634     value: Pretty vector drawing.
    635 ruby-setup: |
    636   YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val|
    637     if Array === val
    638       val << "Shape Container"
    639       val
    640     else
    641       raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
    642     end
    643   }
    644   one_shape_proc = Proc.new { |type, val|
    645     scheme, domain, type = type.split( /:/, 3 )
    646     if val.is_a? ::Hash
    647       val['TYPE'] = "Shape: #{type}"
    648       val
    649     else
    650       raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
    651     end
    652   }
    653   YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc )
    654   YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc )
    655   YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc )
    656 ruby: |
    657   [
    658     {
    659       "radius" => 7,
    660       "center"=>
    661       {
    662         "x" => 73,
    663         "y" => 129
    664       },
    665       "TYPE" => "Shape: graph/circle"
    666     }, {
    667       "finish" =>
    668       {
    669         "x" => 89,
    670         "y" => 102
    671       },
    672       "TYPE" => "Shape: graph/line",
    673       "start" =>
    674       {
    675         "x" => 73,
    676         "y" => 129
    677       }
    678     }, {
    679       "TYPE" => "Shape: graph/label",
    680       "value" => "Pretty vector drawing.",
    681       "start" =>
    682       {
    683         "x" => 73,
    684         "y" => 129
    685       },
    686       "color" => 16772795
    687     },
    688     "Shape Container"
    689   ]
    690 # ---
    691 # test: Unordered set
    692 # spec: 2.25
    693 # yaml: |
    694 #   # sets are represented as a
    695 #   # mapping where each key is
    696 #   # associated with the empty string
    697 #   --- !set
    698 #   ? Mark McGwire
    699 #   ? Sammy Sosa
    700 #   ? Ken Griff
    701 ---
    702 test: Ordered mappings
    703 todo: true
    704 spec: 2.26
    705 yaml: |
    706   # ordered maps are represented as
    707   # a sequence of mappings, with
    708   # each mapping having one key
    709   --- !omap
    710   - Mark McGwire: 65
    711   - Sammy Sosa: 63
    712   - Ken Griffy: 58
    713 ruby: |
    714   YAML::Omap[
    715     'Mark McGwire', 65,
    716     'Sammy Sosa', 63,
    717     'Ken Griffy', 58
    718   ]
    719 ---
    720 test: Invoice
    721 dump_skip: true
    722 spec: 2.27
    723 yaml: |
    724   --- !clarkevans.com,2002/^invoice
    725   invoice: 34843
    726   date   : 2001-01-23
    727   bill-to: &id001
    728       given  : Chris
    729       family : Dumars
    730       address:
    731           lines: |
    732               458 Walkman Dr.
    733               Suite #292
    734           city    : Royal Oak
    735           state   : MI
    736           postal  : 48046
    737   ship-to: *id001
    738   product:
    739       -
    740         sku         : BL394D
    741         quantity    : 4
    742         description : Basketball
    743         price       : 450.00
    744       -
    745         sku         : BL4438H
    746         quantity    : 1
    747         description : Super Hoop
    748         price       : 2392.00
    749   tax  : 251.42
    750   total: 4443.52
    751   comments: >
    752     Late afternoon is best.
    753     Backup contact is Nancy
    754     Billsmer @ 338-4338.
    755 php: |
    756   array(
    757      'invoice' => 34843, 'date' => mktime(0, 0, 0, 1, 23, 2001),
    758      'bill-to' =>
    759       array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
    760      , 'ship-to' =>
    761       array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
    762      , 'product' =>
    763        array(
    764         array( 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ),
    765         array( 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 )
    766       ),
    767      'tax' => 251.42, 'total' => 4443.52,
    768      'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n"
    769   )
    770 ---
    771 test: Log file
    772 todo: true
    773 spec: 2.28
    774 yaml: |
    775   ---
    776   Time: 2001-11-23 15:01:42 -05:00
    777   User: ed
    778   Warning: >
    779     This is an error message
    780     for the log file
    781   ---
    782   Time: 2001-11-23 15:02:31 -05:00
    783   User: ed
    784   Warning: >
    785     A slightly different error
    786     message.
    787   ---
    788   Date: 2001-11-23 15:03:17 -05:00
    789   User: ed
    790   Fatal: >
    791     Unknown variable "bar"
    792   Stack:
    793     - file: TopClass.py
    794       line: 23
    795       code: |
    796         x = MoreObject("345\n")
    797     - file: MoreClass.py
    798       line: 58
    799       code: |-
    800         foo = bar
    801 ruby: |
    802   y = YAML::Stream.new
    803   y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ),
    804            'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } )
    805   y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ),
    806            'User' => 'ed', 'Warning' => "A slightly different error message.\n" } )
    807   y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ),
    808            'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n",
    809            'Stack' => [
    810            { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" },
    811            { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } )
    812 documents: 3
    813 
    814 ---
    815 test: Throwaway comments
    816 yaml: |
    817    ### These are four throwaway comment  ###
    818 
    819    ### lines (the second line is empty). ###
    820    this: |   # Comments may trail lines.
    821       contains three lines of text.
    822       The third one starts with a
    823       # character. This isn't a comment.
    824 
    825    # These are three throwaway comment
    826    # lines (the first line is empty).
    827 php: |
    828    array(
    829      'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n"
    830    )
    831 ---
    832 test: Document with a single value
    833 todo: true
    834 yaml: |
    835    --- >
    836    This YAML stream contains a single text value.
    837    The next stream is a log file - a sequence of
    838    log entries. Adding an entry to the log is a
    839    simple matter of appending it at the end.
    840 ruby: |
    841    "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n"
    842 ---
    843 test: Document stream
    844 todo: true
    845 yaml: |
    846    ---
    847    at: 2001-08-12 09:25:00.00 Z
    848    type: GET
    849    HTTP: '1.0'
    850    url: '/index.html'
    851    ---
    852    at: 2001-08-12 09:25:10.00 Z
    853    type: GET
    854    HTTP: '1.0'
    855    url: '/toc.html'
    856 ruby: |
    857    y = YAML::Stream.new
    858    y.add( {
    859       'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ),
    860       'type' => 'GET',
    861       'HTTP' => '1.0',
    862       'url' => '/index.html'
    863    } )
    864    y.add( {
    865       'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ),
    866       'type' => 'GET',
    867       'HTTP' => '1.0',
    868       'url' => '/toc.html'
    869    } )
    870 documents: 2
    871 
    872 ---
    873 test: Top level mapping
    874 yaml: |
    875    # This stream is an example of a top-level mapping.
    876    invoice : 34843
    877    date    : 2001-01-23
    878    total   : 4443.52
    879 php: |
    880    array(
    881       'invoice' => 34843,
    882       'date' => mktime(0, 0, 0, 1, 23, 2001),
    883       'total' => 4443.52
    884    )
    885 ---
    886 test: Single-line documents
    887 todo: true
    888 yaml: |
    889   # The following is a sequence of three documents.
    890   # The first contains an empty mapping, the second
    891   # an empty sequence, and the last an empty string.
    892   --- {}
    893   --- [ ]
    894   --- ''
    895 ruby: |
    896   y = YAML::Stream.new
    897   y.add( {} )
    898   y.add( [] )
    899   y.add( '' )
    900 documents: 3
    901 
    902 ---
    903 test: Document with pause
    904 todo: true
    905 yaml: |
    906   # A communication channel based on a YAML stream.
    907   ---
    908   sent at: 2002-06-06 11:46:25.10 Z
    909   payload: Whatever
    910   # Receiver can process this as soon as the following is sent:
    911   ...
    912   # Even if the next message is sent long after:
    913   ---
    914   sent at: 2002-06-06 12:05:53.47 Z
    915   payload: Whatever
    916   ...
    917 ruby: |
    918   y = YAML::Stream.new
    919   y.add(
    920     { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ),
    921       'payload' => 'Whatever' }
    922   )
    923   y.add(
    924     { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) }
    925   )
    926 documents: 2
    927 
    928 ---
    929 test: Explicit typing
    930 yaml: |
    931    integer: 12
    932    also int: ! "12"
    933    string: !str 12
    934 php: |
    935    array( 'integer' => 12, 'also int' => 12, 'string' => '12' )
    936 ---
    937 test: Private types
    938 todo: true
    939 yaml: |
    940   # Both examples below make use of the 'x-private:ball'
    941   # type family URI, but with different semantics.
    942   ---
    943   pool: !!ball
    944     number: 8
    945     color: black
    946   ---
    947   bearing: !!ball
    948     material: steel
    949 ruby: |
    950   y = YAML::Stream.new
    951   y.add( { 'pool' =>
    952     YAML::PrivateType.new( 'ball',
    953       { 'number' => 8, 'color' => 'black' } ) }
    954   )
    955   y.add( { 'bearing' =>
    956     YAML::PrivateType.new( 'ball',
    957       { 'material' => 'steel' } ) }
    958   )
    959 documents: 2
    960 
    961 ---
    962 test: Type family under yaml.org
    963 yaml: |
    964   # The URI is 'tag:yaml.org,2002:str'
    965   - !str a Unicode string
    966 php: |
    967   array( 'a Unicode string' )
    968 ---
    969 test: Type family under perl.yaml.org
    970 todo: true
    971 yaml: |
    972   # The URI is 'tag:perl.yaml.org,2002:Text::Tabs'
    973   - !perl/Text::Tabs {}
    974 ruby: |
    975   [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ]
    976 ---
    977 test: Type family under clarkevans.com
    978 todo: true
    979 yaml: |
    980   # The URI is 'tag:clarkevans.com,2003-02:timesheet'
    981   - !clarkevans.com,2003-02/timesheet {}
    982 ruby: |
    983   [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ]
    984 ---
    985 test: URI Escaping
    986 todo: true
    987 yaml: |
    988   same:
    989     - !domain.tld,2002/type\x30 value
    990     - !domain.tld,2002/type0 value
    991   different: # As far as the YAML parser is concerned
    992     - !domain.tld,2002/type%30 value
    993     - !domain.tld,2002/type0 value
    994 ruby-setup: |
    995   YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val|
    996     "ONE: #{val}"
    997   }
    998   YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val|
    999     "TWO: #{val}"
   1000   }
   1001 ruby: |
   1002   { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] }
   1003 ---
   1004 test: URI Prefixing
   1005 todo: true
   1006 yaml: |
   1007   # 'tag:domain.tld,2002:invoice' is some type family.
   1008   invoice: !domain.tld,2002/^invoice
   1009     # 'seq' is shorthand for 'tag:yaml.org,2002:seq'.
   1010     # This does not effect '^customer' below
   1011     # because it is does not specify a prefix.
   1012     customers: !seq
   1013       # '^customer' is shorthand for the full
   1014       # notation 'tag:domain.tld,2002:customer'.
   1015       - !^customer
   1016         given : Chris
   1017         family : Dumars
   1018 ruby-setup: |
   1019   YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val|
   1020     if val.is_a? ::Hash
   1021       scheme, domain, type = type.split( /:/, 3 )
   1022       val['type'] = "domain #{type}"
   1023       val
   1024     else
   1025       raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect
   1026     end
   1027   }
   1028 ruby: |
   1029   { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } }
   1030 
   1031 ---
   1032 test: Overriding anchors
   1033 yaml: |
   1034   anchor : &A001 This scalar has an anchor.
   1035   override : &A001 >
   1036    The alias node below is a
   1037    repeated use of this value.
   1038   alias : *A001
   1039 php: |
   1040   array( 'anchor' => 'This scalar has an anchor.',
   1041     'override' => "The alias node below is a repeated use of this value.\n",
   1042     'alias' => "The alias node below is a repeated use of this value.\n" )
   1043 ---
   1044 test: Flow and block formatting
   1045 todo: true
   1046 yaml: |
   1047   empty: []
   1048   flow: [ one, two, three # May span lines,
   1049            , four,           # indentation is
   1050              five ]          # mostly ignored.
   1051   block:
   1052    - First item in top sequence
   1053    -
   1054     - Subordinate sequence entry
   1055    - >
   1056      A folded sequence entry
   1057    - Sixth item in top sequence
   1058 ruby: |
   1059   { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ],
   1060     'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ],
   1061     "A folded sequence entry\n", 'Sixth item in top sequence' ] }
   1062 ---
   1063 test: Complete mapping test
   1064 todo: true
   1065 yaml: |
   1066  empty: {}
   1067  flow: { one: 1, two: 2 }
   1068  spanning: { one: 1,
   1069     two: 2 }
   1070  block:
   1071   first : First entry
   1072   second:
   1073    key: Subordinate mapping
   1074   third:
   1075    - Subordinate sequence
   1076    - { }
   1077    - Previous mapping is empty.
   1078    - A key: value pair in a sequence.
   1079      A second: key:value pair.
   1080    - The previous entry is equal to the following one.
   1081    -
   1082      A key: value pair in a sequence.
   1083      A second: key:value pair.
   1084   !float 12 : This key is a float.
   1085   ? >
   1086    ?
   1087   : This key had to be protected.
   1088   "\a" : This key had to be escaped.
   1089   ? >
   1090    This is a
   1091    multi-line
   1092    folded key
   1093   : Whose value is
   1094     also multi-line.
   1095   ? this also works as a key
   1096   : with a value at the next line.
   1097   ?
   1098    - This key
   1099    - is a sequence
   1100   :
   1101    - With a sequence value.
   1102   ?
   1103    This: key
   1104    is a: mapping
   1105   :
   1106    with a: mapping value.
   1107 ruby: |
   1108   { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 },
   1109     'spanning' => { 'one' => 1, 'two' => 2 },
   1110     'block' => { 'first' => 'First entry', 'second' =>
   1111     { 'key' => 'Subordinate mapping' }, 'third' =>
   1112       [ 'Subordinate sequence', {}, 'Previous mapping is empty.',
   1113         { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' },
   1114         'The previous entry is equal to the following one.',
   1115         { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ],
   1116     12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.',
   1117     "\a" => 'This key had to be escaped.',
   1118     "This is a multi-line folded key\n" => "Whose value is also multi-line.",
   1119     'this also works as a key' => 'with a value at the next line.',
   1120     [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } }
   1121   # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact
   1122   obj_y['block'].keys.each { |k|
   1123     if Hash === k
   1124       v = obj_y['block'][k]
   1125       if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.'
   1126          obj_r['block'][k] = v
   1127       end
   1128     end
   1129   }
   1130 ---
   1131 test: Literal explicit indentation
   1132 yaml: |
   1133    # Explicit indentation must
   1134    # be given in all the three
   1135    # following cases.
   1136    leading spaces: |2
   1137          This value starts with four spaces.
   1138 
   1139    leading line break: |2
   1140 
   1141      This value starts with a line break.
   1142 
   1143    leading comment indicator: |2
   1144      # first line starts with a
   1145      # character.
   1146 
   1147    # Explicit indentation may
   1148    # also be given when it is
   1149    # not required.
   1150    redundant: |2
   1151      This value is indented 2 spaces.
   1152 php: |
   1153    array(
   1154       'leading spaces' => "    This value starts with four spaces.\n",
   1155       'leading line break' => "\nThis value starts with a line break.\n",
   1156       'leading comment indicator' => "# first line starts with a\n# character.\n",
   1157       'redundant' => "This value is indented 2 spaces.\n"
   1158    )
   1159 ---
   1160 test: Chomping and keep modifiers
   1161 yaml: |
   1162     clipped: |
   1163         This has one newline.
   1164 
   1165     same as "clipped" above: "This has one newline.\n"
   1166 
   1167     stripped: |-
   1168         This has no newline.
   1169 
   1170     same as "stripped" above: "This has no newline."
   1171 
   1172     kept: |+
   1173         This has two newlines.
   1174 
   1175     same as "kept" above: "This has two newlines.\n\n"
   1176 php: |
   1177     array(
   1178       'clipped' => "This has one newline.\n",
   1179       'same as "clipped" above' => "This has one newline.\n",
   1180       'stripped' => 'This has no newline.',
   1181       'same as "stripped" above' => 'This has no newline.',
   1182       'kept' => "This has two newlines.\n\n",
   1183       'same as "kept" above' => "This has two newlines.\n\n"
   1184     )
   1185 ---
   1186 test: Literal combinations
   1187 todo: true
   1188 yaml: |
   1189    empty: |
   1190 
   1191    literal: |
   1192     The \ ' " characters may be
   1193     freely used. Leading white
   1194        space is significant.
   1195 
   1196     Line breaks are significant.
   1197     Thus this value contains one
   1198     empty line and ends with a
   1199     single line break, but does
   1200     not start with one.
   1201 
   1202    is equal to: "The \\ ' \" characters may \
   1203     be\nfreely used. Leading white\n   space \
   1204     is significant.\n\nLine breaks are \
   1205     significant.\nThus this value contains \
   1206     one\nempty line and ends with a\nsingle \
   1207     line break, but does\nnot start with one.\n"
   1208 
   1209    # Comments may follow a block
   1210    # scalar value. They must be
   1211    # less indented.
   1212 
   1213    # Modifiers may be combined in any order.
   1214    indented and chomped: |2-
   1215        This has no newline.
   1216 
   1217    also written as: |-2
   1218        This has no newline.
   1219 
   1220    both are equal to: "  This has no newline."
   1221 php: |
   1222    array(
   1223      'empty' => '',
   1224      'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n   space " +
   1225        "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
   1226        "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
   1227      'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n   space " +
   1228        "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
   1229        "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
   1230      'indented and chomped' => '  This has no newline.',
   1231      'also written as' => '  This has no newline.',
   1232      'both are equal to' => '  This has no newline.'
   1233    )
   1234 ---
   1235 test: Folded combinations
   1236 todo: true
   1237 yaml: |
   1238    empty: >
   1239 
   1240    one paragraph: >
   1241     Line feeds are converted
   1242     to spaces, so this value
   1243     contains no line breaks
   1244     except for the final one.
   1245 
   1246    multiple paragraphs: >2
   1247 
   1248      An empty line, either
   1249      at the start or in
   1250      the value:
   1251 
   1252      Is interpreted as a
   1253      line break. Thus this
   1254      value contains three
   1255      line breaks.
   1256 
   1257    indented text: >
   1258        This is a folded
   1259        paragraph followed
   1260        by a list:
   1261         * first entry
   1262         * second entry
   1263        Followed by another
   1264        folded paragraph,
   1265        another list:
   1266 
   1267         * first entry
   1268 
   1269         * second entry
   1270 
   1271        And a final folded
   1272        paragraph.
   1273 
   1274    above is equal to: |
   1275        This is a folded paragraph followed by a list:
   1276         * first entry
   1277         * second entry
   1278        Followed by another folded paragraph, another list:
   1279 
   1280         * first entry
   1281 
   1282         * second entry
   1283 
   1284        And a final folded paragraph.
   1285 
   1286    # Explicit comments may follow
   1287    # but must be less indented.
   1288 php: |
   1289    array(
   1290      'empty' => '',
   1291      'one paragraph' => 'Line feeds are converted to spaces, so this value'.
   1292        " contains no line breaks except for the final one.\n",
   1293      'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n".
   1294        "Is interpreted as a line break. Thus this value contains three line breaks.\n",
   1295      'indented text' => "This is a folded paragraph followed by a list:\n".
   1296        " * first entry\n * second entry\nFollowed by another folded paragraph, ".
   1297        "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n",
   1298      'above is equal to' => "This is a folded paragraph followed by a list:\n".
   1299        " * first entry\n * second entry\nFollowed by another folded paragraph, ".
   1300        "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n"
   1301    )
   1302 ---
   1303 test: Single quotes
   1304 todo: true
   1305 yaml: |
   1306    empty: ''
   1307    second: '! : \ etc. can be used freely.'
   1308    third: 'a single quote '' must be escaped.'
   1309    span: 'this contains
   1310          six spaces
   1311 
   1312          and one
   1313          line break'
   1314    is same as: "this contains six spaces\nand one line break"
   1315 php: |
   1316    array(
   1317      'empty' => '',
   1318      'second' => '! : \\ etc. can be used freely.',
   1319      'third' => "a single quote ' must be escaped.",
   1320      'span' => "this contains six spaces\nand one line break",
   1321      'is same as' => "this contains six spaces\nand one line break"
   1322    )
   1323 ---
   1324 test: Double quotes
   1325 todo: true
   1326 yaml: |
   1327    empty: ""
   1328    second: "! : etc. can be used freely."
   1329    third: "a \" or a \\ must be escaped."
   1330    fourth: "this value ends with an LF.\n"
   1331    span: "this contains
   1332      four  \
   1333          spaces"
   1334    is equal to: "this contains four  spaces"
   1335 php: |
   1336    array(
   1337      'empty' => '',
   1338      'second' => '! : etc. can be used freely.',
   1339      'third' => 'a " or a \\ must be escaped.',
   1340      'fourth' => "this value ends with an LF.\n",
   1341      'span' => "this contains four  spaces",
   1342      'is equal to' => "this contains four  spaces"
   1343    )
   1344 ---
   1345 test: Unquoted strings
   1346 todo: true
   1347 yaml: |
   1348    first: There is no unquoted empty string.
   1349 
   1350    second: 12          ## This is an integer.
   1351 
   1352    third: !str 12      ## This is a string.
   1353 
   1354    span: this contains
   1355          six spaces
   1356 
   1357          and one
   1358          line break
   1359 
   1360    indicators: this has no comments.
   1361                #:foo and bar# are
   1362                both text.
   1363 
   1364    flow: [ can span
   1365               lines, # comment
   1366               like
   1367               this ]
   1368 
   1369    note: { one-line keys: but multi-line values }
   1370 
   1371 php: |
   1372    array(
   1373      'first' => 'There is no unquoted empty string.',
   1374      'second' => 12,
   1375      'third' => '12',
   1376      'span' => "this contains six spaces\nand one line break",
   1377      'indicators' => "this has no comments. #:foo and bar# are both text.",
   1378      'flow' => [ 'can span lines', 'like this' ],
   1379      'note' => { 'one-line keys' => 'but multi-line values' }
   1380    )
   1381 ---
   1382 test: Spanning sequences
   1383 todo: true
   1384 yaml: |
   1385    # The following are equal seqs
   1386    # with different identities.
   1387    flow: [ one, two ]
   1388    spanning: [ one,
   1389         two ]
   1390    block:
   1391      - one
   1392      - two
   1393 php: |
   1394    array(
   1395      'flow' => [ 'one', 'two' ],
   1396      'spanning' => [ 'one', 'two' ],
   1397      'block' => [ 'one', 'two' ]
   1398    )
   1399 ---
   1400 test: Flow mappings
   1401 yaml: |
   1402    # The following are equal maps
   1403    # with different identities.
   1404    flow: { one: 1, two: 2 }
   1405    block:
   1406        one: 1
   1407        two: 2
   1408 php: |
   1409    array(
   1410      'flow' => array( 'one' => 1, 'two' => 2 ),
   1411      'block' => array( 'one' => 1, 'two' => 2 )
   1412    )
   1413 ---
   1414 test: Representations of 12
   1415 todo: true
   1416 yaml: |
   1417    - 12 # An integer
   1418    # The following scalars
   1419    # are loaded to the
   1420    # string value '1' '2'.
   1421    - !str 12
   1422    - '12'
   1423    - "12"
   1424    - "\
   1425      1\
   1426      2\
   1427      "
   1428    # Strings containing paths and regexps can be unquoted:
   1429    - /foo/bar
   1430    - d:/foo/bar
   1431    - foo/bar
   1432    - /a.*b/
   1433 php: |
   1434    array( 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' )
   1435 ---
   1436 test: "Null"
   1437 todo: true
   1438 yaml: |
   1439    canonical: ~
   1440 
   1441    english: null
   1442 
   1443    # This sequence has five
   1444    # entries, two with values.
   1445    sparse:
   1446      - ~
   1447      - 2nd entry
   1448      - Null
   1449      - 4th entry
   1450      -
   1451 
   1452    four: This mapping has five keys,
   1453          only two with values.
   1454 
   1455 php: |
   1456    array (
   1457      'canonical' => null,
   1458      'english' => null,
   1459      'sparse' => array( null, '2nd entry', null, '4th entry', null ]),
   1460      'four' => 'This mapping has five keys, only two with values.'
   1461    )
   1462 ---
   1463 test: Omap
   1464 todo: true
   1465 yaml: |
   1466    # Explicitly typed dictionary.
   1467    Bestiary: !omap
   1468      - aardvark: African pig-like ant eater. Ugly.
   1469      - anteater: South-American ant eater. Two species.
   1470      - anaconda: South-American constrictor snake. Scary.
   1471      # Etc.
   1472 ruby: |
   1473    {
   1474      'Bestiary' => YAML::Omap[
   1475        'aardvark', 'African pig-like ant eater. Ugly.',
   1476        'anteater', 'South-American ant eater. Two species.',
   1477        'anaconda', 'South-American constrictor snake. Scary.'
   1478      ]
   1479    }
   1480 
   1481 ---
   1482 test: Pairs
   1483 todo: true
   1484 yaml: |
   1485   # Explicitly typed pairs.
   1486   tasks: !pairs
   1487     - meeting: with team.
   1488     - meeting: with boss.
   1489     - break: lunch.
   1490     - meeting: with client.
   1491 ruby: |
   1492   {
   1493     'tasks' => YAML::Pairs[
   1494       'meeting', 'with team.',
   1495       'meeting', 'with boss.',
   1496       'break', 'lunch.',
   1497       'meeting', 'with client.'
   1498     ]
   1499   }
   1500 
   1501 ---
   1502 test: Set
   1503 todo: true
   1504 yaml: |
   1505   # Explicitly typed set.
   1506   baseball players: !set
   1507     Mark McGwire:
   1508     Sammy Sosa:
   1509     Ken Griffey:
   1510 ruby: |
   1511   {
   1512     'baseball players' => YAML::Set[
   1513       'Mark McGwire', nil,
   1514       'Sammy Sosa', nil,
   1515       'Ken Griffey', nil
   1516     ]
   1517   }
   1518 
   1519 ---
   1520 test: Boolean
   1521 yaml: |
   1522    false: used as key
   1523    logical:  true
   1524    answer: false
   1525 php: |
   1526    array(
   1527      false => 'used as key',
   1528      'logical' => true,
   1529      'answer' => false
   1530    )
   1531 ---
   1532 test: Integer
   1533 yaml: |
   1534    canonical: 12345
   1535    decimal: +12,345
   1536    octal: 014
   1537    hexadecimal: 0xC
   1538 php: |
   1539    array(
   1540      'canonical' => 12345,
   1541      'decimal' => 12345,
   1542      'octal' => 12,
   1543      'hexadecimal' => 12
   1544    )
   1545 ---
   1546 test: Float
   1547 yaml: |
   1548    canonical: 1.23015e+3
   1549    exponential: 12.3015e+02
   1550    fixed: 1,230.15
   1551    negative infinity: -.inf
   1552    not a number: .NaN
   1553 php: |
   1554   array(
   1555     'canonical' => 1230.15,
   1556     'exponential' => 1230.15,
   1557     'fixed' => 1230.15,
   1558     'negative infinity' => log(0),
   1559     'not a number' => -log(0)
   1560   )
   1561 ---
   1562 test: Timestamp
   1563 todo: true
   1564 yaml: |
   1565    canonical:       2001-12-15T02:59:43.1Z
   1566    valid iso8601:   2001-12-14t21:59:43.10-05:00
   1567    space separated: 2001-12-14 21:59:43.10 -05:00
   1568    date (noon UTC): 2002-12-14
   1569 ruby: |
   1570    array(
   1571      'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
   1572      'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
   1573      'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
   1574      'date (noon UTC)' => Date.new( 2002, 12, 14 )
   1575    )
   1576 ---
   1577 test: Binary
   1578 todo: true
   1579 yaml: |
   1580    canonical: !binary "\
   1581     R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\
   1582     OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\
   1583     +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\
   1584     AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
   1585    base64: !binary |
   1586     R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
   1587     OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
   1588     +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
   1589     AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
   1590    description: >
   1591     The binary value above is a tiny arrow
   1592     encoded as a gif image.
   1593 ruby-setup: |
   1594    arrow_gif = "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236iiiccc\243\243\243\204\204\204\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371!\376\016Made with GIMP\000,\000\000\000\000\f\000\f\000\000\005,  \216\2010\236\343@\024\350i\020\304\321\212\010\034\317\200M$z\357\3770\205p\270\2601f\r\e\316\001\303\001\036\020' \202\n\001\000;"
   1595 ruby: |
   1596    {
   1597      'canonical' => arrow_gif,
   1598      'base64' => arrow_gif,
   1599      'description' => "The binary value above is a tiny arrow encoded as a gif image.\n"
   1600    }
   1601 
   1602 ---
   1603 test: Merge key
   1604 todo: true
   1605 yaml: |
   1606   ---
   1607   - &CENTER { x: 1, y: 2 }
   1608   - &LEFT { x: 0, y: 2 }
   1609   - &BIG { r: 10 }
   1610   - &SMALL { r: 1 }
   1611 
   1612   # All the following maps are equal:
   1613 
   1614   - # Explicit keys
   1615     x: 1
   1616     y: 2
   1617     r: 10
   1618     label: center/big
   1619 
   1620   - # Merge one map
   1621     << : *CENTER
   1622     r: 10
   1623     label: center/big
   1624 
   1625   - # Merge multiple maps
   1626     << : [ *CENTER, *BIG ]
   1627     label: center/big
   1628 
   1629   - # Override
   1630     << : [ *BIG, *LEFT, *SMALL ]
   1631     x: 1
   1632     label: center/big
   1633 
   1634 ruby-setup: |
   1635   center = { 'x' => 1, 'y' => 2 }
   1636   left = { 'x' => 0, 'y' => 2 }
   1637   big = { 'r' => 10 }
   1638   small = { 'r' => 1 }
   1639   node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' }
   1640   node2 = center.dup
   1641   node2.update( { 'r' => 10, 'label' => 'center/big' } )
   1642   node3 = big.dup
   1643   node3.update( center )
   1644   node3.update( { 'label' => 'center/big' } )
   1645   node4 = small.dup
   1646   node4.update( left )
   1647   node4.update( big )
   1648   node4.update( { 'x' => 1, 'label' => 'center/big' } )
   1649 
   1650 ruby: |
   1651   [
   1652     center, left, big, small, node1, node2, node3, node4
   1653   ]
   1654 
   1655 ---
   1656 test: Default key
   1657 todo: true
   1658 yaml: |
   1659    ---     # Old schema
   1660    link with:
   1661      - library1.dll
   1662      - library2.dll
   1663    ---     # New schema
   1664    link with:
   1665      - = : library1.dll
   1666        version: 1.2
   1667      - = : library2.dll
   1668        version: 2.3
   1669 ruby: |
   1670    y = YAML::Stream.new
   1671    y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } )
   1672    obj_h = Hash[ 'version' => 1.2 ]
   1673    obj_h.default = 'library1.dll'
   1674    obj_h2 = Hash[ 'version' => 2.3 ]
   1675    obj_h2.default = 'library2.dll'
   1676    y.add( { 'link with' => [ obj_h, obj_h2 ] } )
   1677 documents: 2
   1678 
   1679 ---
   1680 test: Special keys
   1681 todo: true
   1682 yaml: |
   1683    "!": These three keys
   1684    "&": had to be quoted
   1685    "=": and are normal strings.
   1686    # NOTE: the following node should NOT be serialized this way.
   1687    encoded node :
   1688     !special '!' : '!type'
   1689     !special|canonical '&' : 12
   1690     = : value
   1691    # The proper way to serialize the above node is as follows:
   1692    node : !!type &12 value
   1693 ruby: |
   1694    { '!' => 'These three keys', '&' => 'had to be quoted',
   1695      '=' => 'and are normal strings.',
   1696      'encoded node' => YAML::PrivateType.new( 'type', 'value' ),
   1697      'node' => YAML::PrivateType.new( 'type', 'value' ) }