//===-- Unittests for asctime ---------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "src/errno/libc_errno.h"
#include "src/time/asctime.h"
#include "test/UnitTest/Test.h"
#include "test/src/time/TmHelper.h"

static inline char *call_asctime(struct tm *tm_data, int year, int month,
                                 int mday, int hour, int min, int sec, int wday,
                                 int yday) {
  LIBC_NAMESPACE::tmhelper::testing::initialize_tm_data(
      tm_data, year, month, mday, hour, min, sec, wday, yday);
  return LIBC_NAMESPACE::asctime(tm_data);
}

TEST(LlvmLibcAsctime, Nullptr) {
  char *result;
  result = LIBC_NAMESPACE::asctime(nullptr);
  ASSERT_ERRNO_EQ(EINVAL);
  ASSERT_STREQ(nullptr, result);
}

// Weekdays are in the range 0 to 6. Test passing invalid value in wday.
TEST(LlvmLibcAsctime, InvalidWday) {
  struct tm tm_data;

  // Test with wday = -1.
  call_asctime(&tm_data,
               1970, // year
               1,    // month
               1,    // day
               0,    // hr
               0,    // min
               0,    // sec
               -1,   // wday
               0);   // yday
  ASSERT_ERRNO_EQ(EINVAL);

  // Test with wday = 7.
  call_asctime(&tm_data,
               1970, // year
               1,    // month
               1,    // day
               0,    // hr
               0,    // min
               0,    // sec
               7,    // wday
               0);   // yday
  ASSERT_ERRNO_EQ(EINVAL);
}

// Months are from January to December. Test passing invalid value in month.
TEST(LlvmLibcAsctime, InvalidMonth) {
  struct tm tm_data;

  // Test with month = 0.
  call_asctime(&tm_data,
               1970, // year
               0,    // month
               1,    // day
               0,    // hr
               0,    // min
               0,    // sec
               4,    // wday
               0);   // yday
  ASSERT_ERRNO_EQ(EINVAL);

  // Test with month = 13.
  call_asctime(&tm_data,
               1970, // year
               13,   // month
               1,    // day
               0,    // hr
               0,    // min
               0,    // sec
               4,    // wday
               0);   // yday
  ASSERT_ERRNO_EQ(EINVAL);
}

TEST(LlvmLibcAsctime, ValidWeekdays) {
  struct tm tm_data;
  char *result;
  // 1970-01-01 00:00:00.
  result = call_asctime(&tm_data,
                        1970, // year
                        1,    // month
                        1,    // day
                        0,    // hr
                        0,    // min
                        0,    // sec
                        4,    // wday
                        0);   // yday
  ASSERT_STREQ("Thu Jan  1 00:00:00 1970\n", result);

  // 1970-01-03 00:00:00.
  result = call_asctime(&tm_data,
                        1970, // year
                        1,    // month
                        3,    // day
                        0,    // hr
                        0,    // min
                        0,    // sec
                        6,    // wday
                        0);   // yday
  ASSERT_STREQ("Sat Jan  3 00:00:00 1970\n", result);

  // 1970-01-04 00:00:00.
  result = call_asctime(&tm_data,
                        1970, // year
                        1,    // month
                        4,    // day
                        0,    // hr
                        0,    // min
                        0,    // sec
                        0,    // wday
                        0);   // yday
  ASSERT_STREQ("Sun Jan  4 00:00:00 1970\n", result);
}

TEST(LlvmLibcAsctime, ValidMonths) {
  struct tm tm_data;
  char *result;
  // 1970-01-01 00:00:00.
  result = call_asctime(&tm_data,
                        1970, // year
                        1,    // month
                        1,    // day
                        0,    // hr
                        0,    // min
                        0,    // sec
                        4,    // wday
                        0);   // yday
  ASSERT_STREQ("Thu Jan  1 00:00:00 1970\n", result);

  // 1970-02-01 00:00:00.
  result = call_asctime(&tm_data,
                        1970, // year
                        2,    // month
                        1,    // day
                        0,    // hr
                        0,    // min
                        0,    // sec
                        0,    // wday
                        0);   // yday
  ASSERT_STREQ("Sun Feb  1 00:00:00 1970\n", result);

  // 1970-12-31 23:59:59.
  result = call_asctime(&tm_data,
                        1970, // year
                        12,   // month
                        31,   // day
                        23,   // hr
                        59,   // min
                        59,   // sec
                        4,    // wday
                        0);   // yday
  ASSERT_STREQ("Thu Dec 31 23:59:59 1970\n", result);
}

TEST(LlvmLibcAsctime, EndOf32BitEpochYear) {
  struct tm tm_data;
  char *result;
  // Test for maximum value of a signed 32-bit integer.
  // Test implementation can encode time for Tue 19 January 2038 03:14:07 UTC.
  result = call_asctime(&tm_data,
                        2038, // year
                        1,    // month
                        19,   // day
                        3,    // hr
                        14,   // min
                        7,    // sec
                        2,    // wday
                        7);   // yday
  ASSERT_STREQ("Tue Jan 19 03:14:07 2038\n", result);
}

TEST(LlvmLibcAsctime, Max64BitYear) {
  if (sizeof(time_t) == 4)
    return;
  // Mon Jan 1 12:50:50 2170 (200 years from 1970),
  struct tm tm_data;
  char *result;
  result = call_asctime(&tm_data,
                        2170, // year
                        1,    // month
                        1,    // day
                        12,   // hr
                        50,   // min
                        50,   // sec
                        1,    // wday
                        50);  // yday
  ASSERT_STREQ("Mon Jan  1 12:50:50 2170\n", result);

  // Test for Tue Jan 1 12:50:50 in 2,147,483,647th year.
  // This test would cause buffer overflow and thus asctime returns nullptr.
  result = call_asctime(&tm_data,
                        2147483647, // year
                        1,          // month
                        1,          // day
                        12,         // hr
                        50,         // min
                        50,         // sec
                        2,          // wday
                        50);        // yday
  ASSERT_ERRNO_EQ(EOVERFLOW);
  ASSERT_STREQ(nullptr, result);
}
