github.com/gopherjs/gopherjs@v1.19.0-beta1.0.20240506212314-27071a8796e4/tests/linkname_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"testing"
     5  
     6  	_ "reflect"
     7  	_ "unsafe"
     8  
     9  	"github.com/google/go-cmp/cmp"
    10  	"github.com/gopherjs/gopherjs/tests/testdata/linkname/method"
    11  	"github.com/gopherjs/gopherjs/tests/testdata/linkname/one"
    12  )
    13  
    14  func TestLinknames(t *testing.T) {
    15  	defer func() {
    16  		if err := recover(); err != nil {
    17  			t.Fatalf("one.DoAll() paniced: %s", err)
    18  		}
    19  	}()
    20  	want := "doing one\n" +
    21  		"doing two\n" +
    22  		"doing imported one: doing internal one: one secret\n" +
    23  		"doing three\n" +
    24  		"doing imported three: doing internal three: three secret\n"
    25  	got := one.DoAll()
    26  
    27  	if diff := cmp.Diff(want, got); diff != "" {
    28  		t.Fatalf("Callink linknamed functions returned a diff (-want,+got):\n%s", diff)
    29  	}
    30  }
    31  
    32  func TestLinknameMethods(t *testing.T) {
    33  	defer func() {
    34  		if err := recover(); err != nil {
    35  			t.Fatalf("method.TestLinkname() paniced: %s", err)
    36  		}
    37  	}()
    38  	method.TestLinkname(t)
    39  }
    40  
    41  type (
    42  	name    struct{ bytes *byte }
    43  	nameOff int32
    44  	rtype   struct{}
    45  )
    46  
    47  //go:linkname rtype_nameOff reflect.(*rtype).nameOff
    48  func rtype_nameOff(r *rtype, off nameOff) name
    49  
    50  //go:linkname newName reflect.newName
    51  func newName(n, tag string, exported bool) name
    52  
    53  //go:linkname name_name reflect.name.name
    54  func name_name(name) string
    55  
    56  //go:linkname resolveReflectName reflect.resolveReflectName
    57  func resolveReflectName(n name) nameOff
    58  
    59  func TestLinknameReflectName(t *testing.T) {
    60  	info := "myinfo"
    61  	off := resolveReflectName(newName(info, "", false))
    62  	n := rtype_nameOff(nil, off)
    63  	if s := name_name(n); s != info {
    64  		t.Fatalf("to reflect.name got %q: want %q", s, info)
    65  	}
    66  }