date/test/solar_hijri_test/parse.pass.cpp
2020-03-08 20:18:45 -04:00

238 lines
8.4 KiB
C++

// The MIT License (MIT)
//
// Copyright (c) 2020 Asad. Gharighi
// Copyright (c) 2020 Howard Hinnant
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#include "date.h"
#include "solar_hijri.h"
#include "islamic.h"
#include "tz.h"
#include <cassert>
#include <iostream>
#include <chrono>
#include <math.h>
void
test_a() {
constexpr auto civil = date::year{2020}/date::January/27;
using namespace solar_hijri;
static_assert(year_month_day{civil} == 1398_y/11/07, "");
}
void
test_b() {
using namespace solar_hijri::literals;
static_assert(date::year_month_day{475_y/far/1} == date::year{1096}/03/21, "");
static_assert(date::year_month_weekday{475_y/far/1} ==
date::year{1096}/03/date::Saturday[3], "");
}
void
test_c() {
using namespace solar_hijri;
auto date = solar_hijri::year_month_day{1398_y/bah/6};
for (auto i = 0; i < 24; i++) {
auto weekday = solar_hijri::weekday{date};
assert(date == 1398_y/11/06 + months{i});
assert(date.month() == month{(i+10u)%12 + 1});
assert(weekday == (weekday[1]/date.month()/date.year()).weekday());
auto k = weekday;
for (auto j = 0; j < 14; j++, k++) {
assert(weekday + days{j} == k);
}
date+=solar_hijri::months(1);
}
}
void
test_d() {
auto zt = date::make_zoned(date::current_zone(), std::chrono::system_clock::now());
auto ld = date::floor<date::days>(zt.get_local_time());
solar_hijri::year_month_day ymd{ld};
auto time = date::make_time(zt.get_local_time() - ld);
(void)time;
}
void
test_e() {
auto sd = date::floor<solar_hijri::days>(std::chrono::system_clock::now());
auto today = solar_hijri::year_month_day{sd};
assert(solar_hijri::year_month_weekday{today}.weekday() == solar_hijri::weekday{sd});
}
void
test_f() {
constexpr auto isl = islamic::year{1441}/6/1;
using namespace solar_hijri;
static_assert(year_month_day{isl} == 1398_y/11/07, "");
}
void
test_g() {
date::year_month_day ymdd[] = {
date::year{1583}/date::November/21,
date::year{1583}/date::November/22,
date::year{1583}/date::December/6,
date::year{1591}/date::December/26,
date::year{1616}/date::October/20,
date::year{1619}/date::October/13,
date::year{1627}/date::August/9,
date::year{1649}/date::October/15,
date::year{1657}/date::August/9,
date::year{1682}/date::June/23,
date::year{1691}/date::October/12,
date::year{1712}/date::September/13,
date::year{1718}/date::July/17,
date::year{1747}/date::January/4,
date::year{1756}/date::January/1,
date::year{1770}/date::January/15,
date::year{1798}/date::October/24,
date::year{1809}/date::July/11,
date::year{1834}/date::July/17,
date::year{1850}/date::September/9,
date::year{1865}/date::November/4,
date::year{1902}/date::December/21,
date::year{1926}/date::March/21,
date::year{1926}/date::March/22,
date::year{1957}/date::June/1,
date::year{1977}/date::March/7,
date::year{1982}/date::May/30,
date::year{1992}/date::December/8
};
solar_hijri::year_month_day ymdh[] = {
solar_hijri::year{962}/solar_hijri::Aban/30,
solar_hijri::year{962}/solar_hijri::Azar/1,
solar_hijri::year{962}/solar_hijri::Azar/15,
solar_hijri::year{970}/solar_hijri::Dey/5,
solar_hijri::year{995}/solar_hijri::Mehr/29,
solar_hijri::year{998}/solar_hijri::Mehr/21,
solar_hijri::year{1006}/solar_hijri::Mordad/18,
solar_hijri::year{1028}/solar_hijri::Mehr/24,
solar_hijri::year{1036}/solar_hijri::Mordad/19,
solar_hijri::year{1061}/solar_hijri::Tir/3,
solar_hijri::year{1070}/solar_hijri::Mehr/20,
solar_hijri::year{1091}/solar_hijri::Shahrivar/22,
solar_hijri::year{1097}/solar_hijri::Tir/26,
solar_hijri::year{1125}/solar_hijri::Dey/14,
solar_hijri::year{1134}/solar_hijri::Dey/11,
solar_hijri::year{1148}/solar_hijri::Dey/26,
solar_hijri::year{1177}/solar_hijri::Aban/2,
solar_hijri::year{1188}/solar_hijri::Tir/20,
solar_hijri::year{1213}/solar_hijri::Tir/26,
solar_hijri::year{1229}/solar_hijri::Shahrivar/18,
solar_hijri::year{1244}/solar_hijri::Aban/13,
solar_hijri::year{1281}/solar_hijri::Azar/29,
solar_hijri::year{1304}/solar_hijri::Esfand/30,
solar_hijri::year{1305}/solar_hijri::Farvardin/1,
solar_hijri::year{1336}/solar_hijri::Khordad/11,
solar_hijri::year{1355}/solar_hijri::Esfand/16,
solar_hijri::year{1361}/solar_hijri::Khordad/9,
solar_hijri::year{1371}/solar_hijri::Azar/17
};
solar_hijri::year_month_weekday ymdwd[] = {
solar_hijri::year{962}/solar_hijri::Aban/solar_hijri::Doshanbe[5],
solar_hijri::year{962}/solar_hijri::Azar/solar_hijri::Seshanbe[1],
solar_hijri::year{962}/solar_hijri::Azar/solar_hijri::Seshanbe[3],
solar_hijri::year{970}/solar_hijri::Dey/solar_hijri::Panjshanbe[1],
solar_hijri::year{995}/solar_hijri::Mehr/solar_hijri::Panjshanbe[5],
solar_hijri::year{998}/solar_hijri::Mehr/solar_hijri::Yekshanbe[3],
solar_hijri::year{1006}/solar_hijri::Mordad/solar_hijri::Doshanbe[3],
solar_hijri::year{1028}/solar_hijri::Mehr/solar_hijri::Adine[4],
solar_hijri::year{1036}/solar_hijri::Mordad/solar_hijri::Panjshanbe[3],
solar_hijri::year{1061}/solar_hijri::Tir/solar_hijri::Seshanbe[1],
solar_hijri::year{1070}/solar_hijri::Mehr/solar_hijri::Adine[3],
solar_hijri::year{1091}/solar_hijri::Shahrivar/solar_hijri::Seshanbe[4],
solar_hijri::year{1097}/solar_hijri::Tir/solar_hijri::Yekshanbe[4],
solar_hijri::year{1125}/solar_hijri::Dey/solar_hijri::Chaharshanbe[2],
solar_hijri::year{1134}/solar_hijri::Dey/solar_hijri::Panjshanbe[2],
solar_hijri::year{1148}/solar_hijri::Dey/solar_hijri::Doshanbe[4],
solar_hijri::year{1177}/solar_hijri::Aban/solar_hijri::Chaharshanbe[1],
solar_hijri::year{1188}/solar_hijri::Tir/solar_hijri::Seshanbe[3],
solar_hijri::year{1213}/solar_hijri::Tir/solar_hijri::Panjshanbe[4],
solar_hijri::year{1229}/solar_hijri::Shahrivar/solar_hijri::Doshanbe[3],
solar_hijri::year{1244}/solar_hijri::Aban/solar_hijri::Shanbe[2],
solar_hijri::year{1281}/solar_hijri::Azar/solar_hijri::Yekshanbe[5],
solar_hijri::year{1304}/solar_hijri::Esfand/solar_hijri::Yekshanbe[5],
solar_hijri::year{1305}/solar_hijri::Farvardin/solar_hijri::Doshanbe[1],
solar_hijri::year{1336}/solar_hijri::Khordad/solar_hijri::Shanbe[2],
solar_hijri::year{1355}/solar_hijri::Esfand/solar_hijri::Doshanbe[3],
solar_hijri::year{1361}/solar_hijri::Khordad/solar_hijri::Yekshanbe[2],
solar_hijri::year{1371}/solar_hijri::Azar/solar_hijri::Seshanbe[3]
};
bool leaps[] = {
true,
true,
true,
true,
true,
false,
false,
true,
true,
true,
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
false
};
static_assert(sizeof(ymdd)/sizeof(ymdd[0]) == sizeof(ymdwd)/sizeof(ymdwd[0]), "");
static_assert(sizeof(ymdd)/sizeof(ymdd[0]) == sizeof(ymdh)/sizeof(ymdh[0]), "");
static_assert(sizeof(ymdd)/sizeof(ymdd[0]) == sizeof(leaps)/sizeof(leaps[0]), "");
for (auto i = 0; i < sizeof(ymdd)/sizeof(ymdd[0]); ++i)
{
assert(solar_hijri::year_month_day{ymdd[i]} == ymdh[i]);
assert(ymdd[i] == date::year_month_day{ymdh[i]});
assert(ymdh[i].year().is_leap() == leaps[i]);
assert(solar_hijri::year_month_weekday{ymdd[i]} == ymdwd[i]);
}
}
int
main()
{
test_a();
test_b();
test_c();
test_d();
test_e();
test_f();
test_g();
}