o
    Óó·i\t  ã                   @  s  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ G dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZd%dd„Zd%dd„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d d!„ d!eƒZG d"d#„ d#eƒZd$S )&z(
Test cases for positioning primitives.
é    )Úannotations)Úverify)Úbase)ÚAnglesÚ
Directions)ÚIPositioningBeacon)ÚTestCasec                   @  ó8   e Zd ZdZddd„Zddd„Zddd	„Zdd
d„ZdS )Ú
AngleTestsz@
    Tests for the L{twisted.positioning.base.Angle} class.
    ÚreturnÚNonec                 C  s   t  ¡ }|  dt|ƒ¡ dS )zd
        The repr of an empty angle says that is of unknown type and unknown
        value.
        z'<Angle of unknown type (unknown value)>N©r   ÚAngleÚassertEqualÚrepr©ÚselfÚa© r   úhC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/positioning/test/test_base.pyÚ
test_empty   s   zAngleTests.test_emptyc                 C  s"   t jtjd�}|  dt|ƒ¡ dS )zf
        The repr of an empty variation says that it is a variation of unknown
        value.
        ©Z	angleTypez<Variation (unknown value)>N)r   r   r   Z	VARIATIONr   r   r   r   r   r   Útest_variation   s   zAngleTests.test_variationc                 C  s   t  d¡}|  dt|ƒ¡ dS )zz
        The repr of an angle of unknown type but a given value displays that
        type and value in its repr.
        ç      ð?z%<Angle of unknown type (1.0 degrees)>Nr   r   r   r   r   Útest_unknownType%   s   
zAngleTests.test_unknownTypec                 C  s   | j ttjdd� dS )zS
        Trying to create an angle with a bogus type raises C{ValueError}.
        ÚBOGUSr   N)ÚassertRaisesÚ
ValueErrorr   r   ©r   r   r   r   Útest_bogusType-   ó   zAngleTests.test_bogusTypeN©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r
      s    


r
   c                   @  sì   e Zd ZdZd3dd„Zd3dd„Zd3dd	„Zd3d
d„Zd3dd„Zd3dd„Z	d3dd„Z
d4dd„Zd3dd„Zd3dd„Zd3dd„Zd3dd„Zd3dd„Zd3d d!„Zd3d"d#„Zd3d$d%„Zd3d&d'„Zd3d(d)„Zd3d*d+„Zd3d,d-„Zd3d.d/„Zd3d0d1„Zd2S )5ÚHeadingTestszB
    Tests for the L{twisted.positioning.base.Heading} class.
    r   r   c                 C  sD   t  d¡}|  |jd¡ |  t|ƒd¡ |  |j¡ |  |j¡ dS )zÕ
        Tests that a simple heading has a value in decimal degrees, which is
        also its value when converted to a float. Its variation, and by
        consequence its corrected heading, is L{None}.
        r   N)r   ÚHeadingr   ÚinDecimalDegreesÚfloatÚassertIsNoneÚ	variationÚcorrectedHeading©r   Úhr   r   r   Útest_simple9   s
   
zHeadingTests.test_simplec                 C  s"   t  d¡}d}|  t|ƒ|¡ dS )zt
        A repr of a heading with no variation reports its value and that the
        variation is unknown.
        r   z*<Heading (1.0 degrees, unknown variation)>N)r   r'   r   r   )r   ÚheadingÚexpectedReprr   r   r   Ú test_headingWithoutVariationReprE   s   
z-HeadingTests.test_headingWithoutVariationReprc                 C  s8   d\}}t jj||d�}d}|  t|ƒ| ||¡¡ dS )zu
        A repr of a heading with known variation reports its value and the
        value of that variation.
        )r   ç      $À©ZvariationValuez2<Heading ({0} degrees, <Variation ({1} degrees)>)>N)r   r'   Ú
