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