FEAT: genotype parsing resilience and displayGenotypeSafe format helper
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
||||
fromJSON,
|
||||
wildType,
|
||||
extractGenotypeFlags,
|
||||
displayGenotypeSafe,
|
||||
} from '../genotype'
|
||||
import { combineLocus } from '../punnett'
|
||||
import { LOCI, type LocusKey } from '../loci'
|
||||
@@ -686,4 +687,48 @@ describe('GEN-3h: breeder bracket-notation display + E-locus e-before-ef order',
|
||||
expect(g.Sp).toEqual(['Sp', 'sp'])
|
||||
expect(toDisplayString(g)).toBe('aa c[chm]c[chm] Dd e- Gg Pp Spsp')
|
||||
})
|
||||
|
||||
// ── GENOTYPE-PARSE-CRASH / displayGenotypeSafe resilience ───────────────
|
||||
it('handles blank c locus and c[-] resiliently without crashing', () => {
|
||||
// Vandana's genotype
|
||||
const rawVandana = 'Aa Cc Dd eef Gg P? spsp ??'
|
||||
const g = fromDisplayString(rawVandana)
|
||||
expect(g.C).toEqual(['C', '?'])
|
||||
expect(toDisplayString(g)).toBe('Aa C- Dd ee[f] Gg P- spsp')
|
||||
|
||||
// cchmc allele
|
||||
const g2 = fromDisplayString('Aa cchmc Dd ee Gg Pp spsp')
|
||||
expect(g2.C).toEqual(['cchm', '?'])
|
||||
expect(toDisplayString(g2)).toBe('Aa c[chm]- Dd ee Gg Pp spsp')
|
||||
|
||||
// c[-] and blank c standalone
|
||||
const g3 = fromDisplayString('Aa c[-] Dd ee Gg Pp spsp')
|
||||
expect(g3.C).toEqual(['C', 'C']) // default to wild-type since c[-] was skipped
|
||||
expect(toDisplayString(g3)).toBe('Aa CC Dd ee Gg Pp spsp')
|
||||
|
||||
const g4 = fromDisplayString('Aa c Dd ee Gg Pp spsp')
|
||||
expect(g4.C).toEqual(['C', 'C']) // default to wild-type since c was skipped
|
||||
expect(toDisplayString(g4)).toBe('Aa CC Dd ee Gg Pp spsp')
|
||||
})
|
||||
|
||||
it('displayGenotypeSafe formats parsed genotypes and handles fallback safely', () => {
|
||||
// 1. Parseable with unknown alleles, replacing ? with -
|
||||
expect(displayGenotypeSafe('Aa C? Dd')).toBe('Aa C- Dd EE GG PP spsp')
|
||||
|
||||
// 2. Parseable with trailing ?? (stripped completely)
|
||||
expect(displayGenotypeSafe('Aa CC Dd EE GG Pp spsp ??')).toBe('Aa CC Dd EE GG Pp spsp')
|
||||
expect(displayGenotypeSafe('Aa Cc Dd eef Gg P? spsp ??')).toBe('Aa C- Dd ee[f] Gg P- spsp')
|
||||
expect(displayGenotypeSafe('Aa CC Dd EE GG Pp spsp Slsl ??')).toBe('Aa CC Dd EE GG Pp spsp Slsl')
|
||||
|
||||
// 3. Unparseable fallback: removes ?? / -- / [-], replaces remaining ? with -
|
||||
expect(displayGenotypeSafe('Aa Cc XX ??')).toBe('Aa Cc XX')
|
||||
expect(displayGenotypeSafe('Aa Cc XX --')).toBe('Aa Cc XX')
|
||||
expect(displayGenotypeSafe('Aa Cc XX [-]')).toBe('Aa Cc XX')
|
||||
expect(displayGenotypeSafe('Aa Cc? XX')).toBe('Aa Cc- XX')
|
||||
|
||||
// 4. Handles null/undefined/empty
|
||||
expect(displayGenotypeSafe(null)).toBe('')
|
||||
expect(displayGenotypeSafe(undefined)).toBe('')
|
||||
expect(displayGenotypeSafe('')).toBe('')
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user