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.
@@ -2,41 +2,41 @@
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
4
  """
5
- Date类完整测试套件
6
- ===============
5
+ Date类核心功能测试
6
+ ================
7
7
 
8
- 测试staran.tools.date.Date类的所有功能,包括:
8
+ 测试Date类的所有功能,包括:
9
9
  - 对象创建和初始化
10
- - API命名规范
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.tools.date import Date
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 test_create_from_string_yyyymmdd(self):
34
- """测试从YYYYMMDD字符串创建"""
35
- d = Date('20250415')
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, 4)
38
- self.assertEqual(d.day, 15)
39
- self.assertEqual(d.get_format_type(), 'full')
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.get_format_type(), 'year_month')
47
+ self.assertEqual(str(d), '202504')
48
48
 
49
- def test_create_from_string_yyyy(self):
50
- """测试从YYYY字符串创建"""
51
- d = Date('2025')
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, 1)
54
- self.assertEqual(d.day, 1)
55
- self.assertEqual(d.get_format_type(), 'year_only')
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.get_format_type(), 'full')
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 test_create_from_date_object(self):
83
- """测试从datetime.date对象创建"""
84
- date_obj = datetime.date(2025, 4, 15)
85
- d = Date(date_obj)
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 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)
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
- self.assertEqual(d.get_format_type(), 'datetime_object')
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类的类方法 (from_* 系列)"""
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(str(d), '20250415')
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
- # 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)
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
- """测试Date对象的格式化方法 (format_* 系列)"""
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
- result = self.date.format_default()
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
- result = self.date.format_iso()
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
- result = self.date.format_chinese()
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
- result = self.date.format_compact()
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
- result = self.date.format_slash()
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
- 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')
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
- result = self.date.format_year_month()
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
- result = self.date.format_year_month_compact()
240
- self.assertEqual(result, '202504')
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
- """测试Date对象的获取方法 (get_* 系列)"""
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
- result = self.date.get_weekday()
252
- self.assertEqual(result, 1) # 星期二 = 1 (Monday=0)
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
- 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年不是闰年
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
- result = self.date.get_month_start()
272
- self.assertEqual(str(result), '20250401')
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
- result = self.date.get_month_end()
277
- self.assertEqual(str(result), '20250430')
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
- result = self.date.get_year_start()
282
- self.assertEqual(str(result), '20250101')
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
- result = self.date.get_year_end()
287
- self.assertEqual(str(result), '20251231')
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
- """测试Date对象的判断方法 (is_* 系列)"""
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
- weekday = Date('20250415') # 星期二
310
- saturday = Date('20250419') # 星期六
346
+ self.assertTrue(self.date.is_weekday()) # 星期二是工作日
311
347
 
312
- self.assertTrue(weekday.is_weekday())
313
- self.assertFalse(saturday.is_weekday())
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
- # 2024是闰年
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
- # 2025不是闰年
322
- non_leap_year = Date('20250101')
323
- self.assertFalse(non_leap_year.is_leap_year())
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
- month_start = Date('20250401')
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
- month_end = Date('20250430')
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
- year_start = Date('20250101')
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
- year_end = Date('20251231')
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 TestDateArithmetic(unittest.TestCase):
359
- """测试Date对象的运算方法"""
393
+ class TestDateConversion(unittest.TestCase):
394
+ """测试转换方法"""
360
395
 
361
396
  def setUp(self):
362
397
  self.date = Date('20250415')
363
398
 
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)
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 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)
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 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)
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 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)
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 test_hash(self):
457
- """测试哈希值"""
458
- self.assertEqual(hash(self.date1), hash(self.date3))
459
- self.assertNotEqual(hash(self.date1), hash(self.date2))
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
- """测试Date对象的计算方法"""
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
- diff = self.date2.calculate_difference_days(self.date1)
472
- self.assertEqual(diff, 5)
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
- diff = self.date1.calculate_difference_days(self.date2)
476
- self.assertEqual(diff, -5)
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, -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参数
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-%m-%d')
534
- self.assertEqual(result, '2025-04-15')
460
+ result = self.date.format('%Y年%m')
461
+ self.assertEqual(result, '202504')
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
- other = Date('20250420')
556
- result = other.difference(self.date)
557
- self.assertEqual(result, 5)
482
+ other_date = Date('20250425')
483
+ diff = self.date.difference(other_date)
484
+ self.assertEqual(diff, 10)
558
485
 
559
486
 
560
- if __name__ == '__main__':
561
- # 设置日志级别为WARNING,避免测试时的日志干扰
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)