github.com/stackb/rules_proto@v0.0.0-20240221195024-5428336c51f1/pkg/protoc/package_config_test.go (about)

     1  package protoc
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/bazelbuild/bazel-gazelle/rule"
     7  )
     8  
     9  type packageConfigCheck func(t *testing.T, cfg *PackageConfig)
    10  
    11  type packageConfigTestCase struct {
    12  	rel        string
    13  	directives []rule.Directive
    14  	check      packageConfigCheck
    15  	err        error
    16  }
    17  
    18  func TestPackageConfigClone(t *testing.T) {
    19  	initialState := allPackageChecks(
    20  		withLanguage("fake",
    21  			withLanguageEnabled(true),
    22  		),
    23  		withLanguageRule("fake_proto_library",
    24  			withLanguageRuleEnabled(true),
    25  		),
    26  	)
    27  	finalState := allPackageChecks(
    28  		withLanguage("fake",
    29  			withLanguageEnabled(true),
    30  		),
    31  		withLanguageRule("fake_proto_library",
    32  			withLanguageRuleEnabled(false),
    33  		),
    34  		withPlugin("fake_proto"), // withPluginToolEquals("repo", "pkg", "name"),
    35  
    36  	)
    37  
    38  	a := NewPackageConfig(nil)
    39  	if err := a.ParseDirectives("", withDirectives(
    40  		"proto_plugin", "fake_proto label @fake//proto/plugin",
    41  		"proto_rule", "fake_proto_library enabled true",
    42  		"proto_language", "fake plugin fake_proto",
    43  		"proto_language", "fake rule fake_proto_library",
    44  	)); err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	b := a.Clone()
    48  
    49  	initialState(t, a)
    50  	initialState(t, b)
    51  
    52  	b.rules["fake_proto_library"].Enabled = false
    53  
    54  	initialState(t, a)
    55  	finalState(t, b)
    56  }
    57  
    58  func testDirectives(t *testing.T, cases map[string]packageConfigTestCase) {
    59  	for name, tc := range cases {
    60  		t.Run(name, func(t *testing.T) {
    61  			cfg := NewPackageConfig(nil)
    62  			// t.Logf("test case: %+v", tc)
    63  			if err := cfg.ParseDirectives(tc.rel, tc.directives); err != nil {
    64  				if tc.err == nil {
    65  					t.Fatalf("unexpected error: %v", err)
    66  				}
    67  				if tc.err.Error() != err.Error() {
    68  					t.Fatalf("unexpected error: want %v, got %v", tc.err, err)
    69  				}
    70  				return
    71  			}
    72  			tc.check(t, cfg)
    73  		})
    74  	}
    75  }
    76  
    77  func allPackageChecks(checks ...packageConfigCheck) packageConfigCheck {
    78  	return func(t *testing.T, cfg *PackageConfig) {
    79  		for _, check := range checks {
    80  			check(t, cfg)
    81  		}
    82  	}
    83  }
    84  
    85  func withDirectives(items ...string) (d []rule.Directive) {
    86  	if len(items)%2 != 0 {
    87  		panic("directive list must be a sequence of key/value pairs")
    88  	}
    89  	if len(items) < 2 {
    90  		return
    91  	}
    92  	for i := 1; i < len(items); i = i + 2 {
    93  		d = append(d, rule.Directive{Key: items[i-1], Value: items[i]})
    94  	}
    95  	return
    96  }