1 package main
2
3 import (
4 "go/types"
5 "testing"
6
7 "github.com/google/go-cmp/cmp"
8 "golang.org/x/exp/apidiff"
9 )
10
11 func TestIsInternalPackage(t *testing.T) {
12 for _, tst := range []struct {
13 name, pkg, mod string
14 want bool
15 }{
16 {
17 name: "not internal no module",
18 pkg: "foo",
19 want: false,
20 },
21 {
22 name: "not internal with module",
23 pkg: "example.com/bar/foo",
24 mod: "example.com/bar",
25 want: false,
26 },
27 {
28 name: "internal no module",
29 pkg: "internal",
30 want: true,
31 },
32 {
33 name: "leading internal no module",
34 pkg: "internal/foo",
35 want: true,
36 },
37 {
38 name: "middle internal no module",
39 pkg: "foo/internal/bar",
40 want: true,
41 },
42 {
43 name: "ending internal no module",
44 pkg: "foo/internal",
45 want: true,
46 },
47
48 {
49 name: "leading internal with module",
50 pkg: "example.com/baz/internal/foo",
51 mod: "example.com/baz",
52 want: true,
53 },
54 {
55 name: "middle internal with module",
56 pkg: "example.com/baz/foo/internal/bar",
57 mod: "example.com/baz",
58 want: true,
59 },
60 {
61 name: "ending internal with module",
62 pkg: "example.com/baz/foo/internal",
63 mod: "example.com/baz",
64 want: true,
65 },
66 {
67 name: "not package internal with internal module",
68 pkg: "example.com/internal/foo",
69 mod: "example.com/internal",
70 want: false,
71 },
72 } {
73 t.Run(tst.name, func(t *testing.T) {
74 if got := isInternalPackage(tst.pkg, tst.mod); got != tst.want {
75 t.Errorf("expected %v, got %v for %s/%s", tst.want, got, tst.mod, tst.pkg)
76 }
77 })
78 }
79 }
80
81 func TestFilterInternal(t *testing.T) {
82 for _, tst := range []struct {
83 name string
84 mod *apidiff.Module
85 allow bool
86 want []*types.Package
87 }{
88 {
89 name: "allow internal",
90 mod: &apidiff.Module{
91 Path: "example.com/foo",
92 Packages: []*types.Package{
93 types.NewPackage("example.com/foo/bar", "bar"),
94 types.NewPackage("example.com/foo/internal", "internal"),
95 types.NewPackage("example.com/foo/internal/buz", "buz"),
96 types.NewPackage("example.com/foo/bar/internal", "internal"),
97 },
98 },
99 allow: true,
100 want: []*types.Package{
101 types.NewPackage("example.com/foo/bar", "bar"),
102 types.NewPackage("example.com/foo/internal", "internal"),
103 types.NewPackage("example.com/foo/internal/buz", "buz"),
104 types.NewPackage("example.com/foo/bar/internal", "internal"),
105 },
106 },
107 {
108 name: "filter internal",
109 mod: &apidiff.Module{
110 Path: "example.com/foo",
111 Packages: []*types.Package{
112 types.NewPackage("example.com/foo/bar", "bar"),
113 types.NewPackage("example.com/foo/internal", "internal"),
114 types.NewPackage("example.com/foo/internal/buz", "buz"),
115 types.NewPackage("example.com/foo/bar/internal", "internal"),
116 },
117 },
118 want: []*types.Package{
119 types.NewPackage("example.com/foo/bar", "bar"),
120 },
121 },
122 {
123 name: "filter internal nothing left",
124 mod: &apidiff.Module{
125 Path: "example.com/foo",
126 Packages: []*types.Package{
127 types.NewPackage("example.com/foo/internal", "internal"),
128 },
129 },
130 want: nil,
131 },
132 } {
133 t.Run(tst.name, func(t *testing.T) {
134 filterInternal(tst.mod, tst.allow)
135 if diff := cmp.Diff(tst.mod.Packages, tst.want, cmp.Comparer(comparePath)); diff != "" {
136 t.Errorf("got(-),want(+):\n%s", diff)
137 }
138 })
139 }
140 }
141
142 func comparePath(x, y *types.Package) bool {
143 return x.Path() == y.Path()
144 }
145
View as plain text