staran 1.0.0__py3-none-any.whl → 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- staran/__init__.py +1 -1
- staran/tools/__init__.py +1 -1
- staran/tools/date.py +327 -222
- staran/tools/tests/__init__.py +119 -0
- staran/tools/tests/run_tests.py +241 -0
- staran/tools/tests/test_api_compatibility.py +319 -0
- staran/tools/tests/test_date.py +565 -0
- staran/tools/tests/test_logging.py +402 -0
- staran-1.0.1.dist-info/METADATA +37 -0
- staran-1.0.1.dist-info/RECORD +13 -0
- staran-1.0.0.dist-info/METADATA +0 -301
- staran-1.0.0.dist-info/RECORD +0 -8
- {staran-1.0.0.dist-info → staran-1.0.1.dist-info}/WHEEL +0 -0
- {staran-1.0.0.dist-info → staran-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {staran-1.0.0.dist-info → staran-1.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,565 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
"""
|
5
|
+
Date类完整测试套件
|
6
|
+
===============
|
7
|
+
|
8
|
+
测试staran.tools.date.Date类的所有功能,包括:
|
9
|
+
- 对象创建和初始化
|
10
|
+
- API命名规范
|
11
|
+
- 日期运算
|
12
|
+
- 格式化输出
|
13
|
+
- 比较操作
|
14
|
+
- 错误处理
|
15
|
+
- 向后兼容性
|
16
|
+
"""
|
17
|
+
|
18
|
+
import unittest
|
19
|
+
import sys
|
20
|
+
import os
|
21
|
+
import datetime
|
22
|
+
import logging
|
23
|
+
|
24
|
+
# 添加项目根目录到路径
|
25
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
26
|
+
|
27
|
+
from staran.tools.date import Date
|
28
|
+
|
29
|
+
|
30
|
+
class TestDateCreation(unittest.TestCase):
|
31
|
+
"""测试Date对象的创建和初始化"""
|
32
|
+
|
33
|
+
def test_create_from_string_yyyymmdd(self):
|
34
|
+
"""测试从YYYYMMDD字符串创建"""
|
35
|
+
d = Date('20250415')
|
36
|
+
self.assertEqual(d.year, 2025)
|
37
|
+
self.assertEqual(d.month, 4)
|
38
|
+
self.assertEqual(d.day, 15)
|
39
|
+
self.assertEqual(d.get_format_type(), 'full')
|
40
|
+
|
41
|
+
def test_create_from_string_yyyymm(self):
|
42
|
+
"""测试从YYYYMM字符串创建"""
|
43
|
+
d = Date('202504')
|
44
|
+
self.assertEqual(d.year, 2025)
|
45
|
+
self.assertEqual(d.month, 4)
|
46
|
+
self.assertEqual(d.day, 1)
|
47
|
+
self.assertEqual(d.get_format_type(), 'year_month')
|
48
|
+
|
49
|
+
def test_create_from_string_yyyy(self):
|
50
|
+
"""测试从YYYY字符串创建"""
|
51
|
+
d = Date('2025')
|
52
|
+
self.assertEqual(d.year, 2025)
|
53
|
+
self.assertEqual(d.month, 1)
|
54
|
+
self.assertEqual(d.day, 1)
|
55
|
+
self.assertEqual(d.get_format_type(), 'year_only')
|
56
|
+
|
57
|
+
def test_create_from_position_args(self):
|
58
|
+
"""测试从位置参数创建"""
|
59
|
+
d = Date(2025, 4, 15)
|
60
|
+
self.assertEqual(d.year, 2025)
|
61
|
+
self.assertEqual(d.month, 4)
|
62
|
+
self.assertEqual(d.day, 15)
|
63
|
+
self.assertEqual(d.get_format_type(), 'full')
|
64
|
+
|
65
|
+
def test_create_from_keyword_args(self):
|
66
|
+
"""测试从关键字参数创建"""
|
67
|
+
d = Date(year=2025, month=4, day=15)
|
68
|
+
self.assertEqual(d.year, 2025)
|
69
|
+
self.assertEqual(d.month, 4)
|
70
|
+
self.assertEqual(d.day, 15)
|
71
|
+
self.assertEqual(d.get_format_type(), 'full')
|
72
|
+
|
73
|
+
def test_create_today(self):
|
74
|
+
"""测试创建今日对象"""
|
75
|
+
d = Date()
|
76
|
+
today = datetime.date.today()
|
77
|
+
self.assertEqual(d.year, today.year)
|
78
|
+
self.assertEqual(d.month, today.month)
|
79
|
+
self.assertEqual(d.day, today.day)
|
80
|
+
self.assertEqual(d.get_format_type(), 'today')
|
81
|
+
|
82
|
+
def test_create_from_date_object(self):
|
83
|
+
"""测试从datetime.date对象创建"""
|
84
|
+
date_obj = datetime.date(2025, 4, 15)
|
85
|
+
d = Date(date_obj)
|
86
|
+
self.assertEqual(d.year, 2025)
|
87
|
+
self.assertEqual(d.month, 4)
|
88
|
+
self.assertEqual(d.day, 15)
|
89
|
+
self.assertEqual(d.get_format_type(), 'date_object')
|
90
|
+
|
91
|
+
def test_create_from_datetime_object(self):
|
92
|
+
"""测试从datetime.datetime对象创建"""
|
93
|
+
datetime_obj = datetime.datetime(2025, 4, 15, 10, 30, 0)
|
94
|
+
d = Date(datetime_obj)
|
95
|
+
self.assertEqual(d.year, 2025)
|
96
|
+
self.assertEqual(d.month, 4)
|
97
|
+
self.assertEqual(d.day, 15)
|
98
|
+
self.assertEqual(d.get_format_type(), 'datetime_object')
|
99
|
+
|
100
|
+
|
101
|
+
class TestDateClassMethods(unittest.TestCase):
|
102
|
+
"""测试Date类的类方法 (from_* 系列)"""
|
103
|
+
|
104
|
+
def test_from_string(self):
|
105
|
+
"""测试from_string类方法"""
|
106
|
+
d = Date.from_string('20250415')
|
107
|
+
self.assertEqual(str(d), '20250415')
|
108
|
+
|
109
|
+
def test_from_timestamp(self):
|
110
|
+
"""测试from_timestamp类方法"""
|
111
|
+
# 2022-01-01的时间戳
|
112
|
+
d = Date.from_timestamp(1640995200)
|
113
|
+
self.assertEqual(d.year, 2022)
|
114
|
+
self.assertEqual(d.month, 1)
|
115
|
+
self.assertEqual(d.day, 1)
|
116
|
+
|
117
|
+
def test_from_date_object(self):
|
118
|
+
"""测试from_date_object类方法"""
|
119
|
+
date_obj = datetime.date(2025, 4, 15)
|
120
|
+
d = Date.from_date_object(date_obj)
|
121
|
+
self.assertEqual(d.year, 2025)
|
122
|
+
self.assertEqual(d.month, 4)
|
123
|
+
self.assertEqual(d.day, 15)
|
124
|
+
|
125
|
+
def test_from_datetime_object(self):
|
126
|
+
"""测试from_datetime_object类方法"""
|
127
|
+
datetime_obj = datetime.datetime(2025, 4, 15, 10, 30)
|
128
|
+
d = Date.from_datetime_object(datetime_obj)
|
129
|
+
self.assertEqual(d.year, 2025)
|
130
|
+
self.assertEqual(d.month, 4)
|
131
|
+
self.assertEqual(d.day, 15)
|
132
|
+
|
133
|
+
def test_today(self):
|
134
|
+
"""测试today类方法"""
|
135
|
+
d = Date.today()
|
136
|
+
today = datetime.date.today()
|
137
|
+
self.assertEqual(d.year, today.year)
|
138
|
+
self.assertEqual(d.month, today.month)
|
139
|
+
self.assertEqual(d.day, today.day)
|
140
|
+
|
141
|
+
|
142
|
+
class TestDateConversion(unittest.TestCase):
|
143
|
+
"""测试Date对象的转换方法 (to_* 系列)"""
|
144
|
+
|
145
|
+
def setUp(self):
|
146
|
+
self.date = Date('20250415')
|
147
|
+
|
148
|
+
def test_to_tuple(self):
|
149
|
+
"""测试to_tuple方法"""
|
150
|
+
result = self.date.to_tuple()
|
151
|
+
self.assertEqual(result, (2025, 4, 15))
|
152
|
+
self.assertIsInstance(result, tuple)
|
153
|
+
|
154
|
+
def test_to_dict(self):
|
155
|
+
"""测试to_dict方法"""
|
156
|
+
result = self.date.to_dict()
|
157
|
+
expected = {
|
158
|
+
'year': 2025,
|
159
|
+
'month': 4,
|
160
|
+
'day': 15,
|
161
|
+
'format_type': 'full'
|
162
|
+
}
|
163
|
+
self.assertEqual(result, expected)
|
164
|
+
self.assertIsInstance(result, dict)
|
165
|
+
|
166
|
+
def test_to_date_object(self):
|
167
|
+
"""测试to_date_object方法"""
|
168
|
+
result = self.date.to_date_object()
|
169
|
+
expected = datetime.date(2025, 4, 15)
|
170
|
+
self.assertEqual(result, expected)
|
171
|
+
self.assertIsInstance(result, datetime.date)
|
172
|
+
|
173
|
+
def test_to_datetime_object(self):
|
174
|
+
"""测试to_datetime_object方法"""
|
175
|
+
result = self.date.to_datetime_object()
|
176
|
+
expected = datetime.datetime(2025, 4, 15)
|
177
|
+
self.assertEqual(result, expected)
|
178
|
+
self.assertIsInstance(result, datetime.datetime)
|
179
|
+
|
180
|
+
def test_to_timestamp(self):
|
181
|
+
"""测试to_timestamp方法"""
|
182
|
+
result = self.date.to_timestamp()
|
183
|
+
self.assertIsInstance(result, float)
|
184
|
+
# 验证时间戳可以转换回正确的日期
|
185
|
+
dt = datetime.datetime.fromtimestamp(result)
|
186
|
+
self.assertEqual(dt.year, 2025)
|
187
|
+
self.assertEqual(dt.month, 4)
|
188
|
+
self.assertEqual(dt.day, 15)
|
189
|
+
|
190
|
+
|
191
|
+
class TestDateFormatting(unittest.TestCase):
|
192
|
+
"""测试Date对象的格式化方法 (format_* 系列)"""
|
193
|
+
|
194
|
+
def setUp(self):
|
195
|
+
self.date = Date('20250415')
|
196
|
+
|
197
|
+
def test_format_default(self):
|
198
|
+
"""测试format_default方法"""
|
199
|
+
result = self.date.format_default()
|
200
|
+
self.assertEqual(result, '20250415')
|
201
|
+
|
202
|
+
def test_format_iso(self):
|
203
|
+
"""测试format_iso方法"""
|
204
|
+
result = self.date.format_iso()
|
205
|
+
self.assertEqual(result, '2025-04-15')
|
206
|
+
|
207
|
+
def test_format_chinese(self):
|
208
|
+
"""测试format_chinese方法"""
|
209
|
+
result = self.date.format_chinese()
|
210
|
+
self.assertEqual(result, '2025年04月15日')
|
211
|
+
|
212
|
+
def test_format_compact(self):
|
213
|
+
"""测试format_compact方法"""
|
214
|
+
result = self.date.format_compact()
|
215
|
+
self.assertEqual(result, '20250415')
|
216
|
+
|
217
|
+
def test_format_slash(self):
|
218
|
+
"""测试format_slash方法"""
|
219
|
+
result = self.date.format_slash()
|
220
|
+
self.assertEqual(result, '2025/04/15')
|
221
|
+
|
222
|
+
def test_format_dot(self):
|
223
|
+
"""测试format_dot方法"""
|
224
|
+
result = self.date.format_dot()
|
225
|
+
self.assertEqual(result, '2025.04.15')
|
226
|
+
|
227
|
+
def test_format_custom(self):
|
228
|
+
"""测试format_custom方法"""
|
229
|
+
result = self.date.format_custom('%Y-%m')
|
230
|
+
self.assertEqual(result, '2025-04')
|
231
|
+
|
232
|
+
def test_format_year_month(self):
|
233
|
+
"""测试format_year_month方法"""
|
234
|
+
result = self.date.format_year_month()
|
235
|
+
self.assertEqual(result, '2025-04')
|
236
|
+
|
237
|
+
def test_format_year_month_compact(self):
|
238
|
+
"""测试format_year_month_compact方法"""
|
239
|
+
result = self.date.format_year_month_compact()
|
240
|
+
self.assertEqual(result, '202504')
|
241
|
+
|
242
|
+
|
243
|
+
class TestDateGetters(unittest.TestCase):
|
244
|
+
"""测试Date对象的获取方法 (get_* 系列)"""
|
245
|
+
|
246
|
+
def setUp(self):
|
247
|
+
self.date = Date('20250415') # 2025年4月15日,星期二
|
248
|
+
|
249
|
+
def test_get_weekday(self):
|
250
|
+
"""测试get_weekday方法"""
|
251
|
+
result = self.date.get_weekday()
|
252
|
+
self.assertEqual(result, 1) # 星期二 = 1 (Monday=0)
|
253
|
+
|
254
|
+
def test_get_isoweekday(self):
|
255
|
+
"""测试get_isoweekday方法"""
|
256
|
+
result = self.date.get_isoweekday()
|
257
|
+
self.assertEqual(result, 2) # 星期二 = 2 (Monday=1)
|
258
|
+
|
259
|
+
def test_get_days_in_month(self):
|
260
|
+
"""测试get_days_in_month方法"""
|
261
|
+
result = self.date.get_days_in_month()
|
262
|
+
self.assertEqual(result, 30) # 4月有30天
|
263
|
+
|
264
|
+
def test_get_days_in_year(self):
|
265
|
+
"""测试get_days_in_year方法"""
|
266
|
+
result = self.date.get_days_in_year()
|
267
|
+
self.assertEqual(result, 365) # 2025年不是闰年
|
268
|
+
|
269
|
+
def test_get_month_start(self):
|
270
|
+
"""测试get_month_start方法"""
|
271
|
+
result = self.date.get_month_start()
|
272
|
+
self.assertEqual(str(result), '20250401')
|
273
|
+
|
274
|
+
def test_get_month_end(self):
|
275
|
+
"""测试get_month_end方法"""
|
276
|
+
result = self.date.get_month_end()
|
277
|
+
self.assertEqual(str(result), '20250430')
|
278
|
+
|
279
|
+
def test_get_year_start(self):
|
280
|
+
"""测试get_year_start方法"""
|
281
|
+
result = self.date.get_year_start()
|
282
|
+
self.assertEqual(str(result), '20250101')
|
283
|
+
|
284
|
+
def test_get_year_end(self):
|
285
|
+
"""测试get_year_end方法"""
|
286
|
+
result = self.date.get_year_end()
|
287
|
+
self.assertEqual(str(result), '20251231')
|
288
|
+
|
289
|
+
|
290
|
+
class TestDatePredicates(unittest.TestCase):
|
291
|
+
"""测试Date对象的判断方法 (is_* 系列)"""
|
292
|
+
|
293
|
+
def test_is_weekend(self):
|
294
|
+
"""测试is_weekend方法"""
|
295
|
+
# 星期二
|
296
|
+
weekday = Date('20250415')
|
297
|
+
self.assertFalse(weekday.is_weekend())
|
298
|
+
|
299
|
+
# 星期六
|
300
|
+
saturday = Date('20250419')
|
301
|
+
self.assertTrue(saturday.is_weekend())
|
302
|
+
|
303
|
+
# 星期日
|
304
|
+
sunday = Date('20250420')
|
305
|
+
self.assertTrue(sunday.is_weekend())
|
306
|
+
|
307
|
+
def test_is_weekday(self):
|
308
|
+
"""测试is_weekday方法"""
|
309
|
+
weekday = Date('20250415') # 星期二
|
310
|
+
saturday = Date('20250419') # 星期六
|
311
|
+
|
312
|
+
self.assertTrue(weekday.is_weekday())
|
313
|
+
self.assertFalse(saturday.is_weekday())
|
314
|
+
|
315
|
+
def test_is_leap_year(self):
|
316
|
+
"""测试is_leap_year方法"""
|
317
|
+
# 2024是闰年
|
318
|
+
leap_year = Date('20240101')
|
319
|
+
self.assertTrue(leap_year.is_leap_year())
|
320
|
+
|
321
|
+
# 2025不是闰年
|
322
|
+
non_leap_year = Date('20250101')
|
323
|
+
self.assertFalse(non_leap_year.is_leap_year())
|
324
|
+
|
325
|
+
def test_is_month_start(self):
|
326
|
+
"""测试is_month_start方法"""
|
327
|
+
month_start = Date('20250401')
|
328
|
+
not_month_start = Date('20250415')
|
329
|
+
|
330
|
+
self.assertTrue(month_start.is_month_start())
|
331
|
+
self.assertFalse(not_month_start.is_month_start())
|
332
|
+
|
333
|
+
def test_is_month_end(self):
|
334
|
+
"""测试is_month_end方法"""
|
335
|
+
month_end = Date('20250430')
|
336
|
+
not_month_end = Date('20250415')
|
337
|
+
|
338
|
+
self.assertTrue(month_end.is_month_end())
|
339
|
+
self.assertFalse(not_month_end.is_month_end())
|
340
|
+
|
341
|
+
def test_is_year_start(self):
|
342
|
+
"""测试is_year_start方法"""
|
343
|
+
year_start = Date('20250101')
|
344
|
+
not_year_start = Date('20250415')
|
345
|
+
|
346
|
+
self.assertTrue(year_start.is_year_start())
|
347
|
+
self.assertFalse(not_year_start.is_year_start())
|
348
|
+
|
349
|
+
def test_is_year_end(self):
|
350
|
+
"""测试is_year_end方法"""
|
351
|
+
year_end = Date('20251231')
|
352
|
+
not_year_end = Date('20250415')
|
353
|
+
|
354
|
+
self.assertTrue(year_end.is_year_end())
|
355
|
+
self.assertFalse(not_year_end.is_year_end())
|
356
|
+
|
357
|
+
|
358
|
+
class TestDateArithmetic(unittest.TestCase):
|
359
|
+
"""测试Date对象的运算方法"""
|
360
|
+
|
361
|
+
def setUp(self):
|
362
|
+
self.date = Date('20250415')
|
363
|
+
|
364
|
+
def test_add_days(self):
|
365
|
+
"""测试add_days方法"""
|
366
|
+
result = self.date.add_days(10)
|
367
|
+
self.assertEqual(str(result), '20250425')
|
368
|
+
|
369
|
+
# 测试负数
|
370
|
+
result = self.date.add_days(-5)
|
371
|
+
self.assertEqual(str(result), '20250410')
|
372
|
+
|
373
|
+
def test_add_months(self):
|
374
|
+
"""测试add_months方法"""
|
375
|
+
result = self.date.add_months(2)
|
376
|
+
self.assertEqual(str(result), '20250615')
|
377
|
+
|
378
|
+
# 测试负数
|
379
|
+
result = self.date.add_months(-2)
|
380
|
+
self.assertEqual(str(result), '20250215')
|
381
|
+
|
382
|
+
def test_add_years(self):
|
383
|
+
"""测试add_years方法"""
|
384
|
+
result = self.date.add_years(1)
|
385
|
+
self.assertEqual(str(result), '20260415')
|
386
|
+
|
387
|
+
# 测试负数
|
388
|
+
result = self.date.add_years(-1)
|
389
|
+
self.assertEqual(str(result), '20240415')
|
390
|
+
|
391
|
+
def test_subtract_days(self):
|
392
|
+
"""测试subtract_days方法"""
|
393
|
+
result = self.date.subtract_days(10)
|
394
|
+
self.assertEqual(str(result), '20250405')
|
395
|
+
|
396
|
+
def test_subtract_months(self):
|
397
|
+
"""测试subtract_months方法"""
|
398
|
+
result = self.date.subtract_months(2)
|
399
|
+
self.assertEqual(str(result), '20250215')
|
400
|
+
|
401
|
+
def test_subtract_years(self):
|
402
|
+
"""测试subtract_years方法"""
|
403
|
+
result = self.date.subtract_years(1)
|
404
|
+
self.assertEqual(str(result), '20240415')
|
405
|
+
|
406
|
+
def test_format_preservation(self):
|
407
|
+
"""测试运算后格式保持"""
|
408
|
+
# 年月格式
|
409
|
+
ym_date = Date('202504')
|
410
|
+
result = ym_date.add_months(2)
|
411
|
+
self.assertEqual(str(result), '202506')
|
412
|
+
|
413
|
+
# 完整格式
|
414
|
+
full_date = Date('20250415')
|
415
|
+
result = full_date.add_days(10)
|
416
|
+
self.assertEqual(str(result), '20250425')
|
417
|
+
|
418
|
+
|
419
|
+
class TestDateComparison(unittest.TestCase):
|
420
|
+
"""测试Date对象的比较操作"""
|
421
|
+
|
422
|
+
def setUp(self):
|
423
|
+
self.date1 = Date('20250415')
|
424
|
+
self.date2 = Date('20250420')
|
425
|
+
self.date3 = Date('20250415')
|
426
|
+
|
427
|
+
def test_equality(self):
|
428
|
+
"""测试相等比较"""
|
429
|
+
self.assertTrue(self.date1 == self.date3)
|
430
|
+
self.assertFalse(self.date1 == self.date2)
|
431
|
+
|
432
|
+
def test_less_than(self):
|
433
|
+
"""测试小于比较"""
|
434
|
+
self.assertTrue(self.date1 < self.date2)
|
435
|
+
self.assertFalse(self.date2 < self.date1)
|
436
|
+
self.assertFalse(self.date1 < self.date3)
|
437
|
+
|
438
|
+
def test_less_equal(self):
|
439
|
+
"""测试小于等于比较"""
|
440
|
+
self.assertTrue(self.date1 <= self.date2)
|
441
|
+
self.assertTrue(self.date1 <= self.date3)
|
442
|
+
self.assertFalse(self.date2 <= self.date1)
|
443
|
+
|
444
|
+
def test_greater_than(self):
|
445
|
+
"""测试大于比较"""
|
446
|
+
self.assertTrue(self.date2 > self.date1)
|
447
|
+
self.assertFalse(self.date1 > self.date2)
|
448
|
+
self.assertFalse(self.date1 > self.date3)
|
449
|
+
|
450
|
+
def test_greater_equal(self):
|
451
|
+
"""测试大于等于比较"""
|
452
|
+
self.assertTrue(self.date2 >= self.date1)
|
453
|
+
self.assertTrue(self.date1 >= self.date3)
|
454
|
+
self.assertFalse(self.date1 >= self.date2)
|
455
|
+
|
456
|
+
def test_hash(self):
|
457
|
+
"""测试哈希值"""
|
458
|
+
self.assertEqual(hash(self.date1), hash(self.date3))
|
459
|
+
self.assertNotEqual(hash(self.date1), hash(self.date2))
|
460
|
+
|
461
|
+
|
462
|
+
class TestDateCalculation(unittest.TestCase):
|
463
|
+
"""测试Date对象的计算方法"""
|
464
|
+
|
465
|
+
def setUp(self):
|
466
|
+
self.date1 = Date('20250415')
|
467
|
+
self.date2 = Date('20250420')
|
468
|
+
|
469
|
+
def test_calculate_difference_days(self):
|
470
|
+
"""测试calculate_difference_days方法"""
|
471
|
+
diff = self.date2.calculate_difference_days(self.date1)
|
472
|
+
self.assertEqual(diff, 5)
|
473
|
+
|
474
|
+
# 反向计算
|
475
|
+
diff = self.date1.calculate_difference_days(self.date2)
|
476
|
+
self.assertEqual(diff, -5)
|
477
|
+
|
478
|
+
def test_calculate_difference_months(self):
|
479
|
+
"""测试calculate_difference_months方法"""
|
480
|
+
date1 = Date('20250415')
|
481
|
+
date2 = Date('20250615')
|
482
|
+
|
483
|
+
diff = date2.calculate_difference_months(date1)
|
484
|
+
self.assertEqual(diff, 2)
|
485
|
+
|
486
|
+
# 反向计算
|
487
|
+
diff = date1.calculate_difference_months(date2)
|
488
|
+
self.assertEqual(diff, -2)
|
489
|
+
|
490
|
+
|
491
|
+
class TestDateErrorHandling(unittest.TestCase):
|
492
|
+
"""测试Date对象的错误处理"""
|
493
|
+
|
494
|
+
def test_invalid_string_format(self):
|
495
|
+
"""测试无效字符串格式"""
|
496
|
+
with self.assertRaises(ValueError):
|
497
|
+
Date('invalid')
|
498
|
+
|
499
|
+
with self.assertRaises(ValueError):
|
500
|
+
Date('12345') # 5位数字
|
501
|
+
|
502
|
+
with self.assertRaises(ValueError):
|
503
|
+
Date('123456789') # 9位数字
|
504
|
+
|
505
|
+
def test_invalid_date_values(self):
|
506
|
+
"""测试无效日期值"""
|
507
|
+
with self.assertRaises(ValueError):
|
508
|
+
Date(2025, 13, 1) # 无效月份
|
509
|
+
|
510
|
+
with self.assertRaises(ValueError):
|
511
|
+
Date(2025, 4, 31) # 4月没有31日
|
512
|
+
|
513
|
+
with self.assertRaises(ValueError):
|
514
|
+
Date(2025, 2, 29) # 2025年2月没有29日
|
515
|
+
|
516
|
+
def test_invalid_argument_types(self):
|
517
|
+
"""测试无效参数类型"""
|
518
|
+
with self.assertRaises(TypeError):
|
519
|
+
Date(['invalid'])
|
520
|
+
|
521
|
+
with self.assertRaises(ValueError):
|
522
|
+
Date(year=2025) # 缺少month参数
|
523
|
+
|
524
|
+
|
525
|
+
class TestBackwardCompatibility(unittest.TestCase):
|
526
|
+
"""测试向后兼容性"""
|
527
|
+
|
528
|
+
def setUp(self):
|
529
|
+
self.date = Date('20250415')
|
530
|
+
|
531
|
+
def test_old_format_method(self):
|
532
|
+
"""测试旧的format方法"""
|
533
|
+
result = self.date.format('%Y-%m-%d')
|
534
|
+
self.assertEqual(result, '2025-04-15')
|
535
|
+
|
536
|
+
def test_old_to_date_method(self):
|
537
|
+
"""测试旧的to_date方法"""
|
538
|
+
result = self.date.to_date()
|
539
|
+
expected = datetime.date(2025, 4, 15)
|
540
|
+
self.assertEqual(result, expected)
|
541
|
+
|
542
|
+
def test_old_to_datetime_method(self):
|
543
|
+
"""测试旧的to_datetime方法"""
|
544
|
+
result = self.date.to_datetime()
|
545
|
+
expected = datetime.datetime(2025, 4, 15)
|
546
|
+
self.assertEqual(result, expected)
|
547
|
+
|
548
|
+
def test_old_weekday_method(self):
|
549
|
+
"""测试旧的weekday方法"""
|
550
|
+
result = self.date.weekday()
|
551
|
+
self.assertEqual(result, 1)
|
552
|
+
|
553
|
+
def test_old_difference_method(self):
|
554
|
+
"""测试旧的difference方法"""
|
555
|
+
other = Date('20250420')
|
556
|
+
result = other.difference(self.date)
|
557
|
+
self.assertEqual(result, 5)
|
558
|
+
|
559
|
+
|
560
|
+
if __name__ == '__main__':
|
561
|
+
# 设置日志级别为WARNING,避免测试时的日志干扰
|
562
|
+
Date.set_log_level(logging.WARNING)
|
563
|
+
|
564
|
+
# 运行测试
|
565
|
+
unittest.main(verbosity=2)
|