
    \jK!                     p    d Z ddlmZ d Zd Z G d d      Z G d d      Z G d	 d
      Z G d d      Zy)z6
Test Aline algorithm for aligning phonetic sequences
    )alinec                     t        j                  dd      } g dg}| |k(  sJ t        j                  dd      } ddgg}| |k(  sJ t        j                  dd	      } g d
g}| |k(  sJ t        j                  dd      } g dg}| |k(  sJ y )Nu   θintenwis))   θtienr   jou   ʒə)ju   ʒ)ou   əpematesiwenipematesewen)pr   r
   r
   )mr   ar   r   r   r   )sr   r   )wr   r   r   u   tuwθdentis)r   )ur	   )r   -)r   r   r   align)resultexpecteds     C/root/env/lib/python3.12/site-packages/nltk/test/unit/test_aline.py
test_aliner#      s    [[*F56HX[[v&Fk*+HX[[7F	
H  X[[(+FABHX    c                  p    t        j                  dd      dk(  sJ t        j                  dd      dk(  sJ y)zF
    Test aline for computing the difference between two segments
    r   qg      4@r   A        Nr   delta r$   r"   test_aline_deltar,   ,   s6     ;;sC D(((;;sC C'''r$   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestAlineEdgeCasesc                 D    t        j                  dd      }|g dgk(  sJ y)zAAligning identical strings should produce perfect 1-to-1 mapping.pat)r   r   r   Nr   selfr    s     r"   test_identical_stringsz)TestAlineEdgeCases.test_identical_strings5   s$    UE*>????r$   c                     	 t        j                  dd       J d       # t        $ r Y nw xY w	 t        j                  dd       J d       # t        $ r Y yw xY w)z7Unknown segments should raise ValueError, not KeyError.r   !zExpected ValueErroru   ☺r   N)r   r   
ValueErrorr2   s    r"   test_invalid_segment_raisesz.TestAlineEdgeCases.test_invalid_segment_raises:   sb    	KKS!///5 			KKs#///5 		s    	++A 	AAc                 B    t        j                  dd      }|dggk(  sJ y)zSingle characters should align.r   r   Nr   r1   s     r"   test_single_charz#TestAlineEdgeCases.test_single_charG   $    S#&:,'''r$   c                 B    t        j                  dd      }|dggk(  sJ y)z/Different single consonants should still align.r   r   )r   r   Nr   r1   s     r"   test_single_char_differentz-TestAlineEdgeCases.test_single_char_differentL   r;   r$   c                 B    t        j                  dd      }|dggk(  sJ y)zSingle vowels should align.r   r
   )r   r
   Nr   r1   s     r"   test_single_vowelz$TestAlineEdgeCases.test_single_vowelQ   r;   r$   N)__name__
__module____qualname__r3   r8   r:   r=   r?   r+   r$   r"   r.   r.   4   s    @
(
(
(r$   r.   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestFeatureMatrixz:Verify IPA feature assignments match phonetic definitions.c                 h    t         j                  D ]  }|t         j                  v rJ d|d        y)zCEvery consonant in the consonants list should be in feature_matrix.
Consonant  missing from feature_matrixNr   
consonantsfeature_matrixr2   cs     r"   %test_all_consonants_in_feature_matrixz7TestFeatureMatrix.test_all_consonants_in_feature_matrix_   s?    !! 	>AU)))>A5 <=>)	>r$   c                 h    t         j                  D ]  }|t         j                  v rJ d|d        y)z8Every vowel (place='vowel' entry) should be a valid key.Vowel rG   Nr   vowelsrJ   r2   vs     r"   !test_all_vowels_in_feature_matrixz3TestFeatureMatrix.test_all_vowels_in_feature_matrixf   s:     	YA,,,Xqe;W.XX,	Yr$   c                 j    t         j                  D ]   }||j                         k(  rJ d|d        y)z3No consonant entry should have trailing whitespace.rF    has trailing whitespaceN)r   rI   striprK   s     r"   %test_no_trailing_spaces_in_consonantsz7TestFeatureMatrix.test_no_trailing_spaces_in_consonantsk   s:    !! 	NA	>MZu4L#MM>	Nr$   c                 j    t         j                  D ]   }||j                         k(  rJ d|d        y)z/No vowel entry should have trailing whitespace.rO   rV   N)r   rQ   rW   rR   s     r"   !test_no_trailing_spaces_in_vowelsz3TestFeatureMatrix.test_no_trailing_spaces_in_vowelsp   s8     	JA	>IVA50H#II>	Jr$   c                 j    t         j                  D ]   }||j                         k(  rJ d|d        y)z6No feature_matrix key should have trailing whitespace.zFeature matrix key rV   N)r   rJ   rW   )r2   ks     r"   .test_no_trailing_spaces_in_feature_matrix_keysz@TestFeatureMatrix.test_no_trailing_spaces_in_feature_matrix_keysu   s;    %% 	WA	>V%8=U#VV>	Wr$   c                 v    t         j                  D ]&  }t         j                  |   d   dk7  rJ d|d        y)z'No consonant should have place='vowel'.placevowelrF   z has place='vowel'NrH   rK   s     r"   test_consonants_not_vowel_placez1TestFeatureMatrix.test_consonants_not_vowel_placez   sI    !! 	4A$$Q'0G;4A5 234;	4r$   c                     t         j                  D ]<  }t         j                  |   d   dk(  rJ d|dt         j                  |   d           y)z7All vowels in feature_matrix should have place='vowel'.r_   r`   rO   z has place=NrP   rR   s     r"   test_vowels_have_vowel_placez.TestFeatureMatrix.test_vowels_have_vowel_place   s_     	MA$$Q'0G;MuK(<(<Q(?(H'KLM;	Mr$   c                     g d}|D ]O  }|t         j                  v st         j                  |   d   dk(  r0J d|dt         j                  |   d           y)z;Vowels that are unrounded in IPA should have round='minus'.)r	   r
   u   ɛr   u   ɯ   ɘu   ɜu   ɐu   ɑu   ʌu   ɤroundminuszIPA unrounded vowel  has round=Nr   rJ   )r2   	unroundedrS   s      r"   test_unrounded_vowelsz'TestFeatureMatrix.test_unrounded_vowels   so    S	 	_AE(((((+G4?_)!k%:N:Nq:QRY:Z9]^_?	_r$   c                     g d}|D ]O  }|t         j                  v st         j                  |   d   dk(  r0J d|dt         j                  |   d           y)z8Vowels that are rounded in IPA should have round='plus'.)r   r   yu   ɒ   ɵu   ʏu   ʊrf   pluszIPA rounded vowel rh   Nri   )r2   roundedrS   s      r"   test_rounded_vowelsz%TestFeatureMatrix.test_rounded_vowels   so    9 	]AE(((((+G4>]'uK8L8LQ8OPW8X7[\]>	]r$   c                     ddg}|D ]O  }|t         j                  v st         j                  |   d   dk(  r0J d|dt         j                  |   d           y)z4Close-mid vowels should have high='mid', not 'high'.re   rn   highmidzClose-mid vowel z
 has high=Nri   )r2   	close_midrS   s      r"   test_close_mid_vowelsz'TestFeatureMatrix.test_close_mid_vowels   sr    4L	 	YAE(((((+F3u<Y%aU*U5I5I!5LV5T4WXY<	Yr$   N)r@   rA   rB   __doc__rM   rT   rX   rZ   r]   ra   rc   rk   rq   rv   r+   r$   r"   rD   rD   \   s?    D>Y
N
J
W
4M_]Yr$   rD   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestScoringFunctionsc                     t        j                  dd      dk(  sJ t        j                  dd      dk(  sJ t        j                  dd      dk(  sJ y)z+Identical consonants should have delta = 0.r   r(   r   r   Nr)   r7   s    r"   test_delta_identical_consonantsz4TestScoringFunctions.test_delta_identical_consonants   sM    {{3$+++{{3$+++{{3$+++r$   c                 p    t        j                  dd      dk(  sJ t        j                  dd      dk(  sJ y)z'Identical vowels should have delta = 0.r   r(   r	   Nr)   r7   s    r"   test_delta_identical_vowelsz0TestScoringFunctions.test_delta_identical_vowels   s4    {{3$+++{{3$+++r$   c                 j    t        j                  dd      }t        j                  dd      }||k  sJ y)z8Similar consonants (same place) should have small delta.r   br\   Nr)   )r2   d_pbd_pks      r"   test_delta_similar_consonantsz2TestScoringFunctions.test_delta_similar_consonants   s0     {{3${{3$d{{r$   c                    t        j                  dd      t        j                  dd      k(  sJ t        j                  dd      t        j                  dd      k(  sJ t        j                  dd      t        j                  dd      k(  sJ y)z4Delta should be symmetric: delta(a,b) == delta(b,a).r   r   r   r   r   u   ʃNr)   r7   s    r"   test_delta_symmetricz)TestScoringFunctions.test_delta_symmetric   sn    {{3$C(===={{3$C(===={{3%T3)????r$   c                 l    t        j                  d      dk  sJ t        j                  d      dk  sJ y)z4sigma_skip should return a negative value (penalty).r   r   r   N)r   
sigma_skipr7   s    r"   test_sigma_skip_negativez-TestScoringFunctions.test_sigma_skip_negative   s4    $q((($q(((r$   c                 j    t        j                  dd      }t        j                  dd      }||kD  sJ y)z6Substituting identical segments should give max score.r   r   N)r   	sigma_sub)r2   score_identicalscore_differents      r"   test_sigma_sub_identicalz-TestScoringFunctions.test_sigma_sub_identical   s0    //#s3//#s3000r$   c                 `    t        j                  dd      }t        |t        t        f      sJ y)z6sigma_exp should return a numeric value without error.r   )r   r   N)r   	sigma_exp
isinstanceintfloatr1   s     r"   test_sigma_exp_returns_valuez1TestScoringFunctions.test_sigma_exp_returns_value   s&    j1&3,///r$   c                 f    t        j                  d      }t        j                  d      }||k\  sJ y)z1V() for a vowel should be >= V() for a consonant.r   r   N)r   V)r2   v_vowelv_consonants      r"   test_V_vowel_gt_consonantz.TestScoringFunctions.test_V_vowel_gt_consonant   s,     ''#,ggcl+%%%r$   c                     t        j                  dd      }t        j                  dd      }t        |t              sJ t        |t              sJ t	        |      dkD  sJ t	        |      dkD  sJ y)z9R() should return relevant features for the segment pair.r   r   r   r
   r   N)r   Rr   listlen)r2   r_consonantsr_vowelss      r"   test_R_returns_listz(TestScoringFunctions.test_R_returns_list   si     wwsC(773$,---(D)))< 1$$$8}q   r$   N)r@   rA   rB   r{   r}   r   r   r   r   r   r   r   r+   r$   r"   ry   ry      s0    ,,
@)
10
&!r$   ry   c                       e Zd Zd Zd Zy)TestAlignmentPropertiesc                 v    t        j                  dd      }t        |      dkD  sJ t        |d         dkD  sJ y)z?Alignment of non-empty strings should produce non-empty result.r0   katr   N)r   r   r   r1   s     r"   test_alignment_not_emptyz0TestAlignmentProperties.test_alignment_not_empty   s8    UE*6{Q6!9~!!!r$   c                     t        j                  dd      }t        |t              sJ t        |d   t              sJ t        |d   d   t              sJ y)z0align() should return a list of alignment lists.patar   N)r   r   r   r   tupler1   s     r"   $test_alignment_returns_list_of_listsz<TestAlignmentProperties.test_alignment_returns_list_of_lists   sN    T4(&$'''&)T***&)A,...r$   N)r@   rA   rB   r   r   r+   r$   r"   r   r      s    "/r$   r   N)	rw   nltk.metricsr   r#   r,   r.   rD   ry   r   r+   r$   r"   <module>r      sI    !H( (  (PGY GYT9! 9!x/ /r$   