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