github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/noder/lex_test.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package noder 6 7 import ( 8 "reflect" 9 "runtime" 10 "testing" 11 12 "github.com/go-asm/go/cmd/compile/syntax" 13 ) 14 15 func eq(a, b []string) bool { 16 if len(a) != len(b) { 17 return false 18 } 19 for i := 0; i < len(a); i++ { 20 if a[i] != b[i] { 21 return false 22 } 23 } 24 return true 25 } 26 27 func TestPragmaFields(t *testing.T) { 28 var tests = []struct { 29 in string 30 want []string 31 }{ 32 {"", []string{}}, 33 {" \t ", []string{}}, 34 {`""""`, []string{`""`, `""`}}, 35 {" a'b'c ", []string{"a'b'c"}}, 36 {"1 2 3 4", []string{"1", "2", "3", "4"}}, 37 {"\n☺\t☹\n", []string{"☺", "☹"}}, 38 {`"1 2 " 3 " 4 5"`, []string{`"1 2 "`, `3`, `" 4 5"`}}, 39 {`"1""2 3""4"`, []string{`"1"`, `"2 3"`, `"4"`}}, 40 {`12"34"`, []string{`12`, `"34"`}}, 41 {`12"34 `, []string{`12`}}, 42 } 43 44 for _, tt := range tests { 45 got := pragmaFields(tt.in) 46 if !eq(got, tt.want) { 47 t.Errorf("pragmaFields(%q) = %v; want %v", tt.in, got, tt.want) 48 continue 49 } 50 } 51 } 52 53 func TestPragcgo(t *testing.T) { 54 type testStruct struct { 55 in string 56 want []string 57 } 58 59 var tests = []testStruct{ 60 {`go:cgo_export_dynamic local`, []string{`cgo_export_dynamic`, `local`}}, 61 {`go:cgo_export_dynamic local remote`, []string{`cgo_export_dynamic`, `local`, `remote`}}, 62 {`go:cgo_export_dynamic local' remote'`, []string{`cgo_export_dynamic`, `local'`, `remote'`}}, 63 {`go:cgo_export_static local`, []string{`cgo_export_static`, `local`}}, 64 {`go:cgo_export_static local remote`, []string{`cgo_export_static`, `local`, `remote`}}, 65 {`go:cgo_export_static local' remote'`, []string{`cgo_export_static`, `local'`, `remote'`}}, 66 {`go:cgo_import_dynamic local`, []string{`cgo_import_dynamic`, `local`}}, 67 {`go:cgo_import_dynamic local remote`, []string{`cgo_import_dynamic`, `local`, `remote`}}, 68 {`go:cgo_import_static local`, []string{`cgo_import_static`, `local`}}, 69 {`go:cgo_import_static local'`, []string{`cgo_import_static`, `local'`}}, 70 {`go:cgo_dynamic_linker "/path/"`, []string{`cgo_dynamic_linker`, `/path/`}}, 71 {`go:cgo_dynamic_linker "/p ath/"`, []string{`cgo_dynamic_linker`, `/p ath/`}}, 72 {`go:cgo_ldflag "arg"`, []string{`cgo_ldflag`, `arg`}}, 73 {`go:cgo_ldflag "a rg"`, []string{`cgo_ldflag`, `a rg`}}, 74 } 75 76 if runtime.GOOS != "aix" { 77 tests = append(tests, []testStruct{ 78 {`go:cgo_import_dynamic local remote "library"`, []string{`cgo_import_dynamic`, `local`, `remote`, `library`}}, 79 {`go:cgo_import_dynamic local' remote' "lib rary"`, []string{`cgo_import_dynamic`, `local'`, `remote'`, `lib rary`}}, 80 }...) 81 } else { 82 // cgo_import_dynamic with a library is slightly different on AIX 83 // as the library field must follow the pattern [libc.a/object.o]. 84 tests = append(tests, []testStruct{ 85 {`go:cgo_import_dynamic local remote "lib.a/obj.o"`, []string{`cgo_import_dynamic`, `local`, `remote`, `lib.a/obj.o`}}, 86 // This test must fail. 87 {`go:cgo_import_dynamic local' remote' "library"`, []string{`<unknown position>: usage: //go:cgo_import_dynamic local [remote ["lib.a/object.o"]]`}}, 88 }...) 89 90 } 91 92 var p noder 93 var nopos syntax.Pos 94 for _, tt := range tests { 95 96 p.err = make(chan syntax.Error) 97 gotch := make(chan [][]string, 1) 98 go func() { 99 p.pragcgobuf = nil 100 p.pragcgo(nopos, tt.in) 101 if p.pragcgobuf != nil { 102 gotch <- p.pragcgobuf 103 } 104 }() 105 106 select { 107 case e := <-p.err: 108 want := tt.want[0] 109 if e.Error() != want { 110 t.Errorf("pragcgo(%q) = %q; want %q", tt.in, e, want) 111 continue 112 } 113 case got := <-gotch: 114 want := [][]string{tt.want} 115 if !reflect.DeepEqual(got, want) { 116 t.Errorf("pragcgo(%q) = %q; want %q", tt.in, got, want) 117 continue 118 } 119 } 120 121 } 122 }