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 }