|
29 | 29 | from beets.test.helper import ItemInDBTestCase
|
30 | 30 |
|
31 | 31 |
|
32 |
| -def _date(string): |
33 |
| - return datetime.strptime(string, "%Y-%m-%dT%H:%M:%S") |
34 |
| - |
35 |
| - |
36 |
| -def _datepattern(datetimedate): |
37 |
| - return datetimedate.strftime("%Y-%m-%dT%H:%M:%S") |
38 |
| - |
39 |
| - |
40 |
| -class DateIntervalTest(unittest.TestCase): |
41 |
| - def test_year_precision_intervals(self): |
42 |
| - self.assertContains("2000..2001", "2000-01-01T00:00:00") |
43 |
| - self.assertContains("2000..2001", "2001-06-20T14:15:16") |
44 |
| - self.assertContains("2000..2001", "2001-12-31T23:59:59") |
45 |
| - self.assertExcludes("2000..2001", "1999-12-31T23:59:59") |
46 |
| - self.assertExcludes("2000..2001", "2002-01-01T00:00:00") |
47 |
| - |
48 |
| - self.assertContains("2000..", "2000-01-01T00:00:00") |
49 |
| - self.assertContains("2000..", "2099-10-11T00:00:00") |
50 |
| - self.assertExcludes("2000..", "1999-12-31T23:59:59") |
51 |
| - |
52 |
| - self.assertContains("..2001", "2001-12-31T23:59:59") |
53 |
| - self.assertExcludes("..2001", "2002-01-01T00:00:00") |
54 |
| - |
55 |
| - self.assertContains("-1d..1d", _datepattern(datetime.now())) |
56 |
| - self.assertExcludes("-2d..-1d", _datepattern(datetime.now())) |
57 |
| - |
58 |
| - def test_day_precision_intervals(self): |
59 |
| - self.assertContains("2000-06-20..2000-06-20", "2000-06-20T00:00:00") |
60 |
| - self.assertContains("2000-06-20..2000-06-20", "2000-06-20T10:20:30") |
61 |
| - self.assertContains("2000-06-20..2000-06-20", "2000-06-20T23:59:59") |
62 |
| - self.assertExcludes("2000-06-20..2000-06-20", "2000-06-19T23:59:59") |
63 |
| - self.assertExcludes("2000-06-20..2000-06-20", "2000-06-21T00:00:00") |
64 |
| - |
65 |
| - def test_month_precision_intervals(self): |
66 |
| - self.assertContains("1999-12..2000-02", "1999-12-01T00:00:00") |
67 |
| - self.assertContains("1999-12..2000-02", "2000-02-15T05:06:07") |
68 |
| - self.assertContains("1999-12..2000-02", "2000-02-29T23:59:59") |
69 |
| - self.assertExcludes("1999-12..2000-02", "1999-11-30T23:59:59") |
70 |
| - self.assertExcludes("1999-12..2000-02", "2000-03-01T00:00:00") |
71 |
| - |
72 |
| - def test_hour_precision_intervals(self): |
73 |
| - # test with 'T' separator |
74 |
| - self.assertExcludes( |
75 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T11:59:59" |
76 |
| - ) |
77 |
| - self.assertContains( |
78 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T12:00:00" |
79 |
| - ) |
80 |
| - self.assertContains( |
81 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T12:30:00" |
82 |
| - ) |
83 |
| - self.assertContains( |
84 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T13:30:00" |
85 |
| - ) |
86 |
| - self.assertContains( |
87 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T13:59:59" |
88 |
| - ) |
89 |
| - self.assertExcludes( |
90 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T14:00:00" |
91 |
| - ) |
92 |
| - self.assertExcludes( |
93 |
| - "2000-01-01T12..2000-01-01T13", "2000-01-01T14:30:00" |
94 |
| - ) |
95 |
| - |
96 |
| - # test non-range query |
97 |
| - self.assertContains("2008-12-01T22", "2008-12-01T22:30:00") |
98 |
| - self.assertExcludes("2008-12-01T22", "2008-12-01T23:30:00") |
99 |
| - |
100 |
| - def test_minute_precision_intervals(self): |
101 |
| - self.assertExcludes( |
102 |
| - "2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:29:59" |
103 |
| - ) |
104 |
| - self.assertContains( |
105 |
| - "2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:30:00" |
106 |
| - ) |
107 |
| - self.assertContains( |
108 |
| - "2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:30:30" |
109 |
| - ) |
110 |
| - self.assertContains( |
111 |
| - "2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:31:59" |
112 |
| - ) |
113 |
| - self.assertExcludes( |
114 |
| - "2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:32:00" |
115 |
| - ) |
116 |
| - |
117 |
| - def test_second_precision_intervals(self): |
118 |
| - self.assertExcludes( |
119 |
| - "2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:49" |
120 |
| - ) |
121 |
| - self.assertContains( |
122 |
| - "2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:50" |
123 |
| - ) |
124 |
| - self.assertContains( |
125 |
| - "2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:55" |
126 |
| - ) |
127 |
| - self.assertExcludes( |
128 |
| - "2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:56" |
129 |
| - ) |
130 |
| - |
131 |
| - def test_unbounded_endpoints(self): |
132 |
| - self.assertContains("..", date=datetime.max) |
133 |
| - self.assertContains("..", date=datetime.min) |
134 |
| - self.assertContains("..", "1000-01-01T00:00:00") |
135 |
| - |
136 |
| - def assertContains(self, interval_pattern, date_pattern=None, date=None): |
137 |
| - if date is None: |
138 |
| - date = _date(date_pattern) |
139 |
| - (start, end) = _parse_periods(interval_pattern) |
140 |
| - interval = DateInterval.from_periods(start, end) |
141 |
| - assert interval.contains(date) |
142 |
| - |
143 |
| - def assertExcludes(self, interval_pattern, date_pattern): |
144 |
| - date = _date(date_pattern) |
145 |
| - (start, end) = _parse_periods(interval_pattern) |
| 32 | +class TestDateInterval: |
| 33 | + now = datetime.now().replace(microsecond=0, second=0).isoformat() |
| 34 | + |
| 35 | + @pytest.mark.parametrize( |
| 36 | + "pattern, datestr, include", |
| 37 | + [ |
| 38 | + # year precision |
| 39 | + ("2000..2001", "2000-01-01T00:00:00", True), |
| 40 | + ("2000..2001", "2001-06-20T14:15:16", True), |
| 41 | + ("2000..2001", "2001-12-31T23:59:59", True), |
| 42 | + ("2000..2001", "1999-12-31T23:59:59", False), |
| 43 | + ("2000..2001", "2002-01-01T00:00:00", False), |
| 44 | + ("2000..", "2000-01-01T00:00:00", True), |
| 45 | + ("2000..", "2099-10-11T00:00:00", True), |
| 46 | + ("2000..", "1999-12-31T23:59:59", False), |
| 47 | + ("..2001", "2001-12-31T23:59:59", True), |
| 48 | + ("..2001", "2002-01-01T00:00:00", False), |
| 49 | + ("-1d..1d", now, True), |
| 50 | + ("-2d..-1d", now, False), |
| 51 | + # month precision |
| 52 | + ("2000-06-20..2000-06-20", "2000-06-20T00:00:00", True), |
| 53 | + ("2000-06-20..2000-06-20", "2000-06-20T10:20:30", True), |
| 54 | + ("2000-06-20..2000-06-20", "2000-06-20T23:59:59", True), |
| 55 | + ("2000-06-20..2000-06-20", "2000-06-19T23:59:59", False), |
| 56 | + ("2000-06-20..2000-06-20", "2000-06-21T00:00:00", False), |
| 57 | + # day precision |
| 58 | + ("1999-12..2000-02", "1999-12-01T00:00:00", True), |
| 59 | + ("1999-12..2000-02", "2000-02-15T05:06:07", True), |
| 60 | + ("1999-12..2000-02", "2000-02-29T23:59:59", True), |
| 61 | + ("1999-12..2000-02", "1999-11-30T23:59:59", False), |
| 62 | + ("1999-12..2000-02", "2000-03-01T00:00:00", False), |
| 63 | + # hour precision with 'T' separator |
| 64 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T11:59:59", False), |
| 65 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T12:00:00", True), |
| 66 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T12:30:00", True), |
| 67 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T13:30:00", True), |
| 68 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T13:59:59", True), |
| 69 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T14:00:00", False), |
| 70 | + ("2000-01-01T12..2000-01-01T13", "2000-01-01T14:30:00", False), |
| 71 | + # hour precision non-range query |
| 72 | + ("2008-12-01T22", "2008-12-01T22:30:00", True), |
| 73 | + ("2008-12-01T22", "2008-12-01T23:30:00", False), |
| 74 | + # minute precision |
| 75 | + ("2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:29:59", False), |
| 76 | + ("2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:30:00", True), |
| 77 | + ("2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:30:30", True), |
| 78 | + ("2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:31:59", True), |
| 79 | + ("2000-01-01T12:30..2000-01-01T12:31", "2000-01-01T12:32:00", False), |
| 80 | + # second precision |
| 81 | + ("2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:49", False), |
| 82 | + ("2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:50", True), |
| 83 | + ("2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:55", True), |
| 84 | + ("2000-01-01T12:30:50..2000-01-01T12:30:55", "2000-01-01T12:30:56", False), # unbounded # noqa: E501 |
| 85 | + ("..", datetime.max.isoformat(), True), |
| 86 | + ("..", datetime.min.isoformat(), True), |
| 87 | + ("..", "1000-01-01T00:00:00", True), |
| 88 | + ], |
| 89 | + ) # fmt: skip |
| 90 | + def test_intervals(self, pattern, datestr, include): |
| 91 | + (start, end) = _parse_periods(pattern) |
146 | 92 | interval = DateInterval.from_periods(start, end)
|
147 |
| - assert not interval.contains(date) |
| 93 | + assert interval.contains(datetime.fromisoformat(datestr)) == include |
148 | 94 |
|
149 | 95 |
|
150 | 96 | def _parsetime(s):
|
|
0 commit comments