github.com/shawnclovie/gopher-lua@v0.0.0-20200520092726-90b44ec0e2f2/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  }