The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use lib -e 't' ? 't' : 'test';
use TestYAML tests => 52;

run_load_passes();

__DATA__
===
+++ yaml
- Mark McGwire
- Sammy Sosa
- Ken Griffey

===
+++ yaml
hr:  65
avg: 0.278
rbi: 147

===
+++ yaml
american:
   - Boston Red Sox
   - Detroit Tigers
   - New York Yankees
   - Texas Rangers
national:
   - New York Mets
   - Chicago Cubs
   - Atlanta Braves
   - Montreal Expos

===
+++ yaml
-
  name: Mark McGwire
  hr:   65
  avg:  0.278
  rbi:  147
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288
  rbi:  141

===
+++ yaml
?
    - New York Yankees
    - Atlanta Braves
:
  - 2001-07-02
  - 2001-08-12
  - 2001-08-14
?
    - Detroit Tigers
    - Chicago Cubs
:
  - 2001-07-23

===
+++ yaml
invoice: 34843
date   : 2001-01-23
bill-to:
   given  : Chris
   family : Dumars
product:
   - quantity: 4
     desc    : Basketball
   - quantity: 1
     desc    : Super Hoop

===
+++ yaml
---
name: Mark McGwire
hr:  65
avg: 0.278
rbi: 147
---
name: Sammy Sosa
hr:  63
avg: 0.288
rbi: 141

===
+++ yaml
# Ranking of players by
# season home runs.
---
   - Mark McGwire
   - Sammy Sosa
   - Ken Griffey

===
+++ yaml
#hr:     # Home runs
#   # 1998 record
#   - Mark McGwire
#   - Sammy Sosa
#rbi:    # Runs batted in
#   - Sammy Sosa
#   - Ken Griffey

===
+++ yaml
hr:
   - Mark McGwire
   # Name "Sammy Sosa" scalar SS
   - &SS Sammy Sosa
rbi:
   # So it can be referenced later.
   - *SS
   - Ken Griffey

===
+++ yaml
--- >
    Mark McGwire's
    year was crippled
    by a knee injury.

===
+++ yaml
--- |
    \/|\/|
    / |  |_

===
+++ yaml
--- >-
 Sosa completed
 another fine
 season.

===
+++ yaml
#name: Mark McGwire
#occupation: baseball player
#comments: Mark set a major
#          league home run
#          record in 1998.

===
+++ yaml
years: "1998\t1999\t2000\n"
msg:   "Sosa did fine. \u263A"

===
+++ yaml
- ' \/|\/|  '
- ' / |  |_ '

===
+++ yaml
- [ name         , hr , avg   ]
- [ Mark McGwire , 65 , 0.278 ]
- [ Sammy Sosa   , 63 , 0.288 ]

===
+++ yaml
#Mark McGwire: {hr: 65, avg: 0.278}
#Sammy Sosa:   {hr: 63,
#               avg: 0.288}

===
+++ yaml
invoice: 34843
date   : 2001-01-23
buyer:
  given  : Chris
  family : Dumars
product:
  - Basketball: 4
  - Superhoop:  1

===
+++ yaml
#invoice: !int|dec 34843
#date   : !time 2001-01-23
#buyer: !map
#   given  : !str Chris
#   family : !str Dumars
#product: !seq
# - !str Basketball: !int 4
# - !str Superhoop:  !int 1

===
+++ yaml
#invoice: !str 34843
#date   : !str 2001-01-23

===
+++ yaml
#--- !clarkevans.com/schedule/^entry
#who: Clark C. Evans
#when: 2001-11-18
#hours: !^hours 3
#description: >
#   Wrote up these examples
#   and learned a lot about
#   baseball statistics.

===
+++ yaml
#--- !clarkevans.com/graph/^shape
#- !^circle
#  center: &ORIGIN {x: 73, y: 129}
#  radius: 7
#- !^line [23, 32, 300, 200]
#- !^text
#  center: *ORIGIN
#  color: 0x02FDBA

===
+++ yaml
--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
    given  : Chris
    family : Dumars
    address:
        lines: |
            458 Walkman Dr.
            Suite #292
        city    : Royal Oak
        state   : MI
        postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

===
+++ yaml
---
Date: 2001-11-23
Time: 15:01:42
User: ed
Warning: >
  This is an error message
  for the log file
---
Date: 2001-11-23
Time: 15:02:31
User: ed
Warning: >
  A slightly different error
  message.
