Files
Sportstime/SportsTimeTests/Services/PhotoMetadataExtractorTests.swift
2026-02-18 13:00:15 -06:00

138 lines
4.8 KiB
Swift

//
// PhotoMetadataExtractorTests.swift
// SportsTimeTests
//
// TDD specification tests for PhotoMetadata types.
//
import Testing
import Foundation
import CoreLocation
@testable import SportsTime
// MARK: - PhotoMetadata Tests
@Suite("PhotoMetadata")
struct PhotoMetadataTests {
// MARK: - Test Data
private func makeMetadata(
captureDate: Date? = TestClock.now,
coordinates: CLLocationCoordinate2D? = CLLocationCoordinate2D(latitude: 40.0, longitude: -74.0)
) -> PhotoMetadata {
PhotoMetadata(captureDate: captureDate, coordinates: coordinates)
}
// MARK: - Specification Tests: hasValidLocation
/// - Expected Behavior: true when coordinates are provided
@Test("hasValidLocation: true when coordinates provided")
func hasValidLocation_true() {
let metadata = makeMetadata(coordinates: CLLocationCoordinate2D(latitude: 40.0, longitude: -74.0))
#expect(metadata.hasValidLocation == true)
}
/// - Expected Behavior: false when coordinates are nil
@Test("hasValidLocation: false when coordinates nil")
func hasValidLocation_false() {
let metadata = makeMetadata(coordinates: nil)
#expect(metadata.hasValidLocation == false)
}
// MARK: - Specification Tests: hasValidDate
/// - Expected Behavior: true when captureDate is provided
@Test("hasValidDate: true when captureDate provided")
func hasValidDate_true() {
let metadata = makeMetadata(captureDate: TestClock.now)
#expect(metadata.hasValidDate == true)
}
/// - Expected Behavior: false when captureDate is nil
@Test("hasValidDate: false when captureDate nil")
func hasValidDate_false() {
let metadata = makeMetadata(captureDate: nil)
#expect(metadata.hasValidDate == false)
}
// MARK: - Specification Tests: empty
/// - Expected Behavior: empty returns metadata with all nil values
@Test("empty: returns metadata with nil captureDate")
func empty_nilCaptureDate() {
let empty = PhotoMetadata.empty
#expect(empty.captureDate == nil)
}
@Test("empty: returns metadata with nil coordinates")
func empty_nilCoordinates() {
let empty = PhotoMetadata.empty
#expect(empty.coordinates == nil)
}
@Test("empty: returns metadata with hasValidLocation false")
func empty_hasValidLocationFalse() {
let empty = PhotoMetadata.empty
#expect(empty.hasValidLocation == false)
}
@Test("empty: returns metadata with hasValidDate false")
func empty_hasValidDateFalse() {
let empty = PhotoMetadata.empty
#expect(empty.hasValidDate == false)
}
// MARK: - Specification Tests: Combinations
@Test("Both valid: location and date both provided")
func bothValid() {
let metadata = makeMetadata(captureDate: TestClock.now, coordinates: CLLocationCoordinate2D(latitude: 0, longitude: 0))
#expect(metadata.hasValidLocation == true)
#expect(metadata.hasValidDate == true)
}
@Test("Only location: date nil")
func onlyLocation() {
let metadata = makeMetadata(captureDate: nil, coordinates: CLLocationCoordinate2D(latitude: 0, longitude: 0))
#expect(metadata.hasValidLocation == true)
#expect(metadata.hasValidDate == false)
}
@Test("Only date: coordinates nil")
func onlyDate() {
let metadata = makeMetadata(captureDate: TestClock.now, coordinates: nil)
#expect(metadata.hasValidLocation == false)
#expect(metadata.hasValidDate == true)
}
// MARK: - Invariant Tests
/// - Invariant: hasValidLocation == (coordinates != nil)
@Test("Invariant: hasValidLocation equals coordinates check")
func invariant_hasValidLocationEqualsCoordinatesCheck() {
let withCoords = makeMetadata(coordinates: CLLocationCoordinate2D(latitude: 0, longitude: 0))
let withoutCoords = makeMetadata(coordinates: nil)
#expect(withCoords.hasValidLocation == (withCoords.coordinates != nil))
#expect(withoutCoords.hasValidLocation == (withoutCoords.coordinates != nil))
}
/// - Invariant: hasValidDate == (captureDate != nil)
@Test("Invariant: hasValidDate equals captureDate check")
func invariant_hasValidDateEqualsCaptureCheck() {
let withDate = makeMetadata(captureDate: TestClock.now)
let withoutDate = makeMetadata(captureDate: nil)
#expect(withDate.hasValidDate == (withDate.captureDate != nil))
#expect(withoutDate.hasValidDate == (withoutDate.captureDate != nil))
}
/// - Invariant: empty.hasValidLocation && empty.hasValidDate == false
@Test("Invariant: empty has no valid data")
func invariant_emptyHasNoValidData() {
let empty = PhotoMetadata.empty
#expect(!empty.hasValidLocation && !empty.hasValidDate)
}
}