Neale Pickett
·
2023-04-11
main_test.go
1package main
2
3import (
4 "archive/zip"
5 "bytes"
6 "encoding/json"
7 "fmt"
8 "io/ioutil"
9 "os"
10 "strings"
11 "testing"
12
13 "github.com/dirtbags/moth/v4/pkg/transpile"
14 "github.com/spf13/afero"
15)
16
17var testMothYaml = []byte(`---
18answers:
19 - YAML answer
20authors:
21 - Arthur
22 - Buster
23 - DW
24attachments:
25 - filename: moo.txt
26---
27YAML body
28`)
29
30func newTestFs() afero.Fs {
31 fs := afero.NewMemMapFs()
32 afero.WriteFile(fs, "cat0/1/puzzle.md", testMothYaml, 0644)
33 afero.WriteFile(fs, "cat0/1/moo.txt", []byte("Moo."), 0644)
34 afero.WriteFile(fs, "cat0/2/puzzle.moth", testMothYaml, 0644)
35 afero.WriteFile(fs, "cat0/3/puzzle.moth", testMothYaml, 0644)
36 afero.WriteFile(fs, "cat0/4/puzzle.md", testMothYaml, 0644)
37 afero.WriteFile(fs, "cat0/5/puzzle.md", testMothYaml, 0644)
38 afero.WriteFile(fs, "cat0/10/puzzle.md", testMothYaml, 0644)
39 afero.WriteFile(fs, "unbroken/1/puzzle.md", testMothYaml, 0644)
40 afero.WriteFile(fs, "unbroken/1/moo.txt", []byte("Moo."), 0644)
41 afero.WriteFile(fs, "unbroken/2/puzzle.md", testMothYaml, 0644)
42 afero.WriteFile(fs, "unbroken/2/moo.txt", []byte("Moo."), 0644)
43 return fs
44}
45
46func (tp T) Run(args ...string) error {
47 tp.Args = append([]string{"transpile"}, args...)
48 command, err := tp.ParseArgs()
49 if err != nil {
50 return err
51 }
52 return command()
53}
54
55func TestTranspilerEverything(t *testing.T) {
56 stdin := new(bytes.Buffer)
57 stdout := new(bytes.Buffer)
58 stderr := new(bytes.Buffer)
59 tp := T{
60 Stdin: stdin,
61 Stdout: stdout,
62 Stderr: stderr,
63 BaseFs: newTestFs(),
64 }
65
66 if err := tp.Run("inventory", "-dir=cat0"); err != nil {
67 t.Error(err)
68 }
69 if stdout.String() != "{\"Puzzles\":[1,2,3,4,5,10]}" {
70 t.Errorf("Bad inventory: %#v", stdout.String())
71 }
72
73 stdout.Reset()
74 if err := tp.Run("puzzle", "-dir=cat0/1"); err != nil {
75 t.Error(err)
76 }
77 p := transpile.Puzzle{}
78 if err := json.Unmarshal(stdout.Bytes(), &p); err != nil {
79 t.Error(err)
80 }
81 if (len(p.Answers) != 1) || (p.Answers[0] != "YAML answer") {
82 t.Error("Didn't return the right object", p)
83 }
84
85 stdout.Reset()
86 if err := tp.Run("file", "-dir=cat0/1", "moo.txt"); err != nil {
87 t.Error(err)
88 }
89 if stdout.String() != "Moo." {
90 t.Error("Wrong file pulled", stdout.String())
91 }
92
93 stdout.Reset()
94 if err := tp.Run("answer", "-dir=cat0/1", "YAML answer"); err != nil {
95 t.Error(err)
96 }
97 if stdout.String() != `{"Correct":true}` {
98 t.Error("Answer validation failed", stdout.String())
99 }
100
101 stdout.Reset()
102 stdin.Reset()
103 stdin.WriteString("text *emphasized* text")
104 if err := tp.Run("markdown"); err != nil {
105 t.Error(err)
106 }
107 if stdout.String() != "<p>text <em>emphasized</em> text</p>\n" {
108 t.Error("Markdown conversion failed", stdout.String())
109 }
110}
111
112func TestMothballs(t *testing.T) {
113 stdout := new(bytes.Buffer)
114 stderr := new(bytes.Buffer)
115 tp := T{
116 Stdout: stdout,
117 Stderr: stderr,
118 BaseFs: newTestFs(),
119 }
120
121 stdout.Reset()
122 if err := tp.Run("mothball", "-dir=unbroken", "unbroken.mb"); err != nil {
123 t.Error(err)
124 return
125 }
126
127 // afero.WriteFile(tp.BaseFs, "unbroken.mb", []byte("moo"), 0644)
128 fis, err := afero.ReadDir(tp.BaseFs, "/")
129 if err != nil {
130 t.Error(err)
131 }
132 for _, fi := range fis {
133 t.Log(fi.Name())
134 }
135
136 mb, err := tp.BaseFs.Open("unbroken.mb")
137 if err != nil {
138 t.Error(err)
139 return
140 }
141 defer mb.Close()
142
143 info, err := mb.Stat()
144 if err != nil {
145 t.Error(err)
146 return
147 }
148
149 zmb, err := zip.NewReader(mb, info.Size())
150 if err != nil {
151 t.Error(err)
152 return
153 }
154 for _, zf := range zmb.File {
155 f, err := zf.Open()
156 if err != nil {
157 t.Error(err)
158 continue
159 }
160 defer f.Close()
161 buf, err := ioutil.ReadAll(f)
162 if err != nil {
163 t.Error(err)
164 continue
165 }
166
167 switch zf.Name {
168 case "answers.txt":
169 if len(buf) == 0 {
170 t.Error("answers.txt empty")
171 }
172 case "puzzles.txt":
173 if len(buf) == 0 {
174 t.Error("puzzles.txt empty")
175 }
176 }
177 }
178}
179
180func TestFilesystem(t *testing.T) {
181 stdin := new(bytes.Buffer)
182 stdout := new(bytes.Buffer)
183 stderr := new(bytes.Buffer)
184 tp := T{
185 Stdin: stdin,
186 Stdout: stdout,
187 Stderr: stderr,
188 BaseFs: afero.NewOsFs(),
189 }
190
191 stdout.Reset()
192 if err := tp.Run("puzzle", "-dir=testdata/cat1/1"); err != nil {
193 t.Error(err)
194 }
195 if !strings.Contains(stdout.String(), "moo") {
196 t.Error("File not pulled from cwd", stdout.String())
197 }
198
199 stdout.Reset()
200 if err := tp.Run("file", "-dir=testdata/cat1/1", "moo.txt"); err != nil {
201 t.Error(err)
202 }
203 if !strings.Contains(stdout.String(), "Moo.") {
204 t.Error("Wrong file pulled", stdout.String())
205 }
206}
207
208func TestCwd(t *testing.T) {
209 testwd, err := os.Getwd()
210 if err != nil {
211 t.Error("Can't get current working directory!")
212 return
213 }
214 defer os.Chdir(testwd)
215
216 stdin := new(bytes.Buffer)
217 stdout := new(bytes.Buffer)
218 stderr := new(bytes.Buffer)
219 tp := T{
220 Stdin: stdin,
221 Stdout: stdout,
222 Stderr: stderr,
223 BaseFs: afero.NewOsFs(),
224 }
225
226 stdout.Reset()
227 os.Chdir("/")
228 if err := tp.Run(
229 "file",
230 fmt.Sprintf("-dir=%s/testdata/cat1/1", testwd),
231 "moo.txt",
232 ); err != nil {
233 t.Error(err)
234 }
235}