import Foundation import Testing @testable import CardsNative @Suite("MaskRegions") struct MaskRegionsTests { @Test("Parsed Liste sortiert nach ID lexikographisch") func parseSortsByIdLexically() { let json = """ [ {"id":"m003","x":0.1,"y":0.1,"w":0.2,"h":0.2,"label":"C"}, {"id":"m001","x":0,"y":0,"w":0.1,"h":0.1,"label":"A"}, {"id":"m002","x":0.5,"y":0.5,"w":0.3,"h":0.3} ] """ let regions = MaskRegions.parse(json) #expect(regions.count == 3) #expect(regions[0].id == "m001") #expect(regions[1].id == "m002") #expect(regions[2].id == "m003") #expect(regions[2].label == "C") #expect(regions[1].label == nil) } @Test("Bei Parse-Fehler → leere Liste") func parseInvalidReturnsEmpty() { #expect(MaskRegions.parse("[}").isEmpty) #expect(MaskRegions.parse("{}").isEmpty) #expect(MaskRegions.parse("").isEmpty) } @Test("region(forSubIndex:) mappt aufsteigend") func subIndexLookup() { let json = """ [{"id":"b","x":0,"y":0,"w":0.1,"h":0.1}, {"id":"a","x":0,"y":0,"w":0.2,"h":0.2}] """ #expect(MaskRegions.region(for: json, subIndex: 0)?.id == "a") #expect(MaskRegions.region(for: json, subIndex: 1)?.id == "b") #expect(MaskRegions.region(for: json, subIndex: 2) == nil) } @Test("Encode-Roundtrip") func encodeRoundtrip() { let original = [ MaskRegion(id: "m1", x: 0.1, y: 0.2, w: 0.3, h: 0.4, label: "test"), MaskRegion(id: "m2", x: 0.5, y: 0.6, w: 0.2, h: 0.2, label: nil) ] let encoded = MaskRegions.encode(original) let parsed = MaskRegions.parse(encoded) #expect(parsed.count == 2) #expect(parsed[0].id == "m1") #expect(parsed[0].label == "test") #expect(parsed[1].label == nil) } @Test("CardFieldsBuilder.imageOcclusion produziert korrekte Felder") func builderImageOcclusion() { let regions = [MaskRegion(id: "m1", x: 0, y: 0, w: 0.5, h: 0.5, label: "x")] let fields = CardFieldsBuilder.imageOcclusion( imageRef: "media_123", regions: regions, note: "Hinweis" ) #expect(fields["image_ref"] == "media_123") #expect(fields["note"] == "Hinweis") let reparsed = MaskRegions.parse(fields["mask_regions"] ?? "") #expect(reparsed.count == 1) #expect(reparsed[0].id == "m1") } @Test("CardFieldsBuilder.audioFront produziert korrekte Felder") func builderAudioFront() { let fields = CardFieldsBuilder.audioFront(audioRef: "audio_456", back: "Antwort") #expect(fields["audio_ref"] == "audio_456") #expect(fields["back"] == "Antwort") #expect(fields.count == 2) } }