import Foundation @main struct PlaybackQueueChecks { static func require(_ condition: @autoclosure () -> Bool, _ message: String) { if !condition() { fatalError("FAIL: " + message) } } static func file(_ name: String) -> URL { URL(fileURLWithPath: "/queue-check/" + name + ".mp4") } static func main() { let first = file("Episode1"), second = file("Episode2"), tenth = file("Episode10") var queue = PlaybackQueue() require(queue.items.isEmpty && queue.currentURL == nil && !queue.canPrevious && !queue.canNext, "empty queue has no selection or navigation") require(queue.advance(1) == nil && queue.advance(-1) == nil, "empty navigation is harmless") queue.replace([tenth, second, first]) require(queue.items.map(\.url) == [first, second, tenth], "replace uses natural Episode2/Episode10 filename order") require(queue.currentURL == first && !queue.canPrevious && queue.canNext, "replace selects first item") let firstID = queue.currentID require(queue.advance(-1) == nil && queue.currentID == firstID, "previous at start does not wrap or deselect") require(queue.advance(1) == second && queue.canPrevious && queue.canNext, "next selects middle item") require(queue.advance(1) == tenth && queue.canPrevious && !queue.canNext, "next selects final item") let tenthID = queue.currentID require(queue.advance(1) == nil && queue.currentID == tenthID, "next at end stops without wrapping") require(queue.advance(-1) == second, "previous moves back one item") let selected = queue.currentID! queue.append([file("Episode20"), file("Episode3")]) require(queue.items.map(\.url) == [first, second, tenth, file("Episode3"), file("Episode20")], "append naturally sorts the new batch without reordering existing items") require(queue.currentID == selected && queue.currentURL == second, "append does not interrupt selection") queue.move(fromOffsets: IndexSet(integer: 1), toOffset: queue.items.count) require(queue.items.last?.id == selected && queue.currentID == selected && queue.currentURL == second, "reordering preserves current item identity") require(queue.canPrevious && !queue.canNext, "navigation follows reordered positions") queue.move(fromOffsets: IndexSet([0, 1]), toOffset: queue.items.count) require(queue.currentID == selected && queue.currentURL == second, "moving other items preserves current") queue.replace([tenth, second, first]) queue.select(queue.items[1].id) require(queue.currentURL == second, "explicit selection jumps to an item") let current = queue.currentID let unrelated = queue.items[0].id require(queue.remove(unrelated) == nil && queue.currentID == current && queue.currentURL == second, "removing another item does not request playback or change selection") require(queue.remove(current!) == tenth && queue.currentURL == tenth, "removing current selects the next remaining item") require(queue.remove(queue.currentID!) == nil && queue.currentURL == nil && queue.items.isEmpty, "removing final item stops and empties queue") queue.replace([first, second, tenth]) queue.select(queue.items.last!.id) require(queue.remove(queue.currentID!) == nil && queue.currentID == nil && queue.items.count == 2, "removing current at end stops rather than jumping backward") require(!queue.canPrevious && !queue.canNext, "stopped queue has no implicit selection") queue.select(queue.items[0].id) require(queue.currentURL == first, "remaining items can be explicitly selected after stopping") queue.append([first]) require(Set(queue.items.map(\.id)).count == queue.items.count, "duplicate file entries have independent identities") queue.replace([tenth]) require(queue.items.map(\.url) == [tenth] && queue.currentURL == tenth && !queue.canPrevious && !queue.canNext, "replace discards previous queue and starts new selection") queue.replace([]) require(queue.items.isEmpty && queue.currentID == nil, "empty replacement clears queue") print("playback queue checks passed") } }