main.mx.bak raw
1 package main
2
3 import "os"
4
5 var ok int32
6
7 func check(cond bool, name string) {
8 if cond {
9 ok++
10 } else {
11 os.Stdout.Write([]byte("FAIL "))
12 os.Stdout.Write([]byte(name))
13 os.Stdout.Write([]byte("\n"))
14 }
15 }
16
17 // --- Return value tests ---
18
19 type StrRet struct {
20 V string
21 }
22
23 func testReturnString() (r StrRet) {
24 r.V = "hello"
25 return r
26 }
27
28 func testReturnPtr() (r *StrRet) {
29 r = &StrRet{V: "ptr"}
30 return r
31 }
32
33 func testReturnInt32() (n int32) {
34 return int32(42)
35 }
36
37 func testReturnBool() (b bool) {
38 return true
39 }
40
41 type SliceRet struct {
42 Data []int32
43 }
44
45 func testReturnSliceStruct() (r SliceRet) {
46 r.Data = []int32{1, 2, 3, 4, 5}
47 return r
48 }
49
50 type MapRet struct {
51 M map[string]int32
52 }
53
54 func testReturnMapStruct() (r MapRet) {
55 r.M = map[string]int32{}
56 r.M["one"] = 1
57 r.M["two"] = 2
58 return r
59 }
60
61 type Inner struct {
62 X int32
63 }
64
65 type Outer1 struct {
66 P *Inner
67 }
68
69 func testReturnNestedPtr() (r Outer1) {
70 r.P = &Inner{X: 99}
71 return r
72 }
73
74 func testReturnMulti() (a int32, b string) {
75 return int32(7), "seven"
76 }
77
78 // --- Receiver write tests ---
79
80 type RecvS struct {
81 D []int32
82 }
83
84 func (s *RecvS) grow() {
85 s.D = appendOne(s.D, 99)
86 }
87
88 type RecvM struct {
89 M map[string]string
90 }
91
92 func (m *RecvM) put(k string, v string) {
93 m.M[k] = v
94 }
95
96 type RecvP struct {
97 P *Inner
98 }
99
100 func (p *RecvP) create() {
101 p.P = &Inner{X: 42}
102 }
103
104 type Level1 struct {
105 L2 *RecvS
106 }
107
108 func (l1 *Level1) setup() {
109 l1.L2 = &RecvS{D: []int32{0}}
110 }
111
112 func (l1 *Level1) more(v int32) {
113 l1.L2.grow()
114 }
115
116 // --- Helpers ---
117
118 func appendOne(s []int32, v int32) (r []int32) {
119 n := len(s)
120 r = []int32{:n + 1}
121 for i := int32(0); i < n; i++ {
122 r[i] = s[i]
123 }
124 r[n] = v
125 return r
126 }
127
128 func itoa(n int32) (s string) {
129 if n == 0 {
130 return "0"
131 }
132 buf := []byte{:0:10}
133 for n > 0 {
134 push(buf, '0'+n%10)
135 n /= 10
136 }
137 for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 {
138 buf[i], buf[j] = buf[j], buf[i]
139 }
140 return string(buf)
141 }
142
143 // --- Main ---
144
145 func main() {
146 // Test 1
147 r1 := testReturnString()
148 check(r1.V == "hello", "returnString")
149
150 // Test 2
151 r2 := testReturnPtr()
152 check(r2.V == "ptr", "returnPtr")
153
154 // Test 3
155 r3 := testReturnInt32()
156 check(r3 == 42, "returnInt32")
157
158 // Test 4
159 r4 := testReturnBool()
160 check(r4, "returnBool")
161
162 // Test 5
163 r5 := testReturnSliceStruct()
164 check(len(r5.Data) == 5 && r5.Data[0] == 1, "returnSliceStruct")
165
166 // Test 6
167 r6 := testReturnMapStruct()
168 check(r6.M["one"] == 1 && r6.M["two"] == 2, "returnMapStruct")
169
170 // Test 7
171 r7 := testReturnNestedPtr()
172 check(r7.P != nil && r7.P.X == 99, "returnNestedPtr")
173
174 // Test 8
175 r8a, r8b := testReturnMulti()
176 check(r8a == 7 && r8b == "seven", "returnMulti")
177
178 // Test 9
179 rs := &RecvS{D: []int32{1, 2, 3}}
180 rs.grow()
181 check(len(rs.D) == 4 && rs.D[0] == 1 && rs.D[3] == 99, "recvSliceGrow")
182
183 // Test 10
184 rm := &RecvM{M: map[string]string{}}
185 rm.put("key", "val")
186 check(rm.M["key"] == "val", "recvMapSet")
187
188 // Test 11
189 rp := &RecvP{}
190 rp.create()
191 check(rp.P != nil && rp.P.X == 42, "recvPtrCreate")
192
193 // Test 12
194 l1 := &Level1{}
195 l1.setup()
196 l1.more(10)
197 check(len(l1.L2.D) == 2 && l1.L2.D[0] == 0, "nestedRecv")
198
199 os.Stdout.Write([]byte("ALL "))
200 os.Stdout.Write([]byte(itoa(ok)))
201 os.Stdout.Write([]byte("/12 OK\n"))
202 }
203