GEN-1: export genotypeToFarbschlag for DATA-1 denormalization contract

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-05 23:45:07 +02:00
parent 0553ceda66
commit 0408a482cf
3 changed files with 28 additions and 2 deletions

View File

@@ -17,7 +17,7 @@ import {
wildType,
} from '../genotype'
import { combineLocus } from '../punnett'
import { farbschlagFor, CATALOG_SIZE } from '../catalog'
import { farbschlagFor, genotypeToFarbschlag, CATALOG_SIZE } from '../catalog'
import { breed } from '../breed'
import { GeneticsWarningCode } from '../warnings'
@@ -169,6 +169,14 @@ describe('Farbschlag catalog', () => {
it('has the expected catalogue coverage', () => {
expect(CATALOG_SIZE).toBe(18)
})
it('genotypeToFarbschlag (DATA-1 denormalization contract) returns the plain name', () => {
expect(genotypeToFarbschlag(wildType())).toBe('Agouti')
expect(genotypeToFarbschlag(fromDisplayString('aa CC DD EE GG pp spsp rere'))).toBe('Platin')
expect(genotypeToFarbschlag(fromDisplayString('aa cchmcchm dd ee gg PP spsp rere'))).toBe(
'Unbekannter Farbschlag',
)
})
})
describe('Partially-unknown parents (wildcards)', () => {

View File

@@ -93,5 +93,17 @@ export function farbschlagFor(g: Genotype): FarbschlagMatch {
return { name, base, unknown: false }
}
/**
* Convenience: genotype -> German Farbschlag name (with Schecke/Rex modifiers),
* or "Unbekannter Farbschlag". This is the DENORMALIZATION contract for DATA-1:
* the backend mirrors this mapping into a stored Farbschlag column (recomputed
* whenever the genotype changes) so Gridify list filtering/sorting never has to
* parse genotype strings in SQL. The catalog (BASE_COLORS) is self-contained in
* this file so it can be ported/kept in sync with the backend.
*/
export function genotypeToFarbschlag(g: Genotype): string {
return farbschlagFor(g).name
}
/** Number of base-colour varieties currently catalogued. */
export const CATALOG_SIZE = BASE_COLORS.length

View File

@@ -30,7 +30,13 @@ export type { LocusKey, LocusDef } from './loci'
export { phenotypeTokens } from './phenotype'
export type { PhenotypeTokens } from './phenotype'
export { farbschlagFor, BASE_COLORS, CATALOG_SIZE, UNKNOWN_FARBSCHLAG } from './catalog'
export {
farbschlagFor,
genotypeToFarbschlag,
BASE_COLORS,
CATALOG_SIZE,
UNKNOWN_FARBSCHLAG,
} from './catalog'
export type { FarbschlagEntry, FarbschlagMatch } from './catalog'
export { GeneticsWarningCode } from './warnings'