Sizing
ci / checks (push) Successful in 47m22s

This commit is contained in:
khodowany
2026-09-30 02:49:54 -05:00
parent 923b7f14e2
commit 7cad6db980
17 changed files with 1443 additions and 1298 deletions
+29
View File
@@ -49,6 +49,7 @@ class EngravingTests(unittest.TestCase):
def assert_paired_pages(self, layout):
self.assertTrue(all(len(page.systems) == 2 for page in layout.pages[:-1]))
self.assertIn(len(layout.pages[-1].systems), (1, 2))
self.assertEqual(len({system.scale for page in layout.pages for system in page.systems}), 1)
for page in layout.pages:
self.assertEqual(len({system.scale for system in page.systems}), 1)
for system in page.systems:
@@ -59,6 +60,34 @@ class EngravingTests(unittest.TestCase):
self.assertAlmostEqual(max(x for p in lines for x, _ in p.points), page.width - layout.style.margin_x - 1)
for first, second in zip(page.systems, page.systems[1:]):
self.assertGreaterEqual(second.box.top - first.box.bottom, layout.style.system_gap - 0.001)
def test_titles_sections_and_tempos_do_not_change_size_between_pages(self):
source = tests.test_musicxml.parse(tests.test_accompaniment.xml_bars([tests.test_musicxml.xml_note()] * 40))
source['metadata']['composer'] = 'Composer'
for index in (0, 9, 18, 27):
measure = source['staves'][0]['measures'][index]
measure['section_label'] = f'Section {index}'
measure['tempos'] = [{'onset': generator.model.rational(fractions.Fraction(1, 2)), 'written': {'type': 'quarter', 'dots': 0}, 'bpm': generator.model.rational(124)}]
layout = self.layout(source)
self.assertGreater(len(layout.pages), 2)
self.assert_paired_pages(layout)
self.assertEqual(layout.pages[0].systems[0].scale, 1)
self.assertEqual(self.primitives(layout, 'tempo'), [])
self.assertEqual(len(self.primitives(layout, 'section')), 4)
self.assertEqual(len(self.primitives(layout, 'subtitle')), len(layout.pages))
without_tempos = copy.deepcopy(source)
for measure in without_tempos['staves'][0]['measures']:
measure.pop('tempos', None)
self.assertEqual(layout, self.layout(without_tempos))
self.assertEqual(generator.playback.compile_timeline(source), generator.playback.compile_timeline(without_tempos))
def test_long_credits_wrap_without_overflow_or_page_specific_sizing(self):
source = tests.test_musicxml.parse(tests.test_accompaniment.xml_bars([tests.test_musicxml.xml_note()] * 32))
source['metadata']['composer'] = 'A moderately long composer credit ' * 6
layout = self.layout(source)
self.assert_paired_pages(layout)
header = [p for p in layout.pages[0].primitives if p.role in ('title', 'subtitle')]
self.assertGreater(len(header), 2)
for page in layout.pages:
self.assertEqual(header, [p for p in page.primitives if p.role in ('title', 'subtitle')])
def test_guitar_pages_always_pair_systems_including_tall_passages(self):
content = tests.test_musicxml.xml_note('E', octave=5)
source = tests.test_musicxml.parse(tests.test_accompaniment.xml_bars([content] * 32))