github.com/DQNEO/babygo@v0.0.3/t/test.go (about)

     1  package main
     2  
     3  import (
     4  	"github.com/DQNEO/babygo/lib/token"
     5  	"os"
     6  	"reflect"
     7  	"syscall"
     8  	"unsafe"
     9  
    10  	"github.com/DQNEO/babygo/lib/fmt"
    11  	"github.com/DQNEO/babygo/lib/mylib"
    12  	"github.com/DQNEO/babygo/lib/mymap"
    13  	"github.com/DQNEO/babygo/lib/path"
    14  	"github.com/DQNEO/babygo/lib/strconv"
    15  	"github.com/DQNEO/babygo/lib/strings"
    16  )
    17  
    18  var gmp map[string]string = make(map[string]string)
    19  
    20  func testMapForrange() {
    21  	mapExpr := make(map[string]int)
    22  
    23  	var a string
    24  	var b int
    25  
    26  	for a, b = range mapExpr {
    27  		panic("Should not reach here:")
    28  		gString = a
    29  		gInt = b
    30  	}
    31  
    32  	mapExpr["key1"] = 100
    33  	mapExpr["key2"] = 200
    34  	var i int
    35  	for a, b = range mapExpr {
    36  		i++
    37  		//		fmt.Printf("map iteration %d times\n", i)
    38  		//		fmt.Printf("key=%s, ", a)
    39  		//		fmt.Printf("value=%d\n", b)
    40  	}
    41  
    42  	//	for k, v := range mapExpr {
    43  	//		fmt.Printf("key=%s, ", k)
    44  	//		fmt.Printf("value=%d\n", v)
    45  	//	}
    46  	mapExpr = nil
    47  	for a, b = range mapExpr {
    48  		panic("Should not reach here:")
    49  		gString = a
    50  		gInt = b
    51  	}
    52  }
    53  
    54  func testGlobalMapOK() {
    55  	mp := gmp
    56  	mp["key1"] = "value1"
    57  
    58  	s, ok := mp["key1"]
    59  	if !ok {
    60  		panic("not found")
    61  	}
    62  	fmt.Printf("key1=>\"%s\"\n", s)
    63  
    64  	s, ok = mp["noexist"]
    65  	if ok {
    66  		panic("ERROR" + s)
    67  	}
    68  	fmt.Printf("noexist=>\"%s\"\n", s)
    69  }
    70  
    71  func testMapOK() {
    72  	mp := make(map[string]string)
    73  	mp["key1"] = "value1"
    74  
    75  	s, ok := mp["key1"]
    76  	if !ok {
    77  		panic("not found")
    78  	}
    79  	fmt.Printf("key1=>\"%s\"\n", s)
    80  
    81  	s, ok = mp["noexist"]
    82  	if ok {
    83  		panic("ERROR" + s)
    84  	}
    85  	fmt.Printf("noexist=>\"%s\"\n", s)
    86  }
    87  
    88  func testMap() {
    89  	mp := make(map[string]string)
    90  	fmt.Printf("len=>\"%d\"\n", len(mp))
    91  	mp["key1"] = "value1"
    92  	fmt.Printf("len=>\"%d\"\n", len(mp))
    93  	var s0 string = mp["noexist"]
    94  	fmt.Printf("noexist=>\"%s\"\n", s0)
    95  
    96  	var s1 string = mp["key1"]
    97  	fmt.Printf("key1=>\"%s\"\n", s1)
    98  	var s2 string = mp["key2"]
    99  	fmt.Printf("key2=>\"%s\"\n", s2)
   100  
   101  	mp["key2"] = "value2"
   102  
   103  	s2 = mp["key2"]
   104  	fmt.Printf("key2=>\"%s\"\n", s2)
   105  
   106  	fmt.Printf("len=>\"%d\"\n", len(mp))
   107  
   108  	delete(mp, "key1")
   109  	s1 = mp["key1"]
   110  	fmt.Printf("key1=>\"%s\"\n", s1)
   111  	fmt.Printf("len=>\"%d\"\n", len(mp))
   112  
   113  	fmt.Printf("--------\n")
   114  
   115  	var mp2 = make(map[unsafe.Pointer]int)
   116  	fmt.Printf("len=>\"%d\"\n", len(mp2))
   117  	i := mp2[unsafe.Pointer(&s0)]
   118  	fmt.Printf("i=>%d\n", i)
   119  	mp2[unsafe.Pointer(&s0)] = 2
   120  	i = mp2[unsafe.Pointer(&s0)]
   121  	fmt.Printf("i=>%d\n", i)
   122  
   123  	return
   124  }
   125  
   126  func testMyMap() {
   127  	mp := &mymap.Map{}
   128  	fmt.Printf("mp.Len=%d\n", mp.Len()) // => 0
   129  
   130  	mp.Set("a", 11)
   131  	mp.Set("bb", 22)
   132  	fmt.Printf("mp.Len=%d\n", mp.Len()) // => 2
   133  
   134  	v1, ok1 := mp.Get("a")
   135  	if !ok1 {
   136  		panic("not found")
   137  	}
   138  	fmt.Printf("mp.a=%d\n", v1.(int)) // => 11
   139  
   140  	v2, ok2 := mp.Get("bb")
   141  	if !ok2 {
   142  		panic("not found")
   143  	}
   144  	fmt.Printf("mp.bb=%d\n", v2.(int)) // => 22
   145  
   146  	mp.Set("ccc", 333)
   147  	v3, ok3 := mp.Get("ccc")
   148  	if !ok3 {
   149  		panic("not found")
   150  	}
   151  	fmt.Printf("mp.ccc=%d\n", v3.(int)) // => 333
   152  
   153  	mp.Delete("bb")
   154  	fmt.Printf("mp.Len=%d\n", mp.Len()) // => 2
   155  	v2, ok2 = mp.Get("bb")
   156  	if ok2 {
   157  		panic("should not be present")
   158  	}
   159  	if v2 == nil {
   160  		fmt.Printf("mp.bb is nil\n")
   161  	}
   162  
   163  	mp.Delete("a")
   164  	fmt.Printf("mp.Len=%d\n", mp.Len()) // => 1
   165  
   166  	mp.Delete("ccc")
   167  	fmt.Printf("mp.Len=%d\n", mp.Len()) // => 0
   168  }
   169  
   170  type Expr interface{}
   171  
   172  func testTypeSwitchNil() {
   173  	var val Expr
   174  	val = nil
   175  	switch vl := val.(type) {
   176  	case string:
   177  		panic("ERROR 0" + vl)
   178  	case int:
   179  		panic("ERROR 1")
   180  	default:
   181  		panic("ERROR 2")
   182  	case nil:
   183  		fmt.Printf("I am nil\n")
   184  	}
   185  
   186  }
   187  func testStructPointerMethodsByValue() {
   188  	var p = MyStruct{
   189  		field1: 10,
   190  	}
   191  
   192  	var f1 = p.getField1() // infer method return type
   193  	writeln(f1)
   194  	p.setField1(20)
   195  	writeln(strconv.Itoa(p.getField1()))
   196  }
   197  
   198  func testTokenString() {
   199  	tok := token.Token("hello")
   200  	fmt.Printf("%s\n", tok.String())
   201  }
   202  
   203  func testAssignIncDec() {
   204  	var i int = 1
   205  	i += 10
   206  	fmt.Printf("i=%d\n", i)
   207  	i -= 3
   208  	fmt.Printf("i=%d\n", i)
   209  }
   210  
   211  type Type = mylib.Type
   212  
   213  func testTypeAlias() {
   214  	var mt *Type = &Type{
   215  		Field: 216,
   216  	}
   217  	fmt.Printf("mt.field=%d\n", mt.Field)
   218  }
   219  
   220  func testDerivedString() {
   221  	var qi QualifiedIdent = "hello"
   222  	sqi := string(qi)
   223  	fmt.Printf("sqi=%s\n", sqi)
   224  }
   225  
   226  type QualifiedIdent string
   227  
   228  func testForeignType() {
   229  	mt := &mylib.Type{
   230  		Field: 216,
   231  	}
   232  	fmt.Printf("mt.field=%d\n", mt.Method())
   233  }
   234  
   235  func returnMixed() (int, string, uint8, interface{}, int) {
   236  	return 123, "456", 'a', nil, 789
   237  }
   238  
   239  func returnStrings() (string, string, string) {
   240  	return "aaa", "bbb", "ccc"
   241  }
   242  
   243  func returnInts() (int, int, int) {
   244  	return 1000, 2000, 3000
   245  }
   246  
   247  func returnUint8s(a uint8, b uint8, c uint8) (uint8, uint8, uint8) {
   248  	return a, b, c
   249  }
   250  
   251  func testReturnMixed() {
   252  	var a int
   253  	var b string
   254  	var c uint8
   255  	var d interface{}
   256  	var e int
   257  	a, b, c, d, e = returnMixed()
   258  	fmt.Printf("abce=%d,%s,%s.%d\n", a, b, string([]uint8{c}), e)
   259  	geface = d
   260  }
   261  
   262  func testReturnStrings() {
   263  	var a string
   264  	var b string
   265  	var c string
   266  	a, b, c = returnStrings()
   267  	fmt.Printf("abc=%s,%s,%s\n", a, b, c)
   268  }
   269  
   270  func testReturnInts() {
   271  	var a int
   272  	var b int
   273  	var c int
   274  	a, b, c = returnInts()
   275  	fmt.Printf("abc=%d,%d,%d\n", a, b, c)
   276  }
   277  
   278  func testReturnUint8s() {
   279  	var a uint8
   280  	var b uint8
   281  	var c uint8
   282  	a, b, c = returnUint8s('A', 'B', 'C')
   283  	fmt.Printf("abc=%s\n", string([]uint8{a, b, c}))
   284  }
   285  
   286  func receiveBytes(a uint8, b uint8, c uint8) uint8 {
   287  	var r uint8 = c
   288  	return r
   289  }
   290  
   291  func testPassBytes() {
   292  	var a uint8 = 'a'
   293  	var b uint8 = 'b'
   294  	rc := receiveBytes(a, b, 'c')
   295  	buf := []uint8{rc}
   296  	s := string(buf)
   297  	fmt.Printf("s=%s\n", s)
   298  }
   299  
   300  func testSprinfMore() {
   301  	var s string
   302  	s = fmt.Sprintf("hello")
   303  	writeln(s)
   304  	s = fmt.Sprintf("%%rax")
   305  	writeln(s)
   306  
   307  	var i int = 1234
   308  	s = fmt.Sprintf("number %d", i)
   309  	writeln(s)
   310  
   311  	var str = "I am string"
   312  	s = fmt.Sprintf("string %s", str)
   313  	writeln(s)
   314  
   315  	s = fmt.Sprintf("types are %T", str)
   316  	writeln(s)
   317  
   318  	s = fmt.Sprintf("types are %T", i)
   319  	writeln(s)
   320  
   321  	s = fmt.Sprintf("types are %T", &i)
   322  	writeln(s)
   323  
   324  	s = fmt.Sprintf("%d", "xyz")
   325  	writeln(s)
   326  
   327  	var a []interface{} = make([]interface{}, 3, 3)
   328  	a[0] = 1234
   329  	a[1] = "c"
   330  	a[2] = "efg"
   331  	s = fmt.Sprintf("%dab%sd%s", a...)
   332  	writeln(s)
   333  
   334  	// type mismatch cases
   335  	s = fmt.Sprintf("string %d", str)
   336  	writeln(s)
   337  
   338  	s = fmt.Sprintf("%s", 123)
   339  	writeln(s)
   340  
   341  }
   342  
   343  var anotherVar string = "Another Hello\n"
   344  
   345  func testAnotherFile() {
   346  	anotherFunc()
   347  }
   348  
   349  func testSortStrings() {
   350  	ss := []string{
   351  		// sample strings
   352  		"github.com/DQNEO/babygo/lib/strings",
   353  		"unsafe",
   354  		"reflect",
   355  		"github.com/DQNEO/babygo/lib/fmt",
   356  		"github.com/DQNEO/babygo/lib/mylib2",
   357  		"github.com/DQNEO/babygo/lib/strconv",
   358  		"syscall",
   359  		"github.com/DQNEO/babygo/lib/mylib",
   360  		"github.com/DQNEO/babygo/lib/path",
   361  		"os",
   362  	}
   363  
   364  	fmt.Printf("--------------------------------\n")
   365  	for _, s := range ss {
   366  		fmt.Printf("%s\n", s)
   367  	}
   368  	mylib.SortStrings(ss)
   369  	fmt.Printf("--------------------------------\n")
   370  	for _, s := range ss {
   371  		fmt.Printf("%s\n", s)
   372  	}
   373  }
   374  
   375  func testGetdents64() {
   376  	// This succeeds only when invoked from babygo's root directory
   377  	dirents := mylib.GetDirents("./t") // fd should be 3
   378  	var counter int
   379  	for _, dirent := range dirents {
   380  		if dirent == "." || dirent == ".." {
   381  			continue
   382  		}
   383  		counter++
   384  	}
   385  	fmt.Printf("%d\n", counter)
   386  }
   387  
   388  func testEnv() {
   389  	var gopath string = os.Getenv("FOO")
   390  	fmt.Printf("env FOO=%s\n", gopath)
   391  }
   392  
   393  func testReflect() {
   394  	var i int = 123
   395  	rt := reflect.TypeOf(i)
   396  	fmt.Printf("%s\n", rt.String()) // int
   397  
   398  	rt = reflect.TypeOf(&i)
   399  	fmt.Printf("%s\n", rt.String()) // *int
   400  
   401  	rt = reflect.TypeOf("hello")
   402  	fmt.Printf("%s\n", rt.String()) // string
   403  
   404  	myStruct := MyStruct{}
   405  	rt = reflect.TypeOf(myStruct)
   406  	fmt.Printf("%s\n", rt.String()) // main.MyStruct
   407  
   408  	myStructP := &MyStruct{}
   409  	rt = reflect.TypeOf(myStructP)
   410  	fmt.Printf("%s\n", rt.String()) // *main.MyStruct
   411  }
   412  
   413  func returnSlice() []string {
   414  	r := []string{"aa", "bb", "cc"}
   415  	return r
   416  }
   417  
   418  func testReturnSlice() {
   419  	slice := returnSlice()
   420  	write(slice[0])
   421  	write(slice[1])
   422  	writeln(slice[2])
   423  }
   424  
   425  func testStrings() {
   426  	// Split
   427  	s := strings.Split("foo/bar", "/")
   428  	fmt.Printf("%d\n", len(s)+1) // 3
   429  	fmt.Printf("%s\n", s[0])     // foo
   430  	fmt.Printf("%s\n", s[1])     // bar
   431  
   432  	target := "foo bar buz"
   433  	if !strings.HasPrefix(target, "foo") {
   434  		panic("error")
   435  	}
   436  
   437  	if strings.HasPrefix(target, " ") {
   438  		panic("error")
   439  	}
   440  
   441  	if strings.HasPrefix(target, "buz") {
   442  		panic("error")
   443  	}
   444  
   445  	s2 := "main.go"
   446  	suffix := ".go"
   447  	if strings.HasSuffix(s2, suffix) {
   448  		fmt.Printf("1\n")
   449  	} else {
   450  		panic("ERROR")
   451  	}
   452  
   453  	if strings.Contains("foo/bar", "/") {
   454  		fmt.Printf("ok\n")
   455  	} else {
   456  		panic("ERROR")
   457  	}
   458  }
   459  
   460  // https://golang.org/ref/spec#Slice_expressions
   461  func testSliceExpr() {
   462  	a := [5]int{1, 2, 3, 4, 5}
   463  	var s []int
   464  	s = a[1:4]
   465  	for _, elm := range s {
   466  		write(elm)
   467  	}
   468  	write(len(s))
   469  	write(cap(s))
   470  	writeln("")
   471  
   472  	s = a[:2]
   473  	for _, elm := range s {
   474  		write(elm)
   475  	}
   476  	write(len(s))
   477  	write(cap(s))
   478  	writeln("")
   479  
   480  	s = a[1:]
   481  	for _, elm := range s {
   482  		write(elm)
   483  	}
   484  	write(len(s))
   485  	write(cap(s))
   486  	writeln("")
   487  
   488  	s = a[:]
   489  	for _, elm := range s {
   490  		write(elm)
   491  	}
   492  	write(len(s))
   493  	write(cap(s))
   494  	writeln("")
   495  
   496  	str := "12345"
   497  	str2 := str[:]
   498  	writeln(str2)
   499  	writeln(str[1:])
   500  	writeln(str[:4])
   501  	writeln(str[1:3])
   502  }
   503  
   504  func testPath() {
   505  	// Copied from https://golang.org/pkg/path/#Base
   506  	writeln(path.Base("/a/b"))
   507  	writeln(path.Base("/"))
   508  	writeln(path.Base(""))
   509  
   510  	// Copied from https://golang.org/pkg/mylib/#Dir
   511  	writeln(path.Dir("/a/b/c"))
   512  	writeln(path.Dir("a/b/c"))
   513  	writeln(path.Dir("/a/"))
   514  	writeln(path.Dir("a/"))
   515  	writeln(path.Dir("/"))
   516  	writeln(path.Dir(""))
   517  }
   518  
   519  func testByteType() {
   520  	var b byte = uint8('x')
   521  	var s string = string([]byte{b})
   522  	writeln(s)
   523  }
   524  
   525  func testExtLib() {
   526  	y := mylib.Sum2(3, 4)
   527  	write("# testExtLib() => ")
   528  	writeln(strconv.Itoa(y))
   529  }
   530  
   531  func passVargs(a ...interface{}) {
   532  	takeInterfaceVaargs(a...)
   533  }
   534  
   535  func takeStringVaargs(a ...string) {
   536  	writeln(len(a))
   537  	for _, s := range a {
   538  		writeln(s)
   539  	}
   540  }
   541  
   542  func testExpandSlice() {
   543  	var slicexxx = []interface{}{2, 4, 6}
   544  	nop()
   545  	passVargs(slicexxx...)
   546  
   547  	takeStringVaargs("foo", "bar", "buz")
   548  }
   549  
   550  var gArrayForFullSlice [3]int
   551  
   552  func testFullSlice() {
   553  	gArrayForFullSlice = [3]int{
   554  		2,
   555  		4,
   556  		6,
   557  	}
   558  
   559  	for _, i := range gArrayForFullSlice {
   560  		writeln(i)
   561  	}
   562  
   563  	fullSlice := gArrayForFullSlice[1:2:3]
   564  	writeln(cap(fullSlice))
   565  
   566  	for _, i := range fullSlice {
   567  		writeln(i)
   568  	}
   569  }
   570  
   571  func takeInterfaceVaargs(a ...interface{}) {
   572  	writeln(len(a))
   573  	for _, ifc := range a {
   574  		writeln(ifc)
   575  	}
   576  }
   577  
   578  func testInterfaceVaargs() {
   579  	var i = 1419
   580  	var s = "s1419"
   581  	takeInterfaceVaargs(i, s)
   582  }
   583  
   584  var gefacearray [3]interface{}
   585  
   586  func returnInterface() interface{} {
   587  	return 14
   588  }
   589  
   590  func testConvertToInterface() {
   591  	// Explicit conversion
   592  	var ifc interface{} = interface{}(7)
   593  	var i int
   594  	i, _ = ifc.(int)
   595  	writeln(i)
   596  
   597  	// Implicit conversion to variable
   598  	var j int = 8
   599  	ifc = j
   600  	i, _ = ifc.(int)
   601  	writeln(i)
   602  
   603  	// Implicit conversion to struct field
   604  	var k int = 9
   605  	var strct MyStruct
   606  	strct.ifc = k
   607  	i, _ = strct.ifc.(int)
   608  	writeln(i)
   609  
   610  	// Implicit conversion to array element
   611  	var l int = 10
   612  	gefacearray[2] = l
   613  	i, _ = gefacearray[2].(int)
   614  	writeln(i)
   615  
   616  	// Implicit conversion to struct literal
   617  	k = 11
   618  	strct = MyStruct{
   619  		field1: 1,
   620  		field2: 2,
   621  		ifc:    k,
   622  	}
   623  	i, _ = strct.ifc.(int)
   624  	writeln(i)
   625  
   626  	// Implicit conversion to array literal
   627  	gefacearray = [3]interface{}{
   628  		0,
   629  		0,
   630  		12,
   631  	}
   632  	i, _ = gefacearray[2].(int)
   633  	writeln(i)
   634  
   635  	// Implicit conversion to function call
   636  	l = 13
   637  	takeInterface(l)
   638  
   639  	// Implicit conversion to return
   640  	ifc = returnInterface()
   641  	i, _ = ifc.(int)
   642  	writeln(i)
   643  
   644  	// Implicit conversion to function call (vaargs)
   645  }
   646  
   647  func testTypeSwitch() {
   648  	var ifc EmptyInterface
   649  	var i int = 7
   650  	ifc = &i
   651  	switch ifc.(type) {
   652  	case *int:
   653  		x := ifc.(*int)
   654  		writeln("type is *int")
   655  		writeln(strconv.Itoa(*x))
   656  	case string:
   657  		x := ifc.(string)
   658  		writeln("type is string")
   659  		writeln(x)
   660  	default:
   661  		panic("ERROR")
   662  	}
   663  
   664  	var s string = "abcde"
   665  	ifc = s
   666  	switch xxx := ifc.(type) {
   667  	case int:
   668  		writeln("type is int")
   669  		var zzzzz = xxx // test inference of xxx
   670  		writeln(zzzzz)
   671  	case string:
   672  		writeln("type is string")
   673  		writeln(xxx)
   674  	case nil:
   675  		writeln(xxx)
   676  	default:
   677  		panic("ERROR")
   678  	}
   679  
   680  	var srct MyStruct = MyStruct{
   681  		field1: 111,
   682  		field2: 222,
   683  	}
   684  	ifc = srct
   685  	switch yyy := ifc.(type) {
   686  	case MyStruct:
   687  		writeln("type is MySruct")
   688  		writeln(strconv.Itoa(yyy.field2))
   689  	default:
   690  		panic("ERROR")
   691  	}
   692  	ifc = true
   693  	switch ifc.(type) {
   694  	case int:
   695  		panic("ERROR")
   696  	case string:
   697  		panic("ERROR")
   698  	default:
   699  		writeln("type is bool")
   700  	}
   701  
   702  	ifc = nil
   703  	switch ifc.(type) {
   704  	case nil:
   705  		writeln("ifc is nil")
   706  	case int:
   707  		panic("ERROR")
   708  	case string:
   709  		panic("ERROR")
   710  	default:
   711  		writeln("type is bool")
   712  	}
   713  }
   714  
   715  func makeInterface() interface{} {
   716  	var r interface{} = 1829
   717  	return r
   718  }
   719  
   720  func testGetInterface() {
   721  	var x interface{} = makeInterface()
   722  	var i int
   723  	var ok bool
   724  	i, ok = x.(int)
   725  	if ok {
   726  		writeln(i)
   727  	}
   728  }
   729  
   730  func takeInterface(ifc interface{}) {
   731  	var s int
   732  	var ok bool
   733  	s, ok = ifc.(int)
   734  	if ok {
   735  		writeln(s)
   736  	}
   737  }
   738  
   739  func testPassInterface() {
   740  	var s int = 1537
   741  	var ifc interface{} = s
   742  	takeInterface(ifc)
   743  }
   744  
   745  type EmptyInterface interface {
   746  }
   747  
   748  func testInterfaceAssertion() {
   749  	var ifc interface{}
   750  	var ifc2 EmptyInterface
   751  
   752  	var ok bool
   753  	var i int = 20210124
   754  	ifc = i
   755  	writeln("aaaa")
   756  	i, ok = ifc.(int)
   757  	if ok {
   758  		writeln(" type matched")
   759  		write(strconv.Itoa(i))
   760  	} else {
   761  		panic("FAILED")
   762  	}
   763  
   764  	var j int
   765  	j = ifc.(int)
   766  	write(strconv.Itoa(j))
   767  	_, ok = ifc.(int) // error!!!
   768  	if ok {
   769  		writeln("ok")
   770  	} else {
   771  		panic("FAILED")
   772  	}
   773  
   774  	i, _ = ifc.(int)
   775  	write(strconv.Itoa(i))
   776  
   777  	_, _ = ifc.(int)
   778  	writeln("end of testInterfaceAssertion")
   779  	var s string
   780  	s, ok = ifc.(string)
   781  	writeln(s)
   782  	if ok {
   783  		panic("FAILED")
   784  	} else {
   785  		writeln(s)
   786  	}
   787  	s = "I am string"
   788  	ifc2 = s
   789  	s, ok = ifc2.(string)
   790  	writeln(s)
   791  	if ok {
   792  		writeln("ok")
   793  	} else {
   794  		panic("FAILED")
   795  	}
   796  
   797  	ifc2 = nil
   798  	s, ok = ifc2.(string)
   799  	if ok {
   800  		panic("FAILED")
   801  	} else {
   802  		writeln(s)
   803  	}
   804  }
   805  
   806  func testInterfaceimplicitConversion() {
   807  	var eface interface{}
   808  	var i int = 7
   809  	eface = i
   810  	geface = eface
   811  	writeln("1111")
   812  	if geface == eface {
   813  		writeln("eface match")
   814  	}
   815  	writeln("22222")
   816  	var x **[1][]*int
   817  	writeln("3333")
   818  	eface = x
   819  	writeln("4444")
   820  	if geface != eface {
   821  		writeln("eface not match")
   822  	}
   823  	var m MyType
   824  	eface = m
   825  	if geface != eface {
   826  		writeln("eface not match")
   827  	}
   828  }
   829  
   830  var geface interface{}
   831  
   832  func testInterfaceZeroValue() {
   833  	var eface interface{}
   834  	if eface == nil {
   835  		writeln("eface is nil")
   836  	}
   837  	if geface == nil {
   838  		writeln("geface is nil")
   839  	}
   840  	geface = eface
   841  	if geface == nil {
   842  		writeln("geface is nil")
   843  	}
   844  	eface = geface
   845  	if eface == nil {
   846  		writeln("eface is nil")
   847  	}
   848  }
   849  
   850  func testForRangeShortDecl() {
   851  	var ary []int = []int{3, 2, 1, 0}
   852  
   853  	for _, w := range ary {
   854  		write(strconv.Itoa(w))
   855  	}
   856  	writeln("")
   857  
   858  	var i int = 20210122
   859  	for i, www := range ary {
   860  		write(strconv.Itoa(i))
   861  		write(strconv.Itoa(www))
   862  	}
   863  	writeln("")
   864  
   865  	writeln(i)
   866  }
   867  
   868  var gi = 123   // int
   869  var gs = "abc" // string
   870  var gstrctPtr = &MyStruct{
   871  	field2: 456,
   872  }
   873  
   874  func testInferVarTypes() {
   875  	// type by literal
   876  	var gstrct = MyStruct{
   877  		field1: 789,
   878  	}
   879  
   880  	var gslc = []int{1, 2, 3}
   881  
   882  	writeln(gi)
   883  	writeln(gs)
   884  	writeln(strconv.Itoa(gslc[2]))
   885  	writeln(strconv.Itoa(gstrctPtr.field2))
   886  	writeln(strconv.Itoa(gstrct.field1))
   887  }
   888  
   889  var gInt int = 1010
   890  var gBool bool = true
   891  var gString string = "gString"
   892  var gPointer *MyStruct = &MyStruct{
   893  	field1: 11,
   894  	field2: 22,
   895  }
   896  
   897  var gChar uint8 = 'A'
   898  
   899  func testGlobalValues() {
   900  	writeln(gInt)
   901  	if gBool {
   902  		writeln("gBool is true")
   903  	}
   904  	writeln(gString)
   905  	writeln(strconv.Itoa(gPointer.field2))
   906  	writeln(strconv.Itoa(int(gChar)))
   907  }
   908  
   909  func testShortVarDecl() {
   910  	x := 123
   911  	writeln(x)
   912  
   913  	var p = &MyStruct{
   914  		field1: 10,
   915  	}
   916  
   917  	f1 := p.getField1() // infer method return type
   918  	writeln(f1)
   919  
   920  	s := "infer string literal"
   921  	writeln(s)
   922  
   923  	i := 3 + 5
   924  	j := i
   925  	writeln(j)
   926  }
   927  
   928  func testStructPointerMethods() {
   929  	var p = &MyStruct{
   930  		field1: 10,
   931  	}
   932  
   933  	var f1 = p.getField1() // infer method return type
   934  	writeln(f1)
   935  	p.setField1(20)
   936  	writeln(strconv.Itoa(p.getField1()))
   937  }
   938  
   939  func (p *MyStruct) getField1() int {
   940  	return p.field1
   941  }
   942  
   943  func (p *MyStruct) setField1(x int) {
   944  	p.field1 = x
   945  }
   946  
   947  type T int
   948  
   949  //type MV interface {
   950  //	mv(int)
   951  //}
   952  //
   953  //type MP interface {
   954  //	mp(int)
   955  //}
   956  
   957  func (v T) mv(a int) {
   958  	v = T(a)
   959  }
   960  
   961  func (p *T) mp(a int) {
   962  	*p = T(a)
   963  }
   964  
   965  //func testBasicMethodCalls() {
   966  //	var v T = 1
   967  //	writeln(mylib.Itoa(int(v)))
   968  //	v.mv(2) // ordinary
   969  //	writeln(mylib.Itoa(int(v)))
   970  //	v.mp(3) // (&v).mp()
   971  //	writeln(mylib.Itoa(int(v)))
   972  //
   973  //	var p *T = &v
   974  //	p.mp(4) // ordinary
   975  //	writeln(mylib.Itoa(int(v)))
   976  //	p.mv(5) // (*p).mv()
   977  //	writeln(mylib.Itoa(int(v)))
   978  //}
   979  
   980  func testPointerMethod() {
   981  	var v T = 1
   982  	v.mv(2)
   983  	writeln(strconv.Itoa(int(v)))
   984  
   985  	var p *T = &v
   986  	p.mp(3)
   987  	writeln(strconv.Itoa(int(v)))
   988  }
   989  
   990  type MyAnotherType int
   991  
   992  func (x MyAnotherType) add10() int {
   993  	return int(x) + 10
   994  }
   995  
   996  func testMethodAnother() {
   997  	var x MyAnotherType = 10
   998  	var y int = x.add10()
   999  	writeln(y)
  1000  }
  1001  
  1002  type MyType int
  1003  
  1004  func add10(x MyType) int {
  1005  	return int(x) + 10
  1006  }
  1007  
  1008  func (x MyType) add10() int {
  1009  	return int(x) + 10
  1010  }
  1011  
  1012  func testMethodSimple() {
  1013  	var x MyType = 4
  1014  	writeln(strconv.Itoa(x.add10()))
  1015  	writeln(strconv.Itoa(add10(x)))
  1016  }
  1017  
  1018  func testOsArgs() {
  1019  	if len(os.Args) > 1 {
  1020  		writeln(os.Args[1])
  1021  	}
  1022  }
  1023  
  1024  func testStructLiteralWithContents() {
  1025  	var strct = MyStruct{
  1026  		field1: 10,
  1027  		field2: 20,
  1028  	}
  1029  	writeln(strconv.Itoa(strct.field1))
  1030  	writeln(strconv.Itoa(strct.field2))
  1031  
  1032  	var strct2 = MyStruct{
  1033  		field2: 20,
  1034  	}
  1035  	writeln(strconv.Itoa(strct2.field1))
  1036  	writeln(strconv.Itoa(strct2.field2))
  1037  
  1038  	var strctp = &MyStruct{
  1039  		field1: 30,
  1040  		field2: 40,
  1041  	}
  1042  	writeln(strconv.Itoa(strctp.field1))
  1043  	writeln(strconv.Itoa(strctp.field2))
  1044  }
  1045  
  1046  func returnPointerOfStruct() *MyStruct {
  1047  	var strct *MyStruct = &MyStruct{}
  1048  	strct.field1 = 345
  1049  	strct.field2 = 678
  1050  	return strct
  1051  }
  1052  
  1053  func testAddressOfStructLiteral() {
  1054  	var strct *MyStruct = returnPointerOfStruct()
  1055  	writeln(strconv.Itoa(strct.field1))
  1056  	writeln(strconv.Itoa(strct.field2))
  1057  }
  1058  
  1059  func testStructCopy() {
  1060  	var strct MyStruct = MyStruct{}
  1061  	strct.field1 = 123
  1062  	strct.field2 = 456
  1063  
  1064  	var strct2 MyStruct = MyStruct{}
  1065  	strct2 = strct
  1066  
  1067  	writeln(strconv.Itoa(strct2.field1))
  1068  	writeln(strconv.Itoa(strct2.field2))
  1069  
  1070  	// assert 2 struct does not share memory
  1071  	strct2.field1 = 789
  1072  	writeln(strconv.Itoa(strct.field1))
  1073  }
  1074  
  1075  func testStructLiteral() {
  1076  	var strct MyStruct = MyStruct{}
  1077  	writeln(strconv.Itoa(strct.field1))
  1078  	writeln(strconv.Itoa(strct.field2))
  1079  
  1080  	strct.field1 = 123
  1081  	strct.field2 = 456
  1082  
  1083  	writeln(strconv.Itoa(strct.field1))
  1084  	writeln(strconv.Itoa(strct.field2))
  1085  }
  1086  
  1087  func testStructZeroValue() {
  1088  	var strct MyStruct
  1089  	writeln(strconv.Itoa(strct.field1))
  1090  	writeln(strconv.Itoa(strct.field2))
  1091  }
  1092  
  1093  func testAtoi() {
  1094  	writeln(strconv.Itoa(strconv.Atoi("")))  // "0"
  1095  	writeln(strconv.Itoa(strconv.Atoi("0"))) // "0"
  1096  	writeln(strconv.Itoa(strconv.Atoi("1")))
  1097  	writeln(strconv.Itoa(strconv.Atoi("12")))
  1098  	writeln(strconv.Itoa(strconv.Atoi("1234567890")))
  1099  	writeln(strconv.Itoa(strconv.Atoi("-1234567890")))
  1100  	writeln(strconv.Itoa(strconv.Atoi("-7")))
  1101  }
  1102  
  1103  func isLetter_(ch uint8) bool {
  1104  	if ch == '_' {
  1105  		return true
  1106  	}
  1107  	return ('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z')
  1108  }
  1109  
  1110  func testIsLetter() {
  1111  	if isLetter_('A') {
  1112  		writeln("OK isLetter A")
  1113  	} else {
  1114  		writeln("ERROR isLetter")
  1115  	}
  1116  
  1117  }
  1118  
  1119  func funcVaarg1(f string, a ...interface{}) {
  1120  	write(fmt.Sprintf(f, a...))
  1121  }
  1122  
  1123  func funcVaarg2(a int, b ...int) {
  1124  	if b == nil {
  1125  		write(strconv.Itoa(a))
  1126  		writeln(" nil vaargs ok")
  1127  	} else {
  1128  		writeln("ERROR")
  1129  	}
  1130  }
  1131  
  1132  func testVaargs() {
  1133  	funcVaarg1("pass nil slice\n")
  1134  	funcVaarg1("%s %s %s\n", "a", "bc", "def")
  1135  	funcVaarg2(777)
  1136  }
  1137  
  1138  const O_READONLY_ int = 0
  1139  const O_CREATE_WRITE int = 524866 // O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC
  1140  
  1141  func testOpenRead() {
  1142  	var fd int
  1143  	fd, _ = syscall.Open("t/text.txt", O_READONLY_, 0)
  1144  	writeln(fd) // should be 4
  1145  	var buf []uint8 = make([]uint8, 300, 300)
  1146  	var n int
  1147  	n, _ = syscall.Read(fd, buf)
  1148  	if n < 279 {
  1149  		panic("ERROR")
  1150  	}
  1151  	writeln(n) // should be 280
  1152  	var readbytes []uint8 = buf[0:n]
  1153  	writeln(string(readbytes))
  1154  	syscall.Close(fd)
  1155  }
  1156  
  1157  func testOpenWrite() {
  1158  	writeln("testOpenWrite")
  1159  
  1160  	//var fd int
  1161  	var fd int
  1162  	fd, _ = syscall.Open("/tmp/bbgwrite.txt", O_CREATE_WRITE, 438)
  1163  	//println(os.O_RDWR|os.O_CREATE|os.O_TRUNC|syscall.O_CLOEXEC)
  1164  	//	println(0666)
  1165  	//	if err != nil {
  1166  	//		panic(err)
  1167  	//	}
  1168  	writeln(fd) // should be 5
  1169  	var buf []uint8 = []uint8{'a', 'b', 'c', 'd', 'e', 'f', 'g', '\n'}
  1170  	var n int
  1171  	n, _ = syscall.Write(fd, buf)
  1172  	writeln(n) // should be 8
  1173  	syscall.Close(fd)
  1174  }
  1175  
  1176  func testInfer() {
  1177  	var s = "infer string literal"
  1178  	writeln(s)
  1179  
  1180  	var i = 3 + 5
  1181  	var j = i
  1182  	writeln(j)
  1183  }
  1184  
  1185  func testEscapedChar() {
  1186  	var chars []uint8 = []uint8{'\\', '\t', '\r', '\'', '\n'}
  1187  	writeln("start")
  1188  	write(string(chars))
  1189  	writeln("end")
  1190  }
  1191  
  1192  func testSwitchString() {
  1193  	var testVar string = "foo"
  1194  	var caseVar string = "fo"
  1195  
  1196  	switch testVar {
  1197  	case "dummy":
  1198  		writeln("ERROR")
  1199  	}
  1200  
  1201  	switch testVar {
  1202  	case "x", caseVar + "o":
  1203  		writeln("swithc string 1 ok")
  1204  	case "", "y":
  1205  		writeln("ERROR")
  1206  	default:
  1207  		writeln("ERROR")
  1208  	}
  1209  
  1210  	switch testVar {
  1211  	case "":
  1212  		writeln("ERROR")
  1213  	case "fo":
  1214  		writeln("ERROR")
  1215  	default:
  1216  		writeln("switch string default ok")
  1217  	case "fooo":
  1218  		writeln("ERROR")
  1219  	}
  1220  }
  1221  
  1222  func testSwitchByte() {
  1223  	var testVar uint8 = 'c'
  1224  	var caseVar uint8 = 'a'
  1225  	switch testVar {
  1226  	case 'b':
  1227  		writeln("ERROR")
  1228  	case caseVar + 2:
  1229  		writeln("switch uint8 ok")
  1230  	default:
  1231  		writeln("ERROR")
  1232  	}
  1233  
  1234  	switch testVar {
  1235  	case 0:
  1236  		writeln("ERROR")
  1237  	case 'b':
  1238  		writeln("ERROR")
  1239  	default:
  1240  		writeln("switch default ok")
  1241  	case 'd':
  1242  		writeln("ERROR")
  1243  	}
  1244  }
  1245  
  1246  func testSwitchInt() {
  1247  	var testVar int = 7
  1248  	var caseVar int = 5
  1249  	switch testVar {
  1250  	case 1:
  1251  		writeln("ERROR")
  1252  	case caseVar + 2:
  1253  		writeln("switch int ok")
  1254  	default:
  1255  		writeln("ERROR")
  1256  	}
  1257  
  1258  	switch testVar {
  1259  	case 0:
  1260  		writeln("ERROR")
  1261  	case 6:
  1262  		writeln("ERROR")
  1263  	default:
  1264  		writeln("switch default ok")
  1265  	case 8:
  1266  		writeln("ERROR")
  1267  	}
  1268  }
  1269  
  1270  func testLogicalAndOr() {
  1271  	var t bool = true
  1272  	var f bool = false
  1273  
  1274  	if t && t {
  1275  		writeln("true && true ok")
  1276  	} else {
  1277  		writeln("ERROR")
  1278  	}
  1279  
  1280  	if t && f {
  1281  		writeln("ERROR")
  1282  	} else {
  1283  		writeln("true && false ok")
  1284  	}
  1285  	if f && t {
  1286  		writeln("ERROR")
  1287  	} else {
  1288  		writeln("false && true ok")
  1289  	}
  1290  	if f && f {
  1291  		writeln("ERROR")
  1292  	} else {
  1293  		writeln("false && false ok")
  1294  	}
  1295  
  1296  	if t || t {
  1297  		writeln("true || true ok")
  1298  	} else {
  1299  		writeln("ERROR")
  1300  	}
  1301  	if t || f {
  1302  		writeln("true || false ok")
  1303  	} else {
  1304  		writeln("ERROR")
  1305  	}
  1306  	if f || t {
  1307  		writeln("false || true ok")
  1308  	} else {
  1309  		writeln("ERROR")
  1310  	}
  1311  	if f || f {
  1312  		writeln("ERROR")
  1313  	} else {
  1314  		writeln("false || false ok")
  1315  	}
  1316  }
  1317  
  1318  const MY_CONST_INT_VALUE int = 24
  1319  
  1320  func testConst() {
  1321  	writeln(strconv.Itoa(MY_CONST_INT_VALUE))
  1322  }
  1323  
  1324  func testForOmissible() {
  1325  	var i int
  1326  	for {
  1327  		i++
  1328  		if i == 2 {
  1329  			break
  1330  		}
  1331  	}
  1332  	write(strconv.Itoa(i))
  1333  
  1334  	i = 0
  1335  	for i < 3 {
  1336  		i++
  1337  	}
  1338  	write(strconv.Itoa(i))
  1339  
  1340  	i = 0
  1341  	for i < 4 {
  1342  		i++
  1343  	}
  1344  	write(strconv.Itoa(i))
  1345  
  1346  	write("\n")
  1347  }
  1348  
  1349  func testForBreakContinue() {
  1350  	var i int
  1351  	for i = 0; i < 10; i = i + 1 {
  1352  		if i == 3 {
  1353  			break
  1354  		}
  1355  		write(strconv.Itoa(i))
  1356  	}
  1357  	write("exit")
  1358  	writeln(strconv.Itoa(i))
  1359  
  1360  	for i = 0; i < 10; i = i + 1 {
  1361  		if i < 7 {
  1362  			continue
  1363  		}
  1364  		write(strconv.Itoa(i))
  1365  	}
  1366  	write("exit")
  1367  	writeln(strconv.Itoa(i))
  1368  
  1369  	var ary []int = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  1370  	for _, i = range ary {
  1371  		if i == 3 {
  1372  			break
  1373  		}
  1374  		write(strconv.Itoa(i))
  1375  	}
  1376  	write("exit")
  1377  	writeln(strconv.Itoa(i))
  1378  	for _, i = range ary {
  1379  		if i < 7 {
  1380  			continue
  1381  		}
  1382  		write(strconv.Itoa(i))
  1383  	}
  1384  	write("exit")
  1385  	writeln(strconv.Itoa(i))
  1386  }
  1387  
  1388  func returnTrue1() bool {
  1389  	var bol bool
  1390  	bol = true
  1391  	return bol
  1392  }
  1393  
  1394  func returnTrue2() bool {
  1395  	var bol bool
  1396  	return !bol
  1397  }
  1398  
  1399  func returnFalse() bool {
  1400  	var bol bool = true
  1401  	return !bol
  1402  }
  1403  
  1404  var globalbool1 bool = true
  1405  var globalbool2 bool = false
  1406  var globalbool3 bool
  1407  
  1408  func testGlobalBool() {
  1409  	if globalbool1 {
  1410  		writeln("globalbool 1 ok")
  1411  	} else {
  1412  		writeln("ERROR")
  1413  	}
  1414  
  1415  	if globalbool2 {
  1416  		writeln("ERROR")
  1417  	} else {
  1418  		writeln("globalbool 2 ok")
  1419  	}
  1420  
  1421  	if globalbool3 {
  1422  		writeln("ERROR")
  1423  	} else {
  1424  		writeln("globalbool 3 ok")
  1425  	}
  1426  }
  1427  
  1428  func testLocalBool() {
  1429  	var bol bool = returnTrue1()
  1430  	if bol {
  1431  		writeln("bool 1 ok")
  1432  	} else {
  1433  		writeln("ERROR")
  1434  	}
  1435  
  1436  	if !bol {
  1437  		writeln("ERROR")
  1438  	} else {
  1439  		writeln("bool ! 1 ok")
  1440  	}
  1441  
  1442  	if returnTrue2() {
  1443  		writeln("bool 2 ok")
  1444  	} else {
  1445  		writeln("ERROR")
  1446  	}
  1447  
  1448  	if returnFalse() {
  1449  		writeln("ERROR")
  1450  	} else {
  1451  		writeln("bool 3 ok")
  1452  	}
  1453  }
  1454  
  1455  func testNilComparison() {
  1456  	var p *MyStruct
  1457  	if p == nil {
  1458  		writeln("nil pointer 1 ok")
  1459  	} else {
  1460  		writeln("ERROR")
  1461  	}
  1462  	p = nil
  1463  	if p == nil {
  1464  		writeln("nil pointer 2 ok")
  1465  	} else {
  1466  		writeln("ERROR")
  1467  	}
  1468  
  1469  	var slc []string
  1470  	if slc == nil {
  1471  		writeln("nil pointer 3 ok")
  1472  	} else {
  1473  		writeln("ERROR")
  1474  	}
  1475  	slc = nil
  1476  	if slc == nil {
  1477  		writeln("nil pointer 4 ok")
  1478  	} else {
  1479  		writeln("ERROR")
  1480  	}
  1481  }
  1482  
  1483  func testSliceLiteral() {
  1484  	var slc []string = []string{"this is ", "slice literal"}
  1485  	writeln(slc[0] + slc[1])
  1486  }
  1487  
  1488  func testArrayCopy() {
  1489  	var aInt [3]int = [3]int{1, 2, 3}
  1490  	var bInt [3]int = aInt
  1491  	aInt[1] = 20
  1492  
  1493  	write(strconv.Itoa(aInt[1]))
  1494  	write(strconv.Itoa(bInt[1]))
  1495  	write("\n")
  1496  }
  1497  
  1498  func testLocalArrayWithMoreTypes() {
  1499  	var aInt [3]int = [3]int{1, 2, 3}
  1500  	var i int
  1501  	for _, i = range aInt {
  1502  		writeln(strconv.Itoa(i))
  1503  	}
  1504  
  1505  	var aString [3]string = [3]string{"a", "bb", "ccc"}
  1506  	var s string
  1507  	for _, s = range aString {
  1508  		write(s)
  1509  	}
  1510  	write("\n")
  1511  
  1512  	var aByte [4]uint8 = [4]uint8{'x', 'y', 'z', 10}
  1513  	var buf []uint8 = aByte[0:4]
  1514  	write(string(buf))
  1515  }
  1516  
  1517  func testLocalArray() {
  1518  	var aInt [3]int = [3]int{1, 2, 3}
  1519  	write(strconv.Itoa(aInt[0]))
  1520  	write(strconv.Itoa(aInt[1]))
  1521  	write(strconv.Itoa(aInt[2]))
  1522  	write("\n")
  1523  }
  1524  
  1525  func testAppendSlice() {
  1526  	var slcslc [][]string
  1527  	var slc []string
  1528  	slc = append(slc, "aa")
  1529  	slc = append(slc, "bb")
  1530  	slcslc = append(slcslc, slc)
  1531  	slcslc = append(slcslc, slc)
  1532  	slcslc = append(slcslc, slc)
  1533  	var s string
  1534  	for _, slc = range slcslc {
  1535  		for _, s = range slc {
  1536  			write(s)
  1537  		}
  1538  		write("|")
  1539  	}
  1540  	write("\n")
  1541  }
  1542  
  1543  func testAppendPtr() {
  1544  	var slc []*MyStruct
  1545  	var p *MyStruct
  1546  	var i int
  1547  	for i = 0; i < 10; i++ {
  1548  		p = new(MyStruct)
  1549  		p.field1 = i
  1550  		slc = append(slc, p)
  1551  	}
  1552  
  1553  	for _, p = range slc {
  1554  		write(strconv.Itoa(p.field1)) // 123456789
  1555  	}
  1556  	write("\n")
  1557  }
  1558  
  1559  func testAppendString() {
  1560  	var slc []string
  1561  	slc = append(slc, "a")
  1562  	slc = append(slc, "bcde")
  1563  	var elm string = "fghijklmn\n"
  1564  	slc = append(slc, elm)
  1565  	var s string
  1566  	for _, s = range slc {
  1567  		write(s)
  1568  	}
  1569  	writeln(strconv.Itoa(len(slc))) // 3
  1570  }
  1571  
  1572  func testAppendInt() {
  1573  	var slc []int
  1574  	slc = append(slc, 1)
  1575  	var i int
  1576  	for i = 2; i < 10; i++ {
  1577  		slc = append(slc, i)
  1578  	}
  1579  	slc = append(slc, 10)
  1580  
  1581  	for _, i = range slc {
  1582  		write(strconv.Itoa(i)) // 12345678910
  1583  	}
  1584  	write("\n")
  1585  }
  1586  
  1587  func testAppendByte() {
  1588  	var slc []uint8
  1589  	var char uint8
  1590  	for char = 'a'; char <= 'z'; char++ {
  1591  		slc = append(slc, char)
  1592  	}
  1593  	slc = append(slc, 10) // '\n'
  1594  	write(string(slc))
  1595  	writeln(strconv.Itoa(len(slc))) // 27
  1596  }
  1597  
  1598  func testSringIndex() {
  1599  	var s string = "abcde"
  1600  	var char uint8 = s[3]
  1601  	writeln(strconv.Itoa(int(char)))
  1602  }
  1603  
  1604  func testSubstring() {
  1605  	var s string = "abcdefghi"
  1606  	var subs string = s[2:5] // "cde"
  1607  	writeln(subs)
  1608  }
  1609  
  1610  func testSliceOfSlice() {
  1611  	var slc []uint8 = make([]uint8, 3, 3)
  1612  	slc[0] = 'a'
  1613  	slc[1] = 'b'
  1614  	slc[2] = 'c'
  1615  	writeln(string(slc))
  1616  
  1617  	var slc1 []uint8 = slc[0:3]
  1618  	writeln(string(slc1))
  1619  
  1620  	var slc2 []uint8 = slc[0:2]
  1621  	writeln(string(slc2))
  1622  
  1623  	var slc3 []uint8 = slc[1:3]
  1624  	writeln(string(slc3))
  1625  }
  1626  
  1627  func testForrangeKey() {
  1628  	var i int
  1629  	var slc []string
  1630  	var s string
  1631  	slc = make([]string, 3, 3)
  1632  	slc[0] = "a"
  1633  	slc[1] = "b"
  1634  	slc[2] = "c"
  1635  	for i, s = range slc {
  1636  		write(strconv.Itoa(i))
  1637  		writeln(s)
  1638  	}
  1639  }
  1640  
  1641  func testForrange() {
  1642  	var slc []string
  1643  	var s string
  1644  
  1645  	writeln("going to loop 0 times")
  1646  	for _, s = range slc {
  1647  		write(s)
  1648  		write("ERROR")
  1649  	}
  1650  
  1651  	slc = make([]string, 2, 2)
  1652  	slc[0] = ""
  1653  	slc[1] = ""
  1654  
  1655  	writeln("going to loop 2 times")
  1656  	for _, s = range slc {
  1657  		write(s)
  1658  		writeln(" in loop")
  1659  	}
  1660  
  1661  	writeln("going to loop 4 times")
  1662  	var a int
  1663  	for _, a = range globalintarray {
  1664  		write(strconv.Itoa(a))
  1665  	}
  1666  	writeln("")
  1667  
  1668  	slc = make([]string, 3, 3)
  1669  	slc[0] = "hello"
  1670  	slc[1] = "for"
  1671  	slc[2] = "range"
  1672  	for _, s = range slc {
  1673  		write(s)
  1674  	}
  1675  	writeln("")
  1676  }
  1677  
  1678  func newStruct() *MyStruct {
  1679  	var strct *MyStruct = new(MyStruct)
  1680  	writeln(strconv.Itoa(strct.field2))
  1681  	strct.field2 = 2
  1682  	return strct
  1683  }
  1684  
  1685  func testNewStruct() {
  1686  	var strct *MyStruct
  1687  	strct = newStruct()
  1688  	writeln(strconv.Itoa(strct.field1))
  1689  	writeln(strconv.Itoa(strct.field2))
  1690  }
  1691  
  1692  var nilSlice []*MyStruct
  1693  
  1694  func testNilSlice() {
  1695  	nilSlice = make([]*MyStruct, 2, 2)
  1696  	writeln(strconv.Itoa(len(nilSlice)))
  1697  	writeln(strconv.Itoa(cap(nilSlice)))
  1698  
  1699  	nilSlice = nil
  1700  	writeln(strconv.Itoa(len(nilSlice)))
  1701  	writeln(strconv.Itoa(cap(nilSlice)))
  1702  }
  1703  
  1704  func testZeroValues() {
  1705  	writeln("-- testZeroValues()")
  1706  	var s string
  1707  	write(s)
  1708  
  1709  	var s2 string = ""
  1710  	write(s2)
  1711  	var h int = 1
  1712  	var i int
  1713  	var j int = 2
  1714  	writeln(strconv.Itoa(h))
  1715  	writeln(strconv.Itoa(i))
  1716  	writeln(strconv.Itoa(j))
  1717  
  1718  	if i == 0 {
  1719  		writeln("int zero ok")
  1720  	} else {
  1721  		writeln("ERROR")
  1722  	}
  1723  }
  1724  
  1725  func testIncrDecr() {
  1726  	var i int = 0
  1727  	i++
  1728  	writeln(strconv.Itoa(i))
  1729  
  1730  	i--
  1731  	i--
  1732  	writeln(strconv.Itoa(i))
  1733  }
  1734  
  1735  type MyStruct struct {
  1736  	field1 int
  1737  	field2 int
  1738  	ifc    interface{}
  1739  }
  1740  
  1741  var globalstrings1 [2]string
  1742  var globalstrings2 [2]string
  1743  var __slice []string
  1744  
  1745  func testGlobalStrings() {
  1746  	globalstrings1[0] = "aaa,"
  1747  	globalstrings1[1] = "bbb,"
  1748  	globalstrings2[0] = "ccc,"
  1749  	globalstrings2[1] = "ddd,"
  1750  	__slice = make([]string, 1, 1)
  1751  	write(globalstrings1[0])
  1752  	write(globalstrings1[1])
  1753  	write(globalstrings1[0])
  1754  	write(globalstrings1[1])
  1755  }
  1756  
  1757  var globalstrings [2]string
  1758  
  1759  func testSliceOfStrings() {
  1760  	var s1 string = "hello"
  1761  	var s2 string = " strings\n"
  1762  	var strings []string = make([]string, 2, 2)
  1763  	var i int
  1764  	strings[0] = s1
  1765  	strings[1] = s2
  1766  	for i = 0; i < 2; i = i + 1 {
  1767  		write(strings[i])
  1768  	}
  1769  
  1770  	globalstrings[0] = s1
  1771  	globalstrings[1] = " globalstrings\n"
  1772  	for i = 0; i < 2; i = i + 1 {
  1773  		write(globalstrings[i])
  1774  	}
  1775  }
  1776  
  1777  var structPointers []*MyStruct
  1778  
  1779  func testSliceOfPointers() {
  1780  	var strct1 MyStruct
  1781  	var strct2 MyStruct
  1782  	var p1 *MyStruct = &strct1
  1783  	var p2 *MyStruct = &strct2
  1784  
  1785  	strct1.field2 = 11
  1786  	strct2.field2 = 22
  1787  	structPointers = make([]*MyStruct, 2, 2)
  1788  	structPointers[0] = p1
  1789  	structPointers[1] = p2
  1790  
  1791  	var i int
  1792  	var x int
  1793  	for i = 0; i < 2; i = i + 1 {
  1794  		x = structPointers[i].field2
  1795  		writeln(strconv.Itoa(x))
  1796  	}
  1797  }
  1798  
  1799  func testStructPointer() {
  1800  	var _strct MyStruct
  1801  	var strct *MyStruct
  1802  	strct = &_strct
  1803  	strct.field1 = 123
  1804  
  1805  	var i int
  1806  	i = strct.field1
  1807  	writeln(strconv.Itoa(i))
  1808  
  1809  	strct.field2 = 456
  1810  	writeln(strconv.Itoa(_strct.field2))
  1811  
  1812  	strct.field1 = 777
  1813  	strct.field2 = strct.field1
  1814  	writeln(strconv.Itoa(strct.field2))
  1815  }
  1816  
  1817  func testStruct() {
  1818  	var strct MyStruct
  1819  	strct.field1 = 123
  1820  
  1821  	var i int
  1822  	i = strct.field1
  1823  	writeln(strconv.Itoa(i))
  1824  
  1825  	strct.field2 = 456
  1826  	writeln(strconv.Itoa(strct.field2))
  1827  
  1828  	strct.field1 = 777
  1829  	strct.field2 = strct.field1
  1830  	writeln(strconv.Itoa(strct.field2))
  1831  }
  1832  
  1833  func testPointer() {
  1834  	var i int = 12
  1835  	var j int
  1836  	var p *int
  1837  	p = &i
  1838  	j = *p
  1839  	writeln(strconv.Itoa(j))
  1840  	*p = 11
  1841  	writeln(strconv.Itoa(i))
  1842  
  1843  	var c uint8 = 'A'
  1844  	var pc *uint8
  1845  	pc = &c
  1846  	*pc = 'B'
  1847  	var slc []uint8
  1848  	slc = make([]uint8, 1, 1)
  1849  	slc[0] = c
  1850  	writeln(string(slc))
  1851  }
  1852  
  1853  func testDeclValue() {
  1854  	var i int = 123
  1855  	writeln(strconv.Itoa(i))
  1856  }
  1857  
  1858  func testStringComparison() {
  1859  	var s string
  1860  	if s == "" {
  1861  		writeln("string cmp 1 ok")
  1862  	} else {
  1863  		writeln("ERROR")
  1864  	}
  1865  	var s2 string = ""
  1866  	if s2 == s {
  1867  		writeln("string cmp 2 ok")
  1868  	} else {
  1869  		writeln("ERROR")
  1870  	}
  1871  
  1872  	var s3 string = "abc"
  1873  	s3 = s3 + "def"
  1874  	var s4 string = "1abcdef1"
  1875  	var s5 string = s4[1:7]
  1876  	if s3 == s5 {
  1877  		writeln("string cmp 3 ok")
  1878  	} else {
  1879  		writeln("ERROR")
  1880  	}
  1881  
  1882  	if "abcdef" == s5 {
  1883  		writeln("string cmp 4 ok")
  1884  	} else {
  1885  		writeln("ERROR")
  1886  	}
  1887  
  1888  	if s3 != s5 {
  1889  		writeln(s3)
  1890  		writeln(s5)
  1891  		writeln("ERROR")
  1892  		return
  1893  	} else {
  1894  		writeln("string cmp not 1 ok")
  1895  	}
  1896  
  1897  	if s4 != s3 {
  1898  		writeln("string cmp not 2 ok")
  1899  	} else {
  1900  		writeln("ERROR")
  1901  	}
  1902  }
  1903  
  1904  func testConcateStrings() {
  1905  	var concatenated string = "foo" + "bar" + "1234"
  1906  	writeln(concatenated)
  1907  }
  1908  
  1909  func testLenCap() {
  1910  	var x []uint8
  1911  	x = make([]uint8, 0, 0)
  1912  	writeln(strconv.Itoa(len(x)))
  1913  
  1914  	writeln(strconv.Itoa(cap(x)))
  1915  
  1916  	x = make([]uint8, 12, 24)
  1917  	writeln(strconv.Itoa(len(x)))
  1918  
  1919  	writeln(strconv.Itoa(cap(x)))
  1920  
  1921  	writeln(strconv.Itoa(len(globalintarray)))
  1922  
  1923  	writeln(strconv.Itoa(cap(globalintarray)))
  1924  
  1925  	var s string
  1926  	s = "hello\n"
  1927  	writeln(strconv.Itoa(len(s))) // 6
  1928  }
  1929  
  1930  func testMakeSlice() {
  1931  	var x []uint8 = make([]uint8, 3, 20)
  1932  	x[0] = 'A'
  1933  	x[1] = 'B'
  1934  	x[2] = 'C'
  1935  	writeln(string(x))
  1936  }
  1937  
  1938  func testNew() {
  1939  	var i *int
  1940  	i = new(int)
  1941  	writeln(strconv.Itoa(*i)) // 0
  1942  }
  1943  
  1944  func testItoa() {
  1945  	writeln(strconv.Itoa(0))
  1946  	writeln(strconv.Itoa(1))
  1947  	writeln(strconv.Itoa(12))
  1948  	writeln(strconv.Itoa(123))
  1949  	writeln(strconv.Itoa(12345))
  1950  	writeln(strconv.Itoa(12345678))
  1951  	writeln(strconv.Itoa(1234567890))
  1952  	writeln(strconv.Itoa(54321))
  1953  	writeln(strconv.Itoa(-1))
  1954  	writeln(strconv.Itoa(-54321))
  1955  	writeln(strconv.Itoa(-7654321))
  1956  	writeln(strconv.Itoa(-1234567890))
  1957  }
  1958  
  1959  var globalintarray [4]int
  1960  
  1961  func testIndexExprOfArray() {
  1962  	globalintarray[0] = 11
  1963  	globalintarray[1] = 22
  1964  	globalintarray[2] = globalintarray[1]
  1965  	globalintarray[3] = 44
  1966  	write("\n")
  1967  }
  1968  
  1969  func testIndexExprOfSlice() {
  1970  	var intslice []int = globalintarray[0:4]
  1971  	intslice[0] = 66
  1972  	intslice[1] = 77
  1973  	intslice[2] = intslice[1]
  1974  	intslice[3] = 88
  1975  
  1976  	var i int
  1977  	for i = 0; i < 4; i = i + 1 {
  1978  		write(strconv.Itoa(intslice[i]))
  1979  	}
  1980  	write("\n")
  1981  
  1982  	for i = 0; i < 4; i = i + 1 {
  1983  		write(strconv.Itoa(globalintarray[i]))
  1984  	}
  1985  	write("\n")
  1986  }
  1987  
  1988  func testFor() {
  1989  	var i int
  1990  	for i = 0; i < 3; i = i + 1 {
  1991  		write("A")
  1992  	}
  1993  	write("\n")
  1994  }
  1995  
  1996  func testCmpUint8() {
  1997  	var localuint8 uint8 = 1
  1998  	if localuint8 == 1 {
  1999  		writeln("uint8 cmp == ok")
  2000  	}
  2001  	if localuint8 != 1 {
  2002  		writeln("ERROR")
  2003  	} else {
  2004  		writeln("uint8 cmp != ok")
  2005  	}
  2006  	if localuint8 > 0 {
  2007  		writeln("uint8 cmp > ok")
  2008  	}
  2009  	if localuint8 < 0 {
  2010  		writeln("ERROR")
  2011  	} else {
  2012  		writeln("uint8 cmp < ok")
  2013  	}
  2014  
  2015  	if localuint8 >= 1 {
  2016  		writeln("uint8 cmp >= ok")
  2017  	}
  2018  	if localuint8 <= 1 {
  2019  		writeln("uint8 cmp <= ok")
  2020  	}
  2021  
  2022  	localuint8 = 101
  2023  	if localuint8 == 'A' {
  2024  		writeln("uint8 cmp == A ok")
  2025  	}
  2026  }
  2027  
  2028  func testCmpInt() {
  2029  	var a int = 1
  2030  	if a == 1 {
  2031  		writeln("int cmp == ok")
  2032  	}
  2033  	if a != 1 {
  2034  		writeln("ERROR")
  2035  	} else {
  2036  		writeln("int cmp != ok")
  2037  	}
  2038  	if a > 0 {
  2039  		writeln("int cmp > ok")
  2040  	}
  2041  	if a < 0 {
  2042  		writeln("ERROR")
  2043  	} else {
  2044  		writeln("int cmp < ok")
  2045  	}
  2046  
  2047  	if a >= 1 {
  2048  		writeln("int cmp >= ok")
  2049  	}
  2050  	if a <= 1 {
  2051  		writeln("int cmp <= ok")
  2052  	}
  2053  	a = 101
  2054  	if a == 'A' {
  2055  		writeln("int cmp == A ok")
  2056  	}
  2057  }
  2058  
  2059  func testElseIf() {
  2060  	if false {
  2061  		writeln("ERROR")
  2062  	} else if true {
  2063  		writeln("ok else if")
  2064  	} else {
  2065  		writeln("ERROR")
  2066  	}
  2067  
  2068  	if false {
  2069  		writeln("ERROR")
  2070  	} else if false {
  2071  		writeln("ERROR")
  2072  	} else {
  2073  		writeln("ok else if else")
  2074  	}
  2075  }
  2076  
  2077  func testIf() {
  2078  	var tr bool = true
  2079  	var fls bool = false
  2080  	if tr {
  2081  		writeln("ok true")
  2082  	}
  2083  	if fls {
  2084  		writeln("ERROR")
  2085  	}
  2086  	writeln("ok false")
  2087  }
  2088  
  2089  func testElse() {
  2090  	if true {
  2091  		writeln("ok true")
  2092  	} else {
  2093  		writeln("ERROR")
  2094  	}
  2095  
  2096  	if false {
  2097  		writeln("ERROR")
  2098  	} else {
  2099  		writeln("ok false")
  2100  	}
  2101  }
  2102  
  2103  var globalint int
  2104  var globalint2 int
  2105  var globaluint8 uint8
  2106  var globaluint16 uint16
  2107  
  2108  var globalstring string
  2109  var globalarray [9]uint8
  2110  var globalslice []uint8
  2111  var globaluintptr uintptr
  2112  
  2113  func assignGlobal() {
  2114  	globalint = 22
  2115  	globaluint8 = 1
  2116  	globaluint16 = 5
  2117  	globaluintptr = 7
  2118  	globalstring = "globalstring changed\n"
  2119  }
  2120  
  2121  func add1(x int) int {
  2122  	return x + 1
  2123  }
  2124  
  2125  func sum(x int, y int) int {
  2126  	return x + y
  2127  }
  2128  
  2129  func print1(a string) {
  2130  	write(a)
  2131  	return
  2132  }
  2133  
  2134  func print2(a string, b string) {
  2135  	write(a)
  2136  	write(b)
  2137  }
  2138  
  2139  func returnstring() string {
  2140  	return "i am a local 1\n"
  2141  }
  2142  
  2143  func testGlobalCharArray() {
  2144  	globalarray[0] = 'A'
  2145  	globalarray[1] = 'B'
  2146  	globalarray[2] = globalarray[0]
  2147  	globalarray[3] = 100 / 10 // '\n'
  2148  	globalarray[1] = 'B'
  2149  	var chars []uint8 = globalarray[0:4]
  2150  	write(string(chars))
  2151  	globalslice = chars
  2152  	write(string(globalarray[0:4]))
  2153  }
  2154  
  2155  func testString() {
  2156  	write(globalstring)
  2157  	assignGlobal()
  2158  
  2159  	print1("hello string literal\n")
  2160  
  2161  	var s string = "hello string"
  2162  	writeln(s)
  2163  
  2164  	var localstring1 string = returnstring()
  2165  	var localstring2 string
  2166  	localstring2 = "i m local2\n"
  2167  	print1(localstring1)
  2168  	print2(localstring1, localstring2)
  2169  	write(globalstring)
  2170  }
  2171  
  2172  func testArgAssign(x int) int {
  2173  	x = 13
  2174  	return x
  2175  }
  2176  
  2177  func testMinus() int {
  2178  	var x int = -1
  2179  	x = x * -5
  2180  	return x
  2181  }
  2182  
  2183  func testMisc() {
  2184  	var i13 int = 0
  2185  	i13 = testArgAssign(i13)
  2186  	var i5 int = testMinus()
  2187  	globalint2 = sum(1, i13%i5)
  2188  
  2189  	var locali3 int
  2190  	var tmp int
  2191  	tmp = int(uint8('3' - '1'))
  2192  	tmp = tmp + int(globaluint16)
  2193  	tmp = tmp + int(globaluint8)
  2194  	tmp = tmp + int(globaluintptr)
  2195  	locali3 = add1(tmp)
  2196  	var i42 int
  2197  	i42 = sum(globalint, globalint2) + locali3
  2198  
  2199  	writeln(strconv.Itoa(i42))
  2200  }
  2201  
  2202  func main() {
  2203  	testMapForrange()
  2204  	testGlobalMapOK()
  2205  	testMapOK()
  2206  	testMap()
  2207  	testMyMap()
  2208  	testTypeSwitchNil()
  2209  	testStructPointerMethodsByValue()
  2210  	testTokenString()
  2211  	testAssignIncDec()
  2212  	testTypeAlias()
  2213  	testDerivedString()
  2214  	testForeignType()
  2215  	testReturnMixed()
  2216  	testReturnStrings()
  2217  	testReturnInts()
  2218  	testReturnUint8s()
  2219  	testPassBytes()
  2220  	testSprinfMore()
  2221  	testAnotherFile()
  2222  	testSortStrings()
  2223  	testGetdents64()
  2224  	testEnv()
  2225  	testReflect()
  2226  	testReturnSlice()
  2227  	testStrings()
  2228  	testSliceExpr()
  2229  	testPath()
  2230  	testByteType()
  2231  	testExtLib()
  2232  	testExpandSlice()
  2233  	testFullSlice()
  2234  	testInterfaceVaargs()
  2235  	testConvertToInterface()
  2236  	testTypeSwitch()
  2237  	testGetInterface()
  2238  	testPassInterface()
  2239  	testInterfaceAssertion()
  2240  	testInterfaceimplicitConversion()
  2241  	testInterfaceZeroValue()
  2242  	testForRangeShortDecl()
  2243  	testInferVarTypes()
  2244  	testGlobalValues()
  2245  	testShortVarDecl()
  2246  	testStructPointerMethods()
  2247  	//testBasicMethodCalls()
  2248  	testPointerMethod()
  2249  	testMethodAnother()
  2250  	testMethodSimple()
  2251  	testOsArgs()
  2252  	testStructLiteralWithContents()
  2253  	testAddressOfStructLiteral()
  2254  	testStructCopy()
  2255  	testStructLiteral()
  2256  	testStructZeroValue()
  2257  	testAtoi()
  2258  	testIsLetter()
  2259  	testVaargs()
  2260  	testOpenRead()
  2261  	testOpenWrite()
  2262  	testInfer()
  2263  	testEscapedChar()
  2264  	testSwitchString()
  2265  	testSwitchByte()
  2266  	testSwitchInt()
  2267  
  2268  	testLogicalAndOr()
  2269  	testConst()
  2270  	testForOmissible()
  2271  	testForBreakContinue()
  2272  	testGlobalBool()
  2273  	testLocalBool()
  2274  	testNilComparison()
  2275  	testSliceLiteral()
  2276  	testArrayCopy()
  2277  	testLocalArrayWithMoreTypes()
  2278  	testLocalArray()
  2279  	testAppendSlice()
  2280  	testAppendPtr()
  2281  	testAppendString()
  2282  	testAppendInt()
  2283  	testAppendByte()
  2284  	testSringIndex()
  2285  	testSubstring()
  2286  	testSliceOfSlice()
  2287  	testForrangeKey()
  2288  	testForrange()
  2289  	testNewStruct()
  2290  	testNilSlice()
  2291  	testZeroValues()
  2292  	testIncrDecr()
  2293  	testGlobalStrings()
  2294  	testSliceOfStrings()
  2295  	testSliceOfPointers()
  2296  	testStructPointer()
  2297  	testStruct()
  2298  	testPointer()
  2299  	testDeclValue()
  2300  	testStringComparison()
  2301  	testConcateStrings()
  2302  	testLenCap()
  2303  	testMakeSlice()
  2304  	testNew()
  2305  
  2306  	testItoa()
  2307  	testIndexExprOfArray()
  2308  	testIndexExprOfSlice()
  2309  	testString()
  2310  	testFor()
  2311  	testCmpUint8()
  2312  	testCmpInt()
  2313  	testElseIf()
  2314  	testElse()
  2315  	testIf()
  2316  	testGlobalCharArray()
  2317  
  2318  	testMisc()
  2319  	os.Exit(0)
  2320  }