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  }