github.com/bitxmesh/gopher-lua@v0.0.0-20190327085718-93c344ef97a4/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 TestTableInsert(t *testing.T) {
    31  	tbl := newLTable(0, 0)
    32  	tbl.Append(LTrue)
    33  	tbl.Append(LTrue)
    34  	tbl.Append(LTrue)
    35  
    36  	tbl.Insert(5, LFalse)
    37  	errorIfNotEqual(t, LFalse, tbl.RawGetInt(5))
    38  	errorIfNotEqual(t, 5, tbl.Len())
    39  
    40  	tbl.Insert(-10, LFalse)
    41  	errorIfNotEqual(t, LFalse, tbl.RawGet(LNumber(-10)))
    42  	errorIfNotEqual(t, 5, tbl.Len())
    43  
    44  	tbl = newLTable(0, 0)
    45  	tbl.Append(LNumber(1))
    46  	tbl.Append(LNumber(2))
    47  	tbl.Append(LNumber(3))
    48  	tbl.Insert(1, LNumber(10))
    49  	errorIfNotEqual(t, LNumber(10), tbl.RawGetInt(1))
    50  	errorIfNotEqual(t, LNumber(1), tbl.RawGetInt(2))
    51  	errorIfNotEqual(t, LNumber(2), tbl.RawGetInt(3))
    52  	errorIfNotEqual(t, LNumber(3), tbl.RawGetInt(4))
    53  	errorIfNotEqual(t, 4, tbl.Len())
    54  
    55  	tbl = newLTable(0, 0)
    56  	tbl.Insert(5, LNumber(10))
    57  	errorIfNotEqual(t, LNumber(10), tbl.RawGetInt(5))
    58  
    59  }
    60  
    61  func TestTableMaxN(t *testing.T) {
    62  	tbl := newLTable(0, 0)
    63  	tbl.Append(LTrue)
    64  	tbl.Append(LTrue)
    65  	tbl.Append(LTrue)
    66  	errorIfNotEqual(t, 3, tbl.MaxN())
    67  
    68  	tbl = newLTable(0, 0)
    69  	errorIfNotEqual(t, 0, tbl.MaxN())
    70  
    71  	tbl = newLTable(10, 0)
    72  	errorIfNotEqual(t, 0, tbl.MaxN())
    73  }
    74  
    75  func TestTableRemove(t *testing.T) {
    76  	tbl := newLTable(0, 0)
    77  	errorIfNotEqual(t, LNil, tbl.Remove(10))
    78  	tbl.Append(LTrue)
    79  	errorIfNotEqual(t, LNil, tbl.Remove(10))
    80  
    81  	tbl.Append(LFalse)
    82  	tbl.Append(LTrue)
    83  	errorIfNotEqual(t, LFalse, tbl.Remove(2))
    84  	errorIfNotEqual(t, 2, tbl.MaxN())
    85  	tbl.Append(LFalse)
    86  	errorIfNotEqual(t, LFalse, tbl.Remove(-1))
    87  	errorIfNotEqual(t, 2, tbl.MaxN())
    88  
    89  }
    90  
    91  func TestTableRawSetInt(t *testing.T) {
    92  	tbl := newLTable(0, 0)
    93  	tbl.RawSetInt(MaxArrayIndex+1, LTrue)
    94  	errorIfNotEqual(t, 0, tbl.MaxN())
    95  	errorIfNotEqual(t, LTrue, tbl.RawGet(LNumber(MaxArrayIndex+1)))
    96  
    97  	tbl.RawSetInt(1, LTrue)
    98  	tbl.RawSetInt(3, LTrue)
    99  	errorIfNotEqual(t, 3, tbl.MaxN())
   100  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(1))
   101  	errorIfNotEqual(t, LNil, tbl.RawGetInt(2))
   102  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(3))
   103  	tbl.RawSetInt(2, LTrue)
   104  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(1))
   105  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(2))
   106  	errorIfNotEqual(t, LTrue, tbl.RawGetInt(3))
   107  }
   108  
   109  func TestTableRawSetH(t *testing.T) {
   110  	tbl := newLTable(0, 0)
   111  	tbl.RawSetH(LString("key"), LTrue)
   112  	tbl.RawSetH(LString("key"), LNil)
   113  	_, found := tbl.dict[LString("key")]
   114  	errorIfNotEqual(t, false, found)
   115  
   116  	tbl.RawSetH(LTrue, LTrue)
   117  	tbl.RawSetH(LTrue, LNil)
   118  	_, foundb := tbl.dict[LTrue]
   119  	errorIfNotEqual(t, false, foundb)
   120  }
   121  
   122  func TestTableRawGetH(t *testing.T) {
   123  	tbl := newLTable(0, 0)
   124  	errorIfNotEqual(t, LNil, tbl.RawGetH(LNumber(1)))
   125  	errorIfNotEqual(t, LNil, tbl.RawGetH(LString("key0")))
   126  	tbl.RawSetH(LString("key0"), LTrue)
   127  	tbl.RawSetH(LString("key1"), LFalse)
   128  	tbl.RawSetH(LNumber(1), LTrue)
   129  	errorIfNotEqual(t, LTrue, tbl.RawGetH(LString("key0")))
   130  	errorIfNotEqual(t, LTrue, tbl.RawGetH(LNumber(1)))
   131  	errorIfNotEqual(t, LNil, tbl.RawGetH(LString("notexist")))
   132  	errorIfNotEqual(t, LNil, tbl.RawGetH(LTrue))
   133  }
   134  
   135  func TestTableForEach(t *testing.T) {
   136  	tbl := newLTable(0, 0)
   137  	tbl.Append(LNumber(1))
   138  	tbl.Append(LNumber(2))
   139  	tbl.Append(LNumber(3))
   140  	tbl.Append(LNil)
   141  	tbl.Append(LNumber(5))
   142  
   143  	tbl.RawSetH(LString("a"), LString("a"))
   144  	tbl.RawSetH(LString("b"), LString("b"))
   145  	tbl.RawSetH(LString("c"), LString("c"))
   146  
   147  	tbl.RawSetH(LTrue, LString("true"))
   148  	tbl.RawSetH(LFalse, LString("false"))
   149  
   150  	tbl.ForEach(func(key, value LValue) {
   151  		switch k := key.(type) {
   152  		case LBool:
   153  			switch bool(k) {
   154  			case true:
   155  				errorIfNotEqual(t, LString("true"), value)
   156  			case false:
   157  				errorIfNotEqual(t, LString("false"), value)
   158  			default:
   159  				t.Fail()
   160  			}
   161  		case LNumber:
   162  			switch int(k) {
   163  			case 1:
   164  				errorIfNotEqual(t, LNumber(1), value)
   165  			case 2:
   166  				errorIfNotEqual(t, LNumber(2), value)
   167  			case 3:
   168  				errorIfNotEqual(t, LNumber(3), value)
   169  			case 4:
   170  				errorIfNotEqual(t, LNumber(5), value)
   171  			default:
   172  				t.Fail()
   173  			}
   174  		case LString:
   175  			switch string(k) {
   176  			case "a":
   177  				errorIfNotEqual(t, LString("a"), value)
   178  			case "b":
   179  				errorIfNotEqual(t, LString("b"), value)
   180  			case "c":
   181  				errorIfNotEqual(t, LString("c"), value)
   182  			default:
   183  				t.Fail()
   184  			}
   185  		}
   186  	})
   187  }