@@ -3,6 +3,7 @@ package main
33import (
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
3123func 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+
103232func 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
0 commit comments