main.mx raw
1 package main
2
3 import "os"
4
5 func check(cond bool, name string) {
6 if cond {
7 os.Stdout.Write([]byte("OK "))
8 os.Stdout.Write([]byte(name))
9 os.Stdout.Write([]byte("\n"))
10 } else {
11 os.Stdout.Write([]byte("FAIL "))
12 os.Stdout.Write([]byte(name))
13 os.Stdout.Write([]byte("\n"))
14 }
15 }
16
17 // --- t1: return string in struct ---
18 type S1 struct{ V string }
19
20 func f1() (r S1) { r.V = "hello"; return r }
21
22 // --- t2: return pointer to struct ---
23 type S2 struct{ V string }
24
25 func f2() (r *S2) { r = &S2{V: "ptr"}; return r }
26
27 // --- t3: return int32 ---
28 func f3() (n int32) { return 42 }
29
30 // --- t4: return bool ---
31 func f4() (b bool) { return true }
32
33 // --- t5: return struct with slice ---
34 type S5 struct{ D []int32 }
35
36 func f5() (r S5) { r.D = []int32{1, 2, 3, 4, 5}; return r }
37
38 // --- t6: map insert on receiver ---
39 type S6 struct{ M map[string]string }
40
41 func (s *S6) put(k, v string) { s.M[k] = v }
42
43 // --- t7: append-like on receiver ---
44 type S7 struct{ D []int32 }
45
46 func (s *S7) grow() { s.D = appendOne(s.D, 99) }
47
48 func appendOne(s []int32, v int32) (r []int32) {
49 n := len(s); r = []int32{:n + 1}
50 for i := int32(0); i < n; i++ { r[i] = s[i] }
51 r[n] = v; return r
52 }
53
54 // --- t8: pointer assign on receiver ---
55 type S8 struct{ X int32 }
56 type S8w struct{ P *S8 }
57
58 func (s *S8w) create() { s.P = &S8{X: 42} }
59
60 // --- t9: two-level receiver ---
61 type S9a struct{ D []int32 }
62 type S9b struct{ L *S9a }
63
64 func (s *S9a) grow() { s.D = appendOne(s.D, 10) }
65 func (s *S9b) init() { s.L = &S9a{D: []int32{0}} }
66 func (s *S9b) add() { s.L.grow() }
67
68 // --- t10: multi-value return ---
69 func f10() (a int32, b string) { return 7, "seven" }
70
71 // --- t11: return nested pointer ---
72 type S11 struct{ X int32 }
73 type S11w struct{ P *S11 }
74
75 func f11() (r S11w) { r.P = &S11{X: 99}; return r }
76
77 // --- t12: return map struct ---
78 type S12 struct{ M map[string]int32 }
79
80 func f12() (r S12) { r.M = map[string]int32{}; r.M["one"] = 1; return r }
81
82 // --- Main ---
83
84 func main() {
85 // Build the test name from args (simplest: run all)
86 all := true
87
88 if all {
89 r1 := f1(); check(r1.V == "hello", "t1_string_ret")
90 }
91 if all {
92 r2 := f2(); check(r2.V == "ptr", "t2_ptr_ret")
93 }
94 if all {
95 r3 := f3(); check(r3 == 42, "t3_int32_ret")
96 }
97 if all {
98 r4 := f4(); check(r4, "t4_bool_ret")
99 }
100 if all {
101 os.Stdout.Write([]byte("pre-f5\n"))
102 r5 := f5()
103 os.Stdout.Write([]byte("post-f5\n"))
104 check(len(r5.D) == 5 && r5.D[0] == 1, "t5_slice_ret")
105 }
106 if all {
107 r6 := &S6{M: map[string]string{}}; r6.put("k", "v")
108 check(r6.M["k"] == "v", "t6_recv_map")
109 }
110 if all {
111 r7 := &S7{D: []int32{1, 2, 3}}; r7.grow()
112 check(len(r7.D) == 4 && r7.D[0] == 1 && r7.D[3] == 99, "t7_recv_slice")
113 }
114 if all {
115 r8 := &S8w{}; r8.create()
116 check(r8.P != nil && r8.P.X == 42, "t8_recv_ptr")
117 }
118 if all {
119 r9 := &S9b{}; r9.init(); r9.add()
120 check(len(r9.L.D) == 2 && r9.L.D[0] == 0, "t9_nested_recv")
121 }
122 if all {
123 a, b := f10(); check(a == 7 && b == "seven", "t10_multi_ret")
124 }
125 if all {
126 r11 := f11(); check(r11.P != nil && r11.P.X == 99, "t11_nested_ptr_ret")
127 }
128 if all {
129 r12 := f12(); check(r12.M["one"] == 1, "t12_map_ret")
130 }
131 }
132