github.com/elves/elvish@v0.15.0/pkg/eval/vars/element_test.go (about) 1 package vars 2 3 import ( 4 "testing" 5 6 "github.com/elves/elvish/pkg/eval/vals" 7 ) 8 9 var elementTests = []struct { 10 name string 11 oldContainer interface{} 12 indices []interface{} 13 elemValue interface{} 14 newContainer interface{} 15 }{ 16 { 17 "single level", 18 vals.MakeMap("k1", "v1", "k2", "v2"), 19 []interface{}{"k1"}, "new v1", 20 vals.MakeMap("k1", "new v1", "k2", "v2"), 21 }, 22 { 23 "multi level", 24 vals.MakeMap( 25 "k1", vals.MakeMap("k1a", "v1a", "k1b", "v1b"), "k2", "v2"), 26 []interface{}{"k1", "k1a"}, "new v1a", 27 vals.MakeMap( 28 "k1", vals.MakeMap("k1a", "new v1a", "k1b", "v1b"), "k2", "v2"), 29 }, 30 } 31 32 func TestElement(t *testing.T) { 33 for _, test := range elementTests { 34 t.Run(test.name, func(t *testing.T) { 35 m := test.oldContainer 36 37 elemVar, err := MakeElement(FromPtr(&m), test.indices) 38 if err != nil { 39 t.Errorf("MakeElement -> error %v, want nil", err) 40 } 41 42 elemVar.Set(test.elemValue) 43 if !vals.Equal(m, test.newContainer) { 44 t.Errorf("Value after Set is %v, want %v", m, test.newContainer) 45 } 46 47 if elemVar.Get() != test.elemValue { 48 t.Errorf("elemVar.Get() -> %v, want %v", 49 elemVar.Get(), test.elemValue) 50 } 51 }) 52 } 53 } 54 55 var delElementTests = []struct { 56 name string 57 oldContainer interface{} 58 indices []interface{} 59 newContainer interface{} 60 }{ 61 { 62 "single level", 63 vals.MakeMap("k1", "v1", "k2", "v2"), 64 []interface{}{"k1"}, 65 vals.MakeMap("k2", "v2"), 66 }, 67 { 68 "multi level", 69 vals.MakeMap( 70 "k1", vals.MakeMap("k1a", "v1a", "k1b", "v1b"), "k2", "v2"), 71 []interface{}{"k1", "k1a"}, 72 vals.MakeMap("k1", vals.MakeMap("k1b", "v1b"), "k2", "v2"), 73 }, 74 } 75 76 func TestDelElement(t *testing.T) { 77 for _, test := range delElementTests { 78 t.Run(test.name, func(t *testing.T) { 79 m := test.oldContainer 80 81 DelElement(FromPtr(&m), test.indices) 82 if !vals.Equal(m, test.newContainer) { 83 t.Errorf("After deleting, map is %v, want %v", 84 vals.Repr(m, vals.NoPretty), 85 vals.Repr(test.newContainer, vals.NoPretty)) 86 } 87 }) 88 } 89 }