import * as lang from './language'; test('correctly output basic vowels', () => { expect(lang.vowelFeaturesToIpa({ height: lang.VowelHeight.Close, depth: lang.VowelDepth.Front, round: false, long: false, nasal: false, })).toBe('i'); expect(lang.vowelFeaturesToIpa({ height: lang.VowelHeight.Mid, depth: lang.VowelDepth.Central, round: false, long: false, nasal: false, })).toBe('ə'); expect(lang.vowelFeaturesToIpa({ height: lang.VowelHeight.Open, depth: lang.VowelDepth.Back, round: true, long: false, nasal: true, })).toBe('ɒ̃'); expect(lang.vowelFeaturesToIpa({ height: lang.VowelHeight.CloseMid, depth: lang.VowelDepth.Front, round: false, long: true, nasal: false, })).toBe('eː'); }); test('correctly output basic consonants', () => { expect(lang.consonantFeaturesToIpa({ place: lang.ConsonantPlace.Bilabial, manner: lang.ConsonantManner.Nasal, voice: true, })).toBe('m'); expect(lang.consonantFeaturesToIpa({ place: lang.ConsonantPlace.Uvular, manner: lang.ConsonantManner.NonSibilantFricative, voice: true, })).toBe('ʁ'); expect(lang.consonantFeaturesToIpa({ place: lang.ConsonantPlace.Velar, manner: lang.ConsonantManner.Plosive, voice: false, })).toBe('k'); }); test('fail to output impossible consonants', () => { expect(lang.consonantFeaturesToIpa({ place: lang.ConsonantPlace.Retroflex, manner: lang.ConsonantManner.NonSibilantAffricate, voice: false, })).toBe(''); expect(lang.consonantFeaturesToIpa({ place: lang.ConsonantPlace.Labiodental, manner: lang.ConsonantManner.Trill, voice: true, })).toBe(''); expect(lang.consonantFeaturesToIpa({ place: lang.ConsonantPlace.Palatal, manner: lang.ConsonantManner.Approximant, voice: false, })).toBe(''); }); test('all consonants can be selected', () => { expect(lang.pickConsonants( [ lang.ConsonantPlace.Bilabial ], [ lang.ConsonantManner.Nasal ], [ true, true ], )).toEqual([ { place: lang.ConsonantPlace.Bilabial, manner: lang.ConsonantManner.Nasal, voice: false, }, { place: lang.ConsonantPlace.Bilabial, manner: lang.ConsonantManner.Nasal, voice: true, }, ]); expect(lang.pickConsonants( [ lang.ConsonantPlace.Labiodental ], [ lang.ConsonantManner.Nasal, lang.ConsonantManner.Plosive, lang.ConsonantManner.SibilantAffricate, lang.ConsonantManner.NonSibilantAffricate, lang.ConsonantManner.SibilantFricative, lang.ConsonantManner.NonSibilantFricative, lang.ConsonantManner.Approximant, lang.ConsonantManner.Tap, lang.ConsonantManner.Trill, lang.ConsonantManner.LateralAffricate, lang.ConsonantManner.LateralFricative, lang.ConsonantManner.LateralApproximant, lang.ConsonantManner.LateralTap, ], [ true, false ], )).toEqual([ { place: lang.ConsonantPlace.Labiodental, manner: lang.ConsonantManner.Nasal, voice: false, }, { place: lang.ConsonantPlace.Labiodental, manner: lang.ConsonantManner.Plosive, voice: false, }, { place: lang.ConsonantPlace.Labiodental, manner: lang.ConsonantManner.NonSibilantAffricate, voice: false, }, { place: lang.ConsonantPlace.Labiodental, manner: lang.ConsonantManner.NonSibilantFricative, voice: false, }, ]); expect(lang.pickConsonants( [ lang.ConsonantPlace.Bilabial, lang.ConsonantPlace.Alveolar ], [ lang.ConsonantManner.Plosive, lang.ConsonantManner.Tap ], [ true, true ], ).map(lang.consonantFeaturesToIpa)).toEqual([ 'p', 'b', 'ⱱ̟', 't', 'd', 'ɾ̥', 'ɾ', ]); }); test('vowel positions work correctly', () => { expect( lang._vowelXY(lang.VowelHeight.Open, lang.VowelDepth.Back) ).toEqual([0, 0]); expect( lang._vowelXY(lang.VowelHeight.NearOpen, lang.VowelDepth.Central) ).toEqual([1.5, 1]); expect( lang._vowelXY(lang.VowelHeight.Close, lang.VowelDepth.Front) ).toEqual([8, 6]); expect( lang._vowelXY(lang.VowelHeight.Close, lang.VowelDepth.Back) ).toEqual([0, 6]); });