|
6 | 6 |
|
7 | 7 | import pytest
|
8 | 8 |
|
| 9 | +from contextlib import nullcontext |
9 | 10 | import datetime
|
| 11 | +import itertools |
10 | 12 |
|
11 | 13 | import pytz
|
12 | 14 | from traitlets import TraitError
|
13 | 15 |
|
14 | 16 | from ..widget_datetime import DatetimePicker
|
15 | 17 |
|
16 | 18 |
|
| 19 | +dt_1442 = datetime.datetime(1442, 1, 1, tzinfo=pytz.utc) |
| 20 | +dt_1664 = datetime.datetime(1664, 1, 1, tzinfo=pytz.utc) |
| 21 | +dt_1994 = datetime.datetime(1994, 1, 1, tzinfo=pytz.utc) |
| 22 | +dt_2002 = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
| 23 | +dt_2056 = datetime.datetime(2056, 1, 1, tzinfo=pytz.utc) |
| 24 | + |
17 | 25 | def test_time_creation_blank():
|
18 | 26 | w = DatetimePicker()
|
19 | 27 | assert w.value is None
|
20 | 28 |
|
21 | 29 |
|
22 | 30 | def test_time_creation_value():
|
23 |
| - t = datetime.datetime.now(pytz.utc) |
24 |
| - w = DatetimePicker(value=t) |
25 |
| - assert w.value is t |
| 31 | + dt = datetime.datetime.now(pytz.utc) |
| 32 | + w = DatetimePicker(value=dt) |
| 33 | + assert w.value is dt |
26 | 34 |
|
27 | 35 |
|
28 |
| -def test_time_validate_value_none(): |
29 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
30 |
| - t_min = datetime.datetime(1442, 1, 1, tzinfo=pytz.utc) |
31 |
| - t_max = datetime.datetime(2056, 1, 1, tzinfo=pytz.utc) |
32 |
| - w = DatetimePicker(value=t, min=t_min, max=t_max) |
| 36 | +def test_datetime_validate_value_none(): |
| 37 | + dt = dt_2002 |
| 38 | + dt_min = dt_1442 |
| 39 | + dt_max = dt_2056 |
| 40 | + w = DatetimePicker(value=dt, min=dt_min, max=dt_max) |
33 | 41 | w.value = None
|
34 | 42 | assert w.value is None
|
35 | 43 |
|
36 | 44 |
|
37 |
| -def test_time_validate_value_vs_min(): |
38 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
39 |
| - t_min = datetime.datetime(2019, 1, 1, tzinfo=pytz.utc) |
40 |
| - t_max = datetime.datetime(2056, 1, 1, tzinfo=pytz.utc) |
41 |
| - w = DatetimePicker(min=t_min, max=t_max) |
42 |
| - w.value = t |
| 45 | +def _permuted_dts(): |
| 46 | + ret = [] |
| 47 | + combos = list(itertools.product([None, dt_1442, dt_2002, dt_2056], repeat=3)) |
| 48 | + for vals in combos: |
| 49 | + expected = vals[0] |
| 50 | + if vals[1] and vals[2] and vals[1] > vals[2]: |
| 51 | + expected = TraitError |
| 52 | + elif vals[0] is None: |
| 53 | + pass |
| 54 | + elif vals[1] and vals[1] > vals[0]: |
| 55 | + expected = vals[1] |
| 56 | + elif vals[2] and vals[2] < vals[0]: |
| 57 | + expected = vals[2] |
| 58 | + ret.append(vals + (expected,)) |
| 59 | + return ret |
| 60 | + |
| 61 | + |
| 62 | +@pytest.mark.parametrize( |
| 63 | + "input_value,input_min,input_max,expected", |
| 64 | + _permuted_dts() |
| 65 | +) |
| 66 | +def test_datetime_cross_validate_value_min_max( |
| 67 | + input_value, |
| 68 | + input_min, |
| 69 | + input_max, |
| 70 | + expected, |
| 71 | +): |
| 72 | + w = DatetimePicker(value=dt_2002, min=dt_2002, max=dt_2002) |
| 73 | + should_raise = expected is TraitError |
| 74 | + with pytest.raises(expected) if should_raise else nullcontext(): |
| 75 | + with w.hold_trait_notifications(): |
| 76 | + w.value = input_value |
| 77 | + w.min = input_min |
| 78 | + w.max = input_max |
| 79 | + if not should_raise: |
| 80 | + assert w.value is expected |
| 81 | + |
| 82 | + |
| 83 | +def test_datetime_validate_value_vs_min(): |
| 84 | + dt = dt_2002 |
| 85 | + dt_min = datetime.datetime(2019, 1, 1, tzinfo=pytz.utc) |
| 86 | + dt_max = dt_2056 |
| 87 | + w = DatetimePicker(min=dt_min, max=dt_max) |
| 88 | + w.value = dt |
43 | 89 | assert w.value.year == 2019
|
44 | 90 |
|
45 | 91 |
|
46 |
| -def test_time_validate_value_vs_max(): |
47 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
48 |
| - t_min = datetime.datetime(1664, 1, 1, tzinfo=pytz.utc) |
49 |
| - t_max = datetime.datetime(1994, 1, 1, tzinfo=pytz.utc) |
50 |
| - w = DatetimePicker(min=t_min, max=t_max) |
51 |
| - w.value = t |
| 92 | +def test_datetime_validate_value_vs_max(): |
| 93 | + dt = dt_2002 |
| 94 | + dt_min = dt_1664 |
| 95 | + dt_max = dt_1994 |
| 96 | + w = DatetimePicker(min=dt_min, max=dt_max) |
| 97 | + w.value = dt |
52 | 98 | assert w.value.year == 1994
|
53 | 99 |
|
54 | 100 |
|
55 |
| -def test_time_validate_min_vs_value(): |
56 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
57 |
| - t_min = datetime.datetime(2019, 1, 1, tzinfo=pytz.utc) |
58 |
| - t_max = datetime.datetime(2056, 1, 1, tzinfo=pytz.utc) |
59 |
| - w = DatetimePicker(value=t, max=t_max) |
60 |
| - w.min = t_min |
| 101 | +def test_datetime_validate_min_vs_value(): |
| 102 | + dt = dt_2002 |
| 103 | + dt_min = datetime.datetime(2019, 1, 1, tzinfo=pytz.utc) |
| 104 | + dt_max = dt_2056 |
| 105 | + w = DatetimePicker(value=dt, max=dt_max) |
| 106 | + w.min = dt_min |
61 | 107 | assert w.value.year == 2019
|
62 | 108 |
|
63 | 109 |
|
64 |
| -def test_time_validate_min_vs_max(): |
65 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
66 |
| - t_min = datetime.datetime(2112, 1, 1, tzinfo=pytz.utc) |
67 |
| - t_max = datetime.datetime(2056, 1, 1, tzinfo=pytz.utc) |
68 |
| - w = DatetimePicker(value=t, max=t_max) |
| 110 | +def test_datetime_validate_min_vs_max(): |
| 111 | + dt = dt_2002 |
| 112 | + dt_min = datetime.datetime(2112, 1, 1, tzinfo=pytz.utc) |
| 113 | + dt_max = dt_2056 |
| 114 | + w = DatetimePicker(value=dt, max=dt_max) |
69 | 115 | with pytest.raises(TraitError):
|
70 |
| - w.min = t_min |
| 116 | + w.min = dt_min |
71 | 117 |
|
72 | 118 |
|
73 |
| -def test_time_validate_max_vs_value(): |
74 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
75 |
| - t_min = datetime.datetime(1664, 1, 1, tzinfo=pytz.utc) |
76 |
| - t_max = datetime.datetime(1994, 1, 1, tzinfo=pytz.utc) |
77 |
| - w = DatetimePicker(value=t, min=t_min) |
78 |
| - w.max = t_max |
| 119 | +def test_datetime_validate_max_vs_value(): |
| 120 | + dt = dt_2002 |
| 121 | + dt_min = dt_1664 |
| 122 | + dt_max = dt_1994 |
| 123 | + w = DatetimePicker(value=dt, min=dt_min) |
| 124 | + w.max = dt_max |
79 | 125 | assert w.value.year == 1994
|
80 | 126 |
|
81 | 127 |
|
82 |
| -def test_time_validate_max_vs_min(): |
83 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
84 |
| - t_min = datetime.datetime(1664, 1, 1, tzinfo=pytz.utc) |
85 |
| - t_max = datetime.datetime(1337, 1, 1, tzinfo=pytz.utc) |
86 |
| - w = DatetimePicker(value=t, min=t_min) |
| 128 | +def test_datetime_validate_max_vs_min(): |
| 129 | + dt = dt_2002 |
| 130 | + dt_min = dt_1664 |
| 131 | + dt_max = datetime.datetime(1337, 1, 1, tzinfo=pytz.utc) |
| 132 | + w = DatetimePicker(value=dt, min=dt_min) |
87 | 133 | with pytest.raises(TraitError):
|
88 |
| - w.max = t_max |
| 134 | + w.max = dt_max |
89 | 135 |
|
90 | 136 |
|
91 |
| -def test_time_validate_naive(): |
92 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=pytz.utc) |
93 |
| - t_min = datetime.datetime(1442, 1, 1, tzinfo=pytz.utc) |
94 |
| - t_max = datetime.datetime(2056, 1, 1, tzinfo=pytz.utc) |
| 137 | +def test_datetime_validate_naive(): |
| 138 | + dt = dt_2002 |
| 139 | + dt_min = dt_1442 |
| 140 | + dt_max = dt_2056 |
95 | 141 |
|
96 |
| - w = DatetimePicker(value=t, min=t_min, max=t_max) |
| 142 | + w = DatetimePicker(value=dt, min=dt_min, max=dt_max) |
97 | 143 | with pytest.raises(TraitError):
|
98 |
| - w.max = t_max.replace(tzinfo=None) |
| 144 | + w.max = dt_max.replace(tzinfo=None) |
99 | 145 | with pytest.raises(TraitError):
|
100 |
| - w.min = t_min.replace(tzinfo=None) |
| 146 | + w.min = dt_min.replace(tzinfo=None) |
101 | 147 | with pytest.raises(TraitError):
|
102 |
| - w.value = t.replace(tzinfo=None) |
| 148 | + w.value = dt.replace(tzinfo=None) |
103 | 149 |
|
104 | 150 |
|
105 | 151 | def test_datetime_tzinfo():
|
106 | 152 | tz = pytz.timezone('Australia/Sydney')
|
107 |
| - t = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=tz) |
108 |
| - w = DatetimePicker(value=t) |
109 |
| - assert w.value == t |
| 153 | + dt = datetime.datetime(2002, 2, 20, 13, 37, 42, 7, tzinfo=tz) |
| 154 | + w = DatetimePicker(value=dt) |
| 155 | + assert w.value == dt |
110 | 156 | # tzinfo only changes upon input from user
|
111 | 157 | assert w.value.tzinfo == tz
|
0 commit comments