github.com/dfcfw/lua@v0.0.0-20230325031207-0cc7ffb7b8b9/luar/chan_test.go (about)

     1  package luar
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/dfcfw/lua"
     7  )
     8  
     9  func Test_chan(t *testing.T) {
    10  	L := lua.NewState()
    11  	defer L.Close()
    12  
    13  	ch := make(chan string)
    14  	go func() {
    15  		ch <- "Tim"
    16  		name, ok := <-ch
    17  		if name != "John" || !ok {
    18  			t.Fatal("invalid value")
    19  		}
    20  
    21  		close(ch)
    22  	}()
    23  
    24  	L.SetGlobal("ch", New(L, ch))
    25  
    26  	testReturn(t, L, `return ch()`, "Tim", "true")
    27  	testReturn(t, L, `ch("John")`)
    28  	testReturn(t, L, `return ch()`, "nil", "false")
    29  }
    30  
    31  type TestChanString chan string
    32  
    33  func (*TestChanString) Test() string {
    34  	return "TestChanString.Test"
    35  }
    36  
    37  func (TestChanString) Test2() string {
    38  	return "TestChanString.Test2"
    39  }
    40  
    41  func Test_chan_pointermethod(t *testing.T) {
    42  	L := lua.NewState()
    43  	defer L.Close()
    44  
    45  	a := make(TestChanString)
    46  	b := &a
    47  
    48  	L.SetGlobal("b", New(L, b))
    49  
    50  	testReturn(t, L, `return b:Test()`, "TestChanString.Test")
    51  	testReturn(t, L, `return b:Test2()`, "TestChanString.Test2")
    52  }
    53  
    54  func Test_chan_invaliddirection(t *testing.T) {
    55  	L := lua.NewState()
    56  	defer L.Close()
    57  
    58  	ch := make(chan string)
    59  
    60  	L.SetGlobal("send", New(L, (chan<- string)(ch)))
    61  	testError(t, L, `send()`, "receive from send-only type chan<- string")
    62  
    63  	L.SetGlobal("receive", New(L, (<-chan string)(ch)))
    64  	testError(t, L, `receive("hello")`, "send to receive-only type <-chan string")
    65  }