---
Date: 2001-11-23
Time: 15:03:17
User: ed
Fatal: >
  Unknown variable "bar"
Stack:
  - file: TopClass.py
    line: 23
    code: |
      x = MoreObject("345\n")
  - file: MoreClass.py
    line: 58
    code: |
      foo = bar

===
+++ yaml
###################################
## These are four throwaway comment
#
## lines (the second line is empty).
#this: | # Comments may trail lines.
#    contains three lines of text.
#    The third one starts with a
#    # character. This isn't a comment.
#
## These are four throwaway comment
## lines (the first line is empty).
###################################

===
+++ yaml
--- >
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.

===
+++ yaml
---
at: 2001-08-12T09:25:00.00
type: GET
HTTP: '1.0'
url: '/index.html'
---
at: 2001-08-12T09:25:10.00
type: GET
HTTP: '1.0'
url: '/toc.html'

===
+++ yaml
## The following is a sequence of three documents.
## The first contains an empty mapping, the second
## an empty sequence, and the last an empty string.
#--- {}
#--- [ ]
#--- ''

===
+++ yaml
## All entries in the sequence
## have the same type and value.
#- 10.0
#- !float 10
#- !yaml.org/^float '10'
#- !http://yaml.org/float "\
#  1\
#  0"

===
+++ yaml
## Private types are per-document.
#---
#pool: !!ball
#   number: 8
#   color: black
#---
#bearing: !!ball
#        material: steel

===
+++ yaml
## 'http://domain.tld/invoice' is some type family.
#invoice: !domain.tld/^invoice
#  # 'seq' is shorthand for 'http://yaml.org/seq'.
#  # This does not effect '^customer' below
#  # because it is does not specify a prefix.
#  customers: !seq
#    # '^customer' is shorthand for the full
#    # notation 'http://domain.tld/customer'.
#    - !^customer
#      given : Chris
#      family : Dumars

===
+++ yaml
## It is possible to use XML namespace URIs as
## YAML namespaces. Using the ancestor's URI
## allows specifying it only once. The $ separates
## between the XML namespace URI and the tag name.
#doc: !http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd$^html
# - !^body
#  - !^p This is an HTML paragraph.

===
+++ yaml
anchor : &A001 This scalar has an anchor.
override : &A001 >
 The alias node below is a
 repeated use of this value.
alias : *A001

===
+++ yaml
#empty: []
#in-line: [ one, two, three # May span lines,
#         , four,           # indentation is
#           five ]          # mostly ignored.
#nested:
# - First item in top sequence
# -
#  - Subordinate sequence entry
# - >
#  A multi-line
#  sequence entry
# - Sixth item in top sequence

===
+++ yaml
#empty: {}
#in-line: { one: 1, two: 2 }
#spanning: { one: 1,
#   two: 2 }
#nested:
# first : First entry
# second:
#  key: Subordinate mapping
# third:
#  - Subordinate sequence
#  - { }
#  - Previous mapping is empty.
#  - A key: value pair in a sequence.
#    A second: key:value pair.
#  - The previous entry is equal to the following one.
#  -
#   A key: value pair in a sequence.
#   A second: key:value pair.
# !float 12 : This key is a float.
# ? >
#  ?
# : This key had to be protected.
# "\a" : This key had to be escaped.
# ? >
#  This is a
#  multi-line
#  folded key
# : Whose value is
#   also multi-line.
# ?
#  - This key
#  - is a sequence
# :
#  - With a sequence value.
# ?
#  This: key
#  is a: mapping
# :
#  with a: mapping value.

===
+++ yaml
empty: |
detected: |
 The \ ' " characters may be
 freely used. Leading white
    space is significant.

 All line breaks are significant,
 including the final one. Thus
 this value contains one empty
 line and ends with a line break,
 but does not start with one.

# Comments may follow a nested
# scalar value. They must be
# less indented.

# Explicit indentation must
# be given in all the three
# following cases.
leading spaces: |2
      This value starts with four
  spaces. It ends with one line
  break and an empty comment line.

leading line break: |2

  This value starts with
  a line break and ends
  with one.
leading comment indicator: |2
  # first line starts with a
  #. This value does not start
  with a line break but ends
  with one.
# Explicit indentation may
# also be given when it is
# not required.
redundant: |2
  This value is indented 2 spaces.
stripped: |-
  This contains no newline.

