]> git.donarmstrong.com Git - lilypond.git/blob - input/no-notation/display-lily-tests.ly
5b931ad495b269aeb395c2b53c8ab559d5a6fd9a
[lilypond.git] / input / no-notation / display-lily-tests.ly
1 \version "2.9.16"
2
3 #(use-modules (srfi srfi-13)
4               (ice-9 format))
5
6 %%%
7 %%% Testing utilities
8 %%%
9 #(define (my-parse-string-result str parser)
10   "Parse `str', which is supposed to contain a music expression."
11   (ly:parser-parse-string parser
12                           (format #f "parseStringResult = \\notemode { ~a }" str))
13   (ly:parser-lookup parser 'parseStringResult))
14
15 #(define (my-read-lily-expression chr port)
16   (let ((lily-string (call-with-output-string
17                       (lambda (out)
18                         (do ((c (read-char port) (read-char port)))
19                             ((and (char=? c #\#)
20                                   (char=? (peek-char port) #\]))
21                              (read-char port))
22                           (display c out))))))
23     `(let* ((parser-clone (ly:clone-parser parser))
24             (input-str (string-trim-both ,lily-string))
25             (music (car (ly:music-property (my-parse-string-result input-str parser-clone)
26                                            'elements)))
27             (result-str (string-trim-both (music->lily-string music))))
28        (cons input-str result-str))))
29
30 #(read-hash-extend #\[ my-read-lily-expression)
31
32 #(define test-number 0)
33   
34 #(define (lily-string->markup str)
35    (make-column-markup (string-split str #\NewLine)))
36
37 test = #(define-music-function (parser location result-info strings) (string? pair?)
38          (display-lily-init parser)
39           (let ((input (car strings))
40                 (output (cdr strings)))
41             (set! test-number (1+ test-number))
42             (if (string=? input output)
43                 (make-music 'SequentialMusic)
44                 (make-music 'SequentialMusic
45                             'elements
46                             (list (make-music 'EventChord
47                                    'elements (list (make-music 'LineBreakEvent
48                                                     'break-permission 'force)))
49                                   (make-music 'EventChord
50                                    'elements (list (make-music 'SkipEvent
51                                                     'duration (ly:make-duration 0 0 1 1))
52                                                    (make-music 'TextScriptEvent
53                                                     'direction -1
54                                                     'text (markup #:column (#:simple (format #f "Test #~a "
55                                                                                       test-number)
56                                                                             (if (string-null? result-info) 
57                                                                                 (markup #:bold "BUG") 
58                                                                                 (markup #:simple result-info))
59                                                                             #:typewriter (lily-string->markup input)
60                                                                             #:typewriter (lily-string->markup output)))))))))))
61
62 %%%
63 %%% Tests
64 %%%
65 \header {
66   texidoc = \markup \column { \line { \typewriter display-lily-music unit tests }
67                               \line { Real bugs (regressions) are marked as \bold BUG. }
68                               \line { Known bugs are marked as TODO. } }
69 }
70
71 \layout {
72   raggedright = ##t 
73   indent = 0.0\cm
74   \context {
75     \Staff
76     \override StaffSymbol #'line-count = #1
77     \remove "Time_signature_engraver"
78     \remove "Clef_engraver"
79   }
80   \context {
81     \Score
82     \remove "Bar_number_engraver"
83   }
84 }
85 {
86   \fatText
87   %% Sequential music
88   \test #"" ##[ { { a b } { c d } } #]                  % SequentialMusic
89   \test #"" ##[ << { a b } { c d } >> #]                % SimultaneousMusic
90   \test #"" ##[ << { a b } \\ { c d } >> #]             % VoiceSeparator
91   
92   %% Chords and Notes
93   \test #"" ##[ { ceses ces c cis cisis } #]            % NoteEvent
94   \test #"" ##[ { deses des d dis disis } #]
95   \test #"" ##[ { eeses ees e eis eisis } #]
96   \test #"" ##[ { feses fes f fis fisis } #]
97   \test #"" ##[ { geses ges g gis gisis } #]
98   \test #"" ##[ { aeses aes a ais aisis } #]
99   \test #"" ##[ { beses bes b bis bisis } #]
100   \test #"" ##[ { c,, d' } #]
101   \test #"" ##[ { c' d'=' } #]
102   \test #"" ##[ { c! c? } #]
103   \test #"" ##[ r1.*4/3 #]                              % RestEvent
104   \test #"" ##[ c1\rest #]                              % RestEvent
105   \test #"" ##[ s2..*3/4 #]                             % SkipEvent
106   \test #"" ##[ R1.*2/3 #]                              % MultiMeasureRestMusicGroup, MultiMeasureRestEvent
107   \test #"" ##[ \skip 2.*3/4 #]                         % SkipMusic
108   \test #"" ##[ < c\1 e\3 >4.*3/4-. #]                  % EventChord, NoteEvent, StringNumberEvent, ArticulationEvent
109
110   %% tags
111   \test #"" ##[ { \tag #'foo { c4 d } } #]
112   \test #"" ##[ c-\tag #'foo -\tag #'baz -^ -. #]
113
114   %% Graces
115   \test #"" ##[ { \grace c8 d2 } #]                     % GraceMusic
116   \test #"" ##[ { \appoggiatura c8 d2 } #]
117   \test #"" ##[ { \acciaccatura c8 d2 } #]
118   \test #"" ##[ { c1 \afterGrace { b,16 c } d2 } #]
119
120   %% Clusters
121   \test #"" ##[ { \makeClusters { c4 g } } #]           % ClusterNoteEvent
122
123   %% Figured bass
124   \test #"" ##[ \figures { < 6 > } #]                   % BassFigureEvent
125   \test #"" ##[ \figuremode { < 1-- 3- > < 2+ 4++ > < _! 7! > } #]
126   \test #"" ##[ \figuremode { < [6 > < 5] > } #]
127
128   %% Lyrics
129   \test #"" ##[ \lyrics { a b } #]
130   \test #"" ##[ \lyricmode { a --  b } #]               % HyphenEvent
131   \test #"" ##[ \lyricmode { a __  b } #]               % ExtenderEvent
132   \test #"" ##[ \lyricmode { "a " } #]                  % LyricEvent
133   \test #"" ##[ \lyricsto "foo" { bla bla } #]          % LyricCombineMusic
134   \test #"" ##[ { { c d }
135   \addlyrics { bla bla } } #]
136
137   %% Drums
138   \test #"" ##[ \drums { hihat } #]
139   \test #"" ##[ \drummode { hihat4.*3/4 } #]
140
141   %% Expressive marks
142   \test #"" ##[ c4 ~ #]                                 % TieEvent
143   \test #"" ##[ c\noBeam #]                             % BeamForbidEvent
144   \test #"" ##[ c\1 #]                                  % StringNumberEvent
145   \test #"" ##[ { c:  c:1  } #]                         % TremoloEvent
146   \test #"" ##[ { c-^  c^^  c_^  } #]                   % ArticulationEvent
147   \test #"" ##[ { c-+  c^+  c_+  } #]
148   \test #"" ##[ { c--  c^-  c_-  } #]
149   \test #"" ##[ { c-|  c^|  c_|  } #]
150   \test #"" ##[ { c->  c^>  c_>  } #]
151   \test #"" ##[ { c-.  c^.  c_.  } #]
152   \test #"" ##[ { c-_  c^_  c__  } #]
153   \test #"" ##[ { c-\trill  c^\trill  c_\trill  } #]
154   \test #"" ##[ { c-1  c^2  c_3  } #]                   % FingerEvent
155   \test #"" ##[ { c-"foo"  c^"foo"  c_"foo"  } #]       % TextScriptEvent
156   \test #"" ##[ { R1*4 -"foo"  R ^"foo"  R _"foo"  } #] % MultiMeasureTextEvent
157   \test #"" ##[ { c4-\harmonic  c^\harmonic  c_\harmonic  } #]  % HarmonicEvent
158   \test #"" ##[ { c-\glissando  c^\glissando  c_\glissando  } #] % GlissandoEvent
159   \test #"" ##[ { c-\arpeggio  c^\arpeggio  c_\arpeggio  } #]   % ArpeggioEvent
160   \test #"" ##[ { c\p  c^\ff  c_\sfz  } #]              % AbsoluteDynamicEvent
161   \test #"" ##[ { c[  c]  c^[  c^]  c_[  c_]  } #]      % BeamEvent
162   \test #"" ##[ { c(  c)  c^(  c^)  c_(  c_)  } #]      % SlurEvent
163   \test #"" ##[ { c\<  c\!  c^\<  c^\!  c_\<  c_\!  } #]        % CrescendoEvent
164   \test #"" ##[ { c\>  c\!  c^\>  c^\!  c_\>  c_\!  } #]        % DecrescendoEvent
165   \test #"" ##[ { c\(  c\)  c^\(  c^\)  c_\(  c_\)  } #]        % PhrasingSlurEvent
166   \test #"" ##[ { c\sustainDown  c\sustainUp  } #] % SustainEvent
167   \test #"" ##[ { c\sostenutoDown  c\sostenutoUp  } #] % SostenutoEvent
168   \test #"" ##[ { c\melisma  c\melismaEnd  } #]         % ManualMelismaEvent
169   \test #"" ##[ { c\startTextSpan  c\stopTextSpan  } #] % TextSpanEvent
170   \test #"" ##[ { c\startTrillSpan  c\stopTrillSpan  } #] % TrillSpanEvent
171   \test #"" ##[ { c \startStaff c \stopStaff } #]       % StaffSpanEvent
172   \test #"" ##[ { c\startGroup  c\stopGroup  c^\startGroup  c^\stopGroup  c_\startGroup  c_\stopGroup  } #] % NoteGroupingEvent
173   \test #"" ##[ { c\unaCorda  c\treCorde  } #] % UnaCordaEvent
174   \test #"" ##[ \breathe #]
175   \test #"" ##[ { c \[  c \]  } #]                      % LigatureEvent
176   \test #"" ##[ \~ #]                                   % PesOrFlexaEvent
177
178   \test #"" ##[ \break #]
179   \test #"" ##[ \noBreak #]
180   \test #"" ##[ \pageBreak #]
181   \test #"" ##[ \noPageBreak #]
182   \test #"" ##[ \pageTurn #]
183   \test #"" ##[ \noPageTurn #]
184
185   %% Checks
186   \test #"" ##[ \octave a' #]                           % RelativeOctaveCheck
187   \test #"" ##[ | #]                                    % BarCheck
188
189   %% Marks
190   \test #"" ##[ \mark \default #]                       % MarkEvent
191   \test #"" ##[ \mark "Allegro" #]
192   \test #"" ##[ \tempo 4 = 120 #]                       % MetronomeChangeEvent
193
194   %% key, time, clef, bar
195   \test #"" ##[ \key \default #]                        % KeyChangeEvent
196   \test #"" ##[ \key e \minor #]
197   \test #"" ##[ \clef "bass" #]
198   \test #"" ##[ \clef "french^2" #]
199   \test #"" ##[ \clef "alto_3" #]
200   \test #"" ##[ \time 2/4 #]
201   \test #"" ##[ #(set-time-signature 5 8 '(3 2)) #]
202   \test #"" ##[ \bar "|." #]
203
204   %% staff switches
205   \test #"" ##[ \autochange { c d } #]                  % AutoChangeMusic
206   \test #"" ##[ { \change Staff = "up" { c d } } #]     % ContextChange
207
208   %% Tuplets
209   \test #"" ##[ \times 2/3 { c8 d e } #]                                % TimeScaledMusic
210   \test #"" ##[ \times 4/6 { c16 d e f g a } #]
211
212   %% \relative and \tranpose
213   \test #"NOT A BUG" ##[ \relative c' { c b } #]        % RelativeOctaveMusic
214   \test #"NOT A BUG" ##[ \transpose c d { c d } #]      % TransposedMusic
215   
216   %% Repeats
217   \test #"" ##[ \repeat volta 2 { c d } #]              % VoltaRepeatedMusic
218   \test #"" ##[ \repeat unfold 2 { c d } #]             % UnfoldedRepeatedMusic
219   \test #"" ##[ \repeat fold 2 { c d } #]               % FoldedRepeatedMusic
220   \test #"" ##[ \repeat percent 2 { c d } #]            % PercentRepeatedMusic
221   \test #"" ##[ \repeat tremolo 4 { c16 d } #]          % TremoloRepeatedMusic
222   \test #"" ##[ \repeat volta 2 { c4 d } \alternative { { c d } { e f } } #] % 
223
224   %% Context creation
225   \test #"" ##[ \new Staff { c d } #]                   % ContextSpeccedMusic
226   \test #"" ##[ \new Staff = "up" { c d } #]                    % ContextSpeccedMusic
227   \test #"" ##[ \context Staff { c d } #]
228   \test #"" ##[ \context Staff = "up" { c d } #]
229   \test #"" ##[
230 \new Staff \with {
231   \consists "Timing_engraver"
232   \remove "Clef_engraver"
233 } { c d } #]
234   %% Context properties
235   \test #"" ##[ \once \set Score . skipBars = ##t #]    % PropertySet
236   \test #"" ##[ \set autoBeaming = ##f #]
237   \test #"" ##[ \unset Score . skipBars #]              % PropertyUnset
238   \test #"" ##[ \unset autoBeaming #]
239   %% Layout properties
240   \test #"" ##[ \override Staff . Stem #'thickness = #4.0 #]    % OverrideProperty
241   \test #"" ##[ \once \override Beam #'thickness = #0.6 #]
242   \test #"" ##[ \revert Staff . Stem #'thickness #]     % RevertProperty
243   \test #"" ##[ \revert Beam #'thickness #]
244
245   %% \applyOutput
246   \test #"" ##[ \applyOutput #'Foo #(lambda (arg) (list)) #]
247   %% \applyContext
248   \test #"" ##[ \applyContext #(lambda (arg) (list)) #]
249
250   %% \partial
251   \test #"" ##[ \partial 2 #]
252   \test #"" ##[ \partial 8. #]
253   \test #"TODO? exotic durations in \\partial" ##[ \partial 4*2/3 #]
254
255   %% \partcombine
256   \test #"" ##[ \partcombine { c e }
257 { d f } #]                                              % PartCombineMusic UnrelativableMusic
258
259   %% Cue notes
260   \test #"" ##[ \cueDuring #"foo" #1 { c d } #]
261   \test #"" ##[ \quoteDuring #"foo" { c d } #]
262
263 }
264