31 lines
966 B
TypeScript
31 lines
966 B
TypeScript
|
|
import {
|
||
|
|
describe,
|
||
|
|
expect,
|
||
|
|
it,
|
||
|
|
} from 'vitest';
|
||
|
|
import { cn } from './cn';
|
||
|
|
|
||
|
|
describe('cn utility', () => {
|
||
|
|
it('should merge classes with clsx', () => {
|
||
|
|
expect(cn('class1', 'class2')).toBe('class1 class2');
|
||
|
|
expect(cn('class1', { class2: true, class3: false })).toBe('class1 class2');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should resolve tailwind specificity conflicts', () => {
|
||
|
|
// text-neutral-400 vs text-brand (text-brand should win)
|
||
|
|
expect(cn('text-neutral-400', 'text-brand')).toBe('text-brand');
|
||
|
|
|
||
|
|
// p-4 vs p-2
|
||
|
|
expect(cn('p-4', 'p-2')).toBe('p-2');
|
||
|
|
|
||
|
|
// dark mode classes should be handled correctly too
|
||
|
|
expect(cn('text-neutral-400 dark:text-neutral-400', 'text-brand dark:text-brand')).toBe(
|
||
|
|
'text-brand dark:text-brand',
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle undefined and null inputs', () => {
|
||
|
|
expect(cn('class1', undefined, null, 'class2')).toBe('class1 class2');
|
||
|
|
});
|
||
|
|
});
|