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  }