From d6d80a17444c90259c5bfdacb84c61e6bfece655 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 5 Jan 2023 11:38:41 +0100 Subject: Merging upstream version 3.0.0~a1. Signed-off-by: Daniel Baumann --- tests/duration/__init__.py | 0 tests/duration/test_add_sub.py | 54 ++++++++++++++++++++ tests/duration/test_arithmetic.py | 85 +++++++++++++++++++++++++++++++ tests/duration/test_behavior.py | 21 ++++++++ tests/duration/test_construct.py | 99 ++++++++++++++++++++++++++++++++++++ tests/duration/test_in_methods.py | 28 ++++++++++ tests/duration/test_in_words.py | 77 ++++++++++++++++++++++++++++ tests/duration/test_total_methods.py | 28 ++++++++++ 8 files changed, 392 insertions(+) create mode 100644 tests/duration/__init__.py create mode 100644 tests/duration/test_add_sub.py create mode 100644 tests/duration/test_arithmetic.py create mode 100644 tests/duration/test_behavior.py create mode 100644 tests/duration/test_construct.py create mode 100644 tests/duration/test_in_methods.py create mode 100644 tests/duration/test_in_words.py create mode 100644 tests/duration/test_total_methods.py (limited to 'tests/duration') diff --git a/tests/duration/__init__.py b/tests/duration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/duration/test_add_sub.py b/tests/duration/test_add_sub.py new file mode 100644 index 0000000..193a493 --- /dev/null +++ b/tests/duration/test_add_sub.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +from datetime import timedelta + +import pendulum + +from tests.conftest import assert_duration + + +def test_add_interval(): + p1 = pendulum.duration(days=23, seconds=32) + p2 = pendulum.duration(days=12, seconds=30) + + p = p1 + p2 + assert_duration(p, 0, 0, 5, 0, 0, 1, 2) + + +def test_add_timedelta(): + p1 = pendulum.duration(days=23, seconds=32) + p2 = timedelta(days=12, seconds=30) + + p = p1 + p2 + assert_duration(p, 0, 0, 5, 0, 0, 1, 2) + + +def test_add_unsupported(): + p = pendulum.duration(days=23, seconds=32) + assert NotImplemented == p.__add__(5) + + +def test_sub_interval(): + p1 = pendulum.duration(days=23, seconds=32) + p2 = pendulum.duration(days=12, seconds=28) + + p = p1 - p2 + assert_duration(p, 0, 0, 1, 4, 0, 0, 4) + + +def test_sub_timedelta(): + p1 = pendulum.duration(days=23, seconds=32) + p2 = timedelta(days=12, seconds=28) + + p = p1 - p2 + assert_duration(p, 0, 0, 1, 4, 0, 0, 4) + + +def test_sub_unsupported(): + p = pendulum.duration(days=23, seconds=32) + assert NotImplemented == p.__sub__(5) + + +def test_neg(): + p = pendulum.duration(days=23, seconds=32) + assert_duration(-p, 0, 0, -3, -2, 0, 0, -32) diff --git a/tests/duration/test_arithmetic.py b/tests/duration/test_arithmetic.py new file mode 100644 index 0000000..cba4d39 --- /dev/null +++ b/tests/duration/test_arithmetic.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +import pendulum + +from tests.conftest import assert_duration + + +def test_multiply(): + it = pendulum.duration(days=6, seconds=34, microseconds=522222) + mul = it * 2 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 1, 5, 0, 1, 9, 44444) + + it = pendulum.duration(days=6, seconds=34, microseconds=522222) + mul = 2 * it + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 1, 5, 0, 1, 9, 44444) + + it = pendulum.duration( + years=2, months=3, weeks=4, days=6, seconds=34, microseconds=522222 + ) + mul = 2 * it + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 4, 6, 9, 5, 0, 1, 9, 44444) + + +def test_divide(): + it = pendulum.duration(days=2, seconds=34, microseconds=522222) + mul = it / 2 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 0, 1, 0, 0, 17, 261111) + + it = pendulum.duration(days=2, seconds=35, microseconds=522222) + mul = it / 2 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 0, 1, 0, 0, 17, 761111) + + it = pendulum.duration(days=2, seconds=35, microseconds=522222) + mul = it / 1.1 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 0, 1, 19, 38, 43, 202020) + + it = pendulum.duration(years=2, months=4, days=2, seconds=35, microseconds=522222) + mul = it / 2 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 1, 2, 0, 1, 0, 0, 17, 761111) + + it = pendulum.duration(years=2, months=4, days=2, seconds=35, microseconds=522222) + mul = it / 2.0 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 1, 2, 0, 1, 0, 0, 17, 761111) + + +def test_floor_divide(): + it = pendulum.duration(days=2, seconds=34, microseconds=522222) + mul = it // 2 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 0, 1, 0, 0, 17, 261111) + + it = pendulum.duration(days=2, seconds=35, microseconds=522222) + mul = it // 3 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 0, 0, 0, 16, 0, 11, 840740) + + it = pendulum.duration(years=2, months=4, days=2, seconds=34, microseconds=522222) + mul = it // 2 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 1, 2, 0, 1, 0, 0, 17, 261111) + + it = pendulum.duration(years=2, months=4, days=2, seconds=35, microseconds=522222) + mul = it // 3 + + assert isinstance(mul, pendulum.Duration) + assert_duration(mul, 0, 1, 0, 0, 16, 0, 11, 840740) diff --git a/tests/duration/test_behavior.py b/tests/duration/test_behavior.py new file mode 100644 index 0000000..a97bbde --- /dev/null +++ b/tests/duration/test_behavior.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +import pickle + +from datetime import timedelta + +import pendulum + + +def test_pickle(): + it = pendulum.duration(days=3, seconds=2456, microseconds=123456) + s = pickle.dumps(it) + it2 = pickle.loads(s) + + assert it == it2 + + +def test_comparison_to_timedelta(): + duration = pendulum.duration(days=3) + + assert duration < timedelta(days=4) diff --git a/tests/duration/test_construct.py b/tests/duration/test_construct.py new file mode 100644 index 0000000..aaa5390 --- /dev/null +++ b/tests/duration/test_construct.py @@ -0,0 +1,99 @@ +from __future__ import annotations + +from datetime import timedelta + +import pytest + +import pendulum + +from pendulum.duration import AbsoluteDuration +from tests.conftest import assert_duration + + +def test_defaults(): + pi = pendulum.duration() + assert_duration(pi, 0, 0, 0, 0, 0, 0, 0) + + +def test_years(): + pi = pendulum.duration(years=2) + assert_duration(pi, years=2, weeks=0) + assert pi.days == 730 + assert pi.total_seconds() == 63072000 + + +def test_months(): + pi = pendulum.duration(months=3) + assert_duration(pi, months=3, weeks=0) + assert pi.days == 90 + assert pi.total_seconds() == 7776000 + + +def test_weeks(): + pi = pendulum.duration(days=365) + assert_duration(pi, weeks=52) + + pi = pendulum.duration(days=13) + assert_duration(pi, weeks=1) + + +def test_days(): + pi = pendulum.duration(days=6) + assert_duration(pi, 0, 0, 0, 6, 0, 0, 0) + + pi = pendulum.duration(days=16) + assert_duration(pi, 0, 0, 2, 2, 0, 0, 0) + + +def test_hours(): + pi = pendulum.duration(seconds=3600 * 3) + assert_duration(pi, 0, 0, 0, 0, 3, 0, 0) + + +def test_minutes(): + pi = pendulum.duration(seconds=60 * 3) + assert_duration(pi, 0, 0, 0, 0, 0, 3, 0) + + pi = pendulum.duration(seconds=60 * 3 + 12) + assert_duration(pi, 0, 0, 0, 0, 0, 3, 12) + + +def test_all(): + pi = pendulum.duration( + years=2, months=3, days=1177, seconds=7284, microseconds=1000000 + ) + assert_duration(pi, 2, 3, 168, 1, 2, 1, 25) + assert pi.days == 1997 + assert pi.seconds == 7285 + + +def test_absolute_interval(): + pi = AbsoluteDuration(days=-1177, seconds=-7284, microseconds=-1000001) + assert_duration(pi, 0, 0, 168, 1, 2, 1, 25) + assert pi.microseconds == 1 + assert pi.invert + + +def test_invert(): + pi = pendulum.duration(days=1177, seconds=7284, microseconds=1000000) + assert not pi.invert + + pi = pendulum.duration(days=-1177, seconds=-7284, microseconds=-1000000) + assert pi.invert + + +def test_as_timedelta(): + pi = pendulum.duration(seconds=3456.123456) + assert_duration(pi, 0, 0, 0, 0, 0, 57, 36, 123456) + delta = pi.as_timedelta() + assert isinstance(delta, timedelta) + assert delta.total_seconds() == 3456.123456 + assert delta.seconds == 3456 + + +def test_float_years_and_months(): + with pytest.raises(ValueError): + pendulum.duration(years=1.5) + + with pytest.raises(ValueError): + pendulum.duration(months=1.5) diff --git a/tests/duration/test_in_methods.py b/tests/duration/test_in_methods.py new file mode 100644 index 0000000..4527257 --- /dev/null +++ b/tests/duration/test_in_methods.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import pendulum + + +def test_in_weeks(): + it = pendulum.duration(days=17) + assert it.in_weeks() == 2 + + +def test_in_days(): + it = pendulum.duration(days=3) + assert it.in_days() == 3 + + +def test_in_hours(): + it = pendulum.duration(days=3, minutes=72) + assert it.in_hours() == 73 + + +def test_in_minutes(): + it = pendulum.duration(minutes=6, seconds=72) + assert it.in_minutes() == 7 + + +def test_in_seconds(): + it = pendulum.duration(seconds=72) + assert it.in_seconds() == 72 diff --git a/tests/duration/test_in_words.py b/tests/duration/test_in_words.py new file mode 100644 index 0000000..c0a1a1f --- /dev/null +++ b/tests/duration/test_in_words.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +import pendulum + + +def test_week(): + assert pendulum.duration(days=364).in_words() == "52 weeks" + assert pendulum.duration(days=7).in_words() == "1 week" + + +def test_week_to_string(): + assert str(pendulum.duration(days=364)) == "52 weeks" + assert str(pendulum.duration(days=7)) == "1 week" + + +def test_weeks_and_day(): + assert pendulum.duration(days=365).in_words() == "52 weeks 1 day" + + +def test_all(): + pi = pendulum.duration( + years=2, months=3, days=1177, seconds=7284, microseconds=1000000 + ) + + expected = "2 years 3 months 168 weeks 1 day 2 hours 1 minute 25 seconds" + assert pi.in_words() == expected + + +def test_in_french(): + pi = pendulum.duration( + years=2, months=3, days=1177, seconds=7284, microseconds=1000000 + ) + + expected = "2 ans 3 mois 168 semaines 1 jour 2 heures 1 minute 25 secondes" + assert pi.in_words(locale="fr") == expected + + +def test_repr(): + pi = pendulum.duration( + years=2, months=3, days=1177, seconds=7284, microseconds=1000000 + ) + + expected = ( + "Duration(years=2, months=3, weeks=168, days=1, hours=2, minutes=1, seconds=25)" + ) + assert repr(pi) == expected + + +def test_singular_negative_values(): + pi = pendulum.duration(days=-1) + + assert pi.in_words() == "-1 day" + + +def test_separator(): + pi = pendulum.duration(days=1177, seconds=7284, microseconds=1000000) + + expected = "168 weeks, 1 day, 2 hours, 1 minute, 25 seconds" + assert pi.in_words(separator=", ") == expected + + +def test_subseconds(): + pi = pendulum.duration(microseconds=123456) + + assert pi.in_words() == "0.12 second" + + +def test_subseconds_with_seconds(): + pi = pendulum.duration(seconds=12, microseconds=123456) + + assert pi.in_words() == "12 seconds" + + +def test_duration_with_all_zero_values(): + pi = pendulum.duration() + + assert pi.in_words() == "0 microseconds" diff --git a/tests/duration/test_total_methods.py b/tests/duration/test_total_methods.py new file mode 100644 index 0000000..aabcd6c --- /dev/null +++ b/tests/duration/test_total_methods.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import pendulum + + +def test_in_weeks(): + it = pendulum.duration(days=17) + assert round(it.total_weeks(), 2) == 2.43 + + +def test_in_days(): + it = pendulum.duration(days=3) + assert it.total_days() == 3 + + +def test_in_hours(): + it = pendulum.duration(days=3, minutes=72) + assert it.total_hours() == 73.2 + + +def test_in_minutes(): + it = pendulum.duration(minutes=6, seconds=72) + assert it.total_minutes() == 7.2 + + +def test_in_seconds(): + it = pendulum.duration(seconds=72, microseconds=123456) + assert it.total_seconds() == 72.123456 -- cgit v1.2.3