def is_cyclic(self): """ Whether the composition has a cyclic part end. (Returns False if it's a single-part composition). """ if self._is_cyclic is None: # Rows don't have an is_cyclic method (why not?) # Generate all cyclic part ends and see if ours is one of them. if self.is_treble_fixed: cyclic_part_ends = [ Row.cyclic(self.configs.bells, 1, n) for n in range(self.configs.bells - 1) ] else: cyclic_part_ends = [ Row.cyclic(self.configs.bells, 0, n) for n in range(self.configs.bells) ] self._is_cyclic = self.part_end in cyclic_part_ends return self.parts != 1 and self._is_cyclic
def test_row_cyclic(self): self.assertEqual(Row.cyclic(0), Row()) self.assertEqual(Row.cyclic(1), Row('1')) self.assertEqual(Row.cyclic(2), Row('12')) self.assertEqual(Row.cyclic(3), Row('132')) self.assertEqual(Row.cyclic(5), Row('13452')) self.assertEqual(Row.cyclic(8), Row('13456782')) self.assertEqual(Row.cyclic(3, 0), Row('231')) self.assertEqual(Row.cyclic(3, 2), Row('123')) self.assertEqual(Row.cyclic(3, 3), Row('123')) self.assertEqual(Row.cyclic(3, 9), Row('123')) self.assertEqual(Row.cyclic(8, 0), Row('23456781')) self.assertEqual(Row.cyclic(8, 2), Row('12456783')) self.assertEqual(Row.cyclic(9, 2), Row('124567893')) self.assertEqual(Row.cyclic(8, 1, -1), Row('18234567')) self.assertEqual(Row.cyclic(8, 1, 0), Row('12345678')) self.assertEqual(Row.cyclic(8, 1, 2), Row('14567823')) self.assertEqual(Row.cyclic(8, 1, 5), Row('17823456')) self.assertEqual(Row.cyclic(8, 1, 7), Row('12345678')) self.assertEqual(Row.cyclic(8, 1, 13), Row('18234567'))