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