// Copyright (c) 2015, 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.

import "package:compiler/src/platform_configuration.dart";
import "package:expect/expect.dart";

/// Runs the parser on [input] and compares it with [expectedResult]
///
/// A '*' in [input] indicates that the parser will report an error at the
/// given point (On [input] with the "*" removed).
test(String input, [Map<String, Map<String, String>> expectedOutput]) {
  int starIndex = input.indexOf("*");
  String inputWithoutStar = input.replaceFirst("*", "");

  parse() => parseIni(inputWithoutStar.codeUnits,
      allowedSections: new Set.from(["AA", "BB"]));

  if (starIndex != -1) {
    Expect.equals(expectedOutput, null);
    Expect.throws(parse, (dynamic e) {
      Expect.isTrue(e is FormatException);
      Expect.equals(starIndex, e.offset);
      return e is FormatException;
    });
  } else {
    Map<String, Map<String, String>> result = parse();
    Expect.equals(expectedOutput.length, result.length);
    expectedOutput.forEach((String name, Map<String, String> properties) {
      Expect.isTrue(expectedOutput.containsKey(name), "Missing section $name");
      Expect.mapEquals(expectedOutput[name], properties);
    });
  }
}

main() {
  // Empty file.
  test("""
# Nothing here
""", {});

  // Text outside section.
  test("""
*aaa
""");

  // Malformed header.
  test("""
*[AABC
name:value
""");

  // Text after header.
  test("""
[AABC]*abcde
""");

  // Empty section name.
  test("""
[*]
""");

  // Duplicate section name.
  test("""
[AA]
[BB]
[*AA]
""");

  // Unrecognized section name.
  test("""
[*CC]
""");

  // Empty property name.
  test("""
[AA]
*:value
name:value
""");

  // Ok.
  test("""
[AA]
name:value
[BB]
name:value
name2:value2
""", {
    "AA": {"name": "value"},
    "BB": {"name": "value", "name2": "value2"}
  });

  // Ok, file not ending in newline.
  test("""
[AA]
name:value""", {
    "A": {"name": "value"}
  });

  // Ok, whitespace is trimmed away.
  test("""
[ AA ]
 name\t:  value """, {
    "A": {"name": "value"}
  });

  // Duplicate property name.
  test("""
[AA]
a:b
b:c
*a:c
""");

  // No ':' on property line.
  test("""
[AA]
*name1
name2:value
""");
}
