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) } }