Files
iccery-v2-mac/Tests/ICCeryCoreTests/CGATSParserTests.swift
gronodandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> 150d094632 test(m9): convert pure core test suites from Swift Testing to XCTest
Slice 2 (Phase 1a) of the M9 Monterey retarget. Converts all pure Core
suites (argv builders, CGATS/CUPS/profcheck/gamut-mesh parsers, colour
math, file/artefact helpers, classifiers) to XCTestCase, and adds the
shared assertAsyncThrows helper for the async-throws sites that Slice 3
will convert.

Deferred to Slice 3 (kept on Swift Testing in mixed files):
ProcessManagerTests, ArgyllRunner*Tests, ProcessRunSupportTests,
store/UI suites, and the runner suites embedded in TargenTests /
PrinttargTests / ProcessManagerTests.

Also qualifies six bare `throw .case` expressions in CGATSParser with
CGATSParseError — they only compiled under typed throws, which Slice 1
demoted to untyped `throws`; without this the ICCeryCore target fails to
build and no test gate can run.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-11 20:43:42 +01:00

122 lines
3.8 KiB
Swift

import Foundation
import XCTest
@testable import ICCeryCore
final class CGATSParserTests: XCTestCase {
private static let canonicalCTI3 = """
CTI3
DESCRIPTOR "Sample target"
COLOR_REP "RGB"
DEVICE_CLASS "DISPLAY"
NUMBER_OF_FIELDS 11
NUMBER_OF_SETS 2
BEGIN_DATA_FORMAT
SAMPLE_ID\tSAMPLE_LOC\tRGB_R\tRGB_G\tRGB_B\tXYZ_X\tXYZ_Y\tXYZ_Z\tLAB_L\tLAB_A\tLAB_B
END_DATA_FORMAT
BEGIN_DATA
1\tA1\t50.0\t0.0\t0.0\t20.0\t10.0\t5.0\t50.0\t60.0\t30.0
2\tA2\t0.0\t50.0\t0.0\t10.0\t30.0\t5.0\t60.0\t-50.0\t40.0
END_DATA
"""
func testParseCTI3() throws {
let dataset = try CGATSParser.parse(Self.canonicalCTI3)
XCTAssertEqual(dataset.format, .cti3)
XCTAssertEqual(dataset.samples.count, 2)
XCTAssertEqual(dataset.colorRep, "RGB")
XCTAssertEqual(dataset.deviceClass, "DISPLAY")
XCTAssertEqual(dataset.samples[0].id, "1")
XCTAssertEqual(dataset.samples[0].loc, "A1")
XCTAssertEqual(dataset.samples[1].values["RGB_G"], "50.0000")
}
func testRoundTrip() throws {
let first = try CGATSParser.parse(Self.canonicalCTI3)
let text = try CGATSWriter.write(first)
let second = try CGATSParser.parse(text)
XCTAssertEqual(second.format, first.format)
XCTAssertEqual(second.samples.count, first.samples.count)
XCTAssertEqual(second.colorRep, first.colorRep)
XCTAssertEqual(second.deviceClass, first.deviceClass)
}
func testParseCSV() throws {
let csv = """
SAMPLE_ID,SAMPLE_LOC,RGB_R,RGB_G,RGB_B,XYZ_X,XYZ_Y,XYZ_Z,LAB_L,LAB_A,LAB_B
1,A1,50,0,0,20,10,5,50,60,30
2,A2,0,50,0,10,30,5,60,-50,40
"""
let dataset = try CGATSParser.parse(csv, sourceURL: URL(fileURLWithPath: "/tmp/sample.csv"))
XCTAssertEqual(dataset.format, .csv)
XCTAssertEqual(dataset.samples.count, 2)
XCTAssertEqual(dataset.samples[0].values["RGB_R"], "50.0000")
}
func testConverts255To100() throws {
let rgb = """
CTI3
COLOR_REP RGB
NUMBER_OF_FIELDS 6
NUMBER_OF_SETS 1
BEGIN_DATA_FORMAT
SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y
END_DATA_FORMAT
BEGIN_DATA
1 255 128 0 50 25
END_DATA
"""
let dataset = try CGATSParser.parse(rgb)
XCTAssertEqual(dataset.samples[0].values["RGB_R"], "100.0000")
XCTAssertEqual(dataset.samples[0].values["RGB_G"], "50.1961")
}
func testSynthesizesMetadata() throws {
let cmyk = """
CTI3
NUMBER_OF_FIELDS 6
NUMBER_OF_SETS 1
BEGIN_DATA_FORMAT
SAMPLE_ID CMYK_C CMYK_M CMYK_Y CMYK_K LAB_L
END_DATA_FORMAT
BEGIN_DATA
1 50 50 50 50 50
END_DATA
"""
let dataset = try CGATSParser.parse(cmyk)
XCTAssertEqual(dataset.colorRep, "CMYK")
XCTAssertEqual(dataset.deviceClass, "PRINTER")
}
func testRejectsEmpty() {
XCTAssertThrowsError(try CGATSParser.parse(""))
}
func testRejectsArity() {
let bad = """
CTI3
NUMBER_OF_FIELDS 2
NUMBER_OF_SETS 1
BEGIN_DATA_FORMAT
SAMPLE_ID RGB_R
END_DATA_FORMAT
BEGIN_DATA
1
END_DATA
"""
XCTAssertThrowsError(try CGATSParser.parse(bad))
}
func testWriterFormat() throws {
let dataset = try CGATSParser.parse(Self.canonicalCTI3)
let text = try CGATSWriter.write(dataset)
XCTAssertTrue(text.contains("CTI3"))
XCTAssertTrue(text.contains("BEGIN_DATA_FORMAT"))
XCTAssertTrue(text.contains("BEGIN_DATA"))
XCTAssertTrue(text.contains("END_DATA"))
XCTAssertTrue(text.contains("COLOR_REP"))
XCTAssertTrue(text.contains("DEVICE_CLASS"))
XCTAssertTrue(text.contains("\t"))
}
}