Lomse visual regression tests

Lomse comes with an extensive set of unit tests to make sure each core component of Lomse works properly. But they do not check that Lomse code, as a unit, works properly.

So, to improve the quality assurance (QA) test suite, for ensuring that Lomse works properly, and for ensuring that visual appearance of rendered scores doesn't change in unexpected ways from one Lomse release to the next one, Lomse includes these visual regression tests. The tests go as follows:

  1. First, the test script asks Lomse to load a test score and to render it. The result is saved as a JPG image.
  2. Then the generated image is compared with the expected image.
  3. If there are differences, the test script generates a flicker image, which flips between the two images, so that any differences are easily spotted.
  4. Finally, this web page is automatically updated with the results.

Test results

Be aware a 'test passed' does not mean that the rendered image is correct. It only means that the rendered image is not different from the results obtained using the previous version of Lomse library or, being different, it has been accepted as correct, by a human reviewer.

  • Lomse version used: 0.20.0+4c229e4
  • Test date: 2016-09-18_17:32:31
  • Results: All tests (323) passed.

Generated images

For each test, the first image is the expected result. If the test has failed, the test title is displayed in red and an additional flicker image is added. This image flips between the expected one and the generated one, so that any differences are easily spotted.

Scores. Basic layout

Empty scores

00010-empty-renders-one-staff
00011-empty-fill-page
00012-page-filled-with-empty-systems
00013-empty-piano-filled-with-empty-systems

Score prolog

00020-space-before-clef
00021-spacing-in-prolog
00022-spacing-in-prolog-one-note
00023-spacing-in-prolog-two-instr

Notes

00030-same-duration-notes-equally-spaced
00031-notes-spacing-proportional-to-notes-duration
00032-notes-with-fixed-spacing
00033-accidentals-do-no-alter-spacing
00034-accidentals-do-no-alter-fixed-spacing
00035-spacing-notes-with-figured-bass
00040-all-notes-fixed-spacing
00041-all-notes-proportional-spacing
00042-all-notes-dotted
00043-all-notes-double-dotted
00044-all-notes-triple-dotted
00045-shorter-flags

Accidentals

00050-accidental-after-barline
00051-accidentals

Rests

00060-all-rests-fixed-spacing
00061-all-rests-proportional-spacing
00062-all-rests-dotted
00063-all-rests-double-dotted
00064-all-rests-triple-dotted

Chords

00070-chord-no-stem-no-flag
00071-chord-stem-up-no-flag
00072-chord-stem-up-note-reversed-no-flag
00073-chord-stem-down-no-flag
00074-chord-stem-down-note-reversed-no-flag
00075-chord-stem-up-no-flag-accidental
00076-chord-many-accidentals-note-reversed

Spacing non-timed objs.

00090-clef-between-notes-properly-spaced-when-enough-space
00091-clef-between-notes-properly-spaced-when-removing-variable-space
00092-clef-between-notes-adds-little-space-when-not-enough-space

Clefs

00100-all-clefs-all-sizes

Key signatures

00110-all-key-signatures

Time signatures

00120-time-signatures

Vertical alignment

00131-vertical-right-alignment-prolog-one-note
00132-vertical-right-alignment-same-time-positions
00133-vertical-right-alignment-different-time-positions
00134-vertical-right-alignment-when-accidental-requires-more-space
00135-vertical-right-alignment-when-clefs-between-notes
00136-clef-follows-note-when-note-displaced
00137-prolog-properly-aligned-in-second-system
00138-vertical-right-alignment-when-many-clefs-between-notes
00139-triplet-against-5-tuplet-4.14
00140-loose-spacing-4.16
00141-triplet-against-s-e-dot_4.15a
00142-clef-change-at-start

Instructions

00180-new-system
00180-spacer
00181-go-back

Barlines / measures

00190-all-barlines

Systems justification

00200-bars-go-one-after-the-other
00201-systems-are-justified
00202-long-single-bar-is-splitted
00205-multimetric
00206-long-bar-not-splitted
00207-difficult-to-break