fromFloatsr   r   Úformat)r   Zangler+   r0   ZreprTemplater   r   r   Útest_headingWithVariationReprN   s   z*HeadingTests.test_headingWithVariationReprc                 C  s   |   t d¡t d¡¡ dS )z>
        Headings with the same values compare equal.
        r   N)r   r   r'   r   r   r   r   Útest_valueEqualityX   ó   zHeadingTests.test_valueEqualityc                 C  s   |   t d¡t d¡¡ dS )zA
        Headings with different values compare unequal.
        r   ç       @N)ÚassertNotEqualr   r'   r   r   r   r   Útest_valueInequality^   r9   z!HeadingTests.test_valueInequalityc                 C  s   t  d¡ dS )zR
        Headings can be instantiated with a value of 0 and no variation.
        r   N©r   r'   r   r   r   r   Útest_zeroHeadingEdgeCased   ó   z%HeadingTests.test_zeroHeadingEdgeCasec                 C  s   t  dd¡ dS )zh
        Headings can be instantiated with a value of 0 and a variation of 180
        degrees.
        r   é´   Nr=   r   r   r   r   Ú*test_zeroHeading180DegreeVariationEdgeCasej   s   z7HeadingTests.test_zeroHeading180DegreeVariationEdgeCaseÚkwr)   c                 K  s   | j ttjjfi |¤Ž dS )z¤
        Helper function for verifying that bad values raise C{ValueError}.

        @param kw: The keyword arguments passed to L{base.Heading.fromFloats}.
        N)r   r   r   r'   r5   )r   rB   r   r   r   Ú_badValueTestq   s   zHeadingTests._badValueTestc                 C  ó   | j dd� dS )zO
        Headings can not be instantiated with a value of 360 degrees.
        g     €v@©Z
angleValueN©rC   r   r   r   r   Útest_badAngleValueEdgeCasey   ó   z'HeadingTests.test_badAngleValueEdgeCasec                 C  rD   )zT
        Headings can not be instantiated with a variation of -180 degrees.
        ç     €fÀr4   NrF   r   r   r   r   Útest_badVariationEdgeCase   rH   z&HeadingTests.test_badVariationEdgeCasec                 C  rD   )z>
        Negative heading values raise C{ValueError}.
        r3   rE   NrF   r   r   r   r   Útest_negativeHeading…   rH   z!HeadingTests.test_negativeHeadingc                 C  rD   )zK
        Heading values greater than C{360.0} raise C{ValueError}.
        g      w@rE   NrF   r   r   r   r   Útest_headingTooLarge‹   rH   z!HeadingTests.test_headingTooLargec                 C  rD   )zK
        Variation values less than C{-180.0} raise C{ValueError}.
        g     ÀgÀr4   NrF   r   r   r   r   Útest_variationTooNegative‘   rH   z&HeadingTests.test_variationTooNegativec                 C  rD   )zM
        Variation values greater than C{180.0} raise C{ValueError}.
        g     Àg@r4   NrF   r   r   r   r   Útest_variationTooPositive—   rH   z&HeadingTests.test_variationTooPositivec                 C  ó,   t jjddd�}|  |jt  dtj¡¡ dS )zQ
        A heading with a value and a variation has a corrected heading.
        r   r3   r4   g      &@N©r   r'   r5   r   r,   r   r   ÚHEADINGr-   r   r   r   Útest_correctedHeading�   s   z"HeadingTests.test_correctedHeadingc                 C  rO   )zµ
        A heading with a value and a variation has the appropriate corrected
        heading value, even when the variation puts it across the 360 degree
        boundary.
        ç     pv@g       Àr4   r   NrP   r-   r   r   r   Útest_correctedHeadingOverflow¤   ó   z*HeadingTests.test_correctedHeadingOverflowc                 C  rO   )z¹
        A heading with a value and a variation has the appropriate corrected
        heading value, even when the variation puts it exactly at the 360
        degree boundary.
        rS   ç      ð¿r4   ç        NrP   r-   r   r   r   Ú%test_correctedHeadingOverflowEdgeCase­   rU   z2HeadingTests.test_correctedHeadingOverflowEdgeCasec                 C  rO   )z²
        A heading with a value and a variation has the appropriate corrected
        heading value, even when the variation puts it under the 0 degree
        boundary.
        r   r:   r4   rS   NrP   r-   r   r   r   Útest_correctedHeadingUnderflow¶   rU   z+HeadingTests.test_correctedHeadingUnderflowc                 C  s,   t jjddd�}|  |jt  dtj¡¡ dS )z·
        A heading with a value and a variation has the appropriate corrected
        heading value, even when the variation puts it exactly at the 0
        degree boundary.
        r   r4   rW   NrP   r-   r   r   r   Ú&test_correctedHeadingUnderflowEdgeCase¿   rU   z3HeadingTests.test_correctedHeadingUnderflowEdgeCasec                 C  sH   t jjddd�}| d¡ |  |jjd¡ | d¡ |  |jjd¡ dS )zK
        Setting the sign of a heading changes the variation sign.
        r   r4   é   éÿÿÿÿrV   N)r   r'   r5   ÚsetSignr   r+   r(   r-   r   r   r   Útest_setVariationSignÈ   s
   

