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