v2 / vlib / v / tests / loops / for_smartcast_test.v
78 lines · 64 sloc · 1.06 KB · ac7ca1271687ee6e0a69799523a779043f39eeb0
Raw
1type Node = Expr | string
2type Expr = IfExpr | IntegerLiteral
3
4struct IntegerLiteral {}
5
6struct IfExpr {
7 pos int
8}
9
10struct NodeWrapper {
11 node Node
12}
13
14fn test_nested_sumtype_selector() {
15 c := NodeWrapper{Node(Expr(IfExpr{
16 pos: 1
17 }))}
18 for c.node is Expr {
19 assert typeof(c.node).name == 'Expr'
20 break
21 }
22}
23
24struct Milk {
25mut:
26 name string
27}
28
29struct Eggs {
30mut:
31 name string
32}
33
34type Food = Eggs | Milk
35
36struct FoodWrapper {
37mut:
38 food Food
39}
40
41fn test_match_mut() {
42 mut f := Food(Eggs{'test'})
43 for mut f is Eggs {
44 f.name = 'eggs'
45 assert f.name == 'eggs'
46 break
47 }
48}
49
50fn test_conditional_break() {
51 mut f := Food(Eggs{'test'})
52 for mut f is Eggs {
53 f = Milk{'test'}
54 }
55 assert true
56}
57
58type ReceiverExpr = ReceiverPar | int
59
60struct ReceiverPar {
61 expr ReceiverExpr
62}
63
64fn (mut expr ReceiverExpr) strip_par() ReceiverExpr {
65 for mut expr is ReceiverPar {
66 expr = expr.expr
67 }
68 return expr
69}
70
71fn test_receiver_var_smartcast() {
72 mut expr := ReceiverExpr(ReceiverPar{
73 expr: ReceiverExpr(ReceiverPar{
74 expr: ReceiverExpr(1)
75 })
76 })
77 assert expr.strip_par() == ReceiverExpr(1)
78}
79