github.com/dfcfw/lua@v0.0.0-20230325031207-0cc7ffb7b8b9/luar/ptr_test.go (about) 1 package luar 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/dfcfw/lua" 8 ) 9 10 func Test_ptr(t *testing.T) { 11 L := lua.NewState() 12 defer L.Close() 13 14 str := "hello" 15 16 L.SetGlobal("ptr", New(L, &str)) 17 18 testReturn(t, L, `return -ptr`, "hello") 19 } 20 21 func Test_ptr_comparison(t *testing.T) { 22 L := lua.NewState() 23 defer L.Close() 24 25 var ptr1 *string 26 str := "hello" 27 28 L.SetGlobal("ptr1", New(L, ptr1)) 29 L.SetGlobal("ptr2", New(L, &str)) 30 31 testReturn(t, L, `return ptr1 == nil`, "true") 32 testReturn(t, L, `return ptr2 == nil`, "false") 33 testReturn(t, L, `return ptr1 == ptr2`, "false") 34 } 35 36 func Test_ptr_assignment(t *testing.T) { 37 L := lua.NewState() 38 defer L.Close() 39 40 str := "hello" 41 42 L.SetGlobal("str", New(L, &str)) 43 44 testReturn(t, L, `return tostring(-str)`, "hello") 45 testReturn(t, L, `str = str ^ "world"; return (string.match(tostring(str), "userdata:"))`, "userdata:") 46 testReturn(t, L, `return tostring(-str)`, "world") 47 } 48 49 type TestPtrNested struct { 50 *TestPtrNestedChild 51 } 52 53 type TestPtrNestedChild struct { 54 Value *string 55 StructTestPerson 56 } 57 58 func Test_ptr_nested(t *testing.T) { 59 L := lua.NewState() 60 defer L.Close() 61 62 a := TestPtrNested{ 63 TestPtrNestedChild: &TestPtrNestedChild{ 64 StructTestPerson: StructTestPerson{ 65 Name: "Tim", 66 }, 67 }, 68 } 69 70 L.SetGlobal("a", New(L, &a)) 71 L.SetGlobal("str_ptr", NewType(L, "")) 72 73 testReturn(t, L, `return a.Value == nil`, "true") 74 testReturn(t, L, `a.Value = str_ptr(); _ = a.Value ^ "hello"`) 75 testReturn(t, L, `return a.Value == nil`, "false") 76 testReturn(t, L, `return -a.Value`, "hello") 77 testReturn(t, L, `return a.Name`, "Tim") 78 } 79 80 func Test_ptr_assignstruct(t *testing.T) { 81 L := lua.NewState() 82 defer L.Close() 83 84 a := &StructTestPerson{ 85 Name: "tim", 86 } 87 b := &StructTestPerson{ 88 Name: "bob", 89 } 90 91 L.SetGlobal("a", New(L, a)) 92 L.SetGlobal("b", New(L, b)) 93 94 testReturn(t, L, `return a.Name`, "tim") 95 testReturn(t, L, `_ = a ^ -b`) 96 testReturn(t, L, `return a.Name`, "bob") 97 } 98 99 type TestStringType string 100 101 func (s *TestStringType) ToUpper() { 102 *s = TestStringType(strings.ToUpper(string(*s))) 103 } 104 105 func Test_ptr_nested2(t *testing.T) { 106 L := lua.NewState() 107 defer L.Close() 108 109 a := [...]StructTestPerson{ 110 {Name: "Tim"}, 111 } 112 s := []StructTestPerson{ 113 {Name: "Tim", Age: 32}, 114 } 115 116 str := TestStringType("Hello World") 117 118 L.SetGlobal("a", New(L, &a)) 119 L.SetGlobal("s", New(L, s)) 120 L.SetGlobal("p", New(L, &s[0])) 121 L.SetGlobal("str", New(L, &str)) 122 123 testReturn(t, L, `return a[1]:AddNumbers(1, 2, 3, 4, 5)`, "Tim counts: 15") 124 testReturn(t, L, `return s[1]:AddNumbers(1, 2, 3, 4)`, "Tim counts: 10") 125 testReturn(t, L, `return s[1].LastAddSum`, "10") 126 testReturn(t, L, `return p:AddNumbers(1, 2, 3, 4, 5)`, "Tim counts: 15") 127 testReturn(t, L, `return p.LastAddSum`, "15") 128 129 testReturn(t, L, `return p.Age`, "32") 130 testReturn(t, L, `p:IncreaseAge(); return p.Age`, "33") 131 132 testReturn(t, L, `return -str`, "Hello World") 133 testReturn(t, L, `str:ToUpper(); return -str`, "HELLO WORLD") 134 }