Skip to content

Commit 8450576

Browse files
committed
Доработки 1.4
- Поправил вычисление разницы в днях: теперь сравниваем начало дня, игнорируя часы, минуты и секунды - Доработал тесты
1 parent d31cd90 commit 8450576

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

SwiftUI-Days/Models/Item.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import SwiftData
1010

1111
@Model
1212
final class Item {
13+
private static let calendar = Calendar.current
1314
var title = ""
1415
var details = ""
1516
var timestamp = Date.now
@@ -22,11 +23,10 @@ final class Item {
2223

2324
/// Количество дней с момента события
2425
func makeDaysCount(to date: Date) -> Int {
25-
Calendar.current.dateComponents(
26-
[.day],
27-
from: timestamp,
28-
to: date
29-
).day ?? 0
26+
let startDate = Self.calendar.startOfDay(for: timestamp)
27+
let endDate = Self.calendar.startOfDay(for: date)
28+
let daysCount = Self.calendar.dateComponents([.day], from: startDate, to: endDate).day
29+
return daysCount ?? 0
3030
}
3131

3232
var backupItem: BackupFileDocument.BackupItem {

SwiftUI-DaysTests/SwiftUI_DaysTests.swift

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,79 @@ import Foundation
1111

1212
@Suite("Item tests")
1313
struct SwiftUI_DaysTests {
14+
private let calendar = Calendar.current
15+
private let now = Date.now
16+
1417
/// Тестируем инициализацию объекта Item
15-
@Test func itemInitialization() {
18+
@Test func itemInitialization() throws {
1619
let title = "Test Title"
1720
let details = "Test Details"
18-
let oneDayAgo = Date(timeIntervalSinceNow: -86400)
21+
let oneDayAgo = try #require(calendar.date(byAdding: .day, value: -1, to: now))
1922
let item = Item(title: title, details: details, timestamp: oneDayAgo)
2023
#expect(item.title == title)
2124
#expect(item.details == details)
2225
#expect(item.timestamp == oneDayAgo)
2326
}
2427

28+
2529
/// Тестируем `daysCount`, когда событие произошло только что
2630
@Test func daysCountWithNoDaysPassed() {
27-
let item = Item(title: "Recent Event", timestamp: .now)
28-
let result = item.makeDaysCount(to: .now)
31+
let item = Item(title: "Recent Event", timestamp: now)
32+
let result = item.makeDaysCount(to: now)
2933
#expect(result == 0)
3034
}
3135

3236
/// Тестируем `daysCount` для события, произошедшего 1 день назад
33-
@Test func daysCountWithOneDayPassed() {
37+
@Test func daysCountWithOneDayPassed() throws {
38+
let oneDayAgo = try #require(calendar.date(byAdding: .day, value: -1, to: now))
3439
let oneDayOldItem = Item(
3540
title: "One Day Ago",
36-
timestamp: Date(timeIntervalSinceNow: -86400)
41+
timestamp: oneDayAgo
3742
)
38-
let result = oneDayOldItem.makeDaysCount(to: .now)
43+
let result = oneDayOldItem.makeDaysCount(to: now)
3944
#expect(result == 1)
4045
}
41-
46+
4247
/// Тестируем `daysCount` для события, произошедшего 5 дней назад
43-
@Test func daysCountWithMultipleDaysPassed() {
48+
@Test func daysCountWithMultipleDaysPassed() throws {
49+
let fiveDaysAgo = try #require(calendar.date(byAdding: .day, value: -5, to: now))
4450
let fiveDaysOldItem = Item(
4551
title: "Five Days Ago",
46-
timestamp: Date(timeIntervalSinceNow: -432000)
52+
timestamp: fiveDaysAgo
4753
)
48-
let result = fiveDaysOldItem.makeDaysCount(to: .now)
54+
let result = fiveDaysOldItem.makeDaysCount(to: now)
4955
#expect(result == 5)
5056
}
57+
58+
@Test(arguments: 1...11)
59+
func daysCountSameDay(hoursAgo: Int) throws {
60+
let date = try #require(Calendar.current.date(byAdding: .hour, value: -hoursAgo, to: now))
61+
let item = Item(title: "Recent Event", timestamp: date)
62+
let result = item.makeDaysCount(to: now)
63+
#expect(result == 0, "Должно быть 0 дней, так как даты в одном календарном дне")
64+
}
65+
66+
@Test(arguments: 12...23)
67+
func daysCountDifferentDay(hoursAgo: Int) throws {
68+
let date = try #require(Calendar.current.date(byAdding: .hour, value: -hoursAgo, to: now))
69+
let item = Item(title: "Yesterday Event", timestamp: date)
70+
let result = item.makeDaysCount(to: now)
71+
#expect(result == 1, "Должен быть 1 день, так как даты в разных календарных днях")
72+
}
73+
74+
@Test func daysCountAcrossMidnight() throws {
75+
let todayStart = calendar.startOfDay(for: now)
76+
let justBeforeMidnight = try #require(calendar.date(byAdding: .minute, value: -1, to: todayStart))
77+
let justAfterMidnight = try #require(calendar.date(byAdding: .minute, value: 1, to: todayStart))
78+
let item = Item(title: "Late Event", timestamp: justBeforeMidnight)
79+
let result = item.makeDaysCount(to: justAfterMidnight)
80+
#expect(result == 1, "Должен быть 1 день при переходе через полночь")
81+
}
82+
83+
@Test func daysCountFutureEvent() throws {
84+
let futureDate = try #require(calendar.date(byAdding: .day, value: 1, to: now))
85+
let item = Item(title: "Future Event", timestamp: futureDate)
86+
let result = item.makeDaysCount(to: now)
87+
#expect(result <= 0, "Для будущих событий результат должен быть 0 или отрицательным")
88+
}
5189
}

0 commit comments

Comments
 (0)