kept: |+
  This contains two newlines.

# Comments may follow.

===
+++ yaml
#empty: >
#detected: >
# Line feeds are converted
# to spaces, so this value
# contains no line breaks
# except for the final one.
#
#explicit: >2
#
#  An empty line, either
#  at the start or in
#  the value:
#
#  Is interpreted as a
#  line break. Thus this
#  value contains three
#  line breaks.
#
#stripped: >-1
#   This starts with a space
#  and contains no newline.
#
#kept: >1+
#   This starts with a space
#  and contains two newlines.
#
#indented: >
#    This is a folded
#    paragraph followed
#    by a list:
#     * first entry
#     * second entry
#    Followed by another
#    folded paragraph,
#    another list:
#
#     * first entry
#
#     * second entry
#
#    And a final folded
#    paragraph.
#block: |    # Equal to above.
#    This is a folded paragraph followed by a list:
#     * first entry
#     * second entry
#    Followed by another folded paragraph and list:
#
#     * first entry
#
#     * second entry
#
#    And a final folded paragraph.
#
## Explicit comments may follow
## but must be less indented.

===
+++ yaml
#empty: ''
#second: '! : \ etc. can be used freely.'
#third: 'a single quote '' must be escaped.'
#span: 'this contains
#      six spaces
#
#      and one
#      line break'

===
+++ yaml
#empty: ""
#second: "! : etc. can be used freely."
#third: "a \" or a \\ must be escaped."
#fourth: "this value ends with an LF.\n"
#span: "this contains
#  four  \
#      spaces"

===
+++ yaml
#first: There is no unquoted empty string.
#second: 12          ## This is an integer.
#third: !str 12      ## This is a string.
#span: this contains
#      six spaces
#
#      and one
#      line break
#indicators: this has no comments.
#            #foo and bar# are
#            all text.
#in-line: [ can span
#           lines, # comment
#           like
#           this ]
#note: { one-line keys: but
#        multi-line values }

===
+++ yaml
## The following are equal seqs
## with different identities.
#in-line: [ one, two ]
#spanning: [ one,
#     two: ]
#nested:
#  - one
#  - two

===
+++ yaml
# The following are equal maps
# with different identities.
in-line: { one: 1, two: 2 }
nested:
    one: 1
    two: 2

===
+++ yaml
#- 12 # An integer
## The following scalars
## are loaded to the
## string value '1' '2'.
#- !str 12
#- '12'
#- "12"
#- "\
# 1\
# 2\
# "

===
+++ yaml
#canonical: ~
#verbose: (null)
#sparse:
# - ~
# - Second entry.
# - (nil)
# - This sequence has 4 entries, two with values.
#three: >
# This mapping has three keys,
# only two with values.

===
+++ yaml
#canonical: -
#logical:  (true)
#informal: (no)

===
+++ yaml
#canonical: 12345
#decimal: +12,345
#octal: 014
#hexadecimal: 0xC

===
+++ yaml
#canonical: 1.23015e+3
#exponential: 12.3015e+02
#fixed: 1,230.15
#negative infinity: (-inf)
#not a number: (NaN)

===
+++ yaml
canonical: 2001-12-15T02:59:43.1Z
valid iso8601: 2001-12-14t21:59:43.10-05:00
space separated: 2001-12-14 21:59:43.10 -05:00
date (noon UTC): 2002-12-14

===
+++ yaml
#canonical: !binary "\
# R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOf\
# n515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaW\
# NjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++\
# f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUg\
# d2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuN\
# AFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84Bww\
# EeECcgggoBADs="
#base64: !binary |
# R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOf
# n515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaW
# NjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++
# f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUg
# d2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuN
# AFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84Bww
# EeECcgggoBADs=
#description: >
# The binary value above is a tiny arrow
# encoded as a gif image.

===
+++ yaml
## Old schema
#---
#link with:
#  - library1.dll
#  - library2.dll
#
## New schema
#---
#link with:
#  - = : library1.dll
#    version: 1.2
#  - = : library2.dll
#    version: 2.1

===
+++ yaml
#"!": These three keys
#"&": had to be quoted
#"=": and are normal strings.
## NOTE: the following encoded node
## should NOT be serialized this way.
#encoded node :
# !special '!' : '!type'
# !special '&' : 12
# = : value
## The proper way to serialize the
## above structure is as follows:
#node : !!type &12 value