z"HeadingTests.test_setVariationSignc                 C  st   t jjddd�}|  t|jd¡ |  |jjd¡ |  t|jd¡ |  |jjd¡ |  t|jd¡ |  |jjd¡ dS )z‘
        Setting the sign of a heading to values that aren't C{-1} or C{1}
        raises C{ValueError} and does not affect the heading.
        r   r4   éÎÿÿÿr   é2   N)	r   r'   r5   r   r   r]   r   r+   r(   r-   r   r   r   Útest_setBadVariationSignÒ   s   z%HeadingTests.test_setBadVariationSignc                 C  s.   t j d¡}|  |jj¡ |  t|jd¡ dS )zd
        Setting the sign on a heading with unknown variation raises
        C{ValueError}.
        r   r[   N)	r   r'   r5   r*   r+   r(   r   r   r]   r-   r   r   r   Útest_setUnknownVariationSigná   s   z)HeadingTests.test_setUnknownVariationSignNr!   )rB   r)   r   r   )r"   r#   r$   r%   r/   r2   r7   r8   r<   r>   rA   rC   rG   rJ   rK   rL   rM   rN   rR   rT   rX   rY   rZ   r^   ra   rb   r   r   r   r   r&   4   s0    


	














	
	
	
	

r&   c                   @  sü   e Zd Zd4dd„Zd4dd„Zd4dd„Zd4d	d
„Zd4dd„Zd4dd„Zd4dd„Z	d4dd„Z
d4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd „Zd4d!d"„Zd4d#d$„Zd4d%d&„Zd4d'd(„Zd4d)d*„Zd4d+d,„Zd4d-d.„Zd4d/d0„Zd4d1d2„Zd3S )5ÚCoordinateTestsr   r   c                 C  s   t  d¡}|  t|ƒd¡ dS )z9
        Coordinates can be converted to floats.
        ç      $@N)r   Ú
Coordinater   r)   ©r   Ú
coordinater   r   r   Ú
test_floatì   ó   
zCoordinateTests.test_floatc                 C  s*   t  d¡}dd› d�}|  t|ƒ|¡ dS )zn
        Coordinates that aren't explicitly latitudes or longitudes have an
        appropriate repr.
        rd   z<Angle of unknown type (ú
 degrees)>N)r   re   r   r   ©r   rg   r1   r   r   r   Ú	test_repró   s   
zCoordinateTests.test_reprc                 C  ó.   t  dtj¡}dd› d�}|  t|ƒ|¡ dS )zU
        Positive latitudes have a repr that specifies their type and value.
        rd   ú<Latitude (rj   N©r   re   r   ÚLATITUDEr   r   rk   r   r   r   Útest_positiveLatitudeü   ó   z%CoordinateTests.test_positiveLatitudec                 C  rm   )zU
        Negative latitudes have a repr that specifies their type and value.
        ç      IÀrn   rj   Nro   rk   r   r   r   Útest_negativeLatitude  rr   z%CoordinateTests.test_negativeLatitudec                 C  rm   )zV
        Positive longitudes have a repr that specifies their type and value.
        ç      I@ú<Longitude (rj   N©r   re   r   Ú	LONGITUDEr   r   ©r   Z	longituder1   r   r   r   Útest_positiveLongitude  rr   z&CoordinateTests.test_positiveLongitudec                 C  rm   )zV
        Negative longitudes have a repr that specifies their type and value.
        rs   rv   rj   Nrw   ry   r   r   r   Útest_negativeLongitude  rr   z&CoordinateTests.test_negativeLongitudec                 C  s   |   ttjdd¡ dS )zM
        Creating coordinates with bogus types rasies C{ValueError}.
        ç     Àb@r   N)r   r   r   re   r   r   r   r   Útest_bogusCoordinateType  r    z(CoordinateTests.test_bogusCoordinateTypec                 C  s   |   ttjdtj¡ dS )zm
        Creating coordinates with angle types that aren't coordinates raises
        C{ValueError}.
        r|   N)r   r   r   re   r   rQ   r   r   r   r   Útest_angleTypeNotCoordinate"  s   z+CoordinateTests.test_angleTypeNotCoordinatec                 C  s   ddd„}|   |ƒ |ƒ ¡ dS )zE
        Coordinates with the same value and type are equal.
        r   úbase.Coordinatec                   S  s   t  dtj¡S )Nr   ©r   re   r   rx   r   r   r   r   ÚmakeCoordinate.  s   z5CoordinateTests.test_equality.<locals>.makeCoordinateN)r   r   )r   )r   r�   r   r   r   Útest_equality)  s   
