feat: add editable playback queue
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user