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