github.com/yuin/gopher-lua@v1.1.2-0.20231212122839-2348fd042596/auxlib_test.go (about) 1 package lua 2 3 import ( 4 "io/ioutil" 5 "os" 6 "testing" 7 ) 8 9 func TestCheckInt(t *testing.T) { 10 L := NewState() 11 defer L.Close() 12 errorIfGFuncNotFail(t, L, func(L *LState) int { 13 L.Push(LNumber(10)) 14 errorIfNotEqual(t, 10, L.CheckInt(2)) 15 L.Push(LString("aaa")) 16 L.CheckInt(3) 17 return 0 18 }, "number expected, got string") 19 } 20 21 func TestCheckInt64(t *testing.T) { 22 L := NewState() 23 defer L.Close() 24 errorIfGFuncNotFail(t, L, func(L *LState) int { 25 L.Push(LNumber(10)) 26 errorIfNotEqual(t, int64(10), L.CheckInt64(2)) 27 L.Push(LString("aaa")) 28 L.CheckInt64(3) 29 return 0 30 }, "number expected, got string") 31 } 32 33 func TestCheckNumber(t *testing.T) { 34 L := NewState() 35 defer L.Close() 36 errorIfGFuncNotFail(t, L, func(L *LState) int { 37 L.Push(LNumber(10)) 38 errorIfNotEqual(t, LNumber(10), L.CheckNumber(2)) 39 L.Push(LString("11")) 40 errorIfNotEqual(t, LNumber(11), L.CheckNumber(3)) 41 L.Push(LString("aaa")) 42 L.CheckNumber(4) 43 return 0 44 }, "number expected, got string") 45 } 46 47 func TestCheckString(t *testing.T) { 48 L := NewState() 49 defer L.Close() 50 errorIfGFuncNotFail(t, L, func(L *LState) int { 51 L.Push(LString("aaa")) 52 errorIfNotEqual(t, "aaa", L.CheckString(2)) 53 L.Push(LNumber(10)) 54 errorIfNotEqual(t, "10", L.CheckString(3)) 55 L.Push(L.NewTable()) 56 L.CheckString(4) 57 return 0 58 }, "string expected, got table") 59 } 60 61 func TestCheckBool(t *testing.T) { 62 L := NewState() 63 defer L.Close() 64 errorIfGFuncNotFail(t, L, func(L *LState) int { 65 L.Push(LTrue) 66 errorIfNotEqual(t, true, L.CheckBool(2)) 67 L.Push(LNumber(10)) 68 L.CheckBool(3) 69 return 0 70 }, "boolean expected, got number") 71 } 72 73 func TestCheckTable(t *testing.T) { 74 L := NewState() 75 defer L.Close() 76 errorIfGFuncNotFail(t, L, func(L *LState) int { 77 tbl := L.NewTable() 78 L.Push(tbl) 79 errorIfNotEqual(t, tbl, L.CheckTable(2)) 80 L.Push(LNumber(10)) 81 L.CheckTable(3) 82 return 0 83 }, "table expected, got number") 84 } 85 86 func TestCheckFunction(t *testing.T) { 87 L := NewState() 88 defer L.Close() 89 errorIfGFuncNotFail(t, L, func(L *LState) int { 90 fn := L.NewFunction(func(l *LState) int { return 0 }) 91 L.Push(fn) 92 errorIfNotEqual(t, fn, L.CheckFunction(2)) 93 L.Push(LNumber(10)) 94 L.CheckFunction(3) 95 return 0 96 }, "function expected, got number") 97 } 98 99 func TestCheckUserData(t *testing.T) { 100 L := NewState() 101 defer L.Close() 102 errorIfGFuncNotFail(t, L, func(L *LState) int { 103 ud := L.NewUserData() 104 L.Push(ud) 105 errorIfNotEqual(t, ud, L.CheckUserData(2)) 106 L.Push(LNumber(10)) 107 L.CheckUserData(3) 108 return 0 109 }, "userdata expected, got number") 110 } 111 112 func TestCheckThread(t *testing.T) { 113 L := NewState() 114 defer L.Close() 115 errorIfGFuncNotFail(t, L, func(L *LState) int { 116 th, _ := L.NewThread() 117 L.Push(th) 118 errorIfNotEqual(t, th, L.CheckThread(2)) 119 L.Push(LNumber(10)) 120 L.CheckThread(3) 121 return 0 122 }, "thread expected, got number") 123 } 124 125 func TestCheckChannel(t *testing.T) { 126 L := NewState() 127 defer L.Close() 128 errorIfGFuncNotFail(t, L, func(L *LState) int { 129 ch := make(chan LValue) 130 L.Push(LChannel(ch)) 131 errorIfNotEqual(t, ch, L.CheckChannel(2)) 132 L.Push(LString("aaa")) 133 L.CheckChannel(3) 134 return 0 135 }, "channel expected, got string") 136 } 137 138 func TestCheckType(t *testing.T) { 139 L := NewState() 140 defer L.Close() 141 errorIfGFuncNotFail(t, L, func(L *LState) int { 142 L.Push(LNumber(10)) 143 L.CheckType(2, LTNumber) 144 L.CheckType(2, LTString) 145 return 0 146 }, "string expected, got number") 147 } 148 149 func TestCheckTypes(t *testing.T) { 150 L := NewState() 151 defer L.Close() 152 errorIfGFuncNotFail(t, L, func(L *LState) int { 153 L.Push(LNumber(10)) 154 L.CheckTypes(2, LTString, LTBool, LTNumber) 155 L.CheckTypes(2, LTString, LTBool) 156 return 0 157 }, "string or boolean expected, got number") 158 } 159 160 func TestCheckOption(t *testing.T) { 161 opts := []string{ 162 "opt1", 163 "opt2", 164 "opt3", 165 } 166 L := NewState() 167 defer L.Close() 168 errorIfGFuncNotFail(t, L, func(L *LState) int { 169 L.Push(LString("opt1")) 170 errorIfNotEqual(t, 0, L.CheckOption(2, opts)) 171 L.Push(LString("opt5")) 172 L.CheckOption(3, opts) 173 return 0 174 }, "invalid option: opt5 \\(must be one of opt1,opt2,opt3\\)") 175 } 176 177 func TestOptInt(t *testing.T) { 178 L := NewState() 179 defer L.Close() 180 errorIfGFuncNotFail(t, L, func(L *LState) int { 181 errorIfNotEqual(t, 99, L.OptInt(1, 99)) 182 L.Push(LNumber(10)) 183 errorIfNotEqual(t, 10, L.OptInt(2, 99)) 184 L.Push(LString("aaa")) 185 L.OptInt(3, 99) 186 return 0 187 }, "number expected, got string") 188 } 189 190 func TestOptInt64(t *testing.T) { 191 L := NewState() 192 defer L.Close() 193 errorIfGFuncNotFail(t, L, func(L *LState) int { 194 errorIfNotEqual(t, int64(99), L.OptInt64(1, int64(99))) 195 L.Push(LNumber(10)) 196 errorIfNotEqual(t, int64(10), L.OptInt64(2, int64(99))) 197 L.Push(LString("aaa")) 198 L.OptInt64(3, int64(99)) 199 return 0 200 }, "number expected, got string") 201 } 202 203 func TestOptNumber(t *testing.T) { 204 L := NewState() 205 defer L.Close() 206 errorIfGFuncNotFail(t, L, func(L *LState) int { 207 errorIfNotEqual(t, LNumber(99), L.OptNumber(1, LNumber(99))) 208 L.Push(LNumber(10)) 209 errorIfNotEqual(t, LNumber(10), L.OptNumber(2, LNumber(99))) 210 L.Push(LString("aaa")) 211 L.OptNumber(3, LNumber(99)) 212 return 0 213 }, "number expected, got string") 214 } 215 216 func TestOptString(t *testing.T) { 217 L := NewState() 218 defer L.Close() 219 errorIfGFuncNotFail(t, L, func(L *LState) int { 220 errorIfNotEqual(t, "bbb", L.OptString(1, "bbb")) 221 L.Push(LString("aaa")) 222 errorIfNotEqual(t, "aaa", L.OptString(2, "bbb")) 223 L.Push(LNumber(10)) 224 L.OptString(3, "bbb") 225 return 0 226 }, "string expected, got number") 227 } 228 229 func TestOptBool(t *testing.T) { 230 L := NewState() 231 defer L.Close() 232 errorIfGFuncNotFail(t, L, func(L *LState) int { 233 errorIfNotEqual(t, true, L.OptBool(1, true)) 234 L.Push(LTrue) 235 errorIfNotEqual(t, true, L.OptBool(2, false)) 236 L.Push(LNumber(10)) 237 L.OptBool(3, false) 238 return 0 239 }, "boolean expected, got number") 240 } 241 242 func TestOptTable(t *testing.T) { 243 L := NewState() 244 defer L.Close() 245 errorIfGFuncNotFail(t, L, func(L *LState) int { 246 deftbl := L.NewTable() 247 errorIfNotEqual(t, deftbl, L.OptTable(1, deftbl)) 248 tbl := L.NewTable() 249 L.Push(tbl) 250 errorIfNotEqual(t, tbl, L.OptTable(2, deftbl)) 251 L.Push(LNumber(10)) 252 L.OptTable(3, deftbl) 253 return 0 254 }, "table expected, got number") 255 } 256 257 func TestOptFunction(t *testing.T) { 258 L := NewState() 259 defer L.Close() 260 errorIfGFuncNotFail(t, L, func(L *LState) int { 261 deffn := L.NewFunction(func(l *LState) int { return 0 }) 262 errorIfNotEqual(t, deffn, L.OptFunction(1, deffn)) 263 fn := L.NewFunction(func(l *LState) int { return 0 }) 264 L.Push(fn) 265 errorIfNotEqual(t, fn, L.OptFunction(2, deffn)) 266 L.Push(LNumber(10)) 267 L.OptFunction(3, deffn) 268 return 0 269 }, "function expected, got number") 270 } 271 272 func TestOptUserData(t *testing.T) { 273 L := NewState() 274 defer L.Close() 275 errorIfGFuncNotFail(t, L, func(L *LState) int { 276 defud := L.NewUserData() 277 errorIfNotEqual(t, defud, L.OptUserData(1, defud)) 278 ud := L.NewUserData() 279 L.Push(ud) 280 errorIfNotEqual(t, ud, L.OptUserData(2, defud)) 281 L.Push(LNumber(10)) 282 L.OptUserData(3, defud) 283 return 0 284 }, "userdata expected, got number") 285 } 286 287 func TestOptChannel(t *testing.T) { 288 L := NewState() 289 defer L.Close() 290 errorIfGFuncNotFail(t, L, func(L *LState) int { 291 defch := make(chan LValue) 292 errorIfNotEqual(t, defch, L.OptChannel(1, defch)) 293 ch := make(chan LValue) 294 L.Push(LChannel(ch)) 295 errorIfNotEqual(t, ch, L.OptChannel(2, defch)) 296 L.Push(LString("aaa")) 297 L.OptChannel(3, defch) 298 return 0 299 }, "channel expected, got string") 300 } 301 302 func TestLoadFileForShebang(t *testing.T) { 303 tmpFile, err := ioutil.TempFile("", "") 304 errorIfNotNil(t, err) 305 306 err = ioutil.WriteFile(tmpFile.Name(), []byte(`#!/path/to/lua 307 print("hello") 308 `), 0644) 309 errorIfNotNil(t, err) 310 311 defer func() { 312 tmpFile.Close() 313 os.Remove(tmpFile.Name()) 314 }() 315 316 L := NewState() 317 defer L.Close() 318 319 _, err = L.LoadFile(tmpFile.Name()) 320 errorIfNotNil(t, err) 321 } 322 323 func TestLoadFileForEmptyFile(t *testing.T) { 324 tmpFile, err := ioutil.TempFile("", "") 325 errorIfNotNil(t, err) 326 327 defer func() { 328 tmpFile.Close() 329 os.Remove(tmpFile.Name()) 330 }() 331 332 L := NewState() 333 defer L.Close() 334 335 _, err = L.LoadFile(tmpFile.Name()) 336 errorIfNotNil(t, err) 337 }