Complete rename across all bundle IDs, App Groups, CloudKit containers, StoreKit product IDs, data store filenames, URL schemes, logger subsystems, Swift identifiers, user-facing strings (7 languages), file names, directory names, Xcode project, schemes, assets, and documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
43 lines
1.5 KiB
Swift
43 lines
1.5 KiB
Swift
//
|
|
// DayViewViewModelTests.swift
|
|
// ReflectTests
|
|
//
|
|
// Unit tests for DayViewViewModel.countEntries — verifies safe counting
|
|
// across various grouped dictionary shapes (TDD for force-unwrap fix).
|
|
//
|
|
|
|
import XCTest
|
|
import SwiftData
|
|
@testable import Reflect
|
|
|
|
@MainActor
|
|
final class DayViewViewModelTests: XCTestCase {
|
|
|
|
func testCountEntries_EmptyGrouped() {
|
|
let grouped: [Int: [Int: [MoodEntryModel]]] = [:]
|
|
XCTAssertEqual(DayViewViewModel.countEntries(in: grouped), 0)
|
|
}
|
|
|
|
func testCountEntries_SingleYearSingleMonth() {
|
|
let entry = MoodEntryModel(forDate: Date(), mood: .great, entryType: .listView)
|
|
let grouped: [Int: [Int: [MoodEntryModel]]] = [2026: [2: [entry]]]
|
|
XCTAssertEqual(DayViewViewModel.countEntries(in: grouped), 1)
|
|
}
|
|
|
|
func testCountEntries_MultipleYearsAndMonths() {
|
|
let e1 = MoodEntryModel(forDate: Date(), mood: .great, entryType: .listView)
|
|
let e2 = MoodEntryModel(forDate: Date(), mood: .good, entryType: .listView)
|
|
let e3 = MoodEntryModel(forDate: Date(), mood: .bad, entryType: .listView)
|
|
let grouped: [Int: [Int: [MoodEntryModel]]] = [
|
|
2025: [12: [e1, e2]],
|
|
2026: [1: [e3], 2: [e1, e2, e3]]
|
|
]
|
|
XCTAssertEqual(DayViewViewModel.countEntries(in: grouped), 6)
|
|
}
|
|
|
|
func testCountEntries_YearWithEmptyMonth() {
|
|
let grouped: [Int: [Int: [MoodEntryModel]]] = [2026: [1: []]]
|
|
XCTAssertEqual(DayViewViewModel.countEntries(in: grouped), 0)
|
|
}
|
|
}
|