def test_delete(self):
     Feature._cache = {}
     self.assertEqual(len(Feature._cache), 0)
     feature = SuprasegmentalFeature(self.bfm, 'voiced')
     character = SuprasegmentalCharacter(self.bfm, 'a')
     character.set_feature_value(feature, HAS_FEATURE)
     self.assertEqual(len(Feature._cache), 1)
     self.assertEqual(character.get_feature_value(feature), HAS_FEATURE)
     feature.delete()
     self.assertEqual(len(Feature._cache), 0)
     self.assertRaises(MismatchedModelsError, character.get_feature_value,
                       feature)
 def test_delete (self):
     Feature._cache = {}
     self.assertEqual(len(Feature._cache), 0)
     feature = SuprasegmentalFeature(self.bfm, 'voiced')
     character = SuprasegmentalCharacter(self.bfm, 'a')
     character.set_feature_value(feature, HAS_FEATURE)
     self.assertEqual(len(Feature._cache), 1)
     self.assertEqual(character.get_feature_value(feature), HAS_FEATURE)
     feature.delete()
     self.assertEqual(len(Feature._cache), 0)
     self.assertRaises(MismatchedModelsError, character.get_feature_value,
                       feature)
 def test_normalised_form(self):
     feature1 = SuprasegmentalFeature(self.bfm, 'anterior')
     character = SuprasegmentalCharacter(self.bfm, 'n')
     character.set_feature_value(feature1, HAS_FEATURE)
     self.assertEqual(character.normalised_form,
                      NormalisedForm('{0}{1}'.format(SNFM, HAS_FEATURE)))
     # Adding a feature changes the normalised form.
     feature2 = SuprasegmentalFeature(self.bfm, 'dental')
     # All features must have a value.
     self.assertRaises(InvalidCharacterError, getattr, character,
                       'normalised_form')
     character.set_feature_value(feature2, NOT_HAS_FEATURE)
     self.assertEqual(
         character.normalised_form,
         NormalisedForm('{0}{1}{2}'.format(SNFM, HAS_FEATURE,
                                           NOT_HAS_FEATURE)))
     # The order of the normalised form feature values is
     # alphabetical by feature name.
     feature3 = SuprasegmentalFeature(self.bfm, 'consonantal')
     character.set_feature_value(feature3, HAS_FEATURE)
     self.assertEqual(
         character.normalised_form,
         NormalisedForm('{0}{1}{1}{2}'.format(SNFM, HAS_FEATURE,
                                              NOT_HAS_FEATURE)))
     # Renaming a feature may change the normalised form.
     feature3.name = 'vocalic'
     self.assertEqual(
         character.normalised_form,
         NormalisedForm('{0}{1}{2}{1}'.format(SNFM, HAS_FEATURE,
                                              NOT_HAS_FEATURE)))
     # Changing a feature value changes the normalised form.
     character.set_feature_value(feature1, INAPPLICABLE_FEATURE)
     self.assertEqual(
         character.normalised_form,
         NormalisedForm('{0}{3}{2}{1}'.format(SNFM, HAS_FEATURE,
                                              NOT_HAS_FEATURE,
                                              INAPPLICABLE_FEATURE)))
     # Removing a feature value changes the normalised form.
     feature3.delete()
     self.assertEqual(
         character.normalised_form,
         NormalisedForm('{0}{2}{1}'.format(SNFM, NOT_HAS_FEATURE,
                                           INAPPLICABLE_FEATURE)))
     # Adding a feature of a different type does not change the
     # normalised form.
     feature4 = BaseFeature(self.bfm, 'syllabic')
     self.assertEqual(
         character.normalised_form,
         NormalisedForm('{0}{2}{1}'.format(SNFM, NOT_HAS_FEATURE,
                                           INAPPLICABLE_FEATURE)))
 def test_suprasegmental_features (self):
     self.assertEqual(len(self.bfm.suprasegmental_features), 0)
     feature1 = SuprasegmentalFeature(self.bfm, 'voiced')
     self.assertEqual(len(self.bfm.suprasegmental_features), 1)
     self.assertTrue(feature1 in self.bfm.suprasegmental_features)
     feature2 = SuprasegmentalFeature(self.bfm, 'consonantal')
     self.assertEqual(len(self.bfm.suprasegmental_features), 2)
     self.assertTrue(feature1 in self.bfm.suprasegmental_features)
     self.assertTrue(feature2 in self.bfm.suprasegmental_features)
     feature2.delete()
     self.assertEqual(len(self.bfm.suprasegmental_features), 1)
     self.assertTrue(feature1 in self.bfm.suprasegmental_features)
     feature1.delete()
     self.assertEqual(len(self.bfm.suprasegmental_features), 0)
     feature3 = BaseFeature(self.bfm, 'anterior')
     self.assertEqual(len(self.bfm.suprasegmental_features), 0)
 def test_normalised_form (self):
     feature1 = SuprasegmentalFeature(self.bfm, 'anterior')
     character = SuprasegmentalCharacter(self.bfm, 'n')
     character.set_feature_value(feature1, HAS_FEATURE)
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{1}'.format(SNFM, HAS_FEATURE)))
     # Adding a feature changes the normalised form.
     feature2 = SuprasegmentalFeature(self.bfm, 'dental')
     # All features must have a value.
     self.assertRaises(InvalidCharacterError, getattr, character,
                       'normalised_form')
     character.set_feature_value(feature2, NOT_HAS_FEATURE)
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{1}{2}'.format(SNFM, HAS_FEATURE, NOT_HAS_FEATURE)))
     # The order of the normalised form feature values is
     # alphabetical by feature name.
     feature3 = SuprasegmentalFeature(self.bfm, 'consonantal')
     character.set_feature_value(feature3, HAS_FEATURE)
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{1}{1}{2}'.format(SNFM, HAS_FEATURE, NOT_HAS_FEATURE)))
     # Renaming a feature may change the normalised form.
     feature3.name = 'vocalic'
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{1}{2}{1}'.format(SNFM, HAS_FEATURE, NOT_HAS_FEATURE)))
     # Changing a feature value changes the normalised form.
     character.set_feature_value(feature1, INAPPLICABLE_FEATURE)
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{3}{2}{1}'.format(SNFM, HAS_FEATURE, NOT_HAS_FEATURE,
                                   INAPPLICABLE_FEATURE)))
     # Removing a feature value changes the normalised form.
     feature3.delete()
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{2}{1}'.format(SNFM, NOT_HAS_FEATURE,
                                INAPPLICABLE_FEATURE)))
     # Adding a feature of a different type does not change the
     # normalised form.
     feature4 = BaseFeature(self.bfm, 'syllabic')
     self.assertEqual(character.normalised_form, NormalisedForm(
             '{0}{2}{1}'.format(SNFM, NOT_HAS_FEATURE,
                                INAPPLICABLE_FEATURE)))