def test_object_caching (self): # Creating a Feature with the same name as an existing # Feature must return the existing Feature, if both are # associated with the same BinaryFeaturesModel. feature1 = BaseFeature(self.bfm, 'voiced') feature2 = BaseFeature(self.bfm, 'voiced') self.assertEqual(feature1, feature2) feature3 = BaseFeature(self.bfm, 'consonantal') self.assertNotEqual(feature1, feature3) bfm2 = BinaryFeaturesModel() feature4 = BaseFeature(bfm2, 'voiced') self.assertNotEqual(feature1, feature4) # It is an error to create a Feature with the same IPA form # but of a different type (subclass). self.assertRaises(InvalidFeatureError, SuprasegmentalFeature, self.bfm, 'voiced') # Initialisation of a Feature should happen only once. character1 = BaseCharacter(self.bfm, 'a') character1.set_feature_value(feature1, HAS_FEATURE) self.assertEqual(feature1.get_value_characters(HAS_FEATURE), set([character1])) feature5 = BaseFeature(self.bfm, 'voiced') self.assertEqual(feature1.get_value_characters(HAS_FEATURE), set([character1])) feature6 = SuprasegmentalFeature(self.bfm, 'syllabic') character2 = SuprasegmentalCharacter(self.bfm, 'b') character2.set_feature_value(feature6, HAS_FEATURE) self.assertEqual(feature6.get_value_characters(HAS_FEATURE), set([character2])) feature7 = SuprasegmentalFeature(self.bfm, 'syllabic') self.assertEqual(feature6.get_value_characters(HAS_FEATURE), set([character2]))
def test_object_caching(self): # Creating a Feature with the same name as an existing # Feature must return the existing Feature, if both are # associated with the same BinaryFeaturesModel. feature1 = BaseFeature(self.bfm, 'voiced') feature2 = BaseFeature(self.bfm, 'voiced') self.assertEqual(feature1, feature2) feature3 = BaseFeature(self.bfm, 'consonantal') self.assertNotEqual(feature1, feature3) bfm2 = BinaryFeaturesModel() feature4 = BaseFeature(bfm2, 'voiced') self.assertNotEqual(feature1, feature4) # It is an error to create a Feature with the same IPA form # but of a different type (subclass). self.assertRaises(InvalidFeatureError, SuprasegmentalFeature, self.bfm, 'voiced') # Initialisation of a Feature should happen only once. character1 = BaseCharacter(self.bfm, 'a') character1.set_feature_value(feature1, HAS_FEATURE) self.assertEqual(feature1.get_value_characters(HAS_FEATURE), set([character1])) feature5 = BaseFeature(self.bfm, 'voiced') self.assertEqual(feature1.get_value_characters(HAS_FEATURE), set([character1])) feature6 = SuprasegmentalFeature(self.bfm, 'syllabic') character2 = SuprasegmentalCharacter(self.bfm, 'b') character2.set_feature_value(feature6, HAS_FEATURE) self.assertEqual(feature6.get_value_characters(HAS_FEATURE), set([character2])) feature7 = SuprasegmentalFeature(self.bfm, 'syllabic') self.assertEqual(feature6.get_value_characters(HAS_FEATURE), set([character2]))
def test_delete (self): self.assertEqual(len(Character._cache), 0) feature = BaseFeature(self.bfm, 'voiced') character = BaseCharacter(self.bfm, 'a') character.set_feature_value(feature, HAS_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set([character])) self.assertEqual(len(Character._cache), 1) character.delete() self.assertEqual(len(Character._cache), 0) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set())
def test_delete(self): self.assertEqual(len(Character._cache), 0) feature = BaseFeature(self.bfm, 'voiced') character = BaseCharacter(self.bfm, 'a') character.set_feature_value(feature, HAS_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set([character])) self.assertEqual(len(Character._cache), 1) character.delete() self.assertEqual(len(Character._cache), 0) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set())
def test_optional_sections (self): # Optional sections should be optional. configuration = ''' [Base Features] anterior low syllabic voiced [Base Characters] a: b: anterior c: low, voiced''' model = self.parser.parse(configuration) self.assertEqual(len(model.base_features), 4) anterior = BaseFeature(model, 'anterior') low = BaseFeature(model, 'low') syllabic = BaseFeature(model, 'syllabic') voiced = BaseFeature(model, 'voiced') self.assertEqual(len(model.base_features), 4) self.assertTrue(anterior in model.base_features) self.assertTrue(low in model.base_features) self.assertTrue(syllabic in model.base_features) self.assertTrue(voiced in model.base_features) # Base characters. self.assertEqual(len(model.base_characters), 3) a = BaseCharacter(model, 'a') b = BaseCharacter(model, 'b') c = BaseCharacter(model, 'c') self.assertEqual(len(model.base_characters), 3) self.assertTrue(a in model.base_characters) self.assertTrue(b in model.base_characters) self.assertTrue(c in model.base_characters) # Feature values. anterior_has_feature = anterior.get_value_characters(HAS_FEATURE) self.assertEqual(len(anterior_has_feature), 1) self.assertTrue(b in anterior_has_feature) anterior_not_has_feature = anterior.get_value_characters( NOT_HAS_FEATURE) self.assertEqual(len(anterior_not_has_feature), 2) self.assertTrue(a in anterior_not_has_feature) self.assertTrue(c in anterior_not_has_feature) anterior_inapplicable_feature = anterior.get_value_characters( INAPPLICABLE_FEATURE) self.assertEqual(len(anterior_inapplicable_feature), 0)
def test_optional_sections(self): # Optional sections should be optional. configuration = ''' [Base Features] anterior low syllabic voiced [Base Characters] a: b: anterior c: low, voiced''' model = self.parser.parse(configuration) self.assertEqual(len(model.base_features), 4) anterior = BaseFeature(model, 'anterior') low = BaseFeature(model, 'low') syllabic = BaseFeature(model, 'syllabic') voiced = BaseFeature(model, 'voiced') self.assertEqual(len(model.base_features), 4) self.assertTrue(anterior in model.base_features) self.assertTrue(low in model.base_features) self.assertTrue(syllabic in model.base_features) self.assertTrue(voiced in model.base_features) # Base characters. self.assertEqual(len(model.base_characters), 3) a = BaseCharacter(model, 'a') b = BaseCharacter(model, 'b') c = BaseCharacter(model, 'c') self.assertEqual(len(model.base_characters), 3) self.assertTrue(a in model.base_characters) self.assertTrue(b in model.base_characters) self.assertTrue(c in model.base_characters) # Feature values. anterior_has_feature = anterior.get_value_characters(HAS_FEATURE) self.assertEqual(len(anterior_has_feature), 1) self.assertTrue(b in anterior_has_feature) anterior_not_has_feature = anterior.get_value_characters( NOT_HAS_FEATURE) self.assertEqual(len(anterior_not_has_feature), 2) self.assertTrue(a in anterior_not_has_feature) self.assertTrue(c in anterior_not_has_feature) anterior_inapplicable_feature = anterior.get_value_characters( INAPPLICABLE_FEATURE) self.assertEqual(len(anterior_inapplicable_feature), 0)
def test_value_characters (self): feature = BaseFeature(self.bfm, 'voiced') self.assertEqual(feature.get_value_characters(HAS_FEATURE), set()) self.assertEqual(feature.get_value_characters(NOT_HAS_FEATURE), set()) character1 = BaseCharacter(self.bfm, 'a') character1.set_feature_value(feature, HAS_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set([character1])) self.assertEqual(feature.get_value_characters(NOT_HAS_FEATURE), set()) character1.set_feature_value(feature, NOT_HAS_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set()) self.assertEqual(feature.get_value_characters(NOT_HAS_FEATURE), set([character1])) character2 = DiacriticCharacter(self.bfm, 'b') character2.set_feature_value(feature, HAS_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set([character2])) self.assertEqual(feature.get_value_characters(NOT_HAS_FEATURE), set([character1])) character2.set_feature_value(feature, INAPPLICABLE_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set()) self.assertEqual(feature.get_value_characters(NOT_HAS_FEATURE), set([character1])) character3 = SpacingCharacter(self.bfm, 'c') character3.set_feature_value(feature, NOT_HAS_FEATURE) self.assertEqual(feature.get_value_characters(HAS_FEATURE), set()) self.assertEqual(feature.get_value_characters(NOT_HAS_FEATURE), set([character1, character3]))
def test_model (self): configuration = ''' [Base Features] anterior low syllabic voiced [Base Characters] a: b: anterior c: low, voiced [Diacritic Characters] ̥: +anterior [Spacing Characters] ʰ: -low, +voiced [Suprasegmental Features] phrase stressed [Suprasegmental Characters] |: +phrase ˈ: +stressed, +phrase ''' model = self.parser.parse(configuration) # Base features. self.assertEqual(len(model.base_features), 4) anterior = BaseFeature(model, 'anterior') low = BaseFeature(model, 'low') syllabic = BaseFeature(model, 'syllabic') voiced = BaseFeature(model, 'voiced') self.assertEqual(len(model.base_features), 4) self.assertTrue(anterior in model.base_features) self.assertTrue(low in model.base_features) self.assertTrue(syllabic in model.base_features) self.assertTrue(voiced in model.base_features) # Base characters. self.assertEqual(len(model.base_characters), 3) a = BaseCharacter(model, 'a') b = BaseCharacter(model, 'b') c = BaseCharacter(model, 'c') self.assertEqual(len(model.base_characters), 3) self.assertTrue(a in model.base_characters) self.assertTrue(b in model.base_characters) self.assertTrue(c in model.base_characters) # Diacritic characters. self.assertEqual(len(model.diacritic_characters), 1) ring = DiacriticCharacter(model, '̥') self.assertEqual(len(model.diacritic_characters), 1) self.assertTrue(ring in model.diacritic_characters) # Spacing characters. self.assertEqual(len(model.spacing_characters), 1) ʰ = SpacingCharacter(model, 'ʰ') self.assertEqual(len(model.spacing_characters), 1) self.assertTrue(ʰ in model.spacing_characters) # Suprasegmental features. self.assertEqual(len(model.suprasegmental_features), 2) phrase = SuprasegmentalFeature(model, 'phrase') stressed = SuprasegmentalFeature(model, 'stressed') self.assertEqual(len(model.suprasegmental_features), 2) self.assertTrue(phrase in model.suprasegmental_features) self.assertTrue(stressed in model.suprasegmental_features) # Suprasegmental characters. self.assertEqual(len(model.suprasegmental_characters), 2) bar = SuprasegmentalCharacter(model, '|') ˈ = SuprasegmentalCharacter(model, 'ˈ') self.assertEqual(len(model.suprasegmental_characters), 2) self.assertTrue(bar in model.suprasegmental_characters) self.assertTrue(ˈ in model.suprasegmental_characters) # Feature values. anterior_has_feature = anterior.get_value_characters(HAS_FEATURE) self.assertEqual(len(anterior_has_feature), 2) self.assertTrue(b in anterior_has_feature) self.assertTrue(ring in anterior_has_feature) anterior_not_has_feature = anterior.get_value_characters( NOT_HAS_FEATURE) self.assertEqual(len(anterior_not_has_feature), 2) self.assertTrue(a in anterior_not_has_feature) self.assertTrue(c in anterior_not_has_feature) anterior_inapplicable_feature = anterior.get_value_characters( INAPPLICABLE_FEATURE) self.assertEqual(len(anterior_inapplicable_feature), 1) self.assertTrue(ʰ in anterior_inapplicable_feature) phrase_has_feature = phrase.get_value_characters(HAS_FEATURE) self.assertEqual(len(phrase_has_feature), 2) self.assertTrue(bar in phrase_has_feature) self.assertTrue(ˈ in phrase_has_feature) phrase_not_has_feature = phrase.get_value_characters(NOT_HAS_FEATURE) self.assertEqual(len(phrase_not_has_feature), 0) phrase_inapplicable_feature = phrase.get_value_characters( INAPPLICABLE_FEATURE) self.assertEqual(len(phrase_inapplicable_feature), 0)
def test_model(self): configuration = ''' [Base Features] anterior low syllabic voiced [Base Characters] a: b: anterior c: low, voiced [Diacritic Characters] ̥: +anterior [Spacing Characters] ʰ: -low, +voiced [Suprasegmental Features] phrase stressed [Suprasegmental Characters] |: +phrase ˈ: +stressed, +phrase ''' model = self.parser.parse(configuration) # Base features. self.assertEqual(len(model.base_features), 4) anterior = BaseFeature(model, 'anterior') low = BaseFeature(model, 'low') syllabic = BaseFeature(model, 'syllabic') voiced = BaseFeature(model, 'voiced') self.assertEqual(len(model.base_features), 4) self.assertTrue(anterior in model.base_features) self.assertTrue(low in model.base_features) self.assertTrue(syllabic in model.base_features) self.assertTrue(voiced in model.base_features) # Base characters. self.assertEqual(len(model.base_characters), 3) a = BaseCharacter(model, 'a') b = BaseCharacter(model, 'b') c = BaseCharacter(model, 'c') self.assertEqual(len(model.base_characters), 3) self.assertTrue(a in model.base_characters) self.assertTrue(b in model.base_characters) self.assertTrue(c in model.base_characters) # Diacritic characters. self.assertEqual(len(model.diacritic_characters), 1) ring = DiacriticCharacter(model, '̥') self.assertEqual(len(model.diacritic_characters), 1) self.assertTrue(ring in model.diacritic_characters) # Spacing characters. self.assertEqual(len(model.spacing_characters), 1) ʰ = SpacingCharacter(model, 'ʰ') self.assertEqual(len(model.spacing_characters), 1) self.assertTrue(ʰ in model.spacing_characters) # Suprasegmental features. self.assertEqual(len(model.suprasegmental_features), 2) phrase = SuprasegmentalFeature(model, 'phrase') stressed = SuprasegmentalFeature(model, 'stressed') self.assertEqual(len(model.suprasegmental_features), 2) self.assertTrue(phrase in model.suprasegmental_features) self.assertTrue(stressed in model.suprasegmental_features) # Suprasegmental characters. self.assertEqual(len(model.suprasegmental_characters), 2) bar = SuprasegmentalCharacter(model, '|') ˈ = SuprasegmentalCharacter(model, 'ˈ') self.assertEqual(len(model.suprasegmental_characters), 2) self.assertTrue(bar in model.suprasegmental_characters) self.assertTrue(ˈ in model.suprasegmental_characters) # Feature values. anterior_has_feature = anterior.get_value_characters(HAS_FEATURE) self.assertEqual(len(anterior_has_feature), 2) self.assertTrue(b in anterior_has_feature) self.assertTrue(ring in anterior_has_feature) anterior_not_has_feature = anterior.get_value_characters( NOT_HAS_FEATURE) self.assertEqual(len(anterior_not_has_feature), 2) self.assertTrue(a in anterior_not_has_feature) self.assertTrue(c in anterior_not_has_feature) anterior_inapplicable_feature = anterior.get_value_characters( INAPPLICABLE_FEATURE) self.assertEqual(len(anterior_inapplicable_feature), 1) self.assertTrue(ʰ in anterior_inapplicable_feature) phrase_has_feature = phrase.get_value_characters(HAS_FEATURE) self.assertEqual(len(phrase_has_feature), 2) self.assertTrue(bar in phrase_has_feature) self.assertTrue(ˈ in phrase_has_feature) phrase_not_has_feature = phrase.get_value_characters(NOT_HAS_FEATURE) self.assertEqual(len(phrase_not_has_feature), 0) phrase_inapplicable_feature = phrase.get_value_characters( INAPPLICABLE_FEATURE) self.assertEqual(len(phrase_inapplicable_feature), 0)