Instruments

00210-one-instr-2-staves
00211-two-instr-3-staves
00212-empty-STB
00220-empty-piano-with-name
00221-empty-two-instr-3-staves
00222-empty-choir-STB-piano
00223-empty-SATB-choir-name
00224-all-group-styles
00225-group-joined-barlines
00226-group-mensurstrich-layout

Staves spacing

00230-space-for-lyrics

justification/truncation

00240-defaults-note-NJNT
00241-defaults-final-barline-NJT
00242-defaults-simple-barline-NJNT
00243-j1-note-NJNT
00244-j1-final-barline-J
00245-j1-simple-barline-NJNT
00246-j2-note-NJNT
00247-j2-barline-J
00248-j3-note-J
00249-j0t2-note-NJNT

Relations

Tuplets

01010-tuplet-triplets
01011-tuplet-duplets
01012-tuplet-tuplet
01013-tuplet-only-bracket
01014-nested-tuplets
01015-tuplet-braket-position

Beams

01020-beams
01021-chords-beamed
01022-beams
01023-beam-4s-q
01024-rests-in-beam
01025-short-rests-in-beam
01026-beamed-chords

Ties

01030-ties
01031-tie-bezier
01032-tie-bezier-break
01033-tie-bezier-barline
01034-tie-after-barline

Attachments

Lines

02010-graphic-line-text
02011-line-after-barline

Fermatas

02020-fermatas
02021-all-fermatas

Metronome marks

02030-metronome
02031-metronome
02032-metronome

Attached texts

02040-text
02041-text-titles
02042-text-attached

Dynamics

02070-dynamics-marks

Articulations

02080-all-accents
02081-all-caesura-and-breath-marks

Lyrics

02090-lyrics-two-lines-only-text
02091-lyrics-melisma-hyphenation
02092-chant
02093-lyrics-above-below

TimeGrid

07001-two-notes-different-duration
07002-several-lines-with-different-durations
07003-empty-bar-with-barline
07004-two-voices-missing-timepos
07011-chord-whole-notes-no-accidentals-note-reversed
07012-two-instruments-four-staves
07013-two-instruments-four-staves

Other top level objects

Paragraphs

08011-paragraph
08012-long-text-paragraph
08013-paragraph-one-line
08014-paragraph-unicode

Tables

08021-small-table
08022-table-merged-cells

Widgets

08031-score-player

Images

08042-read-png-image

Full documents

09001-paragraph-two-scores-in-vertical
09002-ebook-example
09003-ebook-three-pages
09004-paragraph-score-table
09005-lenmusdoc-example
09007-score-in-exercise
09008-score-in-exercise
09009-dynamic-object
09010-exercise
09011-two-scores-in-vertical

MusicXML importer

Be aware that MusicXML importer is a work in progress, in its initial phase. Most of the MusicXML requirements are not yet satisfied.

Lomse tests

50000-hello-world
50001-accent-on-note
50011b-ornaments
50011-ornaments
50021-articulations
50033-glissando-chords

Lilypond tests

