Porting SwiftUI da Android (auth, hub, wizard, broadcast RTMP, overlay, scoring board-aware), reload hub al ritorno da diretta, decodifica score tollerante e documentazione allineata. Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.7 KiB
Swift
48 lines
1.7 KiB
Swift
import XCTest
|
|
|
|
/// Smoke test eseguibile senza @testable import (validazione logica pura).
|
|
final class ApiInstantTests: XCTestCase {
|
|
func testOverlayKindMapping() {
|
|
XCTAssertEqual(OverlayKindMapping.fromApi("basket"), "basket")
|
|
XCTAssertEqual(OverlayKindMapping.fromApi("none"), "none")
|
|
XCTAssertEqual(OverlayKindMapping.fromApi(nil), "volley")
|
|
}
|
|
|
|
func testRTMPUrlParser() {
|
|
let target = RTMPUrlParserLogic.parse("rtmp://stream.example.com/live/match_abc-123")
|
|
XCTAssertEqual(target?.connectURL, "rtmp://stream.example.com/live")
|
|
XCTAssertEqual(target?.streamName, "match_abc-123")
|
|
}
|
|
}
|
|
|
|
enum OverlayKindMapping {
|
|
static func fromApi(_ value: String?) -> String {
|
|
switch value?.lowercased() {
|
|
case "none", "timer": return "none"
|
|
case "basket": return "basket"
|
|
case "timed": return "timed"
|
|
case "racket": return "racket"
|
|
default: return "volley"
|
|
}
|
|
}
|
|
}
|
|
|
|
enum RTMPUrlParserLogic {
|
|
struct Target {
|
|
let connectURL: String
|
|
let streamName: String
|
|
}
|
|
|
|
static func parse(_ urlString: String) -> Target? {
|
|
guard let url = URL(string: urlString), url.scheme?.hasPrefix("rtmp") == true else { return nil }
|
|
let pathParts = url.path.split(separator: "/").map(String.init)
|
|
guard pathParts.count >= 2 else { return nil }
|
|
let app = pathParts.dropLast().joined(separator: "/")
|
|
let streamName = pathParts.last ?? ""
|
|
var connect = "rtmp://\(url.host ?? "")"
|
|
if let port = url.port { connect += ":\(port)" }
|
|
connect += "/\(app)"
|
|
return Target(connectURL: connect, streamName: streamName)
|
|
}
|
|
}
|