Skip to content

Commit 5ff7c29

Browse files
committed
Add tests
1 parent 00376f4 commit 5ff7c29

4 files changed

Lines changed: 1261 additions & 0 deletions

File tree

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
//// [discriminatedUnionTypes1.ts]
2+
interface Square {
3+
kind: "square";
4+
size: number;
5+
}
6+
7+
interface Rectangle {
8+
kind: "rectangle";
9+
width: number;
10+
height: number;
11+
}
12+
13+
interface Circle {
14+
kind: "circle";
15+
radius: number;
16+
}
17+
18+
type Shape = Square | Rectangle | Circle;
19+
20+
function area1(s: Shape) {
21+
if (s.kind === "square") {
22+
return s.size * s.size;
23+
}
24+
else if (s.kind === "circle") {
25+
return Math.PI * s.radius * s.radius;
26+
}
27+
else if (s.kind === "rectangle") {
28+
return s.width * s.height;
29+
}
30+
else {
31+
return 0;
32+
}
33+
}
34+
35+
function area2(s: Shape) {
36+
switch (s.kind) {
37+
case "square": return s.size * s.size;
38+
case "rectangle": return s.width * s.height;
39+
case "circle": return Math.PI * s.radius * s.radius;
40+
}
41+
}
42+
43+
function assertNever(x: never): never {
44+
throw new Error("Unexpected object: " + x);
45+
}
46+
47+
function area3(s: Shape) {
48+
switch (s.kind) {
49+
case "square": return s.size * s.size;
50+
case "rectangle": return s.width * s.height;
51+
case "circle": return Math.PI * s.radius * s.radius;
52+
default: return assertNever(s);
53+
}
54+
}
55+
56+
function area4(s: Shape) {
57+
switch (s.kind) {
58+
case "square": return s.size * s.size;
59+
case "rectangle": return s.width * s.height;
60+
case "circle": return Math.PI * s.radius * s.radius;
61+
}
62+
return assertNever(s);
63+
}
64+
65+
type Message =
66+
{ kind: "A", x: string } |
67+
{ kind: "B" | "C", y: number } |
68+
{ kind: "D" };
69+
70+
function f1(m: Message) {
71+
if (m.kind === "A") {
72+
m; // { kind: "A", x: string }
73+
}
74+
else if (m.kind === "D") {
75+
m; // { kind: "D" }
76+
}
77+
else {
78+
m; // { kind: "B" | "C", y: number }
79+
}
80+
}
81+
82+
function f2(m: Message) {
83+
if (m.kind === "A") {
84+
return;
85+
}
86+
m; // { kind: "B" | "C", y: number } | { kind: "D" }
87+
}
88+
89+
function f3(m: Message) {
90+
if (m.kind === "X") {
91+
m; // never
92+
}
93+
}
94+
95+
function f4(m: Message, x: "A" | "D") {
96+
if (m.kind == x) {
97+
m; // { kind: "A", x: string } | { kind: "D" }
98+
}
99+
}
100+
101+
function f5(m: Message) {
102+
switch (m.kind) {
103+
case "A":
104+
m; // { kind: "A", x: string }
105+
break;
106+
case "D":
107+
m; // { kind: "D" }
108+
break;
109+
default:
110+
m; // { kind: "B" | "C", y: number }
111+
}
112+
}
113+
114+
function f6(m: Message) {
115+
switch (m.kind) {
116+
case "A":
117+
m; // { kind: "A", x: string }
118+
case "D":
119+
m; // { kind: "A", x: string } | { kind: "D" }
120+
break;
121+
default:
122+
m; // { kind: "B" | "C", y: number }
123+
}
124+
}
125+
126+
function f7(m: Message) {
127+
switch (m.kind) {
128+
case "A":
129+
case "B":
130+
return;
131+
}
132+
m; // { kind: "B" | "C", y: number } | { kind: "D" }
133+
}
134+
135+
function f8(m: Message) {
136+
switch (m.kind) {
137+
case "A":
138+
return;
139+
case "D":
140+
throw new Error();
141+
}
142+
m; // { kind: "B" | "C", y: number }
143+
}
144+
145+
//// [discriminatedUnionTypes1.js]
146+
function area1(s) {
147+
if (s.kind === "square") {
148+
return s.size * s.size;
149+
}
150+
else if (s.kind === "circle") {
151+
return Math.PI * s.radius * s.radius;
152+
}
153+
else if (s.kind === "rectangle") {
154+
return s.width * s.height;
155+
}
156+
else {
157+
return 0;
158+
}
159+
}
160+
function area2(s) {
161+
switch (s.kind) {
162+
case "square": return s.size * s.size;
163+
case "rectangle": return s.width * s.height;
164+
case "circle": return Math.PI * s.radius * s.radius;
165+
}
166+
}
167+
function assertNever(x) {
168+
throw new Error("Unexpected object: " + x);
169+
}
170+
function area3(s) {
171+
switch (s.kind) {
172+
case "square": return s.size * s.size;
173+
case "rectangle": return s.width * s.height;
174+
case "circle": return Math.PI * s.radius * s.radius;
175+
default: return assertNever(s);
176+
}
177+
}
178+
function area4(s) {
179+
switch (s.kind) {
180+
case "square": return s.size * s.size;
181+
case "rectangle": return s.width * s.height;
182+
case "circle": return Math.PI * s.radius * s.radius;
183+
}
184+
return assertNever(s);
185+
}
186+
function f1(m) {
187+
if (m.kind === "A") {
188+
m; // { kind: "A", x: string }
189+
}
190+
else if (m.kind === "D") {
191+
m; // { kind: "D" }
192+
}
193+
else {
194+
m; // { kind: "B" | "C", y: number }
195+
}
196+
}
197+
function f2(m) {
198+
if (m.kind === "A") {
199+
return;
200+
}
201+
m; // { kind: "B" | "C", y: number } | { kind: "D" }
202+
}
203+
function f3(m) {
204+
if (m.kind === "X") {
205+
m; // never
206+
}
207+
}
208+
function f4(m, x) {
209+
if (m.kind == x) {
210+
m; // { kind: "A", x: string } | { kind: "D" }
211+
}
212+
}
213+
function f5(m) {
214+
switch (m.kind) {
215+
case "A":
216+
m; // { kind: "A", x: string }
217+
break;
218+
case "D":
219+
m; // { kind: "D" }
220+
break;
221+
default:
222+
m; // { kind: "B" | "C", y: number }
223+
}
224+
}
225+
function f6(m) {
226+
switch (m.kind) {
227+
case "A":
228+
m; // { kind: "A", x: string }
229+
case "D":
230+
m; // { kind: "A", x: string } | { kind: "D" }
231+
break;
232+
default:
233+
m; // { kind: "B" | "C", y: number }
234+
}
235+
}
236+
function f7(m) {
237+
switch (m.kind) {
238+
case "A":
239+
case "B":
240+
return;
241+
}
242+
m; // { kind: "B" | "C", y: number } | { kind: "D" }
243+
}
244+
function f8(m) {
245+
switch (m.kind) {
246+
case "A":
247+
return;
248+
case "D":
249+
throw new Error();
250+
}
251+
m; // { kind: "B" | "C", y: number }
252+
}

0 commit comments

Comments
 (0)