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  }