Skip to content

Commit ad708e8

Browse files
authored
Доработал форматирование отображения дней (#14)
* Дорабатываю логику и тесты * Поднял версию до 1.6.1
1 parent 717cd36 commit ad708e8

File tree

4 files changed

+77
-47
lines changed

4 files changed

+77
-47
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.6;
535+
MARKETING_VERSION = 1.6.1;
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.6;
581+
MARKETING_VERSION = 1.6.1;
582582
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SwiftUI-Days";
583583
PRODUCT_NAME = "$(TARGET_NAME)";
584584
SDKROOT = auto;

SwiftUI-Days/Models/DisplayOption.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,30 @@ enum DisplayOption: String, Codable, CaseIterable, Hashable {
2626
}
2727

2828
extension DisplayOption {
29-
static func makeUnitsStyle(
29+
func unitsStyle(
3030
years: Int,
3131
months: Int,
3232
days: Int
3333
) -> DateComponentsFormatter.UnitsStyle {
34-
let hasYears = years != 0
35-
let hasMonths = months != 0
36-
let hasDays = days != 0
37-
return switch (hasYears, hasMonths, hasDays) {
38-
case (true, true, true): .abbreviated
39-
case (true, true, false), (true, false, true), (false, true, true): .short
40-
default: .full
34+
switch self {
35+
case .day:
36+
return .full
37+
case .monthDay:
38+
let hasMonths = months != 0
39+
let hasDays = days != 0
40+
return (hasMonths && hasDays) ? .short : .full
41+
case .yearMonthDay:
42+
let hasYears = years != 0
43+
let hasMonths = months != 0
44+
let hasDays = days != 0
45+
switch (hasYears, hasMonths, hasDays) {
46+
case (true, true, true):
47+
return .abbreviated
48+
case (true, true, false), (true, false, true), (false, true, true):
49+
return .short
50+
default:
51+
return .full
52+
}
4153
}
4254
}
4355
}

SwiftUI-Days/Models/Item.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ final class Item {
4545
let formatter = DateComponentsFormatter()
4646
let option = displayOption ?? .day
4747
formatter.allowedUnits = option.allowedUnits
48-
formatter.unitsStyle = DisplayOption.makeUnitsStyle(
48+
formatter.unitsStyle = option.unitsStyle(
4949
years: yearsCount,
5050
months: monthsCount,
5151
days: daysCount

SwiftUI-DaysTests/DisplayOptionTests.swift

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import Testing
55

66
@Suite("DisplayOption tests")
77
struct DisplayOptionTests {
8-
@Test func displayOptionAllowedUnits() {
8+
@Test("allowedUnits: проверка корректных единиц для каждого DisplayOption")
9+
func displayOptionAllowedUnits() {
910
#expect(DisplayOption.day.allowedUnits == [.day])
1011
#expect(DisplayOption.monthDay.allowedUnits == [.month, .day])
1112
#expect(DisplayOption.yearMonthDay.allowedUnits == [.year, .month, .day])
1213
}
1314

14-
@Test func displayOptionLocalizedTitle() {
15+
@Test("localizedTitle: проверка локализованных заголовков")
16+
func displayOptionLocalizedTitle() {
1517
let dayTitle = DisplayOption.day.localizedTitle
1618
let monthDayTitle = DisplayOption.monthDay.localizedTitle
1719
let yearMonthDayTitle = DisplayOption.yearMonthDay.localizedTitle
@@ -20,54 +22,70 @@ struct DisplayOptionTests {
2022
#expect(yearMonthDayTitle == LocalizedStringKey("Years, months and days"))
2123
}
2224

23-
@Test(arguments: abbreviatedTestCases)
24-
func makeUnitsStyleAbbreviated(years: Int, months: Int, days: Int) throws {
25-
let style = DisplayOption.makeUnitsStyle(years: years, months: months, days: days)
25+
@Test(".day: вне зависимости от значений всегда .full", arguments: allCombos)
26+
func unitsStyle_day_alwaysFull(years: Int, months: Int, days: Int) {
27+
let style = DisplayOption.day.unitsStyle(years: years, months: months, days: days)
28+
#expect(style == .full)
29+
}
30+
31+
@Test(".monthDay: .short, если есть месяцы и дни одновременно", arguments: monthDayShortCombos)
32+
func unitsStyle_monthDay_short_whenMonthsAndDays(years: Int, months: Int, days: Int) {
33+
let style = DisplayOption.monthDay.unitsStyle(years: years, months: months, days: days)
34+
#expect(style == .short)
35+
}
36+
37+
@Test(".monthDay: .full в остальных случаях", arguments: monthDayFullCombos)
38+
func unitsStyle_monthDay_full_otherwise(years: Int, months: Int, days: Int) {
39+
let style = DisplayOption.monthDay.unitsStyle(years: years, months: months, days: days)
40+
#expect(style == .full)
41+
}
42+
43+
@Test(".yearMonthDay: .abbreviated когда все три значения", arguments: ymdAbbreviatedCombos)
44+
func unitsStyle_yearMonthDay_abbreviated_whenAll(years: Int, months: Int, days: Int) {
45+
let style = DisplayOption.yearMonthDay.unitsStyle(years: years, months: months, days: days)
2646
#expect(style == .abbreviated)
2747
}
2848

29-
@Test(arguments: shortTestCases)
30-
func makeUnitsStyleShort(years: Int, months: Int, days: Int) throws {
31-
let style = DisplayOption.makeUnitsStyle(years: years, months: months, days: days)
49+
@Test(".yearMonthDay: .short когда два значения", arguments: ymdShortCombos)
50+
func unitsStyle_yearMonthDay_short_whenTwo(years: Int, months: Int, days: Int) {
51+
let style = DisplayOption.yearMonthDay.unitsStyle(years: years, months: months, days: days)
3252
#expect(style == .short)
3353
}
3454

35-
@Test(arguments: fullTestCases)
36-
func makeUnitsStyleFull(years: Int, months: Int, days: Int) throws {
37-
let style = DisplayOption.makeUnitsStyle(years: years, months: months, days: days)
55+
@Test(".yearMonthDay: .full когда ноль или одно значение", arguments: ymdFullCombos)
56+
func unitsStyle_yearMonthDay_full_whenZeroOrOne(years: Int, months: Int, days: Int) {
57+
let style = DisplayOption.yearMonthDay.unitsStyle(years: years, months: months, days: days)
3858
#expect(style == .full)
3959
}
4060

4161
// MARK: - Параметры для тестов
4262

43-
/// Все три компонента ненулевые
44-
static let abbreviatedTestCases: [(years: Int, months: Int, days: Int)] = [
45-
(1, 1, 1), // положительные значения
46-
(-1, 1, 1), // отрицательный год
47-
(1, -1, 1), // отрицательный месяц
48-
(1, 1, -1), // отрицательный день
49-
(-1, -1, -1), // все отрицательные
63+
/// Набор общих комбо для проверки .day (всегда .full)
64+
static let allCombos: [(years: Int, months: Int, days: Int)] = [
65+
(0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1), (1, 1, 1),
66+
(-1, 0, 0), (0, -1, 0), (0, 0, -1), (-1, -1, 0), (-1, 0, -1), (0, -1, -1), (-1, -1, -1),
67+
]
68+
69+
/// Для .monthDay -> .short, когда одновременно есть месяцы и дни (годы не важны)
70+
static let monthDayShortCombos: [(years: Int, months: Int, days: Int)] = [
71+
(0, 1, 1), (1, 1, 1), (-1, 1, 1), (1, -1, 1), (1, 1, -1),
72+
]
73+
74+
/// Для .monthDay -> .full в остальных случаях (нет одновременных месяцев и дней)
75+
static let monthDayFullCombos: [(years: Int, months: Int, days: Int)] = [
76+
(0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 0, 1), (-1, 1, 0), (1, 0, 0),
77+
]
78+
79+
/// Для .yearMonthDay
80+
static let ymdAbbreviatedCombos: [(years: Int, months: Int, days: Int)] = [
81+
(1, 1, 1), (-1, 1, 1), (1, -1, 1), (1, 1, -1), (-1, -1, -1),
5082
]
5183

52-
/// Два компонента ненулевые
53-
static let shortTestCases: [(years: Int, months: Int, days: Int)] = [
54-
(1, 1, 0), // годы и месяцы
55-
(1, 0, 1), // годы и дни
56-
(0, 1, 1), // месяцы и дни
57-
(-1, 1, 0), // отрицательный год и месяц
58-
(1, -1, 0), // год и отрицательный месяц
59-
(1, 0, -1), // год и отрицательный день
60-
(0, -1, 1), // отрицательный месяц и день
84+
static let ymdShortCombos: [(years: Int, months: Int, days: Int)] = [
85+
(1, 1, 0), (1, 0, 1), (0, 1, 1), (-1, 1, 0), (1, -1, 0), (1, 0, -1), (0, -1, 1),
6186
]
6287

63-
/// Один или ноль компонентов ненулевые
64-
static let fullTestCases: [(years: Int, months: Int, days: Int)] = [
65-
(1, 0, 0), // только годы
66-
(0, 1, 0), // только месяцы
67-
(0, 0, 1), // только дни
68-
(0, 0, 0), // все нули
69-
(-1, 0, 0), // только отрицательный год
70-
(0, -1, 0), // только отрицательный месяц
71-
(0, 0, -1), // только отрицательный день
88+
static let ymdFullCombos: [(years: Int, months: Int, days: Int)] = [
89+
(1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, 0), (-1, 0, 0), (0, -1, 0), (0, 0, -1),
7290
]
7391
}

0 commit comments

Comments
 (0)