import { describe, expect, it } from 'vitest' import { ref } from 'vue' import { useSampleGroups } from '../../composables/useSampleGroups' import type { SampleGroup } from '../../types' const groups: SampleGroup[] = [ { name: 'Control/A', color: '#3B82F6', samples: ['S1', 'S2'] }, { name: 'Control/B', color: '#06B6D4', samples: ['S3'] }, { name: 'Treatment/A', color: '#F43F5E', samples: ['S4'] }, ] describe('useSampleGroups', () => { it('derives major groups, display colors, hierarchy state, and ungrouped samples', () => { const sampleGroups = useSampleGroups({ samples: ['S1', 'S2', 'S3', 'S4', 'S5'], groups, }) expect(sampleGroups.separator.value).toBe('/') expect(sampleGroups.showHierarchy.value).toBe(true) expect(sampleGroups.ungroupedSamples.value).toEqual(['S5']) expect(sampleGroups.hierarchicalGroups.value.map(group => group.name)).toEqual(['Control', 'Treatment']) expect(sampleGroups.hierarchicalGroups.value[0].allSamples).toEqual(['S1', 'S2', 'S3']) expect(sampleGroups.hierarchicalGroups.value[0].subGroups[0]).toMatchObject({ name: 'Control/A', displayBg: expect.stringMatching(/20$/), displayBorder: expect.stringMatching(/40$/), }) }) it('keeps flat groups flat when major names do not introduce hierarchy', () => { const sampleGroups = useSampleGroups({ samples: ['S1'], groups: [ { name: 'Control', color: '#3B82F6', samples: ['S1'] }, ], }) expect(sampleGroups.separator.value).toBe('_') expect(sampleGroups.showHierarchy.value).toBe(false) expect(sampleGroups.hierarchicalGroups.value[0].name).toBe('Control') }) it('supports explicit separators, fallback colors, and reactive group sources', () => { const reactiveGroups = ref([ { name: 'Vehicle_DMSO', color: '', samples: ['S1'] }, ]) const sampleGroups = useSampleGroups({ samples: () => ['S1', 'S2'], groups: reactiveGroups, separator: '_', fallbackColor: '#111111', }) expect(sampleGroups.hierarchicalGroups.value[0].name).toBe('Vehicle') expect(sampleGroups.getGroupColor('Vehicle_DMSO')).toBe('#111111') reactiveGroups.value = [ ...reactiveGroups.value, { name: 'Drug_1uM', color: '#F43F5E', samples: ['S2'] }, ] expect(sampleGroups.ungroupedSamples.value).toEqual([]) expect(sampleGroups.findGroup('Drug_1uM')?.samples).toEqual(['S2']) }) })