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 }