@@ -1,4 +1,7 @@
|
||||
"""Meter-specific vocabulary and source-derived quintuple grouping."""
|
||||
import generator.composition
|
||||
import generator.harmony
|
||||
import generator.source
|
||||
import concurrent.futures
|
||||
import copy
|
||||
import fractions
|
||||
@@ -159,15 +162,15 @@ class CompingMeters(unittest.TestCase):
|
||||
def test_unused_meter_and_other_role_data_do_not_reseed(self):
|
||||
resources = generator.vocabulary.load()
|
||||
measures = self.source(4)['staves'][0]['measures']
|
||||
baseline = generator.production.dependencies('acoustic_accompaniment', resources, measures)
|
||||
baseline = generator.composition.dependencies('acoustic_accompaniment', resources, measures)
|
||||
changed = copy.deepcopy(resources)
|
||||
for role, policy in changed['accompaniment']['instruments'].items():
|
||||
for p in policy['patterns']:
|
||||
if role == 'electric' or p['meter'] in ('3/4', '5/4'):
|
||||
p['events'] = []
|
||||
self.assertEqual(baseline, generator.production.dependencies('acoustic_accompaniment', changed, measures))
|
||||
self.assertEqual(baseline, generator.composition.dependencies('acoustic_accompaniment', changed, measures))
|
||||
changed['accompaniment']['instruments']['acoustic']['patterns'][0]['events'] = []
|
||||
self.assertNotEqual(baseline, generator.production.dependencies('acoustic_accompaniment', changed, measures))
|
||||
self.assertNotEqual(baseline, generator.composition.dependencies('acoustic_accompaniment', changed, measures))
|
||||
def test_chord_changes_anticipations_and_cross_bar_ties(self):
|
||||
for beats, grouping in ((4, ()), (3, ()), (5, (3, 2)), (5, (2, 3))):
|
||||
source = self.source(beats, 2, grouping)
|
||||
@@ -188,18 +191,18 @@ class CompingMeters(unittest.TestCase):
|
||||
self.assertTrue(anticipated)
|
||||
def test_roles_are_deterministic_alone_cached_and_parallel(self):
|
||||
for meter in (3, 5):
|
||||
source = generator.production.SourceAnalysis.read(self.source(meter, 9))
|
||||
source = generator.source.SourceAnalysis.read(self.source(meter, 9))
|
||||
roles = ('acoustic_accompaniment', 'electric_accompaniment')
|
||||
with tempfile.TemporaryDirectory() as cache:
|
||||
clean = {r: generator.production.generate_role(source, r, pathlib.Path('data')) for r in roles}
|
||||
clean = {r: generator.composition.generate_role(source, r, pathlib.Path('data')) for r in roles}
|
||||
for role in reversed(roles):
|
||||
cold = generator.production.generate_role(source, role, pathlib.Path('data'), cache_dir=cache)
|
||||
warm = generator.production.generate_role(source, role, pathlib.Path('data'), cache_dir=cache)
|
||||
cold = generator.composition.generate_role(source, role, pathlib.Path('data'), cache_dir=cache)
|
||||
warm = generator.composition.generate_role(source, role, pathlib.Path('data'), cache_dir=cache)
|
||||
self.assertEqual(clean[role]['document'], cold['document'])
|
||||
self.assertEqual(cold['document'], warm['document'])
|
||||
self.assertTrue(warm['cache_hit'])
|
||||
with concurrent.futures.ProcessPoolExecutor(max_workers=2, mp_context=multiprocessing.get_context('spawn')) as pool:
|
||||
jobs = {r: pool.submit(generator.production._job, (source, r, pathlib.Path('data'), {}, None)) for r in reversed(roles)}
|
||||
jobs = {r: pool.submit(generator.production._job, generator.composition_types.RoleRequest(source, r, pathlib.Path('data'))) for r in reversed(roles)}
|
||||
for role, job in jobs.items():
|
||||
self.assertEqual(clean[role]['document'], job.result()['document'])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user