01a-Pitches-Pitches
01b-Pitches-Intervals
01c-Pitches-NoVoiceElement
01d-Pitches-Microtones
01e-Pitches-ParenthesizedAccidentals
01f-Pitches-ParenthesizedMicrotoneAccidentals
02a-Rests-Durations
02b-Rests-PitchedRests
02c-Rests-MultiMeasureRests
02d-Rests-Multimeasure-TimeSignatures
02e-Rests-NoType
03a-Rhythm-Durations
03b-Rhythm-Backup
03c-Rhythm-DivisionChange
03d-Rhythm-DottedDurations-Factors
11a-TimeSignatures
11b-TimeSignatures-NoTime
11c-TimeSignatures-CompoundSimple
11d-TimeSignatures-CompoundMultiple
11e-TimeSignatures-CompoundMixed
11h-TimeSignatures-SenzaMisura
12a-Clefs
12b-Clefs-NoKeyOrClef
13a-KeySignatures
13b-KeySignatures-ChurchModes
13c-KeySignatures-NonTraditional
13d-KeySignatures-Microtones
14a-StaffDetails-LineChanges
21a-Chord-Basic
21b-Chords-TwoNotes
21c-Chords-ThreeNotesDuration
21d-Chords-SchubertStabatMater
21e-Chords-PickupMeasures
21f-Chord-ElementInBetween
22a-Noteheads
22b-Staff-Notestyles
22c-Noteheads-Chords
22d-Parenthesized-Noteheads
23a-Tuplets
23b-Tuplets-Styles
23c-Tuplet-Display-NonStandard
23d-Tuplets-Nested
23e-Tuplets-Tremolo
23f-Tuplets-DurationButNoBracket
24a-GraceNotes
24b-ChordAsGraceNote
24c-GraceNote-MeasureEnd
24d-AfterGrace
24e-GraceNote-StaffChange
24f-GraceNote-Slur
31a-Directions
31c-MetronomeMarks
32a-Notations
32b-Articulations-Texts
32c-MultipleNotationChildren
32d-Arpeggio
33a-Spanners
33b-Spanners-Tie
33c-Spanners-Slurs
33d-Spanners-OctaveShifts
33e-Spanners-OctaveShifts-InvalidSize
33f-Trill-EndingOnGraceNote
33g-Slur-ChordedNotes
33h-Spanners-Glissando
33i-Ties-NotEnded
41a-MultiParts-Partorder
41b-MultiParts-MoreThan10
41c-StaffGroups
41d-StaffGroups-Nested
41e-StaffGroups-InstrumentNames-Linebroken
41f-StaffGroups-Overlapping
41g-PartNoId
41h-TooManyParts
41i-PartNameDisplay-Override
42a-MultiVoice-TwoVoicesOnStaff-Lyrics
42b-MultiVoice-MidMeasureClefChange
43a-PianoStaff
43b-MultiStaff-DifferentKeys
43c-MultiStaff-DifferentKeysAfterBackup
43d-MultiStaff-StaffChange
43e-Multistaff-ClefDynamics
45a-SimpleRepeat
45b-RepeatWithAlternatives
45c-RepeatMultipleTimes
45d-Repeats-Nested-Alternatives
45e-Repeats-Nested-Alternatives
45f-Repeats-InvalidEndings
45g-Repeats-NotEnded
46a-Barlines
46b-MidmeasureBarline
46c-Midmeasure-Clef
46d-PickupMeasure-ImplicitMeasures
46e-PickupMeasure-SecondVoiceStartsLater
46f-IncompleteMeasures
46g-PickupMeasure-Chordnames-FiguredBass
51b-Header-Quotes
51c-MultipleRights
51d-EmptyTitle
52a-PageLayout
52b-Breaks
61a-Lyrics
61b-MultipleLyrics
61c-Lyrics-Pianostaff
61d-Lyrics-Melisma
61e-Lyrics-Chords
61f-Lyrics-GracedNotes
61g-Lyrics-NameNumber
61h-Lyrics-BeamsMelismata
61i-Lyrics-Chords
61j-Lyrics-Elisions
61k-Lyrics-SpannersExtenders
71a-Chordnames
71c-ChordsFrets
71d-ChordsFrets-Multistaff
71e-TabStaves
71f-AllChordTypes
71g-MultipleChordnames
72a-TransposingInstruments
72b-TransposingInstruments-Full
72c-TransposingInstruments-Change
73a-Percussion
74a-FiguredBass
75a-AccordionRegistrations
99a-Sibelius5-IgnoreBeaming
99b-Lyrics-BeamsMelismata-IgnoreBeams

Recordare tests

ActorPreludeSample
BeetAnGeSample
Binchois
BrahWiMeSample
BrookeWestSample
Chant
DebuMandSample
Dichterliebe01
Echigo-Jishi
FaurReveSample
MahlFaGe4Sample
MozaChloSample
MozartPianoSonata
MozartTrio
MozaVeilSample
Saltarello
SchbAvMaSample
Telemann