moth

Monarch Of The Hill game server
git clone https://git.woozle.org/neale/moth.git

moth / cmd / transpile
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}