Skip to content

Commit 8df4601

Browse files
committed
test(assert): assert the golden with the current generated
1 parent 2a289a4 commit 8df4601

5 files changed

Lines changed: 173 additions & 22 deletions

File tree

cmd/lab/test/snapshot/main.go

Lines changed: 148 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"bytes"
55
"context"
6+
"errors"
67
"flag"
78
"fmt"
89
"log"
@@ -15,18 +16,9 @@ import (
1516
"github.com/jodi-ivan/numbered-notation-xml/svc/usecase"
1617
"github.com/jodi-ivan/numbered-notation-xml/utils/config"
1718
"github.com/jodi-ivan/numbered-notation-xml/utils/storage"
18-
)
19-
20-
// TODO: the snapshot testing
21-
/*
22-
- generate golden file
23-
- generate the svg
24-
- sampling
25-
- assert
26-
*/
2719

28-
var defaultxml = "~/go/src/github.com/jodi-ivan/numbered-notation-xml/files/scores/musicxml/"
29-
var defaultdb = "~/go/src/github.com/jodi-ivan/numbered-notation-xml/files/database/kidung-jemaat.db"
20+
"github.com/JoshVarga/svgparser"
21+
)
3022

3123
func main() {
3224
env := os.Environ()
@@ -38,9 +30,9 @@ func main() {
3830
// Parse the command-line arguments into the defined flags
3931
flag.Parse()
4032

41-
log.Println("method:", *method)
42-
xmlFlag := defaultxml
43-
dbPath := defaultdb
33+
// TODO: [snapshot test] validate here
34+
xmlFlag := ""
35+
dbPath := ""
4436

4537
for _, e := range env {
4638
keyval := strings.Split(e, "=")
@@ -84,7 +76,7 @@ func main() {
8476
return
8577
}
8678

87-
fmt.Printf("Read the musicxml files on %s.\n", defaultxml)
79+
fmt.Printf("Read the musicxml files on %s.\n", xmlFlag)
8880
fmt.Printf("Generate golden files. Generated on %s. \n\n", *goldenPath)
8981

9082
err = GenerateGolden(context.Background(), stringRender, *goldenPath)
@@ -93,31 +85,168 @@ func main() {
9385
os.Exit(2)
9486
return
9587
}
88+
case "assert":
89+
90+
if *goldenPath == "" {
91+
fmt.Printf("Goldenpath -path cannot be empty")
92+
os.Exit(2)
93+
return
94+
}
95+
96+
fmt.Printf("Gathering golden files on %s. \n\n", *goldenPath)
97+
numFiles := 22
98+
for i := 1; i <= numFiles; i++ {
99+
fmt.Printf("Asserting kj-%03d....\n", i)
100+
err = Assert(context.Background(), stringRender, *goldenPath, i)
101+
if err != nil {
102+
fmt.Printf("Failed to Assert the golden snapsot: %s\n", err.Error())
103+
os.Exit(2)
104+
return
105+
}
106+
fmt.Printf("Asserting kj-%03d SUCCESS\n", i)
107+
108+
}
96109

97110
}
98111

99112
os.Exit(0)
100113

101114
}
102115

116+
func getGenElement(stringRenderer *adapter.RenderString, number int) (*svgparser.Element, error) {
117+
buff := bytes.NewBuffer(nil)
118+
content, err := stringRenderer.RenderHymn(context.Background(), buff, number)
119+
if err != nil {
120+
return nil, err
121+
}
122+
123+
reader := strings.NewReader(content)
124+
125+
return svgparser.Parse(reader, false)
126+
}
127+
128+
func getGoldenElement(path string, number int) (*svgparser.Element, error) {
129+
fileName := fmt.Sprintf("%s/goldenfiles/kj-%03d.svg", path, number)
130+
xmlFile, err := os.Open(fileName)
131+
if err != nil {
132+
return nil, err
133+
}
134+
defer xmlFile.Close()
135+
136+
return svgparser.Parse(xmlFile, false)
137+
}
138+
139+
func breakdownStaffCredit(elmnt *svgparser.Element) (staff []*svgparser.Element, verses *svgparser.Element, credit *svgparser.Element) {
140+
for i := 4; i < len(elmnt.Children); i++ {
141+
child := elmnt.Children[i]
142+
if sty, ok := child.Attributes["style"]; ok && sty == "staff" {
143+
staff = append(staff, child)
144+
continue
145+
}
146+
147+
if class, ok := child.Attributes["class"]; ok {
148+
switch class {
149+
case "verses":
150+
verses = child
151+
case "credit":
152+
credit = child
153+
}
154+
}
155+
156+
}
157+
return
158+
}
159+
160+
func Assert(ctx context.Context, stringRenderer *adapter.RenderString, path string, number int) error {
161+
162+
generatedElement, err := getGenElement(stringRenderer, number)
163+
if err != nil {
164+
return err
165+
}
166+
167+
goldenElement, err := getGoldenElement(path, number)
168+
if err != nil {
169+
return err
170+
}
171+
172+
cdata := generatedElement.Children[0].Children[0].Content
173+
expectedFont := []string{
174+
"Caladea",
175+
"Old Standard TT",
176+
"Noto Music",
177+
"Figtree",
178+
}
179+
180+
// FONT VALIDATION
181+
for _, ef := range expectedFont {
182+
if !strings.Contains(strings.ToLower(cdata), strings.ToLower(ef)) {
183+
return fmt.Errorf("font family %s is not found", ef)
184+
}
185+
}
186+
187+
// TITLE
188+
if !goldenElement.Children[1].Compare(generatedElement.Children[1]) {
189+
return errors.New("the title element does not match")
190+
}
191+
192+
// KEY SIGNATURE
193+
if !goldenElement.Children[2].Compare(generatedElement.Children[2]) {
194+
return errors.New("the key signature element does not match")
195+
}
196+
197+
// TIME SIGNATURE
198+
if !goldenElement.Children[3].Compare(generatedElement.Children[3]) {
199+
return errors.New("the time signature element does not match")
200+
}
201+
202+
gs, gv, gc := breakdownStaffCredit(generatedElement)
203+
gns, gnv, gnc := breakdownStaffCredit(goldenElement)
204+
205+
// STAFF
206+
if len(gs) != len(gns) {
207+
return fmt.Errorf("the staff element count does not match")
208+
}
209+
210+
for i, g := range gs {
211+
if !g.Compare(gns[i]) {
212+
return fmt.Errorf("the staff element at index %d does not match", i)
213+
}
214+
}
215+
216+
// VERTICES
217+
if !gv.Compare(gnv) {
218+
return fmt.Errorf("the vertices element does not match")
219+
220+
}
221+
222+
// CREDIT
223+
if !gc.Compare(gnc) {
224+
return fmt.Errorf("the credit element does not match")
225+
226+
}
227+
228+
return nil
229+
230+
}
231+
103232
func GenerateGolden(ctx context.Context, stringRenderer *adapter.RenderString, path string) error {
104233
numFiles := 22
105234
for i := 1; i <= numFiles; i++ {
106235
buff := bytes.NewBuffer(nil)
107236
content, err := stringRenderer.RenderHymn(context.Background(), buff, i)
108237
if err != nil {
109-
log.Fatalf("Problem creating file: %v", err)
238+
log.Printf("Problem creating file: %v\n", err)
110239
return err
111240
}
112241

113-
fileName := fmt.Sprintf("%s/kj-%03d.svg", path, i)
242+
fileName := fmt.Sprintf("%s/goldenfiles/kj-%03d.svg", path, i)
114243
fmt.Println("Creating golden for", fileName)
115244
file, err := os.Create(fileName)
116245
if err != nil {
117-
log.Fatalf("Problem creating file: %v", err)
246+
log.Printf("Problem creating file: %v\n", err)
118247
return err
119248
}
120-
fmt.Fprintf(file, "%s", content)
249+
fmt.Fprint(file, content)
121250
file.Close()
122251
}
123252
return nil

cmd/lab/test/snapshot/makefile

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
# Target to build the executable
66
build:
7-
go build -o cmd/lab/test/snapshot-test/main cmd/lab/test/snapshot-test/main.go
7+
go build -o cmd/lab/test/snapshot/main cmd/lab/test/snapshot/main.go
88

99
# Target to run the executable with specified environment variables and flags
10-
run: build
11-
KJ_TEST_DB_PATH=./files/database/kidung-jemaat.db KJ_TEST_MUSICXML_PATH=./files/scores/musicxml/ ./cmd/lab/test/snapshot-test/main -snapshot=gen -path=./cmd/lab/test/snapshot-test/goldenfiles
10+
gen: build
11+
KJ_TEST_DB_PATH=./files/database/kidung-jemaat.db KJ_TEST_MUSICXML_PATH=./files/scores/musicxml/ ./cmd/lab/test/snapshot/main -snapshot=gen -path=./cmd/lab/test/snapshot
12+
13+
assert: build
14+
KJ_TEST_DB_PATH=./files/database/kidung-jemaat.db KJ_TEST_MUSICXML_PATH=./files/scores/musicxml/ ./cmd/lab/test/snapshot/main -snapshot=assert -path=./cmd/lab/test/snapshot

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ require (
1515
)
1616

1717
require (
18+
github.com/JoshVarga/svgparser v0.0.0-20200804023048-5eaba627a7d1 // indirect
1819
github.com/davecgh/go-spew v1.1.1 // indirect
1920
github.com/pmezard/go-difflib v1.0.0 // indirect
21+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
22+
golang.org/x/text v0.3.3 // indirect
2023
gopkg.in/warnings.v0 v0.1.2 // indirect
2124
gopkg.in/yaml.v3 v3.0.1 // indirect
2225
)

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
2+
github.com/JoshVarga/svgparser v0.0.0-20200804023048-5eaba627a7d1 h1:RAQocNl+YQYGPt5yh4SR5zFUIHKrXnLhjIGhHO4Vwnc=
3+
github.com/JoshVarga/svgparser v0.0.0-20200804023048-5eaba627a7d1/go.mod h1:tMmgUTWcco9d1ZmK7zjxuTv7XWZhyutXIsgu0uJ3gDw=
24
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
35
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
46
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw=
@@ -44,6 +46,7 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
4446
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
4547
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
4648
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
49+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
4750
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
4851
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
4952
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -57,6 +60,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
5760
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
5861
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
5962
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
63+
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
6064
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
6165
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
6266
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=

internal/rhythm/lines.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package rhythm
33
import (
44
"context"
55
"math"
6+
"sort"
67

78
"github.com/jodi-ivan/numbered-notation-xml/internal/constant"
89
"github.com/jodi-ivan/numbered-notation-xml/internal/entity"
@@ -259,6 +260,17 @@ func (ri *rhythmInteractor) RenderBeam(ctx context.Context, canv canvas.Canvas,
259260
}
260261

261262
canv.Group("class='beam'")
263+
264+
// beamSets was generated by loop of the map, does not guaranteee the order.
265+
// sorted need so the element printed in svg would be ALWAYS the same order.
266+
// it does not matter in the user end, since it is specific use coordinate X and Y
267+
sort.SliceStable(beamSets, func(i, j int) bool {
268+
one := beamSets[i]
269+
two := beamSets[j]
270+
271+
return one.Start.X < two.Start.X
272+
273+
})
262274
for _, b := range beamSets {
263275
canv.Line(
264276
int(math.Round(b.Start.X)),

0 commit comments

Comments
 (0)