zCoordinateTests.test_equalityc                 C  ó$   t  d¡}t  d¡}|  ||¡ dS )zA
        Coordinates with different values aren't equal.
        r   rV   N)r   re   r;   ©r   Zc1Úc2r   r   r   Útest_differentAnglesInequality3  ó   

z.CoordinateTests.test_differentAnglesInequalityc                 C  s,   t  dtj¡}t  dtj¡}|  ||¡ dS )zT
        Coordinates with the same values but different types aren't equal.
        r   N)r   re   r   rp   rx   r;   r„   r   r   r   Útest_differentTypesInequality;  s   z-CoordinateTests.test_differentTypesInequalityc                 C  sB   t  dtj¡}| d¡ |  |jd¡ | d¡ |  |jd¡ dS )zh
        Setting the sign on a coordinate sets the sign of the value of the
        coordinate.
        ru   r[   r\   rs   N)r   re   r   rp   r]   r   r(   ©r   Úcr   r   r   Ú	test_signC  s
   

zCoordinateTests.test_signc                 C  sp   d}t  |tj¡}|  t|jd¡ |  |jd¡ |  t|jd¡ |  |jd¡ |  t|jd¡ |  |jd¡ dS )zŠ
        Setting a bogus sign value (not -1 or 1) on a coordinate raises
        C{ValueError} and doesn't affect the coordinate.
        ru   r_   r   r`   N)	r   re   r   rp   r   r   r]   r   r(   )r   ÚvaluerŠ   r   r   r   Útest_badVariationSignN  s   z%CoordinateTests.test_badVariationSignc                 C  ó"   t  dtj¡}|  |jtj¡ dS )zD
        Positive latitudes are in the northern hemisphere.
        r   N)r   re   r   rp   r   Ú
hemispherer   ZNORTHrf   r   r   r   Útest_northernHemisphere_  ó   z'CoordinateTests.test_northernHemispherec                 C  rŽ   )zD
        Positive longitudes are in the eastern hemisphere.
        r   N)r   re   r   rx   r   r�   r   ZEASTrf   r   r   r   Útest_easternHemispheref  r‘   z&CoordinateTests.test_easternHemispherec                 C  rŽ   )zD
        Negative latitudes are in the southern hemisphere.
        rV   N)r   re   r   rp   r   r�   r   ZSOUTHrf   r   r   r   Útest_southernHemispherem  r‘   z'CoordinateTests.test_southernHemispherec                 C  rŽ   )zD
        Negative longitudes are in the western hemisphere.
        rV   N)r   re   r   rx   r   r�   r   ZWESTrf   r   r   r   Útest_westernHemispheret  r‘   z&CoordinateTests.test_westernHemispherec                   s$   t  dd¡‰ |  t‡ fdd„¡ dS )zo
        Accessing the hemisphere for a coordinate that can't compute it
        raises C{ValueError}.
        r   Nc                     s   ˆ j S )N)r�   r   ©rg   r   r   Ú<lambda>�  s    z4CoordinateTests.test_badHemisphere.<locals>.<lambda>)r   re   r   r   r   r   r•   r   Útest_badHemisphere{  s   z"CoordinateTests.test_badHemispherec                 C  ó    |   ttd¡ |   ttd¡ dS )zt
        Creating a latitude with a value greater than or equal to 90 degrees
        raises C{ValueError}.
        r|   g     €V@N©r   r   Ú_makeLatituder   r   r   r   Útest_latitudeTooLargeƒ  ó   z%CoordinateTests.test_latitudeTooLargec                 C  r˜   )zr
        Creating a latitude with a value less than or equal to -90 degrees
        raises C{ValueError}.
        g     ÀbÀg     €VÀNr™   r   r   r   r   Útest_latitudeTooSmall‹  rœ   z%CoordinateTests.test_latitudeTooSmallc                 C  r˜   )zv
        Creating a longitude with a value greater than or equal to 180 degrees
        raises C{ValueError}.
        g     @o@g     €f@N©r   r   Ú_makeLongituder   r   r   r   Útest_longitudeTooLarge“  rœ   z&CoordinateTests.test_longitudeTooLargec                 C  r˜   )zt
        Creating a longitude with a value less than or equal to -180 degrees
        raises C{ValueError}.
        g     @oÀrI   Nrž   r   r   r   r   Útest_longitudeTooSmall›  rœ   z&CoordinateTests.test_longitudeTooSmallc                 C  s<   t  dtj¡}|  |jd¡ t  dtj¡}|  |jd¡ dS )zQ
        Coordinate values can be accessed in degrees, minutes, seconds.
        g     @I@)r`   é   r   g%�•CI@)r`   é   é.   N)r   re   r   rp   r   ÚinDegreesMinutesSecondsr‰   r   r   r   Útest_inDegreesMinutesSeconds£  s   z,CoordinateTests.test_inDegreesMinutesSecondsc                 C  s   t  dd¡}|  |j¡ dS )zz
        If the vaue of a coordinate is L{None}, its values in degrees,
        minutes, seconds is also L{None}.
        N)r   re   r*   r¥   r‰   r   r   r   Ú(test_unknownAngleInDegreesMinutesSeconds­  s   z8CoordinateTests.test_unknownAngleInDegreesMinutesSecondsNr!   )r"   r#   r$   rh   rl   rq   rt   rz   r{   r}   r~   r‚   r†   rˆ   r‹   r�   r�   r’   r“   r”   r—   r›   r�   r    r¡   r¦   r§   r   r   r   r   rc   ë   s2    


	





















rc   rŒ   r)   r   r   c                 C  ó   t  | tj¡S )z7
    Builds and returns a latitude of given value.
    N)r   re   r   rp   ©rŒ   r   r   r   rš   ¶  r?   rš   c                 C  r¨   )z8
    Builds and returns a longitude of given value.
    Nr€   r©   r   r   r   rŸ   ½  r?   rŸ   c                   @  r	   )ÚAltitudeTestszC
    Tests for the L{twisted.positioning.base.Altitude} class.
    r   r   c                 C  s@   t  d¡}|  t|ƒd¡ |  |jd¡ |  |jdt j ¡ dS )z�
        Altitudes can be instantiated and reports the correct value in
        meters and feet, as well as when converted to float.
        r   N)r   ÚAltituder   r)   ZinMetersZinFeetZMETERS_PER_FOOT©r   Zaltituder   r   r   Ú
test_valueÉ  s   
zAltitudeTests.test_valuec                 C  ó   t  d¡}|  t|ƒd¡ dS )zF
        Altitudes report their type and value in their repr.
        r   z<Altitude (1.0 m)>N)r   r«   r   r   r¬   r   r   r   rl   Ó  ri   zAltitudeTests.test_reprc                 C  s$   t  d¡}t  d¡}|  ||¡ dS )z<
        Altitudes with equal values compare equal.
        r   N)r   r«   r   ©r   ZfirstAltitudeZsecondAltituder   r   r   r‚   Ú  r‡   zAltitudeTests.test_equalityc                 C  rƒ   )zF
        Altitudes with different values don't compare equal.
        r   rV   N)r   r«   r;   r¯   r   r   r   Útest_inequalityâ  r‡   zAltitudeTests.test_inequalityNr!   )r"   r#   r$   r%   r­   rl   r‚   r°   r   r   r   r   rª   Ä  s    



rª   c                   @  óB   e Zd ZdZddd„Zddd„Zddd	„Zdd
d„Zddd„ZdS )Ú
SpeedTestsz@
    Tests for the L{twisted.positioning.base.Speed} class.
    r   r   c                 C  ó,   t  d¡}|  |jd¡ |  t|ƒd¡ dS )ú‚
        Speeds can be instantiated, and report their value in meters
        per second, and can be converted to floats.
        ru   N)r   ÚSpeedr   ÚinMetersPerSecondr)   ©r   Úspeedr   r   r   r­   ð  ó   
zSpeedTests.test_valuec                 C  r®   )zC
        Speeds report their type and value in their repr.
        ru   z<Speed (50.0 m/s)>N)r   rµ   r   r   r·   r   r   r   rl   ù  ri   zSpeedTests.test_reprc                 C  s   |   ttjd¡ dS )zA
        Creating a negative speed raises C{ValueError}.
        rV   N)r   r   r   rµ   r   r   r   r   Útest_negativeSpeeds   s   zSpeedTests.test_negativeSpeedsc                 C  ó"   t  d¡}|  dt j |j¡ dS )zC
        A speed can be converted into its value in knots.
        r   r[   N)r   rµ   r   ÚMPS_PER_KNOTÚinKnotsr·   r   r   r   Útest_inKnots  ó   
zSpeedTests.test_inKnotsc                 C  ó   |   dtt d¡ƒ¡ dS )z;
        A speed can be converted into a C{float}.
        r   N)r   r)   r   rµ   r   r   r   r   Útest_asFloat  ó   zSpeedTests.test_asFloatNr!   )	r"   r#   r$   r%   r­   rl   rº   r¾   rÁ   r   r   r   r   r²   ë  s    

	

r²   c                   @  r±   )Ú
ClimbTestsz6
    Tests for L{twisted.positioning.base.Climb}.
    r   r   c                 C  r³   )r´   ç      E@N©r   ÚClimbr   r¶   r)   ©r   Zclimbr   r   r   r/     r¹   zClimbTests.test_simplec                 C  r®   )zC
        Climbs report their type and value in their repr.
        rÄ   z<Climb (42.0 m/s)>N)r   rÆ   r   r   rÇ   r   r   r   rl   "  ri   zClimbTests.test_reprc                 C  r³   )z‰
        Climbs can have negative values, and still report that value
        in meters per second and when converted to floats.
        g      EÀNrÅ   rÇ   r   r   r   Útest_negativeClimbs)  r¹   zClimbTests.test_negativeClimbsc                 C  r»   )zC
        A climb can be converted into its value in knots.
        r   r[   N)r   rÆ   r   r¼   r½   rÇ   r   r   r   Útest_speedInKnots2  r¿   zClimbTests.test_speedInKnotsc                 C  rÀ   )z;
        A climb can be converted into a C{float}.
        r   N)r   r)   r   rÆ   r   r   r   r   rÁ   9  rÂ   zClimbTests.test_asFloatNr!   )	r"   r#   r$   r%   r/   rl   rÈ   rÉ   rÁ   r   r   r   r   rÃ     s    

	

	rÃ   c                   @  sŒ   e Zd ZdZd$dd„Zd$dd„Zd$dd	„Zd$d
d„Zd$dd„Zd$dd„Z	d$dd„Z
d$dd„ZdZd%dd„Zd$dd„Zd$dd „Zd$d!d"„Zd#S )&ÚPositionErrorTestsz>
    Tests for L{twisted.positioning.base.PositionError}.
    r   r   c                 C  s0   t  ¡ }|  |j¡ |  |j¡ |  |j¡ dS )z~
        In an empty L{base.PositionError} with no invariant testing, all
        dilutions of positions are L{None}.
        N©r   ÚPositionErrorr*   ÚpdopÚhdopÚvdop©r   ZpositionErrorr   r   r   Útest_allUnsetE  s   z PositionErrorTests.test_allUnsetc                 C  s4   t jdd�}|  |j¡ |  |j¡ |  |j¡ dS )z{
        In an empty L{base.PositionError} with invariant testing, all
        dilutions of positions are L{None}.
        T)ÚtestInvariantNrË   rÐ   r   r   r   Útest_allUnsetWithInvariantO  s   z-PositionErrorTests.test_allUnsetWithInvariantc                 C  s   t jdd�}|  |jd¡ dS )zN
        L{base.PositionError}s can be instantiated with just a HDOP.
        r   )rÎ   N©r   rÌ   r   rÎ   rÐ   r   r   r   Útest_withoutInvariantY  s   z(PositionErrorTests.test_withoutInvariantc                 C  s    t jddd�}|  |jd¡ dS )zv
        Creating a simple L{base.PositionError} with just a HDOP while
        checking the invariant works.
        r   T)rÎ   rÒ   NrÔ   rÐ   r   r   r   Útest_withInvariant`  rœ   z%PositionErrorTests.test_withInvariantc                 C  s>   t jdddd�}|  |jd¡ |  |jd¡ |  |jd¡ dS )zŽ
        Creating a L{base.PositionError} with values set to an impossible
        combination works if the invariant is not checked.
        r   )rÍ   rÏ   rÎ   N)r   rÌ   r   rÍ   rÎ   rÏ   )r   Úerrorr   r   r   Útest_invalidWithoutInvarianth  s   z/PositionErrorTests.test_invalidWithoutInvariantc                 C  s   | j ttjddddd� dS )zž
        Creating a L{base.PositionError} with values set to an impossible
        combination raises C{ValueError} if the invariant is being tested.
        r   T)rÍ   rÏ   rÎ   rÒ   N)r   r   r   rÌ   r   r   r   r   Útest_invalidWithInvariantr  s   
