diff --git a/test/tz_test/OffsetZone.h b/test/tz_test/OffsetZone.h new file mode 100644 index 0000000..bacb03c --- /dev/null +++ b/test/tz_test/OffsetZone.h @@ -0,0 +1,73 @@ +#ifndef OFFSET_ZONE_H +#define OFFSET_ZONE_H + +// The MIT License (MIT) +// +// Copyright (c) 2017 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. + +// Test custom time zone support + +#include "tz.h" + +class OffsetZone +{ + std::chrono::minutes offset_; + +public: + explicit OffsetZone(std::chrono::minutes offset) + : offset_{offset} + {} + + template + auto + to_local(date::sys_time tp) const + { + using namespace date; + using namespace std::chrono; + using LT = local_time>; + return LT{(tp + offset_).time_since_epoch()}; + } + + template + auto + to_sys(date::local_time tp, date::choose = date::choose::earliest) const + { + using namespace date; + using namespace std::chrono; + using ST = sys_time>; + return ST{(tp - offset_).time_since_epoch()}; + } + + template + date::sys_info + get_info(date::sys_time st) const + { + using namespace date; + using namespace std::chrono; + return {sys_seconds::min(), sys_seconds::max(), offset_, + minutes{0}, offset_ >= minutes{0} ? "+" + date::format("%H%M", offset_) + : "-" + date::format("%H%M", -offset_)}; + } + + const OffsetZone* operator->() const {return this;} +}; + +#endif // OFFSET_ZONE_H diff --git a/test/tz_test/OffsetZone.pass.cpp b/test/tz_test/OffsetZone.pass.cpp index b0f9e23..0cef837 100644 --- a/test/tz_test/OffsetZone.pass.cpp +++ b/test/tz_test/OffsetZone.pass.cpp @@ -23,50 +23,7 @@ // Test custom time zone support #include "tz.h" - -class OffsetZone -{ - std::chrono::minutes offset_; - -public: - explicit OffsetZone(std::chrono::minutes offset) - : offset_{offset} - {} - - template - auto - to_local(date::sys_time tp) const - { - using namespace date; - using namespace std::chrono; - using LT = local_time>; - return LT{(tp + offset_).time_since_epoch()}; - } - - template - auto - to_sys(date::local_time tp) const - { - using namespace date; - using namespace std::chrono; - using ST = sys_time>; - return ST{(tp - offset_).time_since_epoch()}; - } - - template - date::sys_info - get_info(date::sys_time st) const - { - using namespace date; - using namespace std::chrono; - return {sys_seconds::min(), sys_seconds::max(), offset_, - minutes{0}, offset_ >= minutes{0} ? "+" + date::format("%H%M", offset_) - : "-" + date::format("%H%M", -offset_)}; - } - - const OffsetZone* operator->() const {return this;} -}; - +#include "OffsetZone.h" #include int diff --git a/test/tz_test/zoned_time_deduction.pass.cpp b/test/tz_test/zoned_time_deduction.pass.cpp index d57c226..8cf4440 100644 --- a/test/tz_test/zoned_time_deduction.pass.cpp +++ b/test/tz_test/zoned_time_deduction.pass.cpp @@ -21,6 +21,7 @@ // SOFTWARE. #include "tz.h" +#include "OffsetZone.h" #include #include #include @@ -216,5 +217,13 @@ main() testDeductionFrom(std::move(tz)); } + // custom time zone + { + OffsetZone tz(minutes(45)); + testDeductionFrom(tz); + testDeductionFrom(to_const(tz)); + testDeductionFrom(std::move(tz)); + } + #endif // HAS_DEDUCTION_GUIDES }