import { expect, test } from "vitest" import { compositeLinearRgbColorValueOverBackground, compositeSrgbColorValueOverBackground, darkenSrgbColorValue, fadeSrgbColorValue, lightenSrgbColorValue, mixLinearRgbColorValues, mixSrgbColorValues, shadeSrgbColorValue, tintSrgbColorValue, toneSrgbColorValue, } from "#Source/color/index.ts" test("mixLinearRgbColorValues mixes directly on the linear layer", () => { expect( mixLinearRgbColorValues( { red: 1, green: 0, blue: 0, alpha: 1 }, { red: 0, green: 0, blue: 1, alpha: 1 }, 0.5, ), ).toEqual({ red: 0.5, green: 0, blue: 0.5, alpha: 1 }) expect(() => mixLinearRgbColorValues( { red: 1, green: 0, blue: 0, alpha: 1 }, { red: 0, green: 0, blue: 1, alpha: 1 }, -0.1, ), ).toThrow(RangeError) }) test("mixSrgbColorValues mixes through the explicit sRGB to linear pipeline", () => { expect( mixSrgbColorValues( { red: 255, green: 0, blue: 0, alpha: 1 }, { red: 0, green: 0, blue: 255, alpha: 1 }, 0.5, ), ).toEqual({ red: 188, green: 0, blue: 188, alpha: 1 }) expect( mixSrgbColorValues( { red: 255, green: 0, blue: 0, alpha: 1 }, { red: 255, green: 255, blue: 255, alpha: 1 }, 0.5, ), ).toEqual({ red: 255, green: 188, blue: 188, alpha: 1 }) }) test("compositeLinearRgbColorValueOverBackground composites directly on the linear layer", () => { expect( compositeLinearRgbColorValueOverBackground( { red: 1, green: 1, blue: 1, alpha: 0.5 }, { red: 0, green: 0, blue: 1, alpha: 1 }, ), ).toEqual({ red: 0.5, green: 0.5, blue: 1, alpha: 1 }) expect( compositeLinearRgbColorValueOverBackground( { red: 1, green: 0, blue: 0, alpha: 1 }, { red: 0, green: 0, blue: 1, alpha: 1 }, ), ).toEqual({ red: 1, green: 0, blue: 0, alpha: 1 }) }) test("compositeSrgbColorValueOverBackground composites through the explicit sRGB to linear pipeline", () => { expect( compositeSrgbColorValueOverBackground( { red: 255, green: 255, blue: 255, alpha: 0.5 }, { red: 0, green: 0, blue: 255, alpha: 1 }, ), ).toEqual({ red: 188, green: 188, blue: 255, alpha: 1 }) expect( compositeSrgbColorValueOverBackground( { red: 255, green: 0, blue: 0, alpha: 1 }, { red: 0, green: 0, blue: 255, alpha: 1 }, ), ).toEqual({ red: 255, green: 0, blue: 0, alpha: 1 }) }) test("fadeSrgbColorValue updates alpha while keeping channels stable", () => { expect(fadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.4)).toEqual({ red: 51, green: 102, blue: 153, alpha: 0.4, }) expect(() => fadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, -0.1)).toThrow( RangeError, ) }) test("tintSrgbColorValue stays on the legal RGB branch pipeline", () => { expect(tintSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.5)).toEqual({ red: 190, green: 198, blue: 212, alpha: 1, }) expect(tintSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)).toEqual({ red: 51, green: 102, blue: 153, alpha: 1, }) expect(() => tintSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 1.1)).toThrow( RangeError, ) }) test("shadeSrgbColorValue stays on the legal RGB branch pipeline", () => { expect(shadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.5)).toEqual({ red: 35, green: 73, blue: 111, alpha: 1, }) expect(shadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)).toEqual({ red: 51, green: 102, blue: 153, alpha: 1, }) }) test("toneSrgbColorValue stays on the legal RGB branch pipeline", () => { expect(toneSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.5)).toEqual({ red: 141, green: 153, blue: 171, alpha: 1, }) expect(toneSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)).toEqual({ red: 51, green: 102, blue: 153, alpha: 1, }) }) test("lightenSrgbColorValue stays on the legal RGB branch pipeline", () => { expect(lightenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.25)).toEqual({ red: 143, green: 160, blue: 186, alpha: 1, }) expect(lightenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)).toEqual({ red: 51, green: 102, blue: 153, alpha: 1, }) }) test("darkenSrgbColorValue stays on the legal RGB branch pipeline", () => { expect(darkenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.25)).toEqual({ red: 44, green: 89, blue: 134, alpha: 1, }) expect(darkenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)).toEqual({ red: 51, green: 102, blue: 153, alpha: 1, }) })