From 126cfa52a8490e7da89a40c81ac1d3a1ada18852 Mon Sep 17 00:00:00 2001 From: Carlos Enumo Date: Fri, 30 Sep 2022 04:43:53 +0100 Subject: [PATCH] Fix calendar picker out of sync + refactor UserDefaults --- Calendr.xcodeproj/project.pbxproj | 8 +- .../Settings/CalendarPickerViewModel.swift | 43 +++-- Calendr/Settings/Prefs+UserDefaults.swift | 92 +++++++++ Calendr/Settings/Prefs.swift | 24 --- Calendr/Settings/SettingsViewModel.swift | 72 +++---- .../CalendarPickerViewModelTests.swift | 38 ++-- CalendrTests/SettingsViewModelTests.swift | 178 +++++++++--------- 7 files changed, 255 insertions(+), 200 deletions(-) create mode 100644 Calendr/Settings/Prefs+UserDefaults.swift delete mode 100644 Calendr/Settings/Prefs.swift diff --git a/Calendr.xcodeproj/project.pbxproj b/Calendr.xcodeproj/project.pbxproj index 4c34169b..f7ce3bc6 100644 --- a/Calendr.xcodeproj/project.pbxproj +++ b/Calendr.xcodeproj/project.pbxproj @@ -74,7 +74,6 @@ 347E6D3E25AA2811009A6716 /* CalendarViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347E6D3D25AA2811009A6716 /* CalendarViewModelTests.swift */; }; 3487A43825E706F800FCC7D7 /* NextEventViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3487A43725E706F800FCC7D7 /* NextEventViewModel.swift */; }; 3487A43C25E70F5B00FCC7D7 /* NextEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3487A43B25E70F5B00FCC7D7 /* NextEventView.swift */; }; - 348B8CFC25B290C200E518FE /* Prefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348B8CFB25B290C200E518FE /* Prefs.swift */; }; 348B8D0425B2925100E518FE /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348B8D0325B2925100E518FE /* SettingsViewModel.swift */; }; 348E701F25C43C5200B3B160 /* WeekDay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348E701E25C43C5200B3B160 /* WeekDay.swift */; }; 348E702D25C6161900B3B160 /* EventViewModelFadeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348E702C25C6161900B3B160 /* EventViewModelFadeTests.swift */; }; @@ -89,6 +88,7 @@ 3492C460269FCF5B009CFAD2 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492C45F269FCF5B009CFAD2 /* Accessibility.swift */; }; 3492C464269FD64D009CFAD2 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492C45F269FCF5B009CFAD2 /* Accessibility.swift */; }; 3492C466269FD6CE009CFAD2 /* MainViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492C465269FD6CE009CFAD2 /* MainViewTests.swift */; }; + 34934CD628E69520009635D4 /* Prefs+UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34934CD528E69520009635D4 /* Prefs+UserDefaults.swift */; }; 349355A625BCA8D400957945 /* EventListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349355A525BCA8D400957945 /* EventListView.swift */; }; 349355AA25BCA8DF00957945 /* EventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349355A925BCA8DF00957945 /* EventView.swift */; }; 349355B225BCB07B00957945 /* EventViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349355B125BCB07B00957945 /* EventViewModel.swift */; }; @@ -225,7 +225,6 @@ 347E6D3D25AA2811009A6716 /* CalendarViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarViewModelTests.swift; sourceTree = ""; }; 3487A43725E706F800FCC7D7 /* NextEventViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextEventViewModel.swift; sourceTree = ""; }; 3487A43B25E70F5B00FCC7D7 /* NextEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextEventView.swift; sourceTree = ""; }; - 348B8CFB25B290C200E518FE /* Prefs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Prefs.swift; sourceTree = ""; }; 348B8D0325B2925100E518FE /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = ""; }; 348E701E25C43C5200B3B160 /* WeekDay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekDay.swift; sourceTree = ""; }; 348E702C25C6161900B3B160 /* EventViewModelFadeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventViewModelFadeTests.swift; sourceTree = ""; }; @@ -239,6 +238,7 @@ 3492C45D269F7966009CFAD2 /* UITestCase+Queries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITestCase+Queries.swift"; sourceTree = ""; }; 3492C45F269FCF5B009CFAD2 /* Accessibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Accessibility.swift; sourceTree = ""; }; 3492C465269FD6CE009CFAD2 /* MainViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewTests.swift; sourceTree = ""; }; + 34934CD528E69520009635D4 /* Prefs+UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Prefs+UserDefaults.swift"; sourceTree = ""; }; 349355A525BCA8D400957945 /* EventListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventListView.swift; sourceTree = ""; }; 349355A925BCA8DF00957945 /* EventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventView.swift; sourceTree = ""; }; 349355B125BCB07B00957945 /* EventViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventViewModel.swift; sourceTree = ""; }; @@ -615,7 +615,7 @@ 3449403125C348C70020E664 /* CalendarPickerViewController.swift */, 34B5A09C25B118EC00F7F7ED /* CalendarPickerViewModel.swift */, 3449402D25C348B20020E664 /* GeneralSettingsViewController.swift */, - 348B8CFB25B290C200E518FE /* Prefs.swift */, + 34934CD528E69520009635D4 /* Prefs+UserDefaults.swift */, 34B5A09225B0CE6F00F7F7ED /* SettingsViewController.swift */, 348B8D0325B2925100E518FE /* SettingsViewModel.swift */, ); @@ -831,10 +831,10 @@ 3468E653284BD44600B21EC8 /* EventBarStyle.swift in Sources */, 34F128E12597B9C9007DF31C /* MainViewController.swift in Sources */, 3477F3E425FD5285008EA888 /* NSView+Rx.swift in Sources */, - 348B8CFC25B290C200E518FE /* Prefs.swift in Sources */, 34D55FE325F06669007F5C81 /* Sequence.swift in Sources */, 347D0FED2595467A002451EC /* CalendarCellView.swift in Sources */, 3421DA212693F12400056837 /* Calendar+Factory.swift in Sources */, + 34934CD628E69520009635D4 /* Prefs+UserDefaults.swift in Sources */, 34FD09D925AE269600AAAAE2 /* DateProvider.swift in Sources */, 34AC60C626925FA5005312B6 /* PreviewExtensions.swift in Sources */, 3477F3CE25FAE56A008EA888 /* EventDetailsViewModel.swift in Sources */, diff --git a/Calendr/Settings/CalendarPickerViewModel.swift b/Calendr/Settings/CalendarPickerViewModel.swift index aedaa9ef..2f4fb555 100644 --- a/Calendr/Settings/CalendarPickerViewModel.swift +++ b/Calendr/Settings/CalendarPickerViewModel.swift @@ -21,6 +21,10 @@ class CalendarPickerViewModel { var isPopover: Bool { popoverSettings != nil } + private let userDefaults: UserDefaults + private let toggleCalendarSubject = PublishRelay() + private let disposeBag = DisposeBag() + init( calendarService: CalendarServiceProviding, userDefaults: UserDefaults, @@ -31,33 +35,34 @@ class CalendarPickerViewModel { .flatMapLatest(calendarService.calendars) .share(replay: 1) - let toggleCalendarSubject = PublishRelay() - self.toggleCalendar = toggleCalendarSubject.asObserver() - self.enabledCalendars = calendars.map { calendars in - { - userDefaults - .stringArray(forKey: Prefs.enabledCalendars)? - .filter($0.contains) ?? $0 - - }(calendars.map(\.identifier)) + self.enabledCalendars = Observable.combineLatest( + calendars, userDefaults.rx.observe(\.enabledCalendars) + ) + .map { calendars, enabled in + let identifiers = calendars.map(\.identifier) + guard let enabled = enabled else { return identifiers } + return enabled.filter(identifiers.contains) } - .flatMapLatest { initial in + .share(replay: 1) + + self.userDefaults = userDefaults + self.popoverSettings = popoverSettings - toggleCalendarSubject.scan(initial) { identifiers, toggled in + setUpBindings() + } + + private func setUpBindings() { + toggleCalendarSubject + .withLatestFrom(enabledCalendars) { ($0, $1) } + .map { toggled, identifiers in identifiers.contains(toggled) ? identifiers.filter { $0 != toggled } : identifiers + [toggled] } - .startWith(initial) - } - .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.enabledCalendars) - }) - .share(replay: 1) - - self.popoverSettings = popoverSettings + .bind(to: userDefaults.rx.enabledCalendars) + .disposed(by: disposeBag) } } diff --git a/Calendr/Settings/Prefs+UserDefaults.swift b/Calendr/Settings/Prefs+UserDefaults.swift new file mode 100644 index 00000000..0eb117cf --- /dev/null +++ b/Calendr/Settings/Prefs+UserDefaults.swift @@ -0,0 +1,92 @@ +// +// Prefs+UserDefaults.swift +// Calendr +// +// Created by Paker on 30/09/22. +// + +import Foundation + +enum Prefs { + static let enabledCalendars = "enabled_calendars" + static let statusItemIconEnabled = "status_item_icon_enabled" + static let statusItemDateEnabled = "status_item_date_enabled" + static let statusItemDateStyle = "status_item_date_style" + static let showEventStatusItem = "show_event_status_item" + static let eventStatusItemLength = "event_status_item_length" + static let eventStatusItemDetectNotch = "event_status_item_detect_notch" + static let showWeekNumbers = "show_week_numbers" + static let preserveSelectedDate = "preserve_selected_date" + static let showDeclinedEvents = "show_declined_events" + static let showPastEvents = "show_past_events" + static let transparencyLevel = "transparency_level" + static let calendarScaling = "calendar_scaling" +} + +extension UserDefaults { + + @objc dynamic var enabledCalendars: [String]? { + get { stringArray(forKey: Prefs.enabledCalendars) } + set { set(newValue, forKey: Prefs.enabledCalendars) } + } + + @objc dynamic var statusItemIconEnabled: Bool { + get { bool(forKey: Prefs.statusItemIconEnabled) } + set { set(newValue, forKey: Prefs.statusItemIconEnabled) } + } + + @objc dynamic var statusItemDateEnabled: Bool { + get { bool(forKey: Prefs.statusItemDateEnabled) } + set { set(newValue, forKey: Prefs.statusItemDateEnabled) } + } + + @objc dynamic var statusItemDateStyle: UInt { + get { UInt(integer(forKey: Prefs.statusItemDateStyle)) } + set { set(newValue, forKey: Prefs.statusItemDateStyle) } + } + + @objc dynamic var showEventStatusItem: Bool { + get { bool(forKey: Prefs.showEventStatusItem) } + set { set(newValue, forKey: Prefs.showEventStatusItem) } + } + + @objc dynamic var eventStatusItemLength: Int { + get { integer(forKey: Prefs.eventStatusItemLength) } + set { set(newValue, forKey: Prefs.eventStatusItemLength) } + } + + @objc dynamic var eventStatusItemDetectNotch: Bool { + get { bool(forKey: Prefs.eventStatusItemDetectNotch) } + set { set(newValue, forKey: Prefs.eventStatusItemDetectNotch) } + } + + @objc dynamic var showWeekNumbers: Bool { + get { bool(forKey: Prefs.showWeekNumbers) } + set { set(newValue, forKey: Prefs.showWeekNumbers) } + } + + @objc dynamic var preserveSelectedDate: Bool { + get { bool(forKey: Prefs.preserveSelectedDate) } + set { set(newValue, forKey: Prefs.preserveSelectedDate) } + } + + @objc dynamic var showDeclinedEvents: Bool { + get { bool(forKey: Prefs.showDeclinedEvents) } + set { set(newValue, forKey: Prefs.showDeclinedEvents) } + } + + @objc dynamic var showPastEvents: Bool { + get { bool(forKey: Prefs.showPastEvents) } + set { set(newValue, forKey: Prefs.showPastEvents) } + } + + @objc dynamic var transparencyLevel: Int { + get { integer(forKey: Prefs.transparencyLevel) } + set { set(newValue, forKey: Prefs.transparencyLevel) } + } + + @objc dynamic var calendarScaling: Double { + get { double(forKey: Prefs.calendarScaling) } + set { set(newValue, forKey: Prefs.calendarScaling) } + } +} diff --git a/Calendr/Settings/Prefs.swift b/Calendr/Settings/Prefs.swift deleted file mode 100644 index 2fe23fea..00000000 --- a/Calendr/Settings/Prefs.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// Prefs.swift -// Calendr -// -// Created by Paker on 16/01/21. -// - -import Foundation - -enum Prefs { - static let enabledCalendars = "enabled_calendars" - static let statusItemIconEnabled = "status_item_icon_enabled" - static let statusItemDateEnabled = "status_item_date_enabled" - static let statusItemDateStyle = "status_item_date_style" - static let showEventStatusItem = "show_event_status_item" - static let eventStatusItemLength = "event_status_item_length" - static let eventStatusItemDetectNotch = "event_status_item_detect_notch" - static let showWeekNumbers = "show_week_numbers" - static let preserveSelectedDate = "preserve_selected_date" - static let showDeclinedEvents = "show_declined_events" - static let showPastEvents = "show_past_events" - static let transparencyLevel = "transparency_level" - static let calendarScaling = "calendar_scaling" -} diff --git a/Calendr/Settings/SettingsViewModel.swift b/Calendr/Settings/SettingsViewModel.swift index ec8f5907..48be69a7 100644 --- a/Calendr/Settings/SettingsViewModel.swift +++ b/Calendr/Settings/SettingsViewModel.swift @@ -93,42 +93,18 @@ class SettingsViewModel: StatusItemSettings, NextEventSettings, CalendarSettings Prefs.calendarScaling: 1 ]) - let statusItemIconBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.statusItemIconEnabled) - ) - let statusItemDateBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.statusItemDateEnabled) - ) - let statusItemDateStyleBehavior = BehaviorSubject( - value: DateStyle(rawValue: UInt(userDefaults.integer(forKey: Prefs.statusItemDateStyle))) ?? .none - ) - let showEventStatusItemBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.showEventStatusItem) - ) - let eventStatusItemLengthBehavior = BehaviorSubject( - value: userDefaults.integer(forKey: Prefs.eventStatusItemLength) - ) - let eventStatusItemDetectNotchBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.eventStatusItemDetectNotch) - ) - let showWeekNumbersBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.showWeekNumbers) - ) - let showDeclinedEventsBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.showDeclinedEvents) - ) - let preserveSelectedDateBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.preserveSelectedDate) - ) - let showPastEventsBehavior = BehaviorSubject( - value: userDefaults.bool(forKey: Prefs.showPastEvents) - ) - let transparencyBehavior = BehaviorSubject( - value: userDefaults.integer(forKey: Prefs.transparencyLevel) - ) - let calendarScalingBehavior = BehaviorSubject( - value: userDefaults.double(forKey: Prefs.calendarScaling) - ) + let statusItemIconBehavior = BehaviorSubject(value: userDefaults.statusItemIconEnabled) + let statusItemDateBehavior = BehaviorSubject(value: userDefaults.statusItemDateEnabled) + let statusItemDateStyleBehavior = BehaviorSubject(value: DateStyle(rawValue: userDefaults.statusItemDateStyle) ?? .none) + let showEventStatusItemBehavior = BehaviorSubject(value: userDefaults.showEventStatusItem) + let eventStatusItemLengthBehavior = BehaviorSubject(value: userDefaults.eventStatusItemLength) + let eventStatusItemDetectNotchBehavior = BehaviorSubject(value: userDefaults.eventStatusItemDetectNotch) + let showWeekNumbersBehavior = BehaviorSubject(value: userDefaults.showWeekNumbers) + let showDeclinedEventsBehavior = BehaviorSubject(value: userDefaults.showDeclinedEvents) + let preserveSelectedDateBehavior = BehaviorSubject(value: userDefaults.preserveSelectedDate) + let showPastEventsBehavior = BehaviorSubject(value: userDefaults.showPastEvents) + let transparencyBehavior = BehaviorSubject(value: userDefaults.transparencyLevel) + let calendarScalingBehavior = BehaviorSubject(value: userDefaults.calendarScaling) toggleStatusItemIcon = statusItemIconBehavior.asObserver() toggleStatusItemDate = statusItemDateBehavior.asObserver() @@ -152,73 +128,73 @@ class SettingsViewModel: StatusItemSettings, NextEventSettings, CalendarSettings showStatusItemIcon = statusItemIconAndDate.map(\.0) .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.statusItemIconEnabled) + userDefaults.statusItemIconEnabled = $0 }) .share(replay: 1) showStatusItemDate = statusItemIconAndDate.map(\.1) .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.statusItemDateEnabled) + userDefaults.statusItemDateEnabled = $0 }) .share(replay: 1) statusItemDateStyle = statusItemDateStyleBehavior .do(onNext: { - userDefaults.setValue($0.rawValue, forKey: Prefs.statusItemDateStyle) + userDefaults.statusItemDateStyle = $0.rawValue }) .share(replay: 1) showEventStatusItem = showEventStatusItemBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.showEventStatusItem) + userDefaults.showEventStatusItem = $0 }) .share(replay: 1) eventStatusItemLength = eventStatusItemLengthBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.eventStatusItemLength) + userDefaults.eventStatusItemLength = $0 }) .share(replay: 1) eventStatusItemDetectNotch = eventStatusItemDetectNotchBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.eventStatusItemDetectNotch) + userDefaults.eventStatusItemDetectNotch = $0 }) .share(replay: 1) showWeekNumbers = showWeekNumbersBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.showWeekNumbers) + userDefaults.showWeekNumbers = $0 }) .share(replay: 1) showDeclinedEvents = showDeclinedEventsBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.showDeclinedEvents) + userDefaults.showDeclinedEvents = $0 }) .share(replay: 1) preserveSelectedDate = preserveSelectedDateBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.preserveSelectedDate) + userDefaults.preserveSelectedDate = $0 }) .share(replay: 1) showPastEvents = showPastEventsBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.showPastEvents) + userDefaults.showPastEvents = $0 }) .share(replay: 1) popoverTransparency = transparencyBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.transparencyLevel) + userDefaults.transparencyLevel = $0 }) .share(replay: 1) calendarScaling = calendarScalingBehavior .do(onNext: { - userDefaults.setValue($0, forKey: Prefs.calendarScaling) + userDefaults.calendarScaling = $0 }) .share(replay: 1) diff --git a/CalendrTests/CalendarPickerViewModelTests.swift b/CalendrTests/CalendarPickerViewModelTests.swift index a64293d7..54295924 100644 --- a/CalendrTests/CalendarPickerViewModelTests.swift +++ b/CalendrTests/CalendarPickerViewModelTests.swift @@ -22,10 +22,6 @@ class CalendarPickerViewModelTests: XCTestCase { popoverSettings: nil ) - var enabledCalendars: [String]? { - userDefaults.stringArray(forKey: Prefs.enabledCalendars) - } - override func setUp() { userDefaults.setVolatileDomain([:], forName: UserDefaults.registrationDomain) userDefaults.removePersistentDomain(forName: className) @@ -58,11 +54,10 @@ class CalendarPickerViewModelTests: XCTestCase { .bind { enabled = $0 } .disposed(by: disposeBag) - XCTAssertNil(enabledCalendars) + XCTAssertNil(userDefaults.enabledCalendars) calendarService.changeObserver.onNext(()) - XCTAssertEqual(enabledCalendars, enabled) XCTAssertEqual(enabled, ["1", "2", "3"]) } @@ -74,10 +69,10 @@ class CalendarPickerViewModelTests: XCTestCase { .bind { enabled = $0 } .disposed(by: disposeBag) - userDefaults.setValue(["1", "2"], forKey: Prefs.enabledCalendars) - calendarService.changeObserver.onNext(()) + userDefaults.enabledCalendars = ["1", "2"] + XCTAssertEqual(enabled, ["1", "2"]) } @@ -93,16 +88,35 @@ class CalendarPickerViewModelTests: XCTestCase { viewModel.toggleCalendar.onNext("2") - XCTAssertEqual(enabledCalendars, enabled) + XCTAssertEqual(userDefaults.enabledCalendars, enabled) XCTAssertEqual(enabled, ["1", "3"]) viewModel.toggleCalendar.onNext("2") - XCTAssertEqual(enabledCalendars, enabled) + XCTAssertEqual(userDefaults.enabledCalendars, enabled) XCTAssertEqual(enabled, ["1", "3", "2"]) } - func testNewCalendar_shouldBeDisabled() { + func testNewCalendar_shouldBeEnabled() { + + var enabled: [String]? + + viewModel.enabledCalendars + .bind { enabled = $0 } + .disposed(by: disposeBag) + + calendarService.changeObserver.onNext(()) + + XCTAssertEqual(enabled, ["1", "2", "3"]) + + calendarService.m_calendars.append(.init(identifier: "4", account: "", title: "", color: .clear)) + + calendarService.changeObserver.onNext(()) + + XCTAssertEqual(enabled, ["1", "2", "3", "4"]) + } + + func testNewCalendar_afterSelectingCalendars_shouldBeDisabled() { var enabled: [String]? @@ -114,6 +128,8 @@ class CalendarPickerViewModelTests: XCTestCase { XCTAssertEqual(enabled, ["1", "2", "3"]) + userDefaults.enabledCalendars = ["1", "2", "3"] + calendarService.m_calendars.append(.init(identifier: "4", account: "", title: "", color: .clear)) calendarService.changeObserver.onNext(()) diff --git a/CalendrTests/SettingsViewModelTests.swift b/CalendrTests/SettingsViewModelTests.swift index 84c29a86..ae81e884 100644 --- a/CalendrTests/SettingsViewModelTests.swift +++ b/CalendrTests/SettingsViewModelTests.swift @@ -25,60 +25,18 @@ class SettingsViewModelTests: XCTestCase { notificationCenter: notificationCenter ) - var userDefaultsIconEnabled: Bool? { - get { userDefaults.object(forKey: Prefs.statusItemIconEnabled) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.statusItemIconEnabled) } - } - - var userDefaultsDateEnabled: Bool? { - get { userDefaults.object(forKey: Prefs.statusItemDateEnabled) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.statusItemDateEnabled) } - } - - var userDefaultsDateStyle: Int? { - get { userDefaults.object(forKey: Prefs.statusItemDateStyle) as! Int? } - set { userDefaults.setValue(newValue, forKey: Prefs.statusItemDateStyle) } - } - - var userDefaultsShowEventStatusItem: Bool? { - get { userDefaults.object(forKey: Prefs.showEventStatusItem) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.showEventStatusItem) } - } - - var userDefaultsEventStatusItemLength: Int? { - get { userDefaults.object(forKey: Prefs.eventStatusItemLength) as! Int? } - set { userDefaults.setValue(newValue, forKey: Prefs.eventStatusItemLength) } - } - - var userDefaultsShowWeekNumbers: Bool? { - get { userDefaults.object(forKey: Prefs.showWeekNumbers) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.showWeekNumbers) } - } - - var userDefaultsShowDeclinedEvents: Bool? { - get { userDefaults.object(forKey: Prefs.showDeclinedEvents) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.showDeclinedEvents) } - } - - var userDefaultsPreserveSelectedDate: Bool? { - get { userDefaults.object(forKey: Prefs.preserveSelectedDate) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.preserveSelectedDate) } - } - - var userDefaultsCalendarScaling: Double? { - get { userDefaults.object(forKey: Prefs.calendarScaling) as! Double? } - set { userDefaults.setValue(newValue, forKey: Prefs.calendarScaling) } - } - - var userDefaultsShowPastEvents: Bool? { - get { userDefaults.object(forKey: Prefs.showPastEvents) as! Bool? } - set { userDefaults.setValue(newValue, forKey: Prefs.showPastEvents) } - } - - var userDefaultsTransparency: Int? { - get { userDefaults.object(forKey: Prefs.transparencyLevel) as! Int? } - set { userDefaults.setValue(newValue, forKey: Prefs.transparencyLevel) } - } + var userDefaultsStatusItemIconEnabled: Bool? { userDefaults.object(forKey: Prefs.statusItemIconEnabled) as! Bool? } + var userDefaultsStatusItemDateEnabled: Bool? { userDefaults.object(forKey: Prefs.statusItemDateEnabled) as! Bool? } + var userDefaultsStatusItemDateStyle: Int? { userDefaults.object(forKey: Prefs.statusItemDateStyle) as! Int? } + var userDefaultsShowEventStatusItem: Bool? { userDefaults.object(forKey: Prefs.showEventStatusItem) as! Bool? } + var userDefaultsEventStatusItemLength: Int? { userDefaults.object(forKey: Prefs.eventStatusItemLength) as! Int? } + var userDefaultsEventStatusItemDetectNotch: Bool? { userDefaults.object(forKey: Prefs.eventStatusItemDetectNotch) as! Bool? } + var userDefaultsShowWeekNumbers: Bool? { userDefaults.object(forKey: Prefs.showWeekNumbers) as! Bool? } + var userDefaultsShowDeclinedEvents: Bool? { userDefaults.object(forKey: Prefs.showDeclinedEvents) as! Bool? } + var userDefaultsPreserveSelectedDate: Bool? { userDefaults.object(forKey: Prefs.preserveSelectedDate) as! Bool? } + var userDefaultsCalendarScaling: Double? { userDefaults.object(forKey: Prefs.calendarScaling) as! Double? } + var userDefaultsShowPastEvents: Bool? { userDefaults.object(forKey: Prefs.showPastEvents) as! Bool? } + var userDefaultsTransparency: Int? { userDefaults.object(forKey: Prefs.transparencyLevel) as! Int? } override func setUp() { userDefaults.setVolatileDomain([:], forName: UserDefaults.registrationDomain) @@ -87,11 +45,12 @@ class SettingsViewModelTests: XCTestCase { func testDefaultSettings() { - XCTAssertNil(userDefaultsIconEnabled) - XCTAssertNil(userDefaultsDateEnabled) - XCTAssertNil(userDefaultsDateStyle) + XCTAssertNil(userDefaultsStatusItemIconEnabled) + XCTAssertNil(userDefaultsStatusItemDateEnabled) + XCTAssertNil(userDefaultsStatusItemDateStyle) XCTAssertNil(userDefaultsShowEventStatusItem) XCTAssertNil(userDefaultsEventStatusItemLength) + XCTAssertNil(userDefaultsEventStatusItemDetectNotch) XCTAssertNil(userDefaultsShowWeekNumbers) XCTAssertNil(userDefaultsShowDeclinedEvents) XCTAssertNil(userDefaultsPreserveSelectedDate) @@ -104,6 +63,7 @@ class SettingsViewModelTests: XCTestCase { var statusItemDateStyle: DateStyle? var showEventStatusItem: Bool? var eventStatusItemLength: Int? + var eventStatusItemDetectNotch: Bool? var showWeekNumbers: Bool? var showDeclinedEvents: Bool? var preserveSelectedDate: Bool? @@ -128,6 +88,10 @@ class SettingsViewModelTests: XCTestCase { .bind { showEventStatusItem = $0 } .disposed(by: disposeBag) + viewModel.eventStatusItemDetectNotch + .bind { eventStatusItemDetectNotch = $0 } + .disposed(by: disposeBag) + viewModel.eventStatusItemLength .bind { eventStatusItemLength = $0 } .disposed(by: disposeBag) @@ -165,6 +129,7 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(statusItemDateStyle, .short) XCTAssertEqual(showEventStatusItem, false) XCTAssertEqual(eventStatusItemLength, 18) + XCTAssertEqual(eventStatusItemDetectNotch, false) XCTAssertEqual(showWeekNumbers, false) XCTAssertEqual(showDeclinedEvents, false) XCTAssertEqual(preserveSelectedDate, false) @@ -173,11 +138,12 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(popoverTransparency, 2) XCTAssertEqual(popoverMaterial, .headerView) - XCTAssertEqual(userDefaultsIconEnabled, true) - XCTAssertEqual(userDefaultsDateEnabled, true) - XCTAssertEqual(userDefaultsDateStyle, 1) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateStyle, 1) XCTAssertEqual(userDefaultsShowEventStatusItem, false) XCTAssertEqual(userDefaultsEventStatusItemLength, 18) + XCTAssertEqual(userDefaultsEventStatusItemDetectNotch, false) XCTAssertEqual(userDefaultsShowWeekNumbers, false) XCTAssertEqual(userDefaultsShowDeclinedEvents, false) XCTAssertEqual(userDefaultsPreserveSelectedDate, false) @@ -225,7 +191,7 @@ class SettingsViewModelTests: XCTestCase { func testDateStyleSelected() { - userDefaultsDateStyle = 2 + userDefaults.statusItemDateStyle = 2 var statusItemDateStyle: DateStyle? @@ -237,12 +203,12 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(statusItemDateStyle, .medium) - XCTAssertEqual(userDefaultsDateStyle, 2) + XCTAssertEqual(userDefaultsStatusItemDateStyle, 2) } func testToggleShowEventStatusItem() { - userDefaultsShowEventStatusItem = true + userDefaults.showEventStatusItem = true var showEventStatusItem: Bool? @@ -266,7 +232,7 @@ class SettingsViewModelTests: XCTestCase { func testChangeEventStatusItemLength() { - userDefaultsEventStatusItemLength = 20 + userDefaults.eventStatusItemLength = 20 var eventStatusItemLength: Int? @@ -283,9 +249,33 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(userDefaultsEventStatusItemLength, 30) } + func testToggleEventStatusItemDetectNotch() { + + userDefaults.eventStatusItemDetectNotch = true + + var eventStatusItemDetectNotch: Bool? + + viewModel.eventStatusItemDetectNotch + .bind { eventStatusItemDetectNotch = $0 } + .disposed(by: disposeBag) + + XCTAssertEqual(eventStatusItemDetectNotch, true) + XCTAssertEqual(userDefaultsEventStatusItemDetectNotch, true) + + viewModel.toggleEventStatusItemDetectNotch.onNext(false) + + XCTAssertEqual(eventStatusItemDetectNotch, false) + XCTAssertEqual(userDefaultsEventStatusItemDetectNotch, false) + + viewModel.toggleEventStatusItemDetectNotch.onNext(true) + + XCTAssertEqual(eventStatusItemDetectNotch, true) + XCTAssertEqual(userDefaultsEventStatusItemDetectNotch, true) + } + func testToggleShowWeekNumbers() { - userDefaultsShowWeekNumbers = true + userDefaults.showWeekNumbers = true var showWeekNumbers: Bool? @@ -309,7 +299,7 @@ class SettingsViewModelTests: XCTestCase { func testToggleShowDeclinedEvents() { - userDefaultsShowDeclinedEvents = true + userDefaults.showDeclinedEvents = true var showDeclinedEvents: Bool? @@ -333,7 +323,7 @@ class SettingsViewModelTests: XCTestCase { func testTogglePreserveSelectedDate() { - userDefaultsPreserveSelectedDate = true + userDefaults.preserveSelectedDate = true var preserveSelectedDate: Bool? @@ -357,7 +347,7 @@ class SettingsViewModelTests: XCTestCase { func testChangeCalendarScaling() { - userDefaultsCalendarScaling = 1.2 + userDefaults.calendarScaling = 1.2 var calendarScaling: Double? @@ -376,7 +366,7 @@ class SettingsViewModelTests: XCTestCase { func testToggleShowPastEvents() { - userDefaultsShowPastEvents = false + userDefaults.showPastEvents = false var showPastEvents: Bool? @@ -400,7 +390,7 @@ class SettingsViewModelTests: XCTestCase { func testChangeTransparency() { - userDefaultsTransparency = 5 + userDefaults.transparencyLevel = 5 var popoverTransparency: Int? var popoverMaterial: PopoverMaterial? @@ -439,8 +429,8 @@ class SettingsViewModelTests: XCTestCase { /// [] icon [✓] date = [✓] icon [✓] date func testToggleIconOn_withDateOn_shouldToggleIconOn() { - userDefaultsIconEnabled = false - userDefaultsDateEnabled = true + userDefaults.statusItemIconEnabled = false + userDefaults.statusItemDateEnabled = true var showStatusItemIcon: Bool? var showStatusItemDate: Bool? @@ -458,15 +448,15 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(showStatusItemIcon, true) XCTAssertEqual(showStatusItemDate, true) - XCTAssertEqual(userDefaultsIconEnabled, true) - XCTAssertEqual(userDefaultsDateEnabled, true) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, true) } /// [✓] icon [✓] date = [] icon [✓] date func testToggleIconOff_withDateOn_shouldToggleIconOff() { - userDefaultsIconEnabled = true - userDefaultsDateEnabled = true + userDefaults.statusItemIconEnabled = true + userDefaults.statusItemDateEnabled = true var showStatusItemIcon: Bool? var showStatusItemDate: Bool? @@ -484,15 +474,15 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(showStatusItemIcon, false) XCTAssertEqual(showStatusItemDate, true) - XCTAssertEqual(userDefaultsIconEnabled, false) - XCTAssertEqual(userDefaultsDateEnabled, true) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, false) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, true) } /// [✓] icon [] date = [✓] icon [] date func testToggleIconOff_withDateOff_shouldDoNothing() { - userDefaultsIconEnabled = true - userDefaultsDateEnabled = false + userDefaults.statusItemIconEnabled = true + userDefaults.statusItemDateEnabled = false var showStatusItemIcon: Bool? var showStatusItemDate: Bool? @@ -510,15 +500,15 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(showStatusItemIcon, true) XCTAssertEqual(showStatusItemDate, false) - XCTAssertEqual(userDefaultsIconEnabled, true) - XCTAssertEqual(userDefaultsDateEnabled, false) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, false) } /// [✓] icon [] date = [✓] icon [✓] date func testToggleDateOn_withIconOn_shouldToggleDateOn() { - userDefaultsIconEnabled = true - userDefaultsDateEnabled = false + userDefaults.statusItemIconEnabled = true + userDefaults.statusItemDateEnabled = false var showStatusItemIcon: Bool? var showStatusItemDate: Bool? @@ -536,15 +526,15 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(showStatusItemIcon, true) XCTAssertEqual(showStatusItemDate, true) - XCTAssertEqual(userDefaultsIconEnabled, true) - XCTAssertEqual(userDefaultsDateEnabled, true) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, true) } /// [✓] icon [✓] date = [✓] icon [] date func testToggleDateOff_withIconOn_shouldToggleDateOff() { - userDefaultsIconEnabled = true - userDefaultsDateEnabled = true + userDefaults.statusItemIconEnabled = true + userDefaults.statusItemDateEnabled = true var showStatusItemIcon: Bool? var showStatusItemDate: Bool? @@ -562,15 +552,15 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(showStatusItemIcon, true) XCTAssertEqual(showStatusItemDate, false) - XCTAssertEqual(userDefaultsIconEnabled, true) - XCTAssertEqual(userDefaultsDateEnabled, false) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, false) } /// [] icon [✓] date = [✓] icon [] date func testToggleDateOff_withIconOff_shouldToggleIconOn() { - userDefaultsIconEnabled = false - userDefaultsDateEnabled = true + userDefaults.statusItemIconEnabled = false + userDefaults.statusItemDateEnabled = true var showStatusItemIcon: Bool? var showStatusItemDate: Bool? @@ -588,7 +578,7 @@ class SettingsViewModelTests: XCTestCase { XCTAssertEqual(showStatusItemIcon, true) XCTAssertEqual(showStatusItemDate, false) - XCTAssertEqual(userDefaultsIconEnabled, true) - XCTAssertEqual(userDefaultsDateEnabled, false) + XCTAssertEqual(userDefaultsStatusItemIconEnabled, true) + XCTAssertEqual(userDefaultsStatusItemDateEnabled, false) } }