1
2
3
4
5 package gentools
6
7 import (
8 "bytes"
9 "os"
10 "path/filepath"
11 "strings"
12 "testing"
13 )
14
15 func TestGoFileFormatting(t *testing.T) {
16 t.Parallel()
17
18 var outBuf bytes.Buffer
19 var files Files
20 files.Options = &Options{
21 Txtar: true,
22 Output: &outBuf,
23 }
24
25 buf := files.NewGoFile("test.go")
26 buf.WriteString("package test\nfunc Foo() int { return 42 }\n")
27
28 err := files.Flush()
29 if err != nil {
30 t.Fatalf("Flush failed: %v", err)
31 }
32
33 outStr := outBuf.String()
34 expected := "-- src/test.go --\npackage test\n\nfunc Foo() int { return 42 }\n"
35 if outStr != expected {
36 t.Errorf("got txtar output:\n%q\nwant:\n%q", outStr, expected)
37 }
38 }
39
40 func TestFormattingError(t *testing.T) {
41 t.Parallel()
42
43 var errBuf bytes.Buffer
44 var files Files
45 files.Options = &Options{
46 ErrOutput: &errBuf,
47 }
48
49 buf := files.NewGoFile("bad.go")
50 buf.WriteString("package test\n\tfunc Foo( {\n")
51
52 err := files.Flush()
53 if err == nil {
54 t.Fatalf("expected formatting error, got nil")
55 }
56 if !strings.Contains(err.Error(), "error formatting bad.go") {
57 t.Errorf("unexpected error message: %v", err)
58 }
59
60 const expectedErrOutput = "package test\n\tfunc Foo( {\n\t ^\n2:12: expected ')', found '{'\n"
61 if errBuf.String() != expectedErrOutput {
62 t.Errorf("got error output:\n%q\nwant:\n%q", errBuf.String(), expectedErrOutput)
63 }
64 }
65
66 func TestWriteMode(t *testing.T) {
67 t.Parallel()
68
69 tmpDir := t.TempDir()
70 var files Files
71 files.Options = &Options{
72 GOROOT: tmpDir,
73 Write: true,
74 }
75
76 gobuf := files.NewGoFile("pkg/a.go")
77 gobuf.WriteString("package pkg\nconst X = 1\n")
78
79 const expectedRawContent = "raw content\n"
80 rawbuf := files.NewRawFile("pkg/a.txt")
81 rawbuf.WriteString(expectedRawContent)
82
83 if err := files.Flush(); err != nil {
84 t.Fatalf("Flush failed: %v", err)
85 }
86
87 aGo, err := os.ReadFile(filepath.Join(tmpDir, "src", "pkg", "a.go"))
88 if err != nil {
89 t.Fatalf("reading a.go: %v", err)
90 }
91 if string(aGo) != "package pkg\n\nconst X = 1\n" {
92 t.Errorf("unexpected a.go content: %q", string(aGo))
93 }
94
95 aTxt, err := os.ReadFile(filepath.Join(tmpDir, "src", "pkg", "a.txt"))
96 if err != nil {
97 t.Fatalf("reading a.txt: %v", err)
98 }
99 if string(aTxt) != expectedRawContent {
100 t.Errorf("unexpected a.txt content: %q", string(aTxt))
101 }
102 }
103
104 func TestWriteAsideMode(t *testing.T) {
105 t.Parallel()
106
107 tmpDir := t.TempDir()
108 tmpDir2 := t.TempDir()
109 var files Files
110 files.Options = &Options{
111 GOROOT: tmpDir,
112 outDir: tmpDir2,
113 Write: true,
114 }
115
116 gobuf := files.NewGoFile("pkg/a.go")
117 gobuf.WriteString("package pkg\nconst X = 1\n")
118
119 const expectedRawContent = "raw content\n"
120 rawbuf := files.NewRawFile("pkg/a.txt")
121 rawbuf.WriteString(expectedRawContent)
122
123 if err := files.Flush(); err != nil {
124 t.Fatalf("Flush failed: %v", err)
125 }
126
127 aGo, err := os.ReadFile(filepath.Join(tmpDir2, "src", "pkg", "a.go"))
128 if err != nil {
129 t.Fatalf("reading a.go: %v", err)
130 }
131 if string(aGo) != "package pkg\n\nconst X = 1\n" {
132 t.Errorf("unexpected a.go content: %q", string(aGo))
133 }
134
135 aTxt, err := os.ReadFile(filepath.Join(tmpDir2, "src", "pkg", "a.txt"))
136 if err != nil {
137 t.Fatalf("reading a.txt: %v", err)
138 }
139 if string(aTxt) != expectedRawContent {
140 t.Errorf("unexpected a.txt content: %q", string(aTxt))
141 }
142 }
143
144 func TestDiffMode(t *testing.T) {
145 t.Parallel()
146
147 tmpDir := t.TempDir()
148 targetFile := filepath.Join(tmpDir, "src", "pkg", "a.go")
149 os.MkdirAll(filepath.Dir(targetFile), 0755)
150 os.WriteFile(targetFile, []byte("package pkg\n\nconst X = 1\n"), 0644)
151
152
153 var files1 Files
154 files1.Options = &Options{
155 GOROOT: tmpDir,
156 Diff: true,
157 }
158 buf1 := files1.NewGoFile("pkg/a.go")
159 buf1.WriteString("package pkg\nconst X = 1\n")
160 if err := files1.Flush(); err != nil {
161 t.Errorf("expected no diff error, got: %v", err)
162 }
163
164
165 var outBuf bytes.Buffer
166 var files2 Files
167 files2.Options = &Options{
168 GOROOT: tmpDir,
169 Diff: true,
170 Output: &outBuf,
171 }
172 buf2 := files2.NewGoFile("pkg/a.go")
173 buf2.WriteString("package pkg\nconst X = 2\n")
174
175 err := files2.Flush()
176 if err == nil {
177 t.Errorf("expected diff error, got nil")
178 }
179
180 if !strings.Contains(outBuf.String(), "-const X = 1") || !strings.Contains(outBuf.String(), "+const X = 2") {
181 t.Errorf("unexpected diff output:\n%s", outBuf.String())
182 }
183 }
184
View as plain text