forked from russlank/lang-forge
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdraw_test.go
More file actions
114 lines (105 loc) · 2.65 KB
/
Copy pathdraw_test.go
File metadata and controls
114 lines (105 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//go:build langforge_generated
package draw
import (
"bytes"
"image/png"
"os"
"strings"
"testing"
)
func TestRenderSample(t *testing.T) {
source := readSample(t)
program, err := Compile(source)
if err != nil {
t.Fatal(err)
}
img, result, err := Render(program)
if err != nil {
t.Fatal(err)
}
if got, want := img.Bounds().Dx(), 960; got != want {
t.Fatalf("width = %d, want %d", got, want)
}
if got, want := img.Bounds().Dy(), 640; got != want {
t.Fatalf("height = %d, want %d", got, want)
}
if len(result.Figures) != 5 {
t.Fatalf("figures = %#v", result.Figures)
}
var encoded bytes.Buffer
if err := png.Encode(&encoded, img); err != nil {
t.Fatal(err)
}
if encoded.Len() == 0 {
t.Fatal("expected encoded PNG bytes")
}
var report bytes.Buffer
WriteReport(&report, "sample.draw", "sample.png", result)
if !strings.Contains(report.String(), "Canvas: 960x640") || !strings.Contains(report.String(), "Operation summary:") {
t.Fatalf("report missing expected content:\n%s", report.String())
}
}
func TestRenderInlineLoop(t *testing.T) {
source := `canvas 64,64;
background #000000;
x = 4;
fill #FFFFFF;
stroke #FFFFFF;
repdraw 4 (
circle x,32,3;
x = x + 12;
);`
program, err := Compile(source)
if err != nil {
t.Fatal(err)
}
img, _, err := Render(program)
if err != nil {
t.Fatal(err)
}
if _, _, _, a := img.At(4, 32).RGBA(); a == 0 {
t.Fatal("expected rendered pixel")
}
}
func TestRejectsUndefinedFigure(t *testing.T) {
program, err := Compile(`canvas 10,10; draw missing;`)
if err != nil {
t.Fatal(err)
}
if _, _, err := Render(program); err == nil {
t.Fatal("expected undefined figure error")
}
}
func TestRejectsMalformedSource(t *testing.T) {
_, err := Compile(`canvas 10,10; line 0,0,1;`)
if err == nil {
t.Fatal("expected parse error")
}
}
func TestDrawReducerCoverageIsComplete(t *testing.T) {
if err := drawReducers.ValidateCoverage(); err != nil {
t.Fatalf("DRAW reducer coverage: %v", err)
}
}
func TestDrawActionManifestIsFullyTyped(t *testing.T) {
manifest, err := os.ReadFile("generated/langforge.actions.json")
if err != nil {
t.Fatal(err)
}
if bytes.Contains(manifest, []byte(`"typed": false`)) || bytes.Contains(manifest, []byte(`"typeIssue"`)) {
t.Fatalf("DRAW action manifest contains an untyped action:\n%s", manifest)
}
for _, label := range []string{`"label": "width"`, `"label": "target"`, `"label": "right"`, `"name": "expr.pass"`} {
if !bytes.Contains(manifest, []byte(label)) {
t.Fatalf("DRAW action manifest missing %s", label)
}
}
}
func readSample(t *testing.T) string {
t.Helper()
data, err := os.ReadFile("sample.draw")
if err != nil {
t.Fatal(err)
}
return string(data)
}