bd44b5aa08
Test / build-libghostty-vt (x86_64-windows-gnu) (push) Has been cancelled
Test / build-libghostty-vt-macos (aarch64-ios) (push) Has been cancelled
Test / build-libghostty-vt-macos (aarch64-macos) (push) Has been cancelled
Test / build-libghostty-vt-macos (x86_64-macos) (push) Has been cancelled
Test / build-nix (namespace-profile-ghostty-md-arm64) (push) Has been cancelled
Test / build-dist (push) Has been cancelled
Test / GTK x11=true wayland=true (push) Has been cancelled
Test / Build -Dsimd=false (push) Has been cancelled
Test / Build -Dsimd=true (push) Has been cancelled
Test / Build -Dsentry=false (push) Has been cancelled
Test / Build -Dsentry=true (push) Has been cancelled
Test / zig-fmt (push) Has been cancelled
Test / GitHub Actions Pins (push) Has been cancelled
Test / prettier (push) Has been cancelled
Test / swiftlint (push) Has been cancelled
Test / alejandra (push) Has been cancelled
Test / typos (push) Has been cancelled
Nix / Required Checks: Nix (push) Has been cancelled
Nix / check-zig-cache-hash (push) Has been cancelled
Test / skip (push) Has been cancelled
Test / Required Checks: Test (push) Has been cancelled
Test / build-bench (push) Has been cancelled
Test / list-examples (push) Has been cancelled
Test / Example ${{ matrix.dir }} (Windows) (push) Has been cancelled
Test / build-cmake (push) Has been cancelled
Test / test-lib-vt-pkgconfig (push) Has been cancelled
Test / build-flatpak (push) Has been cancelled
Test / build-snap (push) Has been cancelled
Test / build-libghostty-vt (aarch64-linux) (push) Has been cancelled
Test / build-libghostty-vt (aarch64-macos) (push) Has been cancelled
Test / build-libghostty-vt (wasm32-freestanding) (push) Has been cancelled
Test / build-libghostty-vt (x86_64-linux) (push) Has been cancelled
Test / build-libghostty-vt (x86_64-linux-musl) (push) Has been cancelled
Test / build-libghostty-vt (x86_64-macos) (push) Has been cancelled
Test / build-libghostty-vt-android (aarch64-linux-android) (push) Has been cancelled
Test / build-libghostty-vt-android (arm-linux-androideabi) (push) Has been cancelled
Test / build-libghostty-vt-android (x86_64-linux-android) (push) Has been cancelled
Test / build-libghostty-vt-windows (push) Has been cancelled
Test / build-libghostty-windows-gnu (push) Has been cancelled
Test / build-linux (namespace-profile-ghostty-md) (push) Has been cancelled
Test / build-linux (namespace-profile-ghostty-md-arm64) (push) Has been cancelled
Test / build-linux-libghostty (push) Has been cancelled
Test / build-nix (namespace-profile-ghostty-md) (push) Has been cancelled
Test / build-dist-lib-vt (push) Has been cancelled
Test / trigger-snap (push) Has been cancelled
Test / trigger-flatpak (push) Has been cancelled
Test / build-macos (push) Has been cancelled
Test / build-macos-freetype (push) Has been cancelled
Test / test (push) Has been cancelled
Test / test-lib-vt (push) Has been cancelled
Test / GTK x11=false wayland=false (push) Has been cancelled
Test / GTK x11=true wayland=false (push) Has been cancelled
Test / GTK x11=false wayland=true (push) Has been cancelled
Test / test-macos (push) Has been cancelled
Test / test-windows (push) Has been cancelled
Test / Build -Di18n=false (push) Has been cancelled
Test / Build -Di18n=true (push) Has been cancelled
Test / Build test/fuzz-libghostty (push) Has been cancelled
Test / shellcheck (push) Has been cancelled
Test / translations (push) Has been cancelled
Test / blueprint-compiler (push) Has been cancelled
Test / Test pkg/wuffs (push) Has been cancelled
Test / Test build on Debian 13 (push) Has been cancelled
Test / valgrind (push) Has been cancelled
Test / Example ${{ matrix.dir }} (push) Has been cancelled
145 lines
5.0 KiB
Swift
145 lines
5.0 KiB
Swift
import AppKit
|
|
import Foundation
|
|
import Testing
|
|
@testable import Ghostty
|
|
|
|
struct ColorizedGhosttyIconTests {
|
|
private func makeIcon(
|
|
screenColors: [NSColor] = [
|
|
NSColor(hex: "#112233")!,
|
|
NSColor(hex: "#AABBCC")!,
|
|
],
|
|
ghostColor: NSColor = NSColor(hex: "#445566")!,
|
|
frame: Ghostty.MacOSIconFrame = .aluminum
|
|
) -> ColorizedGhosttyIcon {
|
|
.init(screenColors: screenColors, ghostColor: ghostColor, frame: frame)
|
|
}
|
|
|
|
// MARK: - Codable
|
|
|
|
@Test func codableRoundTripPreservesIcon() throws {
|
|
let icon = makeIcon(frame: .chrome)
|
|
let data = try JSONEncoder().encode(icon)
|
|
let decoded = try JSONDecoder().decode(ColorizedGhosttyIcon.self, from: data)
|
|
|
|
#expect(decoded == icon)
|
|
#expect(decoded.screenColors.compactMap(\.hexString) == ["#112233", "#AABBCC"])
|
|
#expect(decoded.ghostColor.hexString == "#445566")
|
|
#expect(decoded.frame == .chrome)
|
|
}
|
|
|
|
@Test func encodingWritesVersionAndHexColors() throws {
|
|
let icon = makeIcon(frame: .plastic)
|
|
let data = try JSONEncoder().encode(icon)
|
|
|
|
let payload = try #require(JSONSerialization.jsonObject(with: data) as? [String: Any])
|
|
#expect(payload["version"] as? Int == 1)
|
|
#expect(payload["screenColors"] as? [String] == ["#112233", "#AABBCC"])
|
|
#expect(payload["ghostColor"] as? String == "#445566")
|
|
#expect(payload["frame"] as? String == "plastic")
|
|
}
|
|
|
|
@Test func decodesLegacyV0PayloadWithoutVersion() throws {
|
|
let data = Data("""
|
|
{
|
|
"screenColors": ["#112233", "#AABBCC"],
|
|
"ghostColor": "#445566",
|
|
"frame": "beige"
|
|
}
|
|
""".utf8)
|
|
|
|
let decoded = try JSONDecoder().decode(ColorizedGhosttyIcon.self, from: data)
|
|
#expect(decoded.screenColors.compactMap(\.hexString) == ["#112233", "#AABBCC"])
|
|
#expect(decoded.ghostColor.hexString == "#445566")
|
|
#expect(decoded.frame == .beige)
|
|
}
|
|
|
|
@Test func decodingUnsupportedVersionThrowsDataCorrupted() {
|
|
let data = Data("""
|
|
{
|
|
"version": 99,
|
|
"screenColors": ["#112233", "#AABBCC"],
|
|
"ghostColor": "#445566",
|
|
"frame": "chrome"
|
|
}
|
|
""".utf8)
|
|
|
|
do {
|
|
_ = try JSONDecoder().decode(ColorizedGhosttyIcon.self, from: data)
|
|
Issue.record("Expected decode to fail for unsupported version")
|
|
} catch let DecodingError.dataCorrupted(context) {
|
|
#expect(context.debugDescription.contains("Unsupported ColorizedGhosttyIcon version"))
|
|
} catch {
|
|
Issue.record("Expected DecodingError.dataCorrupted, got: \(error)")
|
|
}
|
|
}
|
|
|
|
@Test func decodingInvalidGhostColorThrows() {
|
|
let data = Data("""
|
|
{
|
|
"version": 1,
|
|
"screenColors": ["#112233", "#AABBCC"],
|
|
"ghostColor": "not-a-color",
|
|
"frame": "chrome"
|
|
}
|
|
""".utf8)
|
|
|
|
do {
|
|
_ = try JSONDecoder().decode(ColorizedGhosttyIcon.self, from: data)
|
|
Issue.record("Expected decode to fail for invalid ghost color")
|
|
} catch let DecodingError.dataCorrupted(context) {
|
|
#expect(context.debugDescription.contains("Failed to decode ghost color"))
|
|
} catch {
|
|
Issue.record("Expected DecodingError.dataCorrupted, got: \(error)")
|
|
}
|
|
}
|
|
|
|
@Test func decodingInvalidScreenColorsDropsInvalidEntries() throws {
|
|
let data = Data("""
|
|
{
|
|
"version": 1,
|
|
"screenColors": ["#112233", "invalid", "#AABBCC"],
|
|
"ghostColor": "#445566",
|
|
"frame": "chrome"
|
|
}
|
|
""".utf8)
|
|
|
|
let decoded = try JSONDecoder().decode(ColorizedGhosttyIcon.self, from: data)
|
|
#expect(decoded.screenColors.compactMap(\.hexString) == ["#112233", "#AABBCC"])
|
|
}
|
|
|
|
// MARK: - Equatable
|
|
|
|
@Test func equatableUsesHexColorAndFrameValues() {
|
|
let lhs = makeIcon(
|
|
screenColors: [
|
|
NSColor(red: 0x11 / 255.0, green: 0x22 / 255.0, blue: 0x33 / 255.0, alpha: 1.0),
|
|
NSColor(red: 0xAA / 255.0, green: 0xBB / 255.0, blue: 0xCC / 255.0, alpha: 1.0),
|
|
],
|
|
ghostColor: NSColor(red: 0x44 / 255.0, green: 0x55 / 255.0, blue: 0x66 / 255.0, alpha: 1.0),
|
|
frame: .chrome
|
|
)
|
|
let rhs = makeIcon(frame: .chrome)
|
|
|
|
#expect(lhs == rhs)
|
|
}
|
|
|
|
@Test func equatableReturnsFalseForDifferentFrame() {
|
|
let lhs = makeIcon(frame: .aluminum)
|
|
let rhs = makeIcon(frame: .chrome)
|
|
#expect(lhs != rhs)
|
|
}
|
|
|
|
@Test func equatableReturnsFalseForDifferentScreenColors() {
|
|
let lhs = makeIcon(screenColors: [NSColor(hex: "#112233")!, NSColor(hex: "#AABBCC")!])
|
|
let rhs = makeIcon(screenColors: [NSColor(hex: "#112233")!, NSColor(hex: "#CCBBAA")!])
|
|
#expect(lhs != rhs)
|
|
}
|
|
|
|
@Test func equatableReturnsFalseForDifferentGhostColor() {
|
|
let lhs = makeIcon(ghostColor: NSColor(hex: "#445566")!)
|
|
let rhs = makeIcon(ghostColor: NSColor(hex: "#665544")!)
|
|
#expect(lhs != rhs)
|
|
}
|
|
}
|