import XCTest
@testable import PoseCore

final class CoachingChecklistTests: XCTestCase {
    func testEveryNewSubjectGetsAllTopicsWithoutInventedFindings() {
        let rows = CoachingChecklist.rows(review: nil)
        XCTAssertEqual(rows.count, 9)
        XCTAssertEqual(Set(rows.map(\.topic)), Set(CoachingTopic.allCases))
        XCTAssertTrue(rows.allSatisfy { $0.status == .needsReview && $0.observation.isEmpty })
    }
    func testSourceValidationCoverageAndRoundTrip() throws {
        let frame = pairDocument().frames.first { $0.role == "subject" }!
        var review = CoachingChecklistReview(frame: frame)
        review.items[0] = CoachingChecklistItem(topic: .grip, status: .hypothesis, observation: "Rider reports fixed grip; tension not visible.")
        review.provenance = "Synthetic review"
        try review.validate(frames: [frame])
        let decoded = try JSONDecoder().decode(CoachingChecklistReview.self, from: JSONEncoder().encode(review))
        XCTAssertEqual(decoded, review)
        XCTAssertEqual(CoachingChecklist.rows(review: review).filter { $0.status == .needsReview }.count, 8)
        review.sourceHash = "wrong"
        XCTAssertThrowsError(try review.validate(frames: [frame]))
        review.sourceHash = frame.sourceHash
        review.items.removeLast()
        XCTAssertThrowsError(try review.validate(frames: [frame]))
        review = CoachingChecklistReview(frame: frame)
        review.items[0].status = .focus
        XCTAssertThrowsError(try review.validate(frames: [frame]))
        review = CoachingChecklistReview(frame: frame)
        review.catalogVersion = "old"
        XCTAssertThrowsError(try review.validate(frames: [frame]))
    }
}
