// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library yaml_test;

// TODO(rnystrom): rewrite tests so that they don't need "Expect".
import "package:expect/expect.dart";
import 'package:unittest/unittest.dart';
import 'package:yaml/yaml.dart';
import 'package:yaml/src/deep_equals.dart';
// TODO(jmesserly): we should not be reaching outside the YAML package
// The http package has a similar problem.
import '../../../tests/utils/test_utils.dart';

/// Constructs a new yaml.YamlMap, optionally from a normal Map.
Map yamlMap([Map from]) =>
    from == null ? new YamlMap() : new YamlMap.from(from);

/// Asserts that a string containing a single YAML document produces a given
/// value when loaded.
expectYamlLoads(expected, String source) {
  var actual = loadYaml(cleanUpLiteral(source));
  Expect.isTrue(deepEquals(expected, actual), 
      'expectYamlLoads(expected: <$expected>, actual: <$actual>)');
}

/// Asserts that a string containing a stream of YAML documents produces a given
/// list of values when loaded.
expectYamlStreamLoads(List expected, String source) {
  var actual = loadYamlStream(cleanUpLiteral(source));
  Expect.isTrue(deepEquals(expected, actual), 
      'expectYamlStreamLoads(expected: <$expected>, actual: <$actual>)');
}

main() {
  var infinity = double.parse("Infinity");
  var nan = double.parse("NaN");

  group('YamlMap', () {
    group('accepts as a key', () {
      _expectKeyWorks(keyFn()) {
        var map = yamlMap();
        map[keyFn()] = 5;
        expect(map.containsKey(keyFn()), isTrue);
        expect(map[keyFn()], 5);
      }

      test('null', () => _expectKeyWorks(() => null));
      test('true', () => _expectKeyWorks(() => true));
      test('false', () => _expectKeyWorks(() => false));
      test('a list', () => _expectKeyWorks(() => [1, 2, 3]));
      test('a map', () => _expectKeyWorks(() => {'foo': 'bar'}));
      test('a YAML map', () => _expectKeyWorks(() => yamlMap({'foo': 'bar'})));
    });

    test('works as a hash key', () {
      var normalMap = new Map();
      normalMap[yamlMap({'foo': 'bar'})] = 'baz';
      expect(normalMap.containsKey(yamlMap({'foo': 'bar'})), isTrue);
      expect(normalMap[yamlMap({'foo': 'bar'})], 'baz');
    });

    test('treats YamlMap keys the same as normal maps', () {
      var map = yamlMap();
      map[{'a': 'b'}] = 5;
      expect(map[yamlMap({'a': 'b'})], 5);
    });
  });

  group('has a friendly error message for', () {
    var tabError = predicate((e) =>
        e.toString().contains('tab characters are not allowed as indentation'));

    test('using a tab as indentation', () {
      expect(() => loadYaml('foo:\n\tbar'),
          throwsA(tabError));
    });

    test('using a tab not as indentation', () {
      expect(() => loadYaml('''
          "foo
          \tbar"
          error'''),
        throwsA(isNot(tabError)));
    });
  });

  // The following tests are all taken directly from the YAML spec
  // (http://www.yaml.org/spec/1.2/spec.html). Most of them are code examples
  // that are directly included in the spec, but additional tests are derived
  // from the prose.

  // A few examples from the spec are deliberately excluded, because they test
  // features that this implementation doesn't intend to support (character
  // encoding detection and user-defined tags). More tests are commented out,
  // because they're intended to be supported but not yet implemented.

  // Chapter 2 is just a preview of various Yaml documents. It's probably not
  // necessary to test its examples, but it would be nice to test everything in
  // the spec.
  group('2.1: Collections', () {
    test('[Example 2.1]', () {
      expectYamlLoads(["Mark McGwire", "Sammy Sosa", "Ken Griffey"],
        """
        - Mark McGwire
        - Sammy Sosa
        - Ken Griffey""");
    });

    test('[Example 2.2]', () {
      expectYamlLoads({"hr": 65, "avg": 0.278, "rbi": 147},
        """
        hr:  65    # Home runs
        avg: 0.278 # Batting average
        rbi: 147   # Runs Batted In""");
    });

    test('[Example 2.3]', () {
      expectYamlLoads({
        "american": ["Boston Red Sox", "Detroit Tigers", "New York Yankees"],
        "national": ["New York Mets", "Chicago Cubs", "Atlanta Braves"],
      },
        """
        american:
          - Boston Red Sox
          - Detroit Tigers
          - New York Yankees
        national:
          - New York Mets
          - Chicago Cubs
          - Atlanta Braves""");
    });

    test('[Example 2.4]', () {
      expectYamlLoads([
        {"name": "Mark McGwire", "hr": 65, "avg": 0.278},
        {"name": "Sammy Sosa", "hr": 63, "avg": 0.288},
      ],
        """
        -
          name: Mark McGwire
          hr:   65
          avg:  0.278
        -
          name: Sammy Sosa
          hr:   63
          avg:  0.288""");
    });

    test('[Example 2.5]', () {
      expectYamlLoads([
        ["name", "hr", "avg"],
        ["Mark McGwire", 65, 0.278],
        ["Sammy Sosa", 63, 0.288]
      ],
        """
        - [name        , hr, avg  ]
        - [Mark McGwire, 65, 0.278]
        - [Sammy Sosa  , 63, 0.288]""");
    });

    test('[Example 2.6]', () {
      expectYamlLoads({
        "Mark McGwire": {"hr": 65, "avg": 0.278},
        "Sammy Sosa": {"hr": 63, "avg": 0.288}
      },
        """
        Mark McGwire: {hr: 65, avg: 0.278}
        Sammy Sosa: {
            hr: 63,
            avg: 0.288
          }""");
    });
  });

  group('2.2: Structures', () {
    test('[Example 2.7]', () {
      expectYamlStreamLoads([
        ["Mark McGwire", "Sammy Sosa", "Ken Griffey"],
        ["Chicago Cubs", "St Louis Cardinals"]
      ],
        """
        # Ranking of 1998 home runs
        ---
        - Mark McGwire
        - Sammy Sosa
        - Ken Griffey

        # Team ranking
        ---
        - Chicago Cubs
        - St Louis Cardinals""");
    });

    test('[Example 2.8]', () {
      expectYamlStreamLoads([
        {"time": "20:03:20", "player": "Sammy Sosa", "action": "strike (miss)"},
        {"time": "20:03:47", "player": "Sammy Sosa", "action": "grand slam"},
      ],
        """
        ---
        time: 20:03:20
        player: Sammy Sosa
        action: strike (miss)
        ...
        ---
        time: 20:03:47
        player: Sammy Sosa
        action: grand slam
        ...""");
    });

    test('[Example 2.9]', () {
      expectYamlLoads({
        "hr": ["Mark McGwire", "Sammy Sosa"],
        "rbi": ["Sammy Sosa", "Ken Griffey"]
      },
        """
        ---
        hr: # 1998 hr ranking
          - Mark McGwire
          - Sammy Sosa
        rbi:
          # 1998 rbi ranking
          - Sammy Sosa
          - Ken Griffey""");
    });

  //   test('[Example 2.10]', () {
  //     expectYamlLoads({
  //       "hr": ["Mark McGwire", "Sammy Sosa"],
  //       "rbi": ["Sammy Sosa", "Ken Griffey"]
  //     },
  //       """
  //       ---
  //       hr:
  //         - Mark McGwire
  //         # Following node labeled SS
  //         - &SS Sammy Sosa
  //       rbi:
  //         - *SS # Subsequent occurrence
  //         - Ken Griffey""");
  //   });

    test('[Example 2.11]', () {
      var doc = yamlMap();
      doc[["Detroit Tigers", "Chicago cubs"]] = ["2001-07-23"];
      doc[["New York Yankees", "Atlanta Braves"]] =
        ["2001-07-02", "2001-08-12", "2001-08-14"];
      expectYamlLoads(doc,
        """
        ? - Detroit Tigers
          - Chicago cubs
        :
          - 2001-07-23

        ? [ New York Yankees,
            Atlanta Braves ]
        : [ 2001-07-02, 2001-08-12,
            2001-08-14 ]""");
    });

    test('[Example 2.12]', () {
      expectYamlLoads([
        {"item": "Super Hoop", "quantity": 1},
        {"item": "Basketball", "quantity": 4},
        {"item": "Big Shoes", "quantity": 1},
      ],
        """
        ---
        # Products purchased
        - item    : Super Hoop
          quantity: 1
        - item    : Basketball
          quantity: 4
        - item    : Big Shoes
          quantity: 1""");
    });
  });

  group('2.3: Scalars', () {
    test('[Example 2.13]', () {
      expectYamlLoads(
        cleanUpLiteral(
        """
        \\//||\\/||
        // ||  ||__"""),
        """
        # ASCII Art
        --- |
          \\//||\\/||
          // ||  ||__""");
    });

    test('[Example 2.14]', () {
      expectYamlLoads("Mark McGwire's year was crippled by a knee injury.",
        """
        --- >
          Mark McGwire's
          year was crippled
          by a knee injury.""");
    });

    test('[Example 2.15]', () {
      expectYamlLoads(
        cleanUpLiteral(
        """
        Sammy Sosa completed another fine season with great stats.

          63 Home Runs
          0.288 Batting Average

        What a year!"""),
        """
        >
         Sammy Sosa completed another
         fine season with great stats.

           63 Home Runs
           0.288 Batting Average

         What a year!""");
    });

    test('[Example 2.16]', () {
      expectYamlLoads({
        "name": "Mark McGwire",
        "accomplishment": "Mark set a major league home run record in 1998.\n",
        "stats": "65 Home Runs\n0.278 Batting Average"
      },
        """
        name: Mark McGwire
        accomplishment: >
          Mark set a major league
          home run record in 1998.
        stats: |
          65 Home Runs
          0.278 Batting Average""");
    });

    test('[Example 2.17]', () {
      expectYamlLoads({
        "unicode": "Sosa did fine.\u263A",
        "control": "\b1998\t1999\t2000\n",
        "hex esc": "\r\n is \r\n",
        "single": '"Howdy!" he cried.',
        "quoted": " # Not a 'comment'.",
        "tie-fighter": "|\\-*-/|"
      },
        """
        unicode: "Sosa did fine.\\u263A"
        control: "\\b1998\\t1999\\t2000\\n"
        hex esc: "\\x0d\\x0a is \\r\\n"

        single: '"Howdy!" he cried.'
        quoted: ' # Not a ''comment''.'
        tie-fighter: '|\\-*-/|'""");
    });

    test('[Example 2.18]', () {
      expectYamlLoads({
        "plain": "This unquoted scalar spans many lines.",
        "quoted": "So does this quoted scalar.\n"
      },
        '''
        plain:
          This unquoted scalar
          spans many lines.

        quoted: "So does this
          quoted scalar.\\n"''');
    });
  });

  group('2.4: Tags', () {
    test('[Example 2.19]', () {
      expectYamlLoads({
        "canonical": 12345,
        "decimal": 12345,
        "octal": 12,
        "hexadecimal": 12
      },
        """
        canonical: 12345
        decimal: +12345
        octal: 0o14
        hexadecimal: 0xC""");
    });

    test('[Example 2.20]', () {
      expectYamlLoads({
        "canonical": 1230.15,
        "exponential": 1230.15,
        "fixed": 1230.15,
        "negative infinity": -infinity,
        "not a number": nan
      },
        """
        canonical: 1.23015e+3
        exponential: 12.3015e+02
        fixed: 1230.15
        negative infinity: -.inf
        not a number: .NaN""");
    });

    test('[Example 2.21]', () {
      var doc = yamlMap({
        "booleans": [true, false],
        "string": "012345"
      });
      doc[null] = null;
      expectYamlLoads(doc,
        """
        null:
        booleans: [ true, false ]
        string: '012345'""");
    });

    // Examples 2.22 through 2.26 test custom tag URIs, which this
    // implementation currently doesn't plan to support.
  });

  group('2.5 Full Length Example', () {
    // Example 2.27 tests custom tag URIs, which this implementation currently
    // doesn't plan to support.

    test('[Example 2.28]', () {
      expectYamlStreamLoads([
        {
          "Time": "2001-11-23 15:01:42 -5",
          "User": "ed",
          "Warning": "This is an error message for the log file"
        },
        {
          "Time": "2001-11-23 15:02:31 -5",
          "User": "ed",
          "Warning": "A slightly different error message."
        },
        {
          "DateTime": "2001-11-23 15:03:17 -5",
          "User": "ed",
          "Fatal": 'Unknown variable "bar"',
          "Stack": [
            {
              "file": "TopClass.py",
              "line": 23,
              "code": 'x = MoreObject("345\\n")\n'
            },
            {"file": "MoreClass.py", "line": 58, "code": "foo = bar"}
          ]
        }
      ],
        """
        ---
        Time: 2001-11-23 15:01:42 -5
        User: ed
        Warning:
          This is an error message
          for the log file
        ---
        Time: 2001-11-23 15:02:31 -5
        User: ed
        Warning:
          A slightly different error
          message.
        ---
        DateTime: 2001-11-23 15:03:17 -5
        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""");
    });
  });

  // Chapter 3 just talks about the structure of loading and dumping Yaml.
  // Chapter 4 explains conventions used in the spec.

  // Chapter 5: Characters
  group('5.1: Character Set', () {
    expectAllowsCharacter(int charCode) {
      var char = new String.fromCharCodes([charCode]);
      expectYamlLoads('The character "$char" is allowed',
          'The character "$char" is allowed');
    }

    expectAllowsQuotedCharacter(int charCode) {
      var char = new String.fromCharCodes([charCode]);
      expectYamlLoads("The character '$char' is allowed",
          '"The character \'$char\' is allowed"');
    }

    expectDisallowsCharacter(int charCode) {
      var char = new String.fromCharCodes([charCode]);
      Expect.throws(() => loadYaml('The character "$char" is disallowed'));
    }

    test("doesn't include C0 control characters", () {
      expectDisallowsCharacter(0x0);
      expectDisallowsCharacter(0x8);
      expectDisallowsCharacter(0x1F);
    });

    test("includes TAB", () => expectAllowsCharacter(0x9));
    test("doesn't include DEL", () => expectDisallowsCharacter(0x7F));

    test("doesn't include C1 control characters", () {
      expectDisallowsCharacter(0x80);
      expectDisallowsCharacter(0x8A);
      expectDisallowsCharacter(0x9F);
    });

    test("includes NEL", () => expectAllowsCharacter(0x85));

    group("within quoted strings", () {
      test("includes DEL", () => expectAllowsQuotedCharacter(0x7F));
      test("includes C1 control characters", () {
        expectAllowsQuotedCharacter(0x80);
        expectAllowsQuotedCharacter(0x8A);
        expectAllowsQuotedCharacter(0x9F);
      });
    });
  });

  // Skipping section 5.2 (Character Encodings), since at the moment the module
  // assumes that the client code is providing it with a string of the proper
  // encoding.

  group('5.3: Indicator Characters', () {
    test('[Example 5.3]', () {
      expectYamlLoads({
        'sequence': ['one', 'two'],
        'mapping': {'sky': 'blue', 'sea': 'green'}
      },
        """
        sequence:
        - one
        - two
        mapping:
          ? sky
          : blue
          sea : green""");
    });

    test('[Example 5.4]', () {
      expectYamlLoads({
        'sequence': ['one', 'two'],
        'mapping': {'sky': 'blue', 'sea': 'green'}
      },
        """
        sequence: [ one, two, ]
        mapping: { sky: blue, sea: green }""");
    });

    test('[Example 5.5]', () => expectYamlLoads(null, "# Comment only."));

    // Skipping 5.6 because it uses an undefined tag.

    test('[Example 5.7]', () {
      expectYamlLoads({
        'literal': "some\ntext\n",
        'folded': "some text\n"
      },
        """
        literal: |
          some
          text
        folded: >
          some
          text
        """);
    });

    test('[Example 5.8]', () {
      expectYamlLoads({
        'single': "text",
        'double': "text"
      },
        """
        single: 'text'
        double: "text"
        """);
    });

    // test('[Example 5.9]', () {
    //   expectYamlLoads("text",
    //     """
    //     %YAML 1.2
    //     --- text""");
    // });

    test('[Example 5.10]', () {
      Expect.throws(() => loadYaml("commercial-at: @text"));
      Expect.throws(() => loadYaml("commercial-at: `text"));
    });
  });

  group('5.4: Line Break Characters', () {
    group('include', () {
      test('\\n', () => expectYamlLoads([1, 2], indentLiteral("- 1\n- 2")));
      test('\\r', () => expectYamlLoads([1, 2], "- 1\r- 2"));
    });

    group('do not include', () {
      test('form feed', () => Expect.throws(() => loadYaml("- 1\x0C- 2")));
      test('NEL', () => expectYamlLoads(["1\x85- 2"], "- 1\x85- 2"));
      test('0x2028', () => expectYamlLoads(["1\u2028- 2"], "- 1\u2028- 2"));
      test('0x2029', () => expectYamlLoads(["1\u2029- 2"], "- 1\u2029- 2"));
    });

    group('in a scalar context must be normalized', () {
      test("from \\r to \\n", () =>
            expectYamlLoads(["foo\nbar"], indentLiteral('- |\n  foo\r  bar')));
      test("from \\r\\n to \\n", () =>
            expectYamlLoads(["foo\nbar"], indentLiteral('- |\n  foo\r\n  bar')));
    });

    test('[Example 5.11]', () {
      expectYamlLoads(
        cleanUpLiteral("""
        Line break (no glyph)
        Line break (glyphed)"""),
        """
        |
          Line break (no glyph)
          Line break (glyphed)""");
    });
  });

  group('5.5: White Space Characters', () {
    test('[Example 5.12]', () {
      expectYamlLoads({
        "quoted": "Quoted \t",
        "block": 'void main() {\n\tprintf("Hello, world!\\n");\n}\n'
      }, 
        """
        # Tabs and spaces
        quoted: "Quoted \t"
        block:\t|
          void main() {
          \tprintf("Hello, world!\\n");
          }
        """);
    });
  });

  group('5.7: Escaped Characters', () {
    test('[Example 5.13]', () {
      expectYamlLoads(
        "Fun with \x5C "
        "\x22 \x07 \x08 \x1B \x0C "
        "\x0A \x0D \x09 \x0B \x00 "
        "\x20 \xA0 \x85 \u2028 \u2029 "
        "A A A",
        '''
        "Fun with \\\\
        \\" \\a \\b \\e \\f \\
        \\n \\r \\t \\v \\0 \\
        \\  \\_ \\N \\L \\P \\
        \\x41 \\u0041 \\U00000041"''');
    });

    test('[Example 5.14]', () {
      Expect.throws(() => loadYaml('Bad escape: "\\c"'));
      Expect.throws(() => loadYaml('Bad escape: "\\xq-"'));
    });
  });

  // Chapter 6: Basic Structures
  group('6.1: Indentation Spaces', () {
    test('may not include TAB characters', () {
      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        -
        \t- foo
        \t- bar""")));
    });

    test('must be the same for all sibling nodes', () {
      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        -
          - foo
         - bar""")));
    });

    test('may be different for the children of sibling nodes', () {
      expectYamlLoads([["foo"], ["bar"]],
        """
        -
          - foo
        -
         - bar""");
    });

    test('[Example 6.1]', () {
      expectYamlLoads({
        "Not indented": {
          "By one space": "By four\n  spaces\n",
          "Flow style": [
            "By two",
            "Also by two",
            "Still by two"
          ]
        }
      },
        """
          # Leading comment line spaces are
           # neither content nor indentation.
            
        Not indented:
         By one space: |
            By four
              spaces
         Flow style: [    # Leading spaces
           By two,        # in flow style
          Also by two,    # are neither
          \tStill by two   # content nor
            ]             # indentation.""");
    });

    test('[Example 6.2]', () {
      expectYamlLoads({'a': ['b', ['c', 'd']]},
        """
        ? a
        : -\tb
          -  -\tc
             - d""");
    });
  });

  group('6.2: Separation Spaces', () {
    test('[Example 6.3]', () {
      expectYamlLoads([{'foo': 'bar'}, ['baz', 'baz']],
        """
        - foo:\t bar
        - - baz
          -\tbaz""");
    });
  });

  group('6.3: Line Prefixes', () {
    test('[Example 6.4]', () {
      expectYamlLoads({
        "plain": "text lines",
        "quoted": "text lines",
        "block": "text\n \tlines\n"
      }, 
        """
        plain: text
          lines
        quoted: "text
          \tlines"
        block: |
          text
           \tlines
        """);
    });
  });

  group('6.4: Empty Lines', () {
    test('[Example 6.5]', () {
      expectYamlLoads({
        "Folding": "Empty line\nas a line feed",
        "Chomping": "Clipped empty lines\n",
      },
        """
        Folding:
          "Empty line
           \t
          as a line feed"
        Chomping: |
          Clipped empty lines
         """);
    });
  });

  group('6.5: Line Folding', () {
    test('[Example 6.6]', () {
      expectYamlLoads("trimmed\n\n\nas space",
        """
        >-
          trimmed
          
         

          as
          space
        """);
    });

    test('[Example 6.7]', () {
      expectYamlLoads("foo \n\n\t bar\n\nbaz\n",
        """
        >
          foo 
         
          \t bar

          baz
        """);
    });

    test('[Example 6.8]', () {
      expectYamlLoads(" foo\nbar\nbaz ",
        '''
        "
          foo 
         
          \t bar

          baz
        "''');
    });
  });

  group('6.6: Comments', () {
    test('must be separated from other tokens by white space characters', () {
      expectYamlLoads("foo#bar", "foo#bar");
      expectYamlLoads("foo:#bar", "foo:#bar");
      expectYamlLoads("-#bar", "-#bar");
    });

    test('[Example 6.9]', () {
      expectYamlLoads({'key': 'value'},
        """
        key:    # Comment
          value""");
    });

    group('outside of scalar content', () {
      test('may appear on a line of their own', () {
        expectYamlLoads([1, 2],
        """
        - 1
        # Comment
        - 2""");
      });

      test('are independent of indentation level', () {
        expectYamlLoads([[1, 2]],
        """
        -
          - 1
         # Comment
          - 2""");
      });

      test('include lines containing only white space characters', () {
        expectYamlLoads([1, 2],
        """
        - 1
          \t  
        - 2""");
      });
    });

    group('within scalar content', () {
      test('may not appear on a line of their own', () {
        expectYamlLoads(["foo\n# not comment\nbar\n"],
        """
        - |
          foo
          # not comment
          bar
        """);
      });

      test("don't include lines containing only white space characters", () {
        expectYamlLoads(["foo\n  \t   \nbar\n"],
        """
        - |
          foo
            \t   
          bar
        """);
      });
    });

    test('[Example 6.10]', () {
      expectYamlLoads(null,
        """
          # Comment
           
        """);
    });

    test('[Example 6.11]', () {
      expectYamlLoads({'key': 'value'},
        """
        key:    # Comment
                # lines
          value
        """);
    });

    group('ending a block scalar header', () {
      test('may not be followed by additional comment lines', () {
        expectYamlLoads(["# not comment\nfoo\n"],
        """
        - | # comment
            # not comment
            foo
        """);
      });
    });
  });

  group('6.7: Separation Lines', () {
    test('may not be used within implicit keys', () {
      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        [1,
         2]: 3""")));
    });

    test('[Example 6.12]', () {
      var doc = yamlMap();
      doc[{'first': 'Sammy', 'last': 'Sosa'}] = {
        'hr': 65,
        'avg': 0.278
      };
      expectYamlLoads(doc,
        """
        { first: Sammy, last: Sosa }:
        # Statistics:
          hr:  # Home runs
             65
          avg: # Average
           0.278""");
    });
  });

  group('6.8: Directives', () {
    // // TODO(nweiz): assert that this produces a warning
    // test('[Example 6.13]', () {
    //   expectYamlLoads("foo",
    //     '''
    //     %FOO  bar baz # Should be ignored
    //                    # with a warning.
    //     --- "foo"''');
    // });

    // // TODO(nweiz): assert that this produces a warning
    // test('[Example 6.14]', () {
    //   expectYamlLoads("foo",
    //     '''
    //     %YAML 1.3 # Attempt parsing
    //                # with a warning
    //     ---
    //     "foo"''');
    // });

    // test('[Example 6.15]', () {
    //   Expect.throws(() => loadYaml(cleanUpLiteral(
    //     """
    //     %YAML 1.2
    //     %YAML 1.1
    //     foo""")));
    // });

    // test('[Example 6.16]', () {
    //   expectYamlLoads("foo",
    //     '''
    //     %TAG !yaml! tag:yaml.org,2002:
    //     ---
    //     !yaml!str "foo"''');
    // });

    // test('[Example 6.17]', () {
    //   Expect.throws(() => loadYaml(cleanUpLiteral(
    //     """
    //     %TAG ! !foo
    //     %TAG ! !foo
    //     bar""")));
    // });

    // Examples 6.18 through 6.22 test custom tag URIs, which this
    // implementation currently doesn't plan to support.
  });

  group('6.9: Node Properties', () {
    // test('may be specified in any order', () {
    //   expectYamlLoads(["foo", "bar"],
    //     """
    //     - !!str &a1 foo
    //     - &a2 !!str bar""");
    // });

    // test('[Example 6.23]', () {
    //   expectYamlLoads({
    //     "foo": "bar",
    //     "baz": "foo"
    //   },
    //     '''
    //     !!str &a1 "foo":
    //       !!str bar
    //     &a2 baz : *a1''');
    // });

    // // Example 6.24 tests custom tag URIs, which this implementation currently
    // // doesn't plan to support.

    // test('[Example 6.25]', () {
    //   Expect.throws(() => loadYaml("- !<!> foo"));
    //   Expect.throws(() => loadYaml("- !<\$:?> foo"));
    // });

    // // Examples 6.26 and 6.27 test custom tag URIs, which this implementation
    // // currently doesn't plan to support.

    // test('[Example 6.28]', () {
    //   expectYamlLoads(["12", 12, "12"],
    //     '''
    //     # Assuming conventional resolution:
    //     - "12"
    //     - 12
    //     - ! 12''');
    // });

    // test('[Example 6.29]', () {
    //   expectYamlLoads({
    //     "First occurrence": "Value",
    //     "Second occurrence": "anchor"
    //   },
    //     """
    //     First occurrence: &anchor Value
    //     Second occurrence: *anchor""");
    // });
  });

  // Chapter 7: Flow Styles
  group('7.1: Alias Nodes', () {
    // test("must not use an anchor that doesn't previously occur", () {
    //   Expect.throws(() => loadYaml(cleanUpLiteral(
    //     """
    //     - *anchor
    //     - &anchor foo"""));
    // });

    // test("don't have to exist for a given anchor node", () {
    //   expectYamlLoads(["foo"], "- &anchor foo");
    // });

    // group('must not specify', () {
    //   test('tag properties', () => Expect.throws(() => loadYaml(cleanUpLiteral(
    //     """
    //     - &anchor foo
    //     - !str *anchor""")));

    //   test('anchor properties', () => Expect.throws(
    //           () => loadYaml(cleanUpLiteral(
    //     """
    //     - &anchor foo
    //     - &anchor2 *anchor""")));

    //   test('content', () => Expect.throws(() => loadYaml(cleanUpLiteral(
    //     """
    //     - &anchor foo
    //     - *anchor bar""")));
    // });

    // test('must preserve structural equality', () {
    //   var doc = loadYaml(cleanUpLiteral(
    //     """
    //     anchor: &anchor [a, b, c]
    //     alias: *anchor""");
    //   var anchorList = doc['anchor'];
    //   var aliasList = doc['alias'];
    //   Expect.isTrue(anchorList === aliasList);
    //   anchorList.add('d');
    //   Expect.listEquals(['a', 'b', 'c', 'd'], aliasList);

    //   doc = loadYaml(cleanUpLiteral(
    //     """
    //     ? &anchor [a, b, c]
    //     : ? *anchor
    //       : bar""");
    //   anchorList = doc.keys[0];
    //   aliasList = doc[['a', 'b', 'c']].keys[0];
    //   Expect.isTrue(anchorList === aliasList);
    //   anchorList.add('d');
    //   Expect.listEquals(['a', 'b', 'c', 'd'], aliasList);
    // });

    // test('[Example 7.1]', () {
    //   expectYamlLoads({
    //     "First occurence": "Foo",
    //     "Second occurence": "Foo",
    //     "Override anchor": "Bar",
    //     "Reuse anchor": "Bar",
    //   },
    //     """
    //     First occurrence: &anchor Foo
    //     Second occurrence: *anchor
    //     Override anchor: &anchor Bar
    //     Reuse anchor: *anchor""");
    // });
  });

  group('7.2: Empty Nodes', () {
    // test('[Example 7.2]', () {
    //   expectYamlLoads({
    //     "foo": "",
    //     "": "bar"
    //   },
    //     """
    //     {
    //       foo : !!str,
    //       !!str : bar,
    //     }""");
    // });

    test('[Example 7.3]', () {
      var doc = yamlMap({"foo": null});
      doc[null] = "bar";
      expectYamlLoads(doc,
        """
        {
          ? foo :,
          : bar,
        }""");
    });
  });

  group('7.3: Flow Scalar Styles', () {
    test('[Example 7.4]', () {
      expectYamlLoads({
        "implicit block key": [{"implicit flow key": "value"}]
      },
        '''
        "implicit block key" : [
          "implicit flow key" : value,
         ]''');
    });

    test('[Example 7.5]', () {
      expectYamlLoads(
        "folded to a space,\nto a line feed, or \t \tnon-content",
        '''
        "folded 
        to a space,\t
         
        to a line feed, or \t\\
         \\ \tnon-content"''');
    });

    test('[Example 7.6]', () {
      expectYamlLoads(" 1st non-empty\n2nd non-empty 3rd non-empty ",
        '''
        " 1st non-empty

         2nd non-empty 
        \t3rd non-empty "''');
    });

    test('[Example 7.7]', () {
      expectYamlLoads("here's to \"quotes\"", "'here''s to \"quotes\"'");
    });

    test('[Example 7.8]', () {
      expectYamlLoads({
        "implicit block key": [{"implicit flow key": "value"}]
      },
        """
        'implicit block key' : [
          'implicit flow key' : value,
         ]""");
    });

    test('[Example 7.9]', () {
      expectYamlLoads(" 1st non-empty\n2nd non-empty 3rd non-empty ",
        """
        ' 1st non-empty

         2nd non-empty 
        \t3rd non-empty '""");
    });

    test('[Example 7.10]', () {
      expectYamlLoads([
        "::vector", ": - ()", "Up, up, and away!", -123,
        "http://example.com/foo#bar",
        [
          "::vector", ": - ()", "Up, up, and away!", -123,
          "http://example.com/foo#bar"
        ]
      ],
        '''
        # Outside flow collection:
        - ::vector
        - ": - ()"
        - Up, up, and away!
        - -123
        - http://example.com/foo#bar
        # Inside flow collection:
        - [ ::vector,
          ": - ()",
          "Up, up, and away!",
          -123,
          http://example.com/foo#bar ]''');
    });

    test('[Example 7.11]', () {
      expectYamlLoads({
        "implicit block key": [{"implicit flow key": "value"}]
      },
        """
        implicit block key : [
          implicit flow key : value,
         ]""");
    });

    test('[Example 7.12]', () {
      expectYamlLoads("1st non-empty\n2nd non-empty 3rd non-empty",
        """
        1st non-empty

         2nd non-empty 
        \t3rd non-empty""");
    });
  });

  group('7.4: Flow Collection Styles', () {
    test('[Example 7.13]', () {
      expectYamlLoads([
        ['one', 'two'],
        ['three', 'four']
      ],
        """
        - [ one, two, ]
        - [three ,four]""");
    });

    test('[Example 7.14]', () {
      expectYamlLoads([
        "double quoted", "single quoted", "plain text", ["nested"],
        {"single": "pair"}
      ],
        """
        [
        "double
         quoted", 'single
                   quoted',
        plain
         text, [ nested ],
        single: pair,
        ]""");
    });

    test('[Example 7.15]', () {
      expectYamlLoads([
        {"one": "two", "three": "four"},
        {"five": "six", "seven": "eight"},
      ],
        """
        - { one : two , three: four , }
        - {five: six,seven : eight}""");
    });

    test('[Example 7.16]', () {
      var doc = yamlMap({
        "explicit": "entry",
        "implicit": "entry"
      });
      doc[null] = null;
      expectYamlLoads(doc,
        """
        {
        ? explicit: entry,
        implicit: entry,
        ?
        }""");
    });

    test('[Example 7.17]', () {
      var doc = yamlMap({
        "unquoted": "separate",
        "http://foo.com": null,
        "omitted value": null
      });
      doc[null] = "omitted key";
      expectYamlLoads(doc,
        '''
        {
        unquoted : "separate",
        http://foo.com,
        omitted value:,
        : omitted key,
        }''');
    });

    test('[Example 7.18]', () {
      expectYamlLoads({
        "adjacent": "value",
        "readable": "value",
        "empty": null
      },
        '''
        {
        "adjacent":value,
        "readable": value,
        "empty":
        }''');
    });

    test('[Example 7.19]', () {
      expectYamlLoads([{"foo": "bar"}],
        """
        [
        foo: bar
        ]""");
    });

    test('[Example 7.20]', () {
      expectYamlLoads([{"foo bar": "baz"}],
        """
        [
        ? foo
         bar : baz
        ]""");
    });

    test('[Example 7.21]', () {
      var el1 = yamlMap();
      el1[null] = "empty key entry";

      var el2 = yamlMap();
      el2[{"JSON": "like"}] = "adjacent";

      expectYamlLoads([[{"YAML": "separate"}], [el1], [el2]],
        """
        - [ YAML : separate ]
        - [ : empty key entry ]
        - [ {JSON: like}:adjacent ]""");
    });

    test('[Example 7.22]', () {
      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        [ foo
         bar: invalid ]""")));

      // TODO(nweiz): enable this when we throw an error for long keys
      // var dotList = new List.filled(1024, ' ');
      // var dots = dotList.join();
      // Expect.throws(() => loadYaml('[ "foo...$dots...bar": invalid ]'));
    });
  });

  group('7.5: Flow Nodes', () {
    test('[Example 7.23]', () {
      expectYamlLoads([["a", "b"], {"a": "b"}, "a", "b", "c"],
        """
        - [ a, b ]
        - { a: b }
        - "a"
        - 'b'
        - c""");
    });

    // test('[Example 7.24]', () {
    //   expectYamlLoads(["a", "b", "c", "c", ""],
    //     """
    //     - !!str "a"
    //     - 'b'
    //     - &anchor "c"
    //     - *anchor
    //     - !!str""");
    // });
  });

  // Chapter 8: Block Styles
  group('8.1: Block Scalar Styles', () {
    test('[Example 8.1]', () {
      expectYamlLoads(["literal\n", " folded\n", "keep\n\n", " strip"],
        """
        - | # Empty header
         literal
        - >1 # Indentation indicator
          folded
        - |+ # Chomping indicator
         keep

        - >1- # Both indicators
          strip""");
    });

    test('[Example 8.2]', () {
      // Note: in the spec, the fourth element in this array is listed as
      // "\t detected\n", not "\t\ndetected\n". However, I'm reasonably
      // confident that "\t\ndetected\n" is correct when parsed according to the
      // rest of the spec.
      expectYamlLoads([
        "detected\n",
        "\n\n# detected\n",
        " explicit\n",
        "\t\ndetected\n"
      ],
        """
        - |
         detected
        - >
         
          
          # detected
        - |1
          explicit
        - >
         \t
         detected
        """);
    });

    test('[Example 8.3]', () {
      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        - |
          
         text""")));

      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        - >
          text
         text""")));

      Expect.throws(() => loadYaml(cleanUpLiteral(
        """
        - |2
         text""")));
    });

    test('[Example 8.4]', () {
      expectYamlLoads({"strip": "text", "clip": "text\n", "keep": "text\n"},
        """
        strip: |-
          text
        clip: |
          text
        keep: |+
          text
        """);
    });

    test('[Example 8.5]', () {
      // This example in the spec only includes a single newline in the "keep"
      // value, but as far as I can tell that's not how it's supposed to be
      // parsed according to the rest of the spec.
      expectYamlLoads({
        "strip": "# text",
        "clip": "# text\n",
        "keep": "# text\n\n"
      },
        """
         # Strip
          # Comments:
        strip: |-
          # text
          
         # Clip
          # comments:

        clip: |
          # text
         
         # Keep
          # comments:

        keep: |+
          # text

         # Trail
          # comments.
        """);
    });

    test('[Example 8.6]', () {
      expectYamlLoads({"strip": "", "clip": "", "keep": "\n"},
        """
        strip: >-

        clip: >

        keep: |+

        """);
    });

    test('[Example 8.7]', () {
      expectYamlLoads("literal\n\ttext\n",
        """
        |
         literal
         \ttext
        """);
    });

    test('[Example 8.8]', () {
      expectYamlLoads("\n\nliteral\n \n\ntext\n",
        """
        |
         
          
          literal
           
          
          text

         # Comment""");
    });

    test('[Example 8.9]', () {
      expectYamlLoads("folded text\n",
        """
        >
         folded
         text
        """);
    });

    test('[Example 8.10]', () {
      expectYamlLoads(
        cleanUpLiteral("""

        folded line
        next line
          * bullet

          * list
          * lines

        last line
        """),
        """
        >

         folded
         line

         next
         line
           * bullet

           * list
           * lines

         last
         line

        # Comment""");
    });

    // Examples 8.11 through 8.13 are duplicates of 8.10.
  });

  group('8.2: Block Collection Styles', () {
    test('[Example 8.14]', () {
      expectYamlLoads({"block sequence": ["one", {"two": "three"}]},
        """
        block sequence:
          - one
          - two : three""");
    });

    test('[Example 8.15]', () {
      expectYamlLoads([
        null, "block node\n", ["one", "two"], {"one": "two"}
      ],
        """
        - # Empty
        - |
         block node
        - - one # Compact
          - two # sequence
        - one: two # Compact mapping""");
    });

    test('[Example 8.16]', () {
      expectYamlLoads({"block mapping": {"key": "value"}},
        """
        block mapping:
         key: value""");
    });

    test('[Example 8.17]', () {
      expectYamlLoads({
        "explicit key": null,
        "block key\n": ["one", "two"]
      },
        """
        ? explicit key # Empty value
        ? |
          block key
        : - one # Explicit compact
          - two # block value""");
    });

    test('[Example 8.18]', () {
      var doc = yamlMap({
        'plain key': 'in-line value',
        "quoted key": ["entry"]
      });
      doc[null] = null;
      expectYamlLoads(doc,
        '''
        plain key: in-line value
        : # Both empty
        "quoted key":
        - entry''');
    });

    test('[Example 8.19]', () {
      var el = yamlMap();
      el[{'earth': 'blue'}] = {'moon': 'white'};
      expectYamlLoads([{'sun': 'yellow'}, el],
        """
        - sun: yellow
        - ? earth: blue
          : moon: white""");
    });

    // test('[Example 8.20]', () {
    //   expectYamlLoads(["flow in block", "Block scalar\n", {"foo": "bar"}],
    //     '''
    //     -
    //       "flow in block"
    //     - >
    //      Block scalar
    //     - !!map # Block collection
    //       foo : bar''');
    // });

    // test('[Example 8.21]', () {
    //   expectYamlLoads({"literal": "value", "folded": "value"},
    //     """
    //     literal: |2
    //       value
    //     folded:
    //        !!str
    //       >1
    //      value""");
    // });

    // test('[Example 8.22]', () {
    //   expectYamlLoads({
    //     "sequence": ["entry", ["nested"]],
    //     "mapping": {"foo": "bar"}
    //   },
    //     """
    //     sequence: !!seq
    //     - entry
    //     - !!seq
    //      - nested
    //     mapping: !!map
    //      foo: bar""");
    // });
  });

  // Chapter 9: YAML Character Stream
  group('9.1: Documents', () {
    // Example 9.1 tests the use of a BOM, which this implementation currently
    // doesn't plan to support.

    // test('[Example 9.2]', () {
    //   expectYamlLoads("Document",
    //     """
    //     %YAML 1.2
    //     ---
    //     Document
    //     ... # Suffix""");
    // });

    test('[Example 9.3]', () {
      // The spec example indicates that the comment after "%!PS-Adobe-2.0"
      // should be stripped, which would imply that that line is not part of the
      // literal defined by the "|". The rest of the spec is ambiguous on this
      // point; the allowable indentation for non-indented literal content is
      // not clearly explained. However, if both the "|" and the text were
      // indented the same amount, the text would be part of the literal, which
      // implies that the spec's parse of this document is incorrect.
      expectYamlStreamLoads(
        ["Bare document", "%!PS-Adobe-2.0 # Not the first line\n"],
        """
        Bare
        document
        ...
        # No document
        ...
        |
        %!PS-Adobe-2.0 # Not the first line
        """);
    });

    test('[Example 9.4]', () {
      expectYamlStreamLoads([{"matches %": 20}, null],
        """
        ---
        { matches
        % : 20 }
        ...
        ---
        # Empty
        ...""");
    });

    // test('[Example 9.5]', () {
    //   expectYamlStreamLoads(["%!PS-Adobe-2.0\n", null],
    //     """
    //     %YAML 1.2
    //     --- |
    //     %!PS-Adobe-2.0
    //     ...
    //     %YAML1.2
    //     ---
    //     # Empty
    //     ...""");
    // });

    // test('[Example 9.6]', () {
    //   expectYamlStreamLoads(["Document", null, {"matches %": 20}],
    //     """
    //     Document
    //     ---
    //     # Empty
    //     ...
    //     %YAML 1.2
    //     ---
    //     matches %: 20""");
    // });
  });

  // Chapter 10: Recommended Schemas
  group('10.1: Failsafe Schema', () {
    // test('[Example 10.1]', () {
    //   expectYamlStreamLoads({
    //     "Block style": {
    //       "Clark": "Evans",
    //       "Ingy": "döt Net",
    //       "Oren": "Ben-Kiki"
    //     },
    //     "Flow style": {
    //       "Clark": "Evans",
    //       "Ingy": "döt Net",
    //       "Oren": "Ben-Kiki"
    //     }
    //   },
    //     """
    //     Block style: !!map
    //       Clark : Evans
    //       Ingy  : döt Net
    //       Oren  : Ben-Kiki

    //     Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }""");
    // });

    // test('[Example 10.2]', () {
    //   expectYamlStreamLoads({
    //     "Block style": ["Clark Evans", "Ingy döt Net", "Oren Ben-Kiki"],
    //     "Flow style": ["Clark Evans", "Ingy döt Net", "Oren Ben-Kiki"]
    //   },
    //     """
    //     Block style: !!seq
    //     - Clark Evans
    //     - Ingy döt Net
    //     - Oren Ben-Kiki

    //     Flow style: !!seq [ Clark Evans, Ingy döt Net, Oren Ben-Kiki ]""");
    // });

    // test('[Example 10.3]', () {
    //   expectYamlStreamLoads({
    //     "Block style": "String: just a theory.",
    //     "Flow style": "String: just a theory."
    //   },
    //     '''
    //     Block style: !!str |-
    //       String: just a theory.

    //     Flow style: !!str "String: just a theory."''');
    // });
  });

  group('10.2: JSON Schema', () {
    // test('[Example 10.4]', () {
    //   var doc = yamlMap({"key with null value": null});
    //   doc[null] = "value for null key";
    //   expectYamlStreamLoads(doc,
    //     """
    //     !!null null: value for null key
    //     key with null value: !!null null""");
    // });

    // test('[Example 10.5]', () {
    //   expectYamlStreamLoads({
    //     "YAML is a superset of JSON": true,
    //     "Pluto is a planet": false
    //   },
    //     """
    //     YAML is a superset of JSON: !!bool true
    //     Pluto is a planet: !!bool false""");
    // });

    // test('[Example 10.6]', () {
    //   expectYamlStreamLoads({
    //     "negative": -12,
    //     "zero": 0,
    //     "positive": 34
    //   },
    //     """
    //     negative: !!int -12
    //     zero: !!int 0
    //     positive: !!int 34""");
    // });

    // test('[Example 10.7]', () {
    //   expectYamlStreamLoads({
    //     "negative": -1,
    //     "zero": 0,
    //     "positive": 23000,
    //     "infinity": infinity,
    //     "not a number": nan
    //   },
    //     """
    //     negative: !!float -1
    //     zero: !!float 0
    //     positive: !!float 2.3e4
    //     infinity: !!float .inf
    //     not a number: !!float .nan""");
    // });

    // test('[Example 10.8]', () {
    //   expectYamlStreamLoads({
    //     "A null": null,
    //     "Booleans": [true, false],
    //     "Integers": [0, -0, 3, -19],
    //     "Floats": [0, 0, 12000, -200000],
    //     // Despite being invalid in the JSON schema, these values are valid in
    //     // the core schema which this implementation supports.
    //     "Invalid": [ true, null, 7, 0x3A, 12.3]
    //   },
    //     """
    //     A null: null
    //     Booleans: [ true, false ]
    //     Integers: [ 0, -0, 3, -19 ]
    //     Floats: [ 0., -0.0, 12e03, -2E+05 ]
    //     Invalid: [ True, Null, 0o7, 0x3A, +12.3 ]""");
    // });
  });

  group('10.3: Core Schema', () {
    test('[Example 10.9]', () {
      expectYamlLoads({
        "A null": null,
        "Also a null": null,
        "Not a null": "",
        "Booleans": [true, true, false, false],
        "Integers": [0, 7, 0x3A, -19],
        "Floats": [0, 0, 0.5, 12000, -200000],
        "Also floats": [infinity, -infinity, infinity, nan]
      },
        '''
        A null: null
        Also a null: # Empty
        Not a null: ""
        Booleans: [ true, True, false, FALSE ]
        Integers: [ 0, 0o7, 0x3A, -19 ]
        Floats: [ 0., -0.0, .5, +12e03, -2E+05 ]
        Also floats: [ .inf, -.Inf, +.INF, .NAN ]''');
    });
  });
}
