def test_too_few_hyphens_after_barline_not_strict(self): parser = ParserCantusVolpiano() parser.parse('1---f---3-f', strict=False) parser.parse('1---f---3--f', strict=False) parser.parse('1---f---4-f', strict=False) parser.parse('1---f---4--f', strict=False) self.assertTrue(True)
def test_too_few_hyphens_before_barline_strict(self): parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('1---f-3', strict=True) self.assertRaises(HyphenationError, test_fn) test_fn = lambda: parser.parse('1---f--3', strict=True) self.assertRaises(HyphenationError, test_fn) test_fn = lambda: parser.parse('1---f--4', strict=True) self.assertRaises(HyphenationError, test_fn)
def test_missing_pitches_hyphenation_strict(self): parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('1---f--6------6---f', strict=True) self.assertRaises(HyphenationError, test_fn) test_fn = lambda: parser.parse('1---f---6------6--f', strict=True) self.assertRaises(HyphenationError, test_fn) test_fn = lambda: parser.parse('1---f---76------677--f', strict=True) self.assertRaises(HyphenationError, test_fn)
def test_volpiano(self): parser = ParserCantusVolpiano(root='volpiano') parse = parser.parse('1---fgf-ef--fg-h---f-g') word0, bound1, word1, bound2, word2, EOF = parse self.assertEqual(word0.rule_name, 'word') self.assertEqual(bound1.rule_name, 'word_boundary') self.assertEqual(word1.rule_name, 'word') self.assertEqual(bound2.rule_name, 'word_boundary') self.assertEqual(word2.rule_name, 'word') self.assertEqual(EOF.rule_name, 'EOF')
def test_syllables(self): parser = ParserCantusVolpiano(root='syllable') parse = parser.parser.parse('fgf-ef') self.assertEqual(len(parse), 3) self.assertEqual(parse[0].rule_name, 'neume') self.assertEqual(parse[1].rule_name, 'neume_boundary') self.assertEqual(parse[2].rule_name, 'neume')
def test_naturals(self): parser = ParserCantusVolpiano(root='alteration') parse = parser.parser.parse('I') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Alteration) self.assertIsInstance(alteration, chant.Natural) self.assertEqual(alteration.editorial.volpiano, 'I') self.assertEqual(alteration.editorial.volpianoPosition, 'j') # High e flat parse = parser.parser.parse('X') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Natural) self.assertEqual(alteration.editorial.volpianoPosition, 'm') # Low e flat parse = parser.parser.parse('W') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Natural) self.assertEqual(alteration.editorial.volpianoPosition, 'e') # Low b flat parse = parser.parser.parse('Y') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Natural) self.assertEqual(alteration.editorial.volpianoPosition, 'b') # High b flat parse = parser.parser.parse('Z') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Natural) self.assertEqual(alteration.editorial.volpianoPosition, 'q')
def test_syllable(self): parser = ParserCantusVolpiano(root='syllable') parse = parser.parser.parse('fg-h-g') syll = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(syll, chant.Syllable) self.assertEqual(len(syll), 3) self.assertIsInstance(syll[0], chant.Neume)
def test_f_clef(self): # TODO not really supported yet parser = ParserCantusVolpiano(root='clef') parse = parser.parser.parse('2') clef = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(clef, chant.Clef) self.assertEqual(clef.editorial.volpiano, '2')
def test_word(self): parser = ParserCantusVolpiano(root='word') parse = parser.parser.parse('fg-h--f--g') word = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(word, chant.Word) self.assertEqual(len(word), 3) self.assertIsInstance(word[0], chant.Syllable)
def test_flats(self): parser = ParserCantusVolpiano(root='alteration') parse = parser.parser.parse('i') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Alteration) self.assertIsInstance(alteration, chant.Flat) self.assertEqual(alteration.editorial.volpiano, 'i') self.assertEqual(alteration.editorial.volpianoPosition, 'j') # High e flat parse = parser.parser.parse('x') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Flat) self.assertEqual(alteration.editorial.volpianoPosition, 'm') # Low e flat parse = parser.parser.parse('w') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Flat) self.assertEqual(alteration.editorial.volpianoPosition, 'e') # Low b flat parse = parser.parser.parse('y') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Flat) self.assertEqual(alteration.editorial.volpianoPosition, 'b') # High b flat parse = parser.parser.parse('z') alteration = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(alteration, chant.Flat) self.assertEqual(alteration.editorial.volpianoPosition, 'q')
def test_words(self): parser = ParserCantusVolpiano(root='word') parse = parser.parser.parse('fgf-ef--fg-h') self.assertEqual(len(parse), 3) self.assertEqual(parse[0].rule_name, 'syllable') self.assertEqual(parse[1].rule_name, 'syllable_boundary') self.assertEqual(parse[2].rule_name, 'syllable')
def test_neume(self): parser = ParserCantusVolpiano(root='neume') parse = parser.parser.parse('fg') neume = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(neume, chant.Neume) self.assertEqual(len(neume), 2) self.assertIsInstance(neume[0], chant.Note)
def test_parse_volpiano_examples(self): """Test whether the volpiano of all Cantus examples can be parsed""" examples = pd.read_csv('chant21/examples/cantus-volpiano-examples.csv', index_col=0) for idx, data in examples.iterrows(): parser = ParserCantusVolpiano() parse = parser.parser.parse(data['volpiano']) self.assertTrue(True)
def test_liquescent(self): parser = ParserCantusVolpiano(root='liquescent') parse = parser.parser.parse('F') note = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(note, chant.Note) self.assertEqual(note.editorial.volpianoPosition, 'f') self.assertEqual(note.editorial.liquescence, True) self.assertEqual(note.notehead, 'x')
def test_missing_pitches(self): """Are missing pitches correctly parsed?""" parser = ParserCantusVolpiano(root='volpiano') parse = parser.parser.parse('1---6------6') _, _, word, EOF = parse self.assertEqual(word.rule_name, 'word') self.assertEqual(word[0].rule_name, 'syllable') self.assertEqual(word[0][0].rule_name, 'missing_pitches')
def test_missing_pitches_with_break(self): """Test whether missing pitches directly followed by a break are correctly parsed""" parser = ParserCantusVolpiano(root='volpiano') parse = parser.parser.parse('1---6------677') _, _, word, eof = parse missing = word[0][0] self.assertEqual(missing.rule_name, 'missing_pitches') self.assertEqual(missing[0].value, '6------6') self.assertEqual(missing[1].rule_name, 'break')
def test_volpiano(self): """Test the basic structure of a chant: division in sections, words and syllables""" parser = ParserCantusVolpiano(root='volpiano') parse = parser.parser.parse('1---fg-h--f--g---f') ch = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(ch, chant.Chant) self.assertIsInstance(ch[0], chant.Section) (word1, word2, word3), = ch self.assertIsInstance(word1, chant.Word) self.assertIsInstance(word1[0], chant.Syllable) self.assertIsInstance(word1[0][0], chant.Clef)
def test_other(self): parser = ParserCantusVolpiano(root='syllable') parse = parser.parser.parse('3') self.assertEqual(len(parse), 1) self.assertEqual(parse[0].rule_name, 'section_end') parse = parser.parser.parse('4') self.assertEqual(len(parse), 1) self.assertEqual(parse[0].rule_name, 'chant_end') parse = parser.parser.parse('6------6') self.assertEqual(len(parse), 1) self.assertEqual(parse[0].rule_name, 'missing_pitches')
def test_4_5_hyphens_strict(self): parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('1---f----f', strict=True) self.assertRaises(HyphenationError, test_fn) parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('1---f-----f', strict=True) self.assertRaises(HyphenationError, test_fn)
def test_double_3_strict(self): parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('1---f---33---g', strict=True) self.assertRaises(BarlineError, test_fn)
def test_page_break(self): parser = ParserCantusVolpiano(root='break') parse = parser.parser.parse('77') brk = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(brk, chant.PageBreak)
def test_double_3_not_strict(self): parser = ParserCantusVolpiano() parse = parser.parse('1---f---33---g', strict=False) self.assertTrue(True)
def test_g_clef(self): parser = ParserCantusVolpiano(root='clef') parse = parser.parser.parse('1') clef = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(clef, chant.Clef) self.assertEqual(clef.editorial.volpiano, '1')
def test_thick_barline_strict(self): parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('1---f---5', strict=True) self.assertRaises(BarlineError, test_fn)
def test_thick_barline_not_strict(self): parser = ParserCantusVolpiano() parse = parser.parse('1---f---5', strict=False) self.assertTrue(True)
def test_missing_clef(self): parser = ParserCantusVolpiano() test_fn = lambda: parser.parse('f---f') self.assertRaises(ClefError, test_fn)
def test_note(self): parser = ParserCantusVolpiano(root='note') parse = parser.parser.parse('f') note = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(note, chant.Note) self.assertEqual(note.editorial.volpianoPosition, 'f')
def test_section_end(self): parser = ParserCantusVolpiano(root='section_end') parse = parser.parser.parse('3') bar = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(bar, chant.PausaMajor)
def test_examples(self): volpiano = '1---gK--k---h--kl--k--g--g---g--j--kl--l---k---n7--l--m---kj--gh---kH--k--h--g--fg--g---g--hhhk---k---k--kj--gh--h---j--kl--lkJ--hg--g---g--h--jk---lm--ml--l--l---l-lkj--g---h--k--k---4' parser = ParserCantusVolpiano() parse = parser.parser.parse(volpiano) chant = visitParseTree(parse, VisitorCantusVolpiano()) print(chant)
def test_chant_end(self): parser = ParserCantusVolpiano(root='chant_end') parse = parser.parser.parse('4') bar = visitParseTree(parse, VisitorCantusVolpiano()) self.assertIsInstance(bar, chant.PausaFinalis)