úz,PositionErrorTests.test_invalidWithInvariantc                 C  s&   t jddd�}d|_|  |jd¡ dS )z}
        You can set the PDOP value to value inconsisted with HDOP and VDOP
        when not checking the invariant.
        r   ©rÎ   rÏ   ç      Y@N)r   rÌ   rÍ   r   )r   Úper   r   r   Útest_setDOPWithoutInvariant€  s   z.PositionErrorTests.test_setDOPWithoutInvariantc                 C  s@   t jdddd�}|j}ddd	„}|  t||¡ |  |j|¡ d
S )z”
        Attempting to set the PDOP value to value inconsisted with HDOP and
        VDOP when checking the invariant raises C{ValueError}.
        r   T)rÎ   rÏ   rÒ   rÜ   úbase.PositionErrorr   r   c                 S  s
   d| _ d S )NrÛ   )rÍ   )rÜ   r   r   r   ÚsetPDOP‘  s   
z<PositionErrorTests.test_setDOPWithInvariant.<locals>.setPDOPN)rÜ   rÞ   r   r   )r   rÌ   rÍ   r   r   r   )r   rÜ   rÍ   rß   r   r   r   Útest_setDOPWithInvariant‰  s
   
z+PositionErrorTests.test_setDOPWithInvariantz.<PositionError (pdop: %s, hdop: %s, vdop: %s)>rÜ   rÞ   rÍ   úfloat | NonerÎ   rÏ   c                 C  sJ   |   |j|¡ |   |j|¡ |   |j|¡ |   t|ƒ| j|||f ¡ dS )aþ  
        Tests the DOP values in a position error, and the repr of that
        position error.

        @param pe: The position error under test.
        @type pe: C{PositionError}
        @param pdop: The expected position dilution of precision.
        @type pdop: C{float} or L{None}
        @param hdop: The expected horizontal dilution of precision.
        @type hdop: C{float} or L{None}
        @param vdop: The expected vertical dilution of precision.
        @type vdop: C{float} or L{None}
        N)r   rÍ   rÎ   rÏ   r   ÚREPR_TEMPLATE)r   rÜ   rÍ   rÎ   rÏ   r   r   r   Ú_testDOP™  s    zPositionErrorTests._testDOPc                 C  s>   d\}}|d |d  d }t j||d�}|  ||||¡ dS )zF
        The VDOP is correctly determined from PDOP and HDOP.
        ©r:   r   é   ç      à?)rÍ   rÎ   N©r   rÌ   rã   )r   rÍ   rÎ   rÏ   rÜ   r   r   r   Útest_positionAndHorizontalSet²  ó   z0PositionErrorTests.test_positionAndHorizontalSetc                 C  s>   d\}}|d |d  d }t j||d�}|  ||||¡ dS )zF
        The HDOP is correctly determined from PDOP and VDOP.
        rä   rå   ræ   )rÍ   rÏ   Nrç   )r   rÍ   rÏ   rÎ   rÜ   r   r   r   Útest_positionAndVerticalSet»  ré   z.PositionErrorTests.test_positionAndVerticalSetc                 C  s>   d\}}|d |d  d }t j||d�}|  ||||¡ dS )zF
        The PDOP is correctly determined from HDOP and VDOP.
        )r   r   rå   ræ   rÚ   Nrç   )r   rÎ   rÏ   rÍ   rÜ   r   r   r   Útest_horizontalAndVerticalSetÄ  ré   z0PositionErrorTests.test_horizontalAndVerticalSetNr!   )
rÜ   rÞ   rÍ   rá   rÎ   rá   rÏ   rá   r   r   )r"   r#   r$   r%   rÑ   rÓ   rÕ   rÖ   rØ   rÙ   rÝ   rà   râ   rã   rè   rê   rë   r   r   r   r   rÊ   @  s    










	


		rÊ   c                   @  s:   e Zd ZdZddd„ZddddœZdd	d
„Zddd„ZdS )ÚBeaconInformationTestszB
    Tests for L{twisted.positioning.base.BeaconInformation}.
    r   r   c                 C  s2   t  ¡ }|  t|jƒd¡ d}|  t|ƒ|¡ dS )z»
        For an empty beacon information object, the number of used
        beacons is zero, the number of seen beacons is zero, and the
        repr of the object reflects that.
        r   z><BeaconInformation (used beacons (0): [], unused beacons: [])>N)r   ÚBeaconInformationr   ÚlenÚusedBeaconsr   )r   Úbir1   r   r   r   Útest_minimalÓ  s
   ÿz#BeaconInformationTests.test_minimalr[   r   )ÚazimuthÚ	elevationÚsignalToNoiseRatioc                   sv   d‡ fdd„}t ƒ }tddƒD ]
}| ||d	�¡ qt |¡}ˆ  t|jƒd
¡ ˆ  t|jƒd¡ ˆ  t	|ƒd¡ dS )zw
        Tests a beacon information with a bunch of satellites, none of
        which used in computing a fix.
        rB   r)   r   úbase.Satellitec                    s$   t ˆ jƒ}| | ¡ tjdi |¤ŽS )Nr   )ÚdictÚsatelliteKwargsÚupdater   Ú	Satellite)rB   Úkwargsr   r   r   Ú_buildSatelliteè  s   

z;BeaconInformationTests.test_simple.<locals>._buildSatelliter[   é
   )Ú
identifieré	   r   a  <BeaconInformation (used beacons (0): [], unused beacons: [<Satellite (1), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (2), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (3), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (4), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (5), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (6), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (7), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (8), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (9), azimuth: 1, elevation: 1, snr: 1.0>])>N)rB   r)   r   rõ   )
ÚsetÚrangeÚaddr   rí   r   rî   ÚseenBeaconsrï   r   )r   rû   ZbeaconsÚprnrð   r   r   r   r/   â  s   
þz"BeaconInformationTests.test_simplec                 C  s†   t  ¡ }tddƒD ]}t jd	d|i| j¤Ž}|j |¡ |d r&|j |¡ q	|  t	|jƒd¡ |  t	|jƒd¡ |  t
|ƒd¡ dS )
zv
        Tests a beacon information with a bunch of satellites, some of
        them used in computing a fix.
        r[   rü   rý   rå   rþ   é   a  <BeaconInformation (used beacons (5): [<Satellite (1), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (3), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (5), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (7), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (9), azimuth: 1, elevation: 1, snr: 1.0>], unused beacons: [<Satellite (2), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (4), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (6), azimuth: 1, elevation: 1, snr: 1.0>, <Satellite (8), azimuth: 1, elevation: 1, snr: 1.0>])>Nr   )r   rí   r   rù   r÷   r  r  rï   r   rî   r   )r   rð   r  Z	satelliter   r   r   Útest_someSatellitesUsed  s   €þz.BeaconInformationTests.test_someSatellitesUsedNr!   )r"   r#   r$   r%   rñ   r÷   r/   r  r   r   r   r   rì   Î  s    

#rì   c                   @  ó$   e Zd ZdZd	dd„Zd	dd„ZdS )
ÚPositioningBeaconTestsz.
    Tests for L{base.PositioningBeacon}.
    r   r   c                 C  s,   t  tj¡}|  |¡ t t t d¡¡ dS )zX
        Tests that L{base.PositioningBeacon} implements L{IPositioningBeacon}.
        r[   N)r   ZimplementedByr   ÚPositioningBeaconÚ
assertTruer   ZverifyObject)r   Z
implementsr   r   r   Útest_interface*  s   
z%PositioningBeaconTests.test_interfacec                 C  s   |   tt d¡ƒd¡ dS )z9
        Tests the repr of a positioning beacon.
        ÚAz<Beacon (A)>N)r   r   r   r  r   r   r   r   rl   2  rÂ   z PositioningBeaconTests.test_reprNr!   )r"   r#   r$   r%   r
  rl   r   r   r   r   r  %  s    
r  c                   @  r  )
ÚSatelliteTestsz:
    Tests for L{twisted.positioning.base.Satellite}.
    r   r   c                 C  sP   t  d¡}|  |jd¡ |  |j¡ |  |j¡ |  |j¡ |  t|ƒd¡ dS )z·
        Tests a minimal satellite that only has a known PRN.

        Tests that the azimuth, elevation and signal to noise ratios
        are L{None} and verifies the repr.
        r[   z:<Satellite (1), azimuth: None, elevation: None, snr: None>N)	r   rù   r   rý   r*   rò   ró   rô   r   ©r   Úsr   r   r   rñ   >  s   
ÿzSatelliteTests.test_minimalc                 C  s^   t jddddd�}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  t|ƒd¡ dS )z·
        Tests a minimal satellite that only has a known PRN.

        Tests that the azimuth, elevation and signal to noise ratios
        are correct and verifies the repr.
        r[   g     àp@g      >@g      9@)rý   rò   ró   rô   z;<Satellite (1), azimuth: 270.0, elevation: 30.0, snr: 25.0>N)r   rù   r   rý   rò   ró   rô   r   r  r   r   r   r/   N  s   ÿÿzSatelliteTests.test_simpleNr!   )r"   r#   r$   r%   rñ   r/   r   r   r   r   r  9  s    
r  N)rŒ   r)   r   r   )r%   Ú
__future__r   Zzope.interfacer   Ztwisted.positioningr   Ztwisted.positioning.baser   r   Z twisted.positioning.ipositioningr   Ztwisted.trial.unittestr   r
   r&   rc   rš   rŸ   rª   r²   rÃ   rÊ   rì   r  r  r   r   r   r   Ú<module>   s,   $ 8 
L
'), W