Skip to content

Commit 4b6fb0f

Browse files
authored
Merge pull request #6 from easydev991/develop-1.4
- Поправил вычисление разницы в днях: теперь сравниваем начало дня, игнорируя часы, минуты и секунды - Доработал тесты
2 parents d31cd90 + 1d1ab91 commit 4b6fb0f

File tree

3 files changed

+56
-18
lines changed

3 files changed

+56
-18
lines changed

SwiftUI-Days.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@
532532
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
533533
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
534534
MACOSX_DEPLOYMENT_TARGET = 14.0;
535-
MARKETING_VERSION = 1.3;
535+
MARKETING_VERSION = 1.4;
536536
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SwiftUI-Days";
537537
PRODUCT_NAME = "$(TARGET_NAME)";
538538
SDKROOT = auto;
@@ -578,7 +578,7 @@
578578
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
579579
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
580580
MACOSX_DEPLOYMENT_TARGET = 14.0;
581-
MARKETING_VERSION = 1.3;
581+
MARKETING_VERSION = 1.4;
582582
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SwiftUI-Days";
583583
PRODUCT_NAME = "$(TARGET_NAME)";
584584
SDKROOT = auto;

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)