import { describe, expect, it } from 'vitest' import { projectCode } from '~/domain/project-code' describe('projectCode mit gesetztem Kürzel', () => { it('nimmt das gesetzte Kürzel und schreibt es groß', () => { expect(projectCode({ code: 'trk', slug: 'trakk' })).toBe('TRK') }) it('sticht die Ableitung aus dem Slug aus', () => { expect(projectCode({ code: 'TEL', slug: 'mta-telematik' })).toBe('TEL') }) it('schneidet nach vier Zeichen ab', () => { expect(projectCode({ code: 'orbitalis', slug: 'orbit' })).toBe('ORBI') }) it('entfernt Leerraum und Sonderzeichen im Kürzel', () => { expect(projectCode({ code: ' p-l s ', slug: 'pulsar' })).toBe('PLS') }) }) describe('projectCode mit fehlendem Kürzel', () => { it('fällt bei leerem Kürzel auf die Ableitung zurück', () => { expect(projectCode({ code: '', slug: 'trakk' })).toBe('TRA') }) it('fällt bei Leerraum als Kürzel auf die Ableitung zurück', () => { expect(projectCode({ code: ' ', slug: 'trakk' })).toBe('TRA') }) it('fällt bei null auf die Ableitung zurück', () => { expect(projectCode({ code: null, slug: 'trakk' })).toBe('TRA') }) it('fällt ohne Feld auf die Ableitung zurück', () => { expect(projectCode({ slug: 'mta360' })).toBe('MTA') }) it('fällt bei einem einzelnen Zeichen als Kürzel auf die Ableitung zurück', () => { expect(projectCode({ code: 'x', slug: 'pulsar' })).toBe('PUL') }) }) describe('projectCode leitet aus dem Slug ab', () => { it('nimmt bei einem Wort die ersten drei Zeichen', () => { expect(projectCode({ slug: 'orbit' })).toBe('ORB') }) it('zählt Ziffern als Teil des Wortes', () => { expect(projectCode({ slug: 'mta360' })).toBe('MTA') }) it('füllt bei zwei Wörtern die Initialen auf drei Zeichen auf', () => { expect(projectCode({ slug: 'mta-telematik' })).toBe('MTE') }) it('nimmt bei drei Wörtern je den ersten Buchstaben', () => { expect(projectCode({ slug: 'pocket-rocket-labs' })).toBe('PRL') }) it('bleibt bei vier Wörtern bei drei Zeichen', () => { expect(projectCode({ slug: 'ein-eingang-fuer-alle' })).toBe('EEF') }) it('behandelt jedes nicht alphanumerische Zeichen als Worttrenner', () => { expect(projectCode({ slug: 'mta_360.pilot' })).toBe('M3P') }) it('ignoriert führende und mehrfache Trenner', () => { expect(projectCode({ slug: '--trakk--' })).toBe('TRA') }) }) describe('projectCode mit Sonderzeichen und Umlauten', () => { it('bricht bei Umlauten nicht und schreibt sie als Grundbuchstaben', () => { expect(projectCode({ slug: 'übung' })).toBe('UBU') }) it('trennt an Umlautwörtern korrekt', () => { expect(projectCode({ slug: 'grüne-wiese' })).toBe('GWI') }) it('löst ß in SS auf', () => { expect(projectCode({ slug: 'straße' })).toBe('STR') }) it('nimmt Umlaute auch im gesetzten Kürzel an', () => { expect(projectCode({ code: 'öl', slug: 'orbit' })).toBe('OL') }) it('bricht bei Zeichen ohne Entsprechung nicht', () => { expect(projectCode({ slug: '★★★' })).toBe('LOG') }) it('bricht bei einem leeren Slug nicht', () => { expect(projectCode({ code: '', slug: '' })).toBe('LOG') }) }) describe('projectCode leitet nie weniger als drei Zeichen ab', () => { const slugs = [ 'trakk', 'mta360', 'mta-telematik', 'orbit', 'pulsar', 'a', 'a-b', '', '★', 'ein-sehr-langer-projekt-slug-mit-vielen-woertern', ] for (const slug of slugs) { it(`liefert für "${slug}" drei bis vier Großbuchstaben`, () => { const result = projectCode({ slug }) expect(result.length).toBeGreaterThanOrEqual(3) expect(result.length).toBeLessThanOrEqual(4) expect(result).toBe(result.toUpperCase()) }) } it('füllt ein einzelnes ableitbares Zeichen auf drei Zeichen auf', () => { expect(projectCode({ slug: 'a' })).toBe('AAA') }) })