diff --git a/include/range.h b/include/range.h index e95703d..08834d3 100644 --- a/include/range.h +++ b/include/range.h @@ -15,8 +15,7 @@ class Range { if (step_ == 0) { throw std::invalid_argument("Range step argument must not be zero"); } else { - auto difference = stop_ - start_; - if ((difference < 0 && step_ > 0) || (difference > 0 && step_ < 0)) { + if ((start > stop && step_ > 0) || (start < stop && step_ < 0)) { throw std::invalid_argument("Range arguments must result in termination"); } } diff --git a/test/range-tests.cpp b/test/range-tests.cpp index 281d989..7cc5d7b 100644 --- a/test/range-tests.cpp +++ b/test/range-tests.cpp @@ -1,5 +1,5 @@ #include - +#include #include #include "range.h" @@ -139,6 +139,18 @@ TEST(RangeIntegerTests, ValueZeroStepExceptionTest) { EXPECT_TRUE(thrown); } +TEST(RangeIntegerTests, IntegerWrapAroundTest) { + bool thrown = false; + try { + range(int64_t{1}, std::numeric_limits::min(), int64_t{1}); + } catch (const std::invalid_argument& e) { + thrown = true; + EXPECT_EQ(std::string{"Range arguments must result in termination"}, + std::string{e.what()}); + } + EXPECT_TRUE(thrown); +} + TEST(RangeFloatTests, ValueStopTest) { for (auto stop = 0.f; stop < 100.f; ++stop) { auto expected = 0.f;