github.com/grafana/synthetic-monitoring-agent@v0.64.2/pkg/pb/synthetic_monitoring/multihttp_string_test.go (about) 1 package synthetic_monitoring 2 3 import ( 4 "cmp" 5 fmt "fmt" 6 "slices" 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 "golang.org/x/exp/constraints" 11 ) 12 13 type enum interface { 14 constraints.Integer 15 fmt.Stringer 16 } 17 18 // The following tests make sure everything is kept in sync, in particular that 19 // modifying the protobuf definition doesn't invalidate the string generated code. 20 21 // TestEnumToString makes sure that the strings generated from the proto file 22 // match the strings generated using enumer. 23 func TestEnumToString(t *testing.T) { 24 testEnumToString[MultiHttpEntryAssertionType](t, MultiHttpEntryAssertionType_name) 25 testEnumToString[MultiHttpEntryAssertionSubjectVariant](t, MultiHttpEntryAssertionSubjectVariant_name) 26 testEnumToString[MultiHttpEntryAssertionConditionVariant](t, MultiHttpEntryAssertionConditionVariant_name) 27 testEnumToString[MultiHttpEntryVariableType](t, MultiHttpEntryVariableType_name) 28 } 29 30 func TestStringToEnum(t *testing.T) { 31 testStringToEnum(t, MultiHttpEntryAssertionTypeString, MultiHttpEntryAssertionType_name) 32 testStringToEnum(t, MultiHttpEntryAssertionSubjectVariantString, MultiHttpEntryAssertionSubjectVariant_name) 33 testStringToEnum(t, MultiHttpEntryAssertionConditionVariantString, MultiHttpEntryAssertionConditionVariant_name) 34 testStringToEnum(t, MultiHttpEntryVariableTypeString, MultiHttpEntryVariableType_name) 35 } 36 37 func TestAllValuesIncluded(t *testing.T) { 38 testAllValuesIncluded(t, MultiHttpEntryAssertionTypeValues(), MultiHttpEntryAssertionType_name) 39 testAllValuesIncluded(t, MultiHttpEntryAssertionSubjectVariantValues(), MultiHttpEntryAssertionSubjectVariant_name) 40 testAllValuesIncluded(t, MultiHttpEntryAssertionConditionVariantValues(), MultiHttpEntryAssertionConditionVariant_name) 41 testAllValuesIncluded(t, MultiHttpEntryVariableTypeValues(), MultiHttpEntryVariableType_name) 42 } 43 44 func TestMultiHttpEntryAssertionType_IsAMultiHttpEntryAssertionType(t *testing.T) { 45 testAllValuesAreValid(t, func(v MultiHttpEntryAssertionType) bool { 46 return v.IsAMultiHttpEntryAssertionType() 47 }, MultiHttpEntryAssertionType_name) 48 49 testAllValuesAreValid(t, func(v MultiHttpEntryAssertionSubjectVariant) bool { 50 return v.IsAMultiHttpEntryAssertionSubjectVariant() 51 }, MultiHttpEntryAssertionSubjectVariant_name) 52 53 testAllValuesAreValid(t, func(v MultiHttpEntryAssertionConditionVariant) bool { 54 return v.IsAMultiHttpEntryAssertionConditionVariant() 55 }, MultiHttpEntryAssertionConditionVariant_name) 56 57 testAllValuesAreValid(t, func(v MultiHttpEntryVariableType) bool { 58 return v.IsAMultiHttpEntryVariableType() 59 }, MultiHttpEntryVariableType_name) 60 } 61 62 func testEnumToString[E enum](t *testing.T, m map[int32]string) { 63 t.Helper() 64 65 for v, str := range m { 66 v := E(v) 67 require.Equal(t, str, v.String()) 68 } 69 } 70 71 func testStringToEnum[E enum](t *testing.T, f func(string) (E, error), m map[int32]string) { 72 t.Helper() 73 74 for v, str := range m { 75 expected := E(v) 76 actual, err := f(str) 77 require.NoError(t, err) 78 require.Equal(t, expected, actual) 79 } 80 } 81 82 func getValues[E cmp.Ordered](m map[int32]string) []E { 83 values := make([]E, 0, len(m)) 84 for v := range m { 85 values = append(values, E(v)) 86 } 87 88 slices.Sort(values) 89 90 return values 91 } 92 93 func testAllValuesIncluded[E enum](t *testing.T, values []E, m map[int32]string) { 94 t.Helper() 95 require.Equal(t, getValues[E](m), values) 96 } 97 98 func testAllValuesAreValid[E enum](t *testing.T, f func(E) bool, m map[int32]string) { 99 t.Helper() 100 101 values := getValues[E](m) 102 103 for _, v := range values { 104 require.True(t, f(v)) 105 } 106 107 require.False(t, f(values[0]-1)) 108 require.False(t, f(values[len(values)-1]+1)) 109 }