diff --git a/date.h b/date.h index 50e54a5..bce38ba 100644 --- a/date.h +++ b/date.h @@ -3017,6 +3017,7 @@ namespace detail enum class classify { + not_valid, hour, minute, second, @@ -3026,7 +3027,8 @@ enum class classify template struct classify_duration { - static CONSTDATA classify value = + static CONSTDATA classify value = + Duration{1} >= days{1} ? classify::not_valid : Duration{1} >= std::chrono::hours{1} ? classify::hour : Duration{1} >= std::chrono::minutes{1} ? classify::minute : Duration{1} >= std::chrono::seconds{1} ? classify::second : diff --git a/test/date_test/make_time.pass.cpp b/test/date_test/make_time.pass.cpp new file mode 100644 index 0000000..3adc60b --- /dev/null +++ b/test/date_test/make_time.pass.cpp @@ -0,0 +1,164 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 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. + +// template ::value>::type> +// constexpr +// time_of_day> +// make_time(std::chrono::duration d) noexcept; + +// constexpr +// time_of_day +// make_time(std::chrono::hours h, unsigned md) noexcept; + +// constexpr +// time_of_day +// make_time(std::chrono::hours h, std::chrono::minutes m, unsigned md) noexcept; + +// constexpr +// time_of_day +// make_time(std::chrono::hours h, std::chrono::minutes m, std::chrono::seconds s, +// unsigned md) noexcept; + +// template >::value>::type> +// constexpr +// time_of_day> +// make_time(std::chrono::hours h, std::chrono::minutes m, std::chrono::seconds s, +// std::chrono::duration sub_s, unsigned md) noexcept; + +#include "date.h" + +#include +#include + +int +main() +{ + using namespace date; + using namespace std; + using namespace std::chrono; + + { + static_assert(is_same>{}, ""); + auto tod = make_time(nanoseconds{18429000000022}); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.subseconds() == nanoseconds{22}); + assert(tod.mode() == 0); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(microseconds{18429000022}); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.subseconds() == microseconds{22}); + assert(tod.mode() == 0); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(seconds{18429}); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.mode() == 0); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(minutes{307}); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.mode() == 0); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}); + assert(tod.hours() == hours{5}); + assert(tod.mode() == 0); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}, minutes{7}, seconds{9}, nanoseconds{22}, pm); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.subseconds() == nanoseconds{22}); + assert(tod.mode() == pm); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}, minutes{7}, seconds{9}, microseconds{22}, 0); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.subseconds() == microseconds{22}); + assert(tod.mode() == 0); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}, minutes{7}, seconds{9}, milliseconds{22}, am); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.subseconds() == milliseconds{22}); + assert(tod.mode() == am); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}, minutes{7}, seconds{9}, am); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.seconds() == seconds{9}); + assert(tod.mode() == am); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}, minutes{7}, pm); + assert(tod.hours() == hours{5}); + assert(tod.minutes() == minutes{7}); + assert(tod.mode() == pm); + } + { + static_assert(is_same>{}, ""); + auto tod = make_time(hours{5}, 0); + assert(tod.hours() == hours{5}); + assert(tod.mode() == 0); + } +} diff --git a/test/date_test/time_of_day_hours.pass.cpp b/test/date_test/time_of_day_hours.pass.cpp new file mode 100644 index 0000000..0e82ba7 --- /dev/null +++ b/test/date_test/time_of_day_hours.pass.cpp @@ -0,0 +1,105 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 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. + +// enum {am = 1, pm}; + +// class time_of_day +// { +// public: +// using precision = std::chrono::hours; +// +// constexpr explicit time_of_day(std::chrono::hours since_midnight) noexcept; +// constexpr time_of_day(std::chrono::hours h, unsigned md) noexcept; +// +// constexpr std::chrono::hours hours() const noexcept; +// constexpr unsigned mode() const noexcept; +// +// constexpr explicit operator precision() const noexcept; +// constexpr precision to_duration() const noexcept; +// +// void make24() noexcept; +// void make12() noexcept; +// }; + +// std::ostream& operator<<(std::ostream& os, const time_of_day& t); + +#include "date.h" + +#include +#include +#include + +int +main() +{ + using namespace date; + using namespace std; + using namespace std::chrono; + + using tod = time_of_day; + + static_assert(is_same{}, ""); + + static_assert( is_trivially_destructible{}, ""); + static_assert(!is_default_constructible{}, ""); + static_assert( is_trivially_copy_constructible{}, ""); + static_assert( is_trivially_copy_assignable{}, ""); + static_assert( is_trivially_move_constructible{}, ""); + static_assert( is_trivially_move_assignable{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + static_assert(is_nothrow_constructible{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + + constexpr tod t1 = tod{hours{13}}; + static_assert(t1.hours() == hours{13}, ""); + static_assert(t1.mode() == 0, ""); +#if __cplusplus >= 201402 + static_assert(static_cast(t1) == hours{13}, ""); + static_assert(t1.to_duration() == hours{13}, ""); +#endif + + auto t2 = t1; + assert(t2.hours() == t1.hours()); + assert(t2.mode() == t1.mode()); + assert(t2.to_duration() == t1.to_duration()); + ostringstream os; + os << t2; + assert(os.str() == "1300"); + t2.make12(); + os.str(""); + assert(t2.hours() == hours{1}); + assert(t2.mode() == pm); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "1pm"); + t2.make24(); + os.str(""); + assert(t2.hours() == hours{13}); + assert(t2.mode() == 0); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "1300"); +} diff --git a/test/date_test/time_of_day_milliseconds.pass.cpp b/test/date_test/time_of_day_milliseconds.pass.cpp new file mode 100644 index 0000000..36a97d4 --- /dev/null +++ b/test/date_test/time_of_day_milliseconds.pass.cpp @@ -0,0 +1,128 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 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. + +// enum {am = 1, pm}; + +// template +// class time_of_day> +// { +// public: +// using precision = std::chrono::std::chrono::duration; +// +// constexpr explicit time_of_day(precision since_midnight) noexcept; +// constexpr time_of_day(std::chrono::hours h, std::chrono::minutes m, +// std::chrono::seconds s, precision sub_s, +// unsigned md) noexcept; +// +// constexpr std::chrono::hours hours() const noexcept; +// constexpr std::chrono::minutes minutes() const noexcept; +// constexpr std::chrono::seconds seconds() const noexcept; +// constexpr precision subseconds() const noexcept; +// constexpr unsigned mode() const noexcept; +// +// constexpr explicit operator precision() const noexcept; +// constexpr precision to_duration() const noexcept; +// +// void make24() noexcept; +// void make12() noexcept; +// }; + +// template +// std::ostream& +// operator<<(std::ostream& os, const time_of_day>& t); + +#include "date.h" + +#include +#include +#include + +int +main() +{ + using namespace date; + using namespace std; + using namespace std::chrono; + + using tod = time_of_day; + + static_assert(is_same{}, ""); + + static_assert( is_trivially_destructible{}, ""); + static_assert(!is_default_constructible{}, ""); + static_assert( is_trivially_copy_constructible{}, ""); + static_assert( is_trivially_copy_assignable{}, ""); + static_assert( is_trivially_move_constructible{}, ""); + static_assert( is_trivially_move_assignable{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + static_assert(is_nothrow_constructible{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + + constexpr tod t1 = tod{hours{13} + minutes{7} + seconds{5} + milliseconds{22}}; + static_assert(t1.hours() == hours{13}, ""); + static_assert(t1.minutes() == minutes{7}, ""); + static_assert(t1.seconds() == seconds{5}, ""); + static_assert(t1.subseconds() == milliseconds{22}, ""); + static_assert(t1.mode() == 0, ""); +#if __cplusplus >= 201402 + static_assert(static_cast(t1) == hours{13} + minutes{7} + + seconds{5} + milliseconds{22}, ""); + static_assert(t1.to_duration() == hours{13} + minutes{7} + seconds{5} + + milliseconds{22}, ""); +#endif + + auto t2 = t1; + assert(t2.hours() == t1.hours()); + assert(t2.minutes() == t1.minutes()); + assert(t2.seconds() == t1.seconds()); + assert(t2.subseconds() == t1.subseconds()); + assert(t2.mode() == t1.mode()); + assert(t2.to_duration() == t1.to_duration()); + ostringstream os; + os << t2; + assert(os.str() == "13:07:05.022"); + t2.make12(); + os.str(""); + assert(t2.hours() == hours{1}); + assert(t2.minutes() == minutes{7}); + assert(t2.seconds() == seconds{5}); + assert(t2.subseconds() == milliseconds{22}); + assert(t2.mode() == pm); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "1:07:05.022pm"); + t2.make24(); + os.str(""); + assert(t2.hours() == hours{13}); + assert(t2.minutes() == minutes{7}); + assert(t2.seconds() == seconds{5}); + assert(t2.subseconds() == milliseconds{22}); + assert(t2.mode() == 0); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "13:07:05.022"); +} diff --git a/test/date_test/time_of_day_minutes.pass.cpp b/test/date_test/time_of_day_minutes.pass.cpp new file mode 100644 index 0000000..83f399b --- /dev/null +++ b/test/date_test/time_of_day_minutes.pass.cpp @@ -0,0 +1,111 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 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. + +// enum {am = 1, pm}; + +// class time_of_day +// { +// public: +// using precision = std::chrono::minutes; +// +// constexpr explicit time_of_day(std::chrono::minutes since_midnight) noexcept; +// constexpr time_of_day(std::chrono::hours h, std::chrono::minutes m, +// unsigned md) noexcept; +// +// constexpr std::chrono::hours hours() const noexcept; +// constexpr std::chrono::minutes minutes() const noexcept; +// constexpr unsigned mode() const noexcept; +// +// constexpr explicit operator precision() const noexcept; +// constexpr precision to_duration() const noexcept; +// +// void make24() noexcept; +// void make12() noexcept; +// }; + +// std::ostream& operator<<(std::ostream& os, const time_of_day& t); + +#include "date.h" + +#include +#include +#include + +int +main() +{ + using namespace date; + using namespace std; + using namespace std::chrono; + + using tod = time_of_day; + + static_assert(is_same{}, ""); + + static_assert( is_trivially_destructible{}, ""); + static_assert(!is_default_constructible{}, ""); + static_assert( is_trivially_copy_constructible{}, ""); + static_assert( is_trivially_copy_assignable{}, ""); + static_assert( is_trivially_move_constructible{}, ""); + static_assert( is_trivially_move_assignable{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + static_assert(is_nothrow_constructible{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + + constexpr tod t1 = tod{hours{13} + minutes{7}}; + static_assert(t1.hours() == hours{13}, ""); + static_assert(t1.minutes() == minutes{7}, ""); + static_assert(t1.mode() == 0, ""); +#if __cplusplus >= 201402 + static_assert(static_cast(t1) == hours{13} + minutes{7}, ""); + static_assert(t1.to_duration() == hours{13} + minutes{7}, ""); +#endif + + auto t2 = t1; + assert(t2.hours() == t1.hours()); + assert(t2.minutes() == t1.minutes()); + assert(t2.mode() == t1.mode()); + assert(t2.to_duration() == t1.to_duration()); + ostringstream os; + os << t2; + assert(os.str() == "13:07"); + t2.make12(); + os.str(""); + assert(t2.hours() == hours{1}); + assert(t2.minutes() == minutes{7}); + assert(t2.mode() == pm); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "1:07pm"); + t2.make24(); + os.str(""); + assert(t2.hours() == hours{13}); + assert(t2.minutes() == minutes{7}); + assert(t2.mode() == 0); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "13:07"); +} diff --git a/test/date_test/time_of_day_nanoseconds.pass.cpp b/test/date_test/time_of_day_nanoseconds.pass.cpp new file mode 100644 index 0000000..553bc83 --- /dev/null +++ b/test/date_test/time_of_day_nanoseconds.pass.cpp @@ -0,0 +1,128 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 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. + +// enum {am = 1, pm}; + +// template +// class time_of_day> +// { +// public: +// using precision = std::chrono::std::chrono::duration; +// +// constexpr explicit time_of_day(precision since_midnight) noexcept; +// constexpr time_of_day(std::chrono::hours h, std::chrono::minutes m, +// std::chrono::seconds s, precision sub_s, +// unsigned md) noexcept; +// +// constexpr std::chrono::hours hours() const noexcept; +// constexpr std::chrono::minutes minutes() const noexcept; +// constexpr std::chrono::seconds seconds() const noexcept; +// constexpr precision subseconds() const noexcept; +// constexpr unsigned mode() const noexcept; +// +// constexpr explicit operator precision() const noexcept; +// constexpr precision to_duration() const noexcept; +// +// void make24() noexcept; +// void make12() noexcept; +// }; + +// template +// std::ostream& +// operator<<(std::ostream& os, const time_of_day>& t); + +#include "date.h" + +#include +#include +#include + +int +main() +{ + using namespace date; + using namespace std; + using namespace std::chrono; + + using tod = time_of_day; + + static_assert(is_same{}, ""); + + static_assert( is_trivially_destructible{}, ""); + static_assert(!is_default_constructible{}, ""); + static_assert( is_trivially_copy_constructible{}, ""); + static_assert( is_trivially_copy_assignable{}, ""); + static_assert( is_trivially_move_constructible{}, ""); + static_assert( is_trivially_move_assignable{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + static_assert(is_nothrow_constructible{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + + constexpr tod t1 = tod{hours{13} + minutes{7} + seconds{5} + nanoseconds{22}}; + static_assert(t1.hours() == hours{13}, ""); + static_assert(t1.minutes() == minutes{7}, ""); + static_assert(t1.seconds() == seconds{5}, ""); + static_assert(t1.subseconds() == nanoseconds{22}, ""); + static_assert(t1.mode() == 0, ""); +#if __cplusplus >= 201402 + static_assert(static_cast(t1) == hours{13} + minutes{7} + + seconds{5} + nanoseconds{22}, ""); + static_assert(t1.to_duration() == hours{13} + minutes{7} + seconds{5} + + nanoseconds{22}, ""); +#endif + + auto t2 = t1; + assert(t2.hours() == t1.hours()); + assert(t2.minutes() == t1.minutes()); + assert(t2.seconds() == t1.seconds()); + assert(t2.subseconds() == t1.subseconds()); + assert(t2.mode() == t1.mode()); + assert(t2.to_duration() == t1.to_duration()); + ostringstream os; + os << t2; + assert(os.str() == "13:07:05.000000022"); + t2.make12(); + os.str(""); + assert(t2.hours() == hours{1}); + assert(t2.minutes() == minutes{7}); + assert(t2.seconds() == seconds{5}); + assert(t2.subseconds() == nanoseconds{22}); + assert(t2.mode() == pm); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "1:07:05.000000022pm"); + t2.make24(); + os.str(""); + assert(t2.hours() == hours{13}); + assert(t2.minutes() == minutes{7}); + assert(t2.seconds() == seconds{5}); + assert(t2.subseconds() == nanoseconds{22}); + assert(t2.mode() == 0); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "13:07:05.000000022"); +} diff --git a/test/date_test/time_of_day_seconds.pass.cpp b/test/date_test/time_of_day_seconds.pass.cpp new file mode 100644 index 0000000..ba9c134 --- /dev/null +++ b/test/date_test/time_of_day_seconds.pass.cpp @@ -0,0 +1,117 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 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. + +// enum {am = 1, pm}; + +// class time_of_day +// { +// public: +// using precision = std::chrono::seconds; +// +// constexpr explicit time_of_day(std::chrono::seconds since_midnight) noexcept; +// constexpr time_of_day(std::chrono::hours h, std::chrono::minutes m, +// std::chrono::seconds s, unsigned md) noexcept; +// +// constexpr std::chrono::hours hours() const noexcept; +// constexpr std::chrono::minutes minutes() const noexcept; +// constexpr std::chrono::seconds seconds() const noexcept; +// constexpr unsigned mode() const noexcept; +// +// constexpr explicit operator precision() const noexcept; +// constexpr precision to_duration() const noexcept; +// +// void make24() noexcept; +// void make12() noexcept; +// }; + +// std::ostream& operator<<(std::ostream& os, const time_of_day& t); + +#include "date.h" + +#include +#include +#include + +int +main() +{ + using namespace date; + using namespace std; + using namespace std::chrono; + + using tod = time_of_day; + + static_assert(is_same{}, ""); + + static_assert( is_trivially_destructible{}, ""); + static_assert(!is_default_constructible{}, ""); + static_assert( is_trivially_copy_constructible{}, ""); + static_assert( is_trivially_copy_assignable{}, ""); + static_assert( is_trivially_move_constructible{}, ""); + static_assert( is_trivially_move_assignable{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + static_assert(is_nothrow_constructible{}, ""); + + static_assert(is_nothrow_constructible{}, ""); + static_assert(!is_convertible{}, ""); + + constexpr tod t1 = tod{hours{13} + minutes{7} + seconds{5}}; + static_assert(t1.hours() == hours{13}, ""); + static_assert(t1.minutes() == minutes{7}, ""); + static_assert(t1.seconds() == seconds{5}, ""); + static_assert(t1.mode() == 0, ""); +#if __cplusplus >= 201402 + static_assert(static_cast(t1) == hours{13} + minutes{7} + + seconds{5}, ""); + static_assert(t1.to_duration() == hours{13} + minutes{7} + seconds{5}, ""); +#endif + + auto t2 = t1; + assert(t2.hours() == t1.hours()); + assert(t2.minutes() == t1.minutes()); + assert(t2.seconds() == t1.seconds()); + assert(t2.mode() == t1.mode()); + assert(t2.to_duration() == t1.to_duration()); + ostringstream os; + os << t2; + assert(os.str() == "13:07:05"); + t2.make12(); + os.str(""); + assert(t2.hours() == hours{1}); + assert(t2.minutes() == minutes{7}); + assert(t2.seconds() == seconds{5}); + assert(t2.mode() == pm); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "1:07:05pm"); + t2.make24(); + os.str(""); + assert(t2.hours() == hours{13}); + assert(t2.minutes() == minutes{7}); + assert(t2.seconds() == seconds{5}); + assert(t2.mode() == 0); + assert(t2.to_duration() == t1.to_duration()); + os << t2; + assert(os.str() == "13:07:05"); +}