github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/analytics/dimensions/dimensions_test.go (about)

     1  package dimensions
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/ActiveState/cli/internal/rtutils/ptr"
    10  )
    11  
    12  func TestMap_Merge(t *testing.T) {
    13  	tests := []struct {
    14  		name      string
    15  		input     *Values
    16  		mergeWith *Values
    17  		expected  *Values
    18  	}{
    19  		{
    20  			"Simple",
    21  			&Values{Version: ptr.To("inputVersion")},
    22  			&Values{ChannelName: ptr.To("mergeChannelName")},
    23  			&Values{Version: ptr.To("inputVersion"), ChannelName: ptr.To("mergeChannelName")},
    24  		},
    25  		{
    26  			"Override",
    27  			&Values{Version: ptr.To("inputVersion")},
    28  			&Values{Version: ptr.To("mergeVersion")},
    29  			&Values{Version: ptr.To("mergeVersion")},
    30  		},
    31  		{
    32  			"Nils don't count",
    33  			&Values{Version: ptr.To("inputVersion")},
    34  			&Values{Version: nil},
    35  			&Values{Version: ptr.To("inputVersion")},
    36  		},
    37  	}
    38  	for _, tt := range tests {
    39  		t.Run(tt.name, func(t *testing.T) {
    40  			tt.input.Merge(tt.mergeWith)
    41  			different, diffValue := diff(tt.input, tt.expected)
    42  			if different {
    43  				t.Errorf("%v", diffValue)
    44  			}
    45  		})
    46  	}
    47  }
    48  
    49  func diff(m1 *Values, m2 *Values) (bool, string) {
    50  	fields1 := reflect.ValueOf(m1).Elem().Type()
    51  	fields2 := reflect.ValueOf(m2).Elem().Type()
    52  	values1 := reflect.ValueOf(m1)
    53  	values2 := reflect.ValueOf(m2)
    54  
    55  	result := []string{}
    56  	for i := 0; i < fields1.NumField(); i++ {
    57  		field1 := fields1.Field(i)
    58  		field2 := fields2.Field(i)
    59  		val1Elem := values1.Elem().Field(i)
    60  		val2Elem := values2.Elem().Field(i)
    61  
    62  		if strings.ToUpper(field1.Name[0:1]) != field1.Name[0:1] {
    63  			continue
    64  		}
    65  
    66  		val1 := val1Elem.Elem().String()
    67  		val2 := val2Elem.Elem().String()
    68  
    69  		if val1Elem.IsNil() {
    70  			val1 = "<nil>"
    71  		}
    72  		if val2Elem.IsNil() {
    73  			val2 = "<nil>"
    74  		}
    75  
    76  		if val1 != val2 {
    77  			result = append(result, fmt.Sprintf("%s:%s != %s:%s", field1.Name, val1, field2.Name, val2))
    78  		}
    79  	}
    80  
    81  	if len(result) > 0 {
    82  		return true, strings.Join(result, "\n")
    83  	}
    84  
    85  	return false, ""
    86  }