98 lines
1.7 KiB
Go
98 lines
1.7 KiB
Go
package luajit
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
)
|
|
|
|
func TestTableOperations(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
data map[string]interface{}
|
|
}{
|
|
{
|
|
name: "empty",
|
|
data: map[string]interface{}{},
|
|
},
|
|
{
|
|
name: "primitives",
|
|
data: map[string]interface{}{
|
|
"str": "hello",
|
|
"num": 42.0,
|
|
"bool": true,
|
|
"array": []float64{1.1, 2.2, 3.3},
|
|
},
|
|
},
|
|
{
|
|
name: "nested",
|
|
data: map[string]interface{}{
|
|
"nested": map[string]interface{}{
|
|
"value": 123.0,
|
|
"array": []float64{4.4, 5.5},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, f := range factories {
|
|
for _, tt := range tests {
|
|
t.Run(f.name+"/"+tt.name, func(t *testing.T) {
|
|
L := f.new()
|
|
if L == nil {
|
|
t.Fatal("Failed to create Lua state")
|
|
}
|
|
defer L.Close()
|
|
|
|
if err := L.PushTable(tt.data); err != nil {
|
|
t.Fatalf("PushTable() error = %v", err)
|
|
}
|
|
|
|
got, err := L.ToTable(-1)
|
|
if err != nil {
|
|
t.Fatalf("ToTable() error = %v", err)
|
|
}
|
|
|
|
if !tablesEqual(got, tt.data) {
|
|
t.Errorf("table mismatch\ngot = %v\nwant = %v", got, tt.data)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
func tablesEqual(a, b map[string]interface{}) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for k, v1 := range a {
|
|
v2, ok := b[k]
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
switch v1 := v1.(type) {
|
|
case map[string]interface{}:
|
|
v2, ok := v2.(map[string]interface{})
|
|
if !ok || !tablesEqual(v1, v2) {
|
|
return false
|
|
}
|
|
case []float64:
|
|
v2, ok := v2.([]float64)
|
|
if !ok || len(v1) != len(v2) {
|
|
return false
|
|
}
|
|
for i := range v1 {
|
|
if math.Abs(v1[i]-v2[i]) > 1e-10 {
|
|
return false
|
|
}
|
|
}
|
|
default:
|
|
if v1 != v2 {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
}
|