github.com/yoheimuta/protolint@v0.49.8-0.20240515023657-4ecaebb7575d/linter/autodisable/placementStrategy_test.go (about) 1 package autodisable_test 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/yoheimuta/go-protoparser/v4/parser" 8 "github.com/yoheimuta/go-protoparser/v4/parser/meta" 9 "github.com/yoheimuta/protolint/internal/setting_test" 10 "github.com/yoheimuta/protolint/internal/util_test" 11 "github.com/yoheimuta/protolint/linter/autodisable" 12 ) 13 14 type inputDisable struct { 15 inputOffset int 16 inputComments []*parser.Comment 17 inputInline *parser.Comment 18 } 19 20 func TestPlacementStrategy_Disable(t *testing.T) { 21 tests := []struct { 22 name string 23 inputPlacementType autodisable.PlacementType 24 inputFilename string 25 inputRoleID string 26 inputDisable []inputDisable 27 wantFilename string 28 }{ 29 { 30 name: "no auto disable", 31 inputPlacementType: autodisable.Noop, 32 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 33 inputDisable: []inputDisable{ 34 { 35 inputOffset: 34, 36 }, 37 }, 38 inputFilename: "invalid_enum_field_names.proto", 39 wantFilename: "invalid_enum_field_names.proto", 40 }, 41 { 42 name: "add a new line comment", 43 inputPlacementType: autodisable.Next, 44 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 45 inputDisable: []inputDisable{ 46 { 47 inputOffset: 34, 48 }, 49 }, 50 inputFilename: "invalid_enum_field_names.proto", 51 wantFilename: "disabled_enum_field_names.proto", 52 }, 53 { 54 name: "add new three line comments", 55 inputPlacementType: autodisable.Next, 56 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 57 inputDisable: []inputDisable{ 58 { 59 inputOffset: 63, 60 }, 61 { 62 inputOffset: 115, 63 }, 64 { 65 inputOffset: 145, 66 }, 67 }, 68 inputFilename: "invalid_many_enum_field_names.proto", 69 wantFilename: "disabled_many_enum_field_names.proto", 70 }, 71 { 72 name: "not merge the comment", 73 inputPlacementType: autodisable.Next, 74 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 75 inputDisable: []inputDisable{ 76 { 77 inputOffset: 99, 78 }, 79 { 80 inputOffset: 119, 81 }, 82 }, 83 inputFilename: "invalid_enum_field_names_comment.proto", 84 wantFilename: "disabled_nomerge_enum_field_names.proto", 85 }, 86 { 87 name: "add an inline comment", 88 inputPlacementType: autodisable.ThisThenNext, 89 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 90 inputDisable: []inputDisable{ 91 { 92 inputOffset: 34, 93 }, 94 }, 95 inputFilename: "invalid_enum_field_names.proto", 96 wantFilename: "disabled_inline_enum_field_names.proto", 97 }, 98 { 99 name: "merge an inline comment", 100 inputPlacementType: autodisable.ThisThenNext, 101 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 102 inputDisable: []inputDisable{ 103 { 104 inputOffset: 99, 105 }, 106 { 107 inputOffset: 119, 108 inputInline: &parser.Comment{ 109 Raw: `// protolint:disable:this ENUM_FIELD_NAMES_PREFIX`, 110 Meta: meta.Meta{Pos: meta.Position{Offset: 142}}, 111 }, 112 }, 113 }, 114 inputFilename: "invalid_inline_disable_enum_field_names.proto", 115 wantFilename: "disabled_merge_inline_enum_field_names.proto", 116 }, 117 { 118 name: "add an inline comment and a line comment", 119 inputPlacementType: autodisable.ThisThenNext, 120 inputRoleID: "ENUM_FIELD_NAMES_UPPER_SNAKE_CASE", 121 inputDisable: []inputDisable{ 122 { 123 inputOffset: 99, 124 }, 125 { 126 inputOffset: 119, 127 inputInline: &parser.Comment{ 128 Raw: `// See the reference page.`, 129 }, 130 }, 131 }, 132 inputFilename: "invalid_inline_enum_field_names.proto", 133 wantFilename: "disabled_inline_line_enum_field_names.proto", 134 }, 135 } 136 137 for _, test := range tests { 138 test := test 139 t.Run(test.name, func(t *testing.T) { 140 inputFilePath := setting_test.TestDataPath("autodisable", test.inputFilename) 141 wantFilePath := setting_test.TestDataPath("autodisable", test.wantFilename) 142 143 strategy, err := autodisable.NewPlacementStrategy( 144 test.inputPlacementType, 145 inputFilePath, 146 test.inputRoleID, 147 ) 148 if err != nil { 149 t.Errorf("got err %v, but want nil", err) 150 return 151 } 152 testDisable(t, strategy, test.inputDisable, inputFilePath, wantFilePath) 153 }) 154 } 155 } 156 157 func testDisable( 158 t *testing.T, 159 strategy autodisable.PlacementStrategy, 160 inputDisable []inputDisable, 161 inputFilePath string, 162 wantFilePath string, 163 ) { 164 input, err := util_test.NewTestData(inputFilePath) 165 if err != nil { 166 t.Errorf("got err %v", err) 167 return 168 } 169 170 want, err := util_test.NewTestData(wantFilePath) 171 if err != nil { 172 t.Errorf("got err %v", err) 173 return 174 } 175 176 for _, p := range inputDisable { 177 strategy.Disable(p.inputOffset, p.inputComments, p.inputInline) 178 } 179 err = strategy.Finalize() 180 if err != nil { 181 t.Errorf("got err %v", err) 182 return 183 } 184 185 got, _ := input.Data() 186 if !reflect.DeepEqual(got, want.OriginData) { 187 t.Errorf( 188 "got %s(%v), but want %s(%v)", 189 string(got), got, 190 string(want.OriginData), want.OriginData, 191 ) 192 } 193 194 err = input.Restore() 195 if err != nil { 196 t.Errorf("got err %v", err) 197 } 198 }