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 }