// The Match-window trigger discipline (design/midstream-resolution-resize.md D2), as pure
// functions — the same rules the session binary's `resize_decision` unit-tests: physical pixels
// even-floored and clamped ≥ 320×200, skip a size equal to the live mode, and request each
// distinct size at most once (so a rejected size / a host rollback can't loop).

import XCTest

@testable import PunktfunkKit

final class MatchWindowTests: XCTestCase {
    func testNormalizeEvenFloorsAndClamps() {
        // Odd pixels floor to even (the host rejects odd dimensions).
        let a = MatchWindow.normalize(widthPx: 1001, heightPx: 601)
        XCTAssertEqual(a.width, 1000)
        XCTAssertEqual(a.height, 600)
        // Already-even sizes pass through.
        let b = MatchWindow.normalize(widthPx: 2560, heightPx: 1440)
        XCTAssertEqual(b.width, 2560)
        XCTAssertEqual(b.height, 1440)
        // Tiny / zero clamp to the host floor.
        let c = MatchWindow.normalize(widthPx: 100, heightPx: 80)
        XCTAssertEqual(c.width, 320)
        XCTAssertEqual(c.height, 200)
        let z = MatchWindow.normalize(widthPx: 0, heightPx: -4)
        XCTAssertEqual(z.width, 320)
        XCTAssertEqual(z.height, 200)
    }

    func testRequestSkipsEqualAndAlreadyRequested() {
        // A new size (different from the live mode, not yet requested) → request it.
        let r = MatchWindow.request(
            target: (1000, 600), current: (1280, 720), lastRequested: (800, 500))
        XCTAssertEqual(r?.width, 1000)
        XCTAssertEqual(r?.height, 600)
        // Equal to the live mode → nothing to do.
        XCTAssertNil(MatchWindow.request(
            target: (1280, 720), current: (1280, 720), lastRequested: nil))
        // Already requested once → don't re-ask (covers a rejected size AND a host rollback:
        // accepted → rebuild failed → corrective ack restored the old mode must not loop).
        XCTAssertNil(MatchWindow.request(
            target: (1000, 600), current: (1280, 720), lastRequested: (1000, 600)))
    }
}
