// 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.

// @dart = 2.9

import "dart:async";
import "dart:math";
import "dart:io";
import "package:expect/expect.dart";

void testParseHttpDate() {
  DateTime date;
  date = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0);
  Expect.equals(date, HttpDate.parse("Fri, 11 Jun 1999 18:46:53 GMT"));
  Expect.equals(date, HttpDate.parse("Friday, 11-Jun-1999 18:46:53 GMT"));
  Expect.equals(date, HttpDate.parse("Fri Jun 11 18:46:53 1999"));

  date = new DateTime.utc(1970, DateTime.january, 1, 0, 0, 0, 0);
  Expect.equals(date, HttpDate.parse("Thu, 1 Jan 1970 00:00:00 GMT"));
  Expect.equals(date, HttpDate.parse("Thursday, 1-Jan-1970 00:00:00 GMT"));
  Expect.equals(date, HttpDate.parse("Thu Jan  1 00:00:00 1970"));

  date = new DateTime.utc(2012, DateTime.march, 5, 23, 59, 59, 0);
  Expect.equals(date, HttpDate.parse("Mon, 5 Mar 2012 23:59:59 GMT"));
  Expect.equals(date, HttpDate.parse("Monday, 5-Mar-2012 23:59:59 GMT"));
  Expect.equals(date, HttpDate.parse("Mon Mar  5 23:59:59 2012"));
}

void testFormatParseHttpDate() {
  test(int year, int month, int day, int hours, int minutes, int seconds,
      String expectedFormatted) {
    DateTime date;
    String formatted;
    date = new DateTime.utc(year, month, day, hours, minutes, seconds, 0);
    formatted = HttpDate.format(date);
    Expect.equals(expectedFormatted, formatted);
    Expect.equals(date, HttpDate.parse(formatted));
  }

  test(1999, DateTime.june, 11, 18, 46, 53, "Fri, 11 Jun 1999 18:46:53 GMT");
  test(1970, DateTime.january, 1, 0, 0, 0, "Thu, 01 Jan 1970 00:00:00 GMT");
  test(1970, DateTime.january, 1, 9, 9, 9, "Thu, 01 Jan 1970 09:09:09 GMT");
  test(2012, DateTime.march, 5, 23, 59, 59, "Mon, 05 Mar 2012 23:59:59 GMT");
}

void testParseHttpDateFailures() {
  Expect.throws(() {
    HttpDate.parse("");
  });
  String valid = "Mon, 5 Mar 2012 23:59:59 GMT";
  for (int i = 1; i < valid.length - 1; i++) {
    String tmp = valid.substring(0, i);
    Expect.throws(() {
      HttpDate.parse(tmp);
    });
    Expect.throws(() {
      HttpDate.parse(" $tmp");
    });
    Expect.throws(() {
      HttpDate.parse(" $tmp ");
    });
    Expect.throws(() {
      HttpDate.parse("$tmp ");
    });
  }
  Expect.throws(() {
    HttpDate.parse(" $valid");
  });
  Expect.throws(() {
    HttpDate.parse(" $valid ");
  });
  Expect.throws(() {
    HttpDate.parse("$valid ");
  });
}

void main() {
  testParseHttpDate();
  testFormatParseHttpDate();
  testParseHttpDateFailures();
}
