github.com/enotodden/gopher-lua@v1.1.2/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 }