github.com/yuin/gopher-lua@v1.1.2-0.20231212122839-2348fd042596/table_test.go (about)

     1  package lua
     2  
     3  import (
     4  	"testing"
     5  )
     6  
     7  func TestTableNewLTable(t *testing.T) {
     8  	tbl := newLTable(-1, -2)
     9  	errorIfNotEqual(t, 0, cap(tbl.array))
    10  
    11  	tbl = newLTable(10, 9)
    12  	errorIfNotEqual(t, 10, cap(tbl.array))
    13  }
    14  
    15  func TestTableLen(t *testing.T) {
    16  	tbl := newLTable(0, 0)
    17  	tbl.RawSetInt(10, LNil)
    18  	tbl.RawSetInt(9, LNumber(10))
    19  	tbl.RawSetInt(8, LNil)
    20  	tbl.RawSetInt(7, LNumber(10))
    21  	errorIfNotEqual(t, 9, tbl.Len())
    22  
    23  	tbl = newLTable(0, 0)
    24  	tbl.Append(LTrue)
    25  	tbl.Append(LTrue)
    26  	tbl.Append(LTrue)
    27  	errorIfNotEqual(t, 3, tbl.Len())
    28  }
    29  
    30  func TestTableLenType(t *testing.T) {
    31  	L := NewState(Options{})
    32  	err := L.DoString(`
    33          mt = {
    34              __index = mt,
    35              __len = function (self)
    36                  return {hello = "world"}
    37              end
    38          }
    39  
    40          v = {}
    41          v.__index = v
    42  
    43          setmetatable(v, mt)
    44  
    45          assert(#v ~= 0, "#v should return a table reference in this case")
    46  
    47          print(#v)
    48      `)
    49  	if err != nil {
    50  		t.Error(err)
    51  	}
    52  }
    53  
    54  func TestTableAppend(t *testing.T) {
    55  	tbl := newLTable(0, 0)
    56  	tbl.RawSetInt(1, LNumber(1))
    57  	tbl.RawSetInt(2, LNumber(2))
    58  	tbl.RawSetInt(3, LNumber(3))
    59  	errorIfNotEqual(t, 3, tbl.Len())
    60  
    61  	tbl.RawSetInt(1, LNil)
    62  	tbl.RawSetInt(2, LNil)
    63  	errorIfNotEqual(t, 3, tbl.Len())
    64  
    65  	tbl.Append(LNumber(4))
    66  	errorIfNotEqual(t, 4, tbl.Len())
    67  
    68  	tbl.RawSetInt(3, LNil)
    69  	tbl.RawSetInt(4, LNil)
    70  	errorIfNotEqual(t, 0, tbl.Len())
    71  
    72  	tbl.Append(LNumber(5))
    73  	errorIfNotEqual(t, 1, tbl.Len())
    74  }
    75  
    76  func TestTableInsert(t *testing.T) {
    77  	tbl := newLTable(0, 0)
    78  	tbl.Append(LTrue)
    79  	tbl.Append(LTrue)
    80  	tbl.Append(LTrue)
    81  
    82  	tbl.Insert(5, LFalse)
    83  	errorIfNotEqual(t, LFalse, tbl.RawGetInt(5))
    84  	errorIfNotEqual(t, 5, tbl.Len())
    85  
    86  	tbl.Insert(-10, LFalse)
    87  	errorIfNotEqual(t, LFalse, tbl.RawGet(LNumber(-10)))
    88  	errorIfNotEqual(t, 5, tbl.Len())
    89  
    90  	tbl = newLTable(0, 0)
    91  	tbl.Append(LNumber(1))
    92  	tbl.Append(LNumber(2))
    93  	tbl.Append(LNumber(3))
    94  	tbl.Insert(1, LNumber(10))
    95  	errorIfNotEqual(t, LNumber(10), tbl.RawGetInt(1))
    96  	errorIfNotEqual(t, LNumber(1), tbl.RawGetInt(2))
    97  	errorIfNotEqual(t, LNumber(2), tbl.RawGetInt(3))
    98  	errorIfNotEqual(t, LNumber(3), tbl.RawGetInt(4))
    99  	errorIfNotEqual(t, 4, tbl.Len())
   100  
   101  	tbl = newLTable(0, 0)
   102  	tbl.Insert(5, LNumber(10))
   103  	errorIfNotEqual(t, LNumber(10), tbl.RawGetInt(5))
   104  
   105  }
   106  
   107  func TestTableMaxN(t *testing.T) {
   108  	tbl := newLTable(0, 0)
   109  	tbl.Append(LTrue)
   110  	tbl.Append(LTrue)
   111  	tbl.Append(LTrue)
   112  	errorIfNotEqual(t, 3, tbl.MaxN())
   113  
   114  	tbl = newLTable(0, 0)
   115  	errorIfNotEqual(t, 0, tbl.MaxN())
   116  
   117  	tbl = newLTable(10, 0)
   118  	errorIfNotEqual(t, 0, tbl.MaxN())
   119  }
   120  
   121  func TestTableRemove(t *testing.T) {
   122  	tbl := newLTable(0, 0)
   123  	errorIfNotEqual(t, LNil, tbl.Remove(10))
   124  	tbl.Append(LTrue)
   125  	errorIfNotEqual(t, LNil, tbl.Remove(10))
   126  
   127  	tbl.Append(LFalse)
   128  	tbl.Append(LTrue)
   129  	errorIfNotEqual(t, LFalse, tbl.Remove(2))
   130  	errorIfNotEqual(t, 2, tbl.MaxN())
   131  	tbl.Append(LFalse)
   132  	errorIfNotEqual(t, LFalse, tbl.Remove(-1))
   133  	errorIfNotEqual(t, 2, tbl.MaxN())
   134  
   135  }
   136  
   137  func TestTableRawSetInt(t *testing.T) {
   138  	tbl := newLTable(0, 0)
   139  	tbl.RawSetInt(MaxArrayIndex+1, LTrue)
   140  	errorIfNotEqual(t, 0, tbl.MaxN())
   141  	errorIfNotEqual(t, LTrue, tbl.RawGet(LNumber(MaxArrayIndex+1)))
   142  
   143  	tbl.RawSetInt(1, LTrue)
   144  	tbl.RawSetInt(3, LTrue)
   145  	errorIfNotEqual(t, 3, tbl.MaxN())
   146  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(1))
   147  	errorIfNotEqual(t, LNil, tbl.RawGetInt(2))
   148  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(3))
   149  	tbl.RawSetInt(2, LTrue)
   150  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(1))
   151  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(2))
   152  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(3))
   153  }
   154  
   155  func TestTableRawSetH(t *testing.T) {
   156  	tbl := newLTable(0, 0)
   157  	tbl.RawSetH(LString("key"), LTrue)
   158  	tbl.RawSetH(LString("key"), LNil)
   159  	_, found := tbl.dict[LString("key")]
   160  	errorIfNotEqual(t, false, found)
   161  
   162  	tbl.RawSetH(LTrue, LTrue)
   163  	tbl.RawSetH(LTrue, LNil)
   164  	_, foundb := tbl.dict[LTrue]
   165  	errorIfNotEqual(t, false, foundb)
   166  }
   167  
   168  func TestTableRawGetH(t *testing.T) {
   169  	tbl := newLTable(0, 0)
   170  	errorIfNotEqual(t, LNil, tbl.RawGetH(LNumber(1)))
   171  	errorIfNotEqual(t, LNil, tbl.RawGetH(LString("key0")))
   172  	tbl.RawSetH(LString("key0"), LTrue)
   173  	tbl.RawSetH(LString("key1"), LFalse)
   174  	tbl.RawSetH(LNumber(1), LTrue)
   175  	errorIfNotEqual(t, LTrue, tbl.RawGetH(LString("key0")))
   176  	errorIfNotEqual(t, LTrue, tbl.RawGetH(LNumber(1)))
   177  	errorIfNotEqual(t, LNil, tbl.RawGetH(LString("notexist")))
   178  	errorIfNotEqual(t, LNil, tbl.RawGetH(LTrue))
   179  }
   180  
   181  func TestTableForEach(t *testing.T) {
   182  	tbl := newLTable(0, 0)
   183  	tbl.Append(LNumber(1))
   184  	tbl.Append(LNumber(2))
   185  	tbl.Append(LNumber(3))
   186  	tbl.Append(LNil)
   187  	tbl.Append(LNumber(5))
   188  
   189  	tbl.RawSetH(LString("a"), LString("a"))
   190  	tbl.RawSetH(LString("b"), LString("b"))
   191  	tbl.RawSetH(LString("c"), LString("c"))
   192  
   193  	tbl.RawSetH(LTrue, LString("true"))
   194  	tbl.RawSetH(LFalse, LString("false"))
   195  
   196  	tbl.ForEach(func(key, value LValue) {
   197  		switch k := key.(type) {
   198  		case LBool:
   199  			switch bool(k) {
   200  			case true:
   201  				errorIfNotEqual(t, LString("true"), value)
   202  			case false:
   203  				errorIfNotEqual(t, LString("false"), value)
   204  			default:
   205  				t.Fail()
   206  			}
   207  		case LNumber:
   208  			switch int(k) {
   209  			case 1:
   210  				errorIfNotEqual(t, LNumber(1), value)
   211  			case 2:
   212  				errorIfNotEqual(t, LNumber(2), value)
   213  			case 3:
   214  				errorIfNotEqual(t, LNumber(3), value)
   215  			case 4:
   216  				errorIfNotEqual(t, LNumber(5), value)
   217  			default:
   218  				t.Fail()
   219  			}
   220  		case LString:
   221  			switch string(k) {
   222  			case "a":
   223  				errorIfNotEqual(t, LString("a"), value)
   224  			case "b":
   225  				errorIfNotEqual(t, LString("b"), value)
   226  			case "c":
   227  				errorIfNotEqual(t, LString("c"), value)
   228  			default:
   229  				t.Fail()
   230  			}
   231  		}
   232  	})
   233  }