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