-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathvariant.enum.spec.ts
37 lines (30 loc) · 1.05 KB
/
variant.enum.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import {variant, TypeNames, VariantOf, variantList, fields, lookup} from '.';
enum ANIMAL_NAME {
DOG = 'dog',
CAT = 'cat',
SNAKE = 'snake',
}
const Animal = variantList([
variant(ANIMAL_NAME.DOG, fields<{name: string, favoriteBall?: string}>()),
variant(ANIMAL_NAME.CAT, fields<{name: string, furnitureDamaged: number}>()),
variant(ANIMAL_NAME.SNAKE, (name: string, patternName?: string) => ({
name,
pattern: patternName ?? 'striped',
})),
]);
type Animal<T extends TypeNames<typeof Animal> = undefined> = VariantOf<typeof Animal, T>;
test('variant enum (string)', () => {
const dog = Animal.dog({name: 'fluffy'});
expect(dog.type).toBe('dog');
expect(dog.name).toBe('fluffy');
expect(dog.favoriteBall).toBeUndefined();
})
test('basic lookup', () => {
const dog = Animal.dog({name: 'fluffy'});
const cuteName = (animal: Animal) => lookup(animal, {
[ANIMAL_NAME.CAT]: 'kitty',
[ANIMAL_NAME.DOG]: 'pupper',
snake: 'snek',
});
expect(cuteName(dog)).toBe('pupper');
})