import { describe, expect, test } from 'vitest'; import { fileURLToPath } from 'node:url'; import { dirname, resolve } from 'node:path'; import { findCss, findTailwind, scan } from './check-tint-contrast.js'; const web = resolve(dirname(fileURLToPath(import.meta.url)), '..'); describe('hue-on-own-tint check (#3150)', () => { test('no source paints a hue as text on a tint of itself', () => { expect(scan(resolve(web, 'src'), web)).toEqual([]); }); describe('Tailwind', () => { test('finds text-X on bg-X-tint and bg-X/NN in one class string', () => { expect(findTailwind(`class="rounded bg-accent-tint px-2 text-accent"`)).toHaveLength(1); expect(findTailwind(`'bg-error/15 text-error'`)).toHaveLength(1); expect(findTailwind("`bg-moss/10 text-moss`")[0].fix).toBe('text-success-fg'); }); test('a class string spanning lines is one string', () => { expect(findTailwind(`class="bg-accent-tint\n text-accent"`)).toHaveLength(1); }); test('an apostrophe earlier in the file does not hide a pair', () => { expect( findTailwind(`

Couldn't add

\n`) ).toHaveLength(1); }); test('passes the -fg partner, another hue, and a tint with no hue text', () => { expect(findTailwind(`"bg-accent-tint text-accent-fg"`)).toEqual([]); expect(findTailwind(`"bg-accent-tint text-error"`)).toEqual([]); expect(findTailwind(`"bg-accent-tint text-text-primary"`)).toEqual([]); expect(findTailwind(`"text-accent"`)).toEqual([]); }); }); describe('CSS', () => { const tinted = (color) => `.pill { background: color-mix(in srgb, var(--fs-warning) 15%, transparent); ${color} }`; test('finds color: var(--fs-X) on a color-mix tint of X', () => { expect(findCss(tinted('color: var(--fs-warning);'))).toHaveLength(1); expect(findCss(tinted('color: var(--fs-warning);'))[0].fix).toBe('var(--fs-warning-fg)'); }); test('passes the -fg partner and border or outline colours', () => { expect(findCss(tinted('color: var(--fs-warning-fg);'))).toEqual([]); expect(findCss(tinted('border-color: var(--fs-warning);'))).toEqual([]); expect(findCss(tinted('outline-color: var(--fs-warning);'))).toEqual([]); }); test('a tint and a colour in different rules are not a pair', () => { expect( findCss( `.a { background: color-mix(in srgb, var(--fs-accent) 15%, transparent); }\n.b { color: var(--fs-accent); }` ) ).toEqual([]); }); }); });