github.com/xmx/lua@v0.0.0-20230324063450-8a298e091302/table_test.go (about)

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