+15
-15
@@ -1,3 +1,5 @@
|
||||
import generator.score_io
|
||||
import generator.validation
|
||||
import tests.production_fixtures
|
||||
import argparse
|
||||
import copy
|
||||
@@ -14,7 +16,6 @@ import xml.etree.ElementTree
|
||||
import PIL.Image
|
||||
import PIL.ImageChops
|
||||
|
||||
import generator.__main__
|
||||
import generator.arrange.generate
|
||||
import generator.engraving.fonts
|
||||
import generator.engraving.layout
|
||||
@@ -30,7 +31,6 @@ import generator.performance
|
||||
import generator.pitch
|
||||
import tests.score_events
|
||||
import tests.arrangement_fixtures
|
||||
import generator.score
|
||||
import generator.theme
|
||||
import tests.musicxml_roundtrip
|
||||
import tests.test_musicxml
|
||||
@@ -48,7 +48,7 @@ class ScoreBundleTests(unittest.TestCase):
|
||||
self.assertEqual(set(document), {'metadata', 'staves'})
|
||||
for malformed in (None, [], {}, {'metadata': {}, 'staves': []}, {**document, 'staves': None}, {**document, 'staves': [{}]}):
|
||||
with self.subTest(document=malformed), self.assertRaises(ValueError):
|
||||
generator.model.validate_document(malformed)
|
||||
generator.validation.validate_document(malformed)
|
||||
def test_multiple_voices_keep_independent_ties_and_transformations(self):
|
||||
def half(action):
|
||||
return tests.test_musicxml.xml_note(duration=2, kind='half', extra=f'<voice>1</voice><tie type="{action}"/>')
|
||||
@@ -59,9 +59,9 @@ class ScoreBundleTests(unittest.TestCase):
|
||||
self.assertEqual([v['id'] for v in measure['voices']], ['1', '2'])
|
||||
self.assertNotIn('tie_from', measure['voices'][1]['notes'][0]['pitches'][0])
|
||||
for document in (source, generator.pitch.concert_document(source), generator.arrange.generate.arrange_document(source, 'vocal')):
|
||||
generator.model.validate_document(document)
|
||||
generator.validation.validate_document(document)
|
||||
restored = self.round_trip(document)
|
||||
generator.model.validate_document(restored)
|
||||
generator.validation.validate_document(restored)
|
||||
self.assertTrue(any(len(m['voices']) == 2 for m in restored['staves'][0]['measures']))
|
||||
def test_contiguous_ties_continue_across_systems_without_repeat_state(self):
|
||||
text = tests.test_musicxml.xml_score(tests.test_musicxml.xml_note(extra='<tie type="start"/>'))
|
||||
@@ -139,7 +139,7 @@ class ScoreBundleTests(unittest.TestCase):
|
||||
tests.musicxml_roundtrip.audit_roundtrip(before, after)
|
||||
source['staves'][0]['instruments'] = []
|
||||
with self.assertRaisesRegex(ValueError, 'unknown score instrument'):
|
||||
generator.model.validate_document(source)
|
||||
generator.validation.validate_document(source)
|
||||
def test_catalog_roundtrip_preserves_written_pitch_and_rhythm(self):
|
||||
for path in sorted(pathlib.Path('data/songs').glob('*.xml')):
|
||||
with self.subTest(path=path):
|
||||
@@ -220,34 +220,34 @@ class ScoreBundleTests(unittest.TestCase):
|
||||
bundle['performance'] = generator.performance.timing(document)
|
||||
path = assets / 'score.json'
|
||||
path.write_text(json.dumps(bundle))
|
||||
self.assertEqual(generator.score.load_json(path), document)
|
||||
self.assertEqual(generator.score_io.load_json(path), document)
|
||||
page.write_bytes(data + b'corrupt')
|
||||
with self.assertRaisesRegex(ValueError, 'checksum'):
|
||||
generator.score.load_json(path)
|
||||
generator.score_io.load_json(path)
|
||||
page.unlink()
|
||||
outside = root / 'outside.png'
|
||||
outside.write_bytes(data)
|
||||
page.symlink_to(outside)
|
||||
with self.assertRaisesRegex(ValueError, 'escapes'):
|
||||
generator.score.load_json(path)
|
||||
generator.score_io.load_json(path)
|
||||
def test_final_validation_reuses_content_checks_and_rechecks_files(self):
|
||||
with tempfile.TemporaryDirectory() as temporary:
|
||||
root = pathlib.Path(temporary)
|
||||
document = tests.test_musicxml.parse(tests.test_musicxml.xml_score(tests.test_musicxml.xml_note()))
|
||||
for index in range(3):
|
||||
generator.score.write_json(root / 'songs' / f'{index}.json', document)
|
||||
generator.score_io.write_json(root / 'songs' / f'{index}.json', document)
|
||||
trusted = generator.engraving.pipeline.engrave_tree(root, pathlib.Path('package/assets/fonts/petaluma'))
|
||||
generator.pico_artwork.generate_titles(root, pathlib.Path('package/assets/fonts/petaluma'))
|
||||
with unittest.mock.patch('generator.engraving.validation.check_content', side_effect=AssertionError('already validated content')):
|
||||
generator.score.validate_generated_tree(root, trusted)
|
||||
generator.score_io.validate_generated_tree(root, trusted)
|
||||
page = root / 'songs/2.pages/0001.png'
|
||||
original = page.read_bytes()
|
||||
page.write_bytes(original + b'changed')
|
||||
with self.assertRaisesRegex(ValueError, 'checksum'):
|
||||
generator.score.validate_generated_tree(root, trusted)
|
||||
generator.score_io.validate_generated_tree(root, trusted)
|
||||
page.write_bytes(original)
|
||||
with unittest.mock.patch('generator.engraving.validation.check_content', wraps=generator.engraving.validation.check_content) as decode:
|
||||
generator.score.validate_generated_tree(root)
|
||||
generator.score_io.validate_generated_tree(root)
|
||||
decode.assert_called_once()
|
||||
PIL.Image.new('RGB', (976, 484), generator.theme.rgb('background')).save(page)
|
||||
path = root / 'songs/2.json'
|
||||
@@ -255,14 +255,14 @@ class ScoreBundleTests(unittest.TestCase):
|
||||
bundle['presentation']['pages'][0]['sha256'] = hashlib.sha256(page.read_bytes()).hexdigest()
|
||||
path.write_text(json.dumps(bundle))
|
||||
with self.assertRaisesRegex(ValueError, 'blank page'):
|
||||
generator.score.validate_generated_tree(root, trusted)
|
||||
generator.score_io.validate_generated_tree(root, trusted)
|
||||
def test_python_engraver_visual_golden_and_determinism(self):
|
||||
document = generator.musicxml.load_musicxml(pathlib.Path('tests/fixtures/engraving.xml'))
|
||||
with tempfile.TemporaryDirectory() as temporary:
|
||||
root = pathlib.Path(temporary)
|
||||
before = None
|
||||
for _ in range(2):
|
||||
generator.score.write_json(root / 'fixture.json', document)
|
||||
generator.score_io.write_json(root / 'fixture.json', document)
|
||||
generator.engraving.pipeline.engrave_tree(root, pathlib.Path('package/assets/fonts/petaluma'))
|
||||
bundle = json.loads((root / 'fixture.json').read_text())
|
||||
self.assertEqual(bundle['music'], document)
|
||||
|
||||
Reference in New Issue
Block a user