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

/// Tests for the loose option when parsing dates and times, which accept
/// mixed-case input and are able to skip missing delimiters. This is only
/// tested in basic US locale, it's hard to define for others.
library date_time_loose_test;

import 'package:intl/intl.dart';
import 'package:unittest/unittest.dart';

main() {
  var format;

  var date = new DateTime(2014, 9, 3);

  check(String s) {
    expect(() => format.parse(s), throwsFormatException);
    expect(format.parseLoose(s), date);
  }

  test("Loose parsing yMMMd", () {
    // Note: We can't handle e.g. Sept, we don't have those abbreviations
    // in our data.
    // Also doesn't handle "sep3,2014", or "sep 3.2014"
    format = new DateFormat.yMMMd("en_US");
    check("Sep 3 2014");
    check("sep 3 2014");
    check("sep 3  2014");
    check("sep  3 2014");
    check("sep  3       2014");
    check("sep3 2014");
    check("september 3, 2014");
    check("sEPTembER 3, 2014");
    check("seP 3, 2014");
  });

  test("Loose parsing yMMMd that parses strict", () {
    expect(format.parseLoose("Sep 3, 2014"), date);
  });

  test("Loose parsing yMd", () {
    format = new DateFormat.yMd("en_US");
    check("09 3 2014");
    check("09 00003    2014");
    check("09/    03/2014");
    expect(() => format.parseLoose("09 / 03 / 2014"),
        throwsA(new isInstanceOf<FormatException>()));
  });

  test("Loose parsing yMd that parses strict", () {
    expect(format.parseLoose("09/03/2014"), date);
    expect(format.parseLoose("09/3/2014"), date);
  });
}
