+
    ¾¾jK  ã                   óv   € R t ^ RIt^ RIHt ^ RIHt ^ RIHtHt ^ RIH	t	 R t
R tR tR	 tR
 tR tR tR tR# )z@Tests for issue #844: timezone placement in calendar components.N)Údatetime)ÚZoneInfo)ÚCalendarÚEvent)ÚTimezonec            
     ó&  € \        4       p V P                  RR4       V P                  RR4       \        4       pVP                  R\        \        P
                  ! 4       4      4       \        R^^^^\        R4      R7      Vn        VP                  R	R
4       V P                  V4       V P                  4        V P                   Uu. uF  q"P                  NK  	  ppVRR.8X  g   Q hV P                  ^ ,          P                  R8X  g   Q hR# u upi )zVTest that single timezone is placed before event when using `add_missing_timezones()`.ÚVERSIONú2.0ÚPRODIDútest calendarÚUIDéê  úEurope/London©ÚtzinfoÚSUMMARYú
Test EventÚ	VTIMEZONEÚVEVENTN©r   Úaddr   ÚstrÚuuidÚuuid4r   r   ÚstartÚadd_componentÚadd_missing_timezonesÚsubcomponentsÚnameÚ	timezonesÚtz_name)ÚcalendarÚeventÚcompÚ
componentss       Úp/home/ralf/ical-fahrzeuge/venv/lib/python3.14/site-packages/icalendar/tests/test_issue_844_timezone_placement.pyÚ(test_single_timezone_placed_before_eventr&      sà   € ä‹z€HØ‡L�L�˜EÔ"Ø‡L�L�˜?Ô+ä‹G€EØ	‡I�Iˆe”SœŸš›Ó&Ô'Ü˜4  B¨¨B´xÀÓ7PÔQ€E„KØ	‡I�Iˆi˜Ô&Ø×Ñ˜5Ô!à×"Ñ"Ô$à(0×(>Ò(>Ó?Ñ(> —)”)Ñ(>€JÐ?Ø˜+ xÐ0Ô0Ð0Ð0ð ×Ñ˜aÕ ×(Ñ(¨OÔ;Ð;Ò;ùò	 @s   ÃDc            
     ól  € \        4       p V P                  RR4       V P                  RR4       \        4       pVP                  R\        \        P
                  ! 4       4      4       \        R^^^^\        R4      R7      Vn        VP                  R	R
4       V P                  V4       \        4       pVP                  R\        \        P
                  ! 4       4      4       \        R^^^^\        R4      R7      Vn        VP                  R	R4       V P                  V4       V P                  4        V P                   Uu. uF  q3P                  NK  	  ppVR,          RR.8X  g   Q hVR,          RR.8X  g   Q hV P                   Uu0 uF  qUP                  kK  	  ppVRR08X  g   Q hR# u upi u upi )z6Test that multiple timezones are placed before events.r   r	   r
   r   r   r   r   r   r   zLondon EventúAmerica/New_YorkúNew York EventºNé   Nr   ºr+   NNr   Nr   )r!   Úevent1Úevent2r#   r$   ÚtzÚtimezone_namess          r%   Ú,test_multiple_timezones_placed_before_eventsr1       sl  € ä‹z€HØ‡L�L�˜EÔ"Ø‡L�L�˜?Ô+ä‹W€FØ
‡J�Jˆu”cœ$Ÿ*š*›,Ó'Ô(Ü˜D ! R¨¨R¼ÀÓ8QÔR€F„LØ
‡J�Jˆy˜.Ô)Ø×Ñ˜6Ô"ä‹W€FØ
‡J�Jˆu”cœ$Ÿ*š*›,Ó'Ô(Ü˜D ! R¨¨R¼ÐASÓ8TÔU€F„LØ
‡J�JˆyÐ*Ô+Ø×Ñ˜6Ô"à×"Ñ"Ô$à(0×(>Ò(>Ó?Ñ(> —)”)Ñ(>€JÐ?Ø�b�>˜k¨;Ð7Ô7Ð7Ð7Ø�b�>˜h¨Ð1Ô1Ð1Ð1ð ,4×+=Ò+=Ó>Ñ+= R—j”jÑ+=€NÐ>Ø˜oÐ/AÐBÔBÐBÒBùò @ùò
 ?s   ÅF,Æ	F1c            
     óº  € \        4       p V P                  RR4       V P                  RR4       \        P                  ! R4      pV P	                  V4       \        4       pVP                  R\        \        P                  ! 4       4      4       \        R^^^^\        R4      R7      Vn        VP                  R	R
4       V P	                  V4       \        4       pVP                  R\        \        P                  ! 4       4      4       \        R^^^^\        R4      R7      Vn        VP                  R	R4       V P	                  V4       V P                  4        V P                   Uu. uF  qDP                  NK  	  ppVR,          RR.8X  g   Q hVR,          RR.8X  g   Q hV P                   Uu0 uF  qfP                   kK  	  ppVRR08X  g   Q hR# u upi u upi )zRTest that existing timezones are preserved and new ones added in correct position.r   r	   r
   r   zEurope/Berlinr   r   r   r   zBerlin Eventr(   r)   r*   r   r,   r   N)r   r   r   Ú	from_tzidr   r   r   r   r   r   r   r   r   r   r   r   r    )r!   Úexisting_tzr-   r.   r#   r$   r/   r0   s           r%   Ú9test_existing_timezone_preserved_new_ones_added_correctlyr5   =   sŒ  € ä‹z€HØ‡L�L�˜EÔ"Ø‡L�L�˜?Ô+ô ×$Ò$ _Ó5€KØ×Ñ˜;Ô'ä‹W€FØ
‡J�Jˆu”cœ$Ÿ*š*›,Ó'Ô(Ü˜D ! R¨¨R¼ÀÓ8QÔR€F„LØ
‡J�Jˆy˜.Ô)Ø×Ñ˜6Ô"ä‹W€FØ
‡J�Jˆu”cœ$Ÿ*š*›,Ó'Ô(Ü˜D ! R¨¨R¼ÐASÓ8TÔU€F„LØ
‡J�JˆyÐ*Ô+Ø×Ñ˜6Ô"à×"Ñ"Ô$à(0×(>Ò(>Ó?Ñ(> —)”)Ñ(>€JÐ?Ø�b�>˜k¨;Ð7Ô7Ð7Ð7Ø�b�>˜h¨Ð1Ô1Ð1Ð1ð ,4×+=Ò+=Ó>Ñ+= R—j”jÑ+=€NÐ>Ø˜oÐ/AÐBÔBÐBÒBùò @ùò
 ?s   Å(GÆ0Gc                 ó,  € \        4       p V P                  RR4       V P                  RR4       \        4       pVP                  R\        \        P
                  ! 4       4      4       \        R^^^^4      Vn        VP                  RR4       V P                  V4       V P                   Uu. uF  q"P                  NK  	  ppV P                  4        V P                   Uu. uF  q"P                  NK  	  ppY4u;8X  d
   R	.8X  g   Q h Q hR
# u upi u upi )zDTest that method handles case with no missing timezones. Gracefully.r   r	   r
   r   r   r   r   zNo Timezone Eventr   N)r   r   r   r   r   r   r   r   r   r   r   r   )r!   r"   r#   Úoriginal_componentsÚnew_componentss        r%   Ú$test_no_missing_timezones_no_changesr9   ^   sá   € ä‹z€HØ‡L�L�˜EÔ"Ø‡L�L�˜?Ô+ä‹G€EØ	‡I�Iˆe”SœŸš›Ó&Ô'Ü˜4  B¨¨BÓ/€E„KØ	‡I�IˆiÐ,Ô-Ø×Ñ˜5Ô!à19×1GÒ1GÓHÑ1G¨Ÿ9œ9Ñ1GÐÐHØ×"Ñ"Ô$Ø,4×,BÒ,BÓCÑ,B D—i”iÑ,B€NÐCàÖ>°X°JÔ>Ð>Ñ>Ð>Ò>ùò	 IùâCs   Â,DÃ Dc                 óæ   € \        4       p V P                  RR4       V P                  RR4       V P                  4        V P                   Uu. uF  qP                  NK  	  ppV. 8X  g   Q hR# u upi )zETest that `add_missing_timezones()` handles empty calendar correctly.r   r	   r
   r   N)r   r   r   r   r   )r!   r#   r$   s      r%   Ú)test_empty_calendar_add_missing_timezonesr;   q   sc   € ä‹z€HØ‡L�L�˜EÔ"Ø‡L�L�˜?Ô+à×"Ñ"Ô$à(0×(>Ò(>Ó?Ñ(> —)”)Ñ(>€JÐ?Ø˜ÔÐÒùò @s   ÁA.c            
     ó�  € \        4       p V P                  RR4       V P                  RR4       \        4       pVP                  R\        \        P
                  ! 4       4      4       \        R^^^^\        R4      R7      Vn        VP                  R	R
4       V P                  V4       V P                  4        V P                  4       P                  4       pVP                  R4      pRpRp\        V4       F7  w  rgVP                  4       R8X  d   TpK  VP                  4       R8X  g   K5  TpK9  	  Vf   Q hVf   Q hWE8  g   Q hR# )zHTest that timezones appear before events in serialized iCalendar output.r   r	   r
   r   r   r   r   r   r   r   Ú
NzBEGIN:VTIMEZONEzBEGIN:VEVENT)r   r   r   r   r   r   r   r   r   r   r   Úto_icalÚdecodeÚsplitÚ	enumerateÚstrip)r!   r"   Úical_contentÚlinesÚvtimezone_lineÚvevent_lineÚiÚlines           r%   Ú,test_timezone_placement_in_serialized_outputrI   }   s  € ä‹z€HØ‡L�L�˜EÔ"Ø‡L�L�˜?Ô+ä‹G€EØ	‡I�Iˆe”SœŸš›Ó&Ô'Ü˜4  B¨¨B´xÀÓ7PÔQ€E„KØ	‡I�Iˆi˜Ô&Ø×Ñ˜5Ô!à×"Ñ"Ô$ð ×#Ñ#Ó%×,Ñ,Ó.€LØ×Ñ˜tÓ$€Eà€NØ€Kä˜UÖ#‰ˆØ�:‰:‹<Ð,Ô,ØŠNØ�Z‰Z‹\˜^Ö+ØŠKñ	 $ð Ò%Ð%Ð%ØÒ"Ð"Ð"ØÔ'Ð'Ò'ó    c                 óî   € Rp \         P                  ! V 4      p\        VP                  4      ^8X  g   Q h\        VP                  4      ^8X  g   Q hVP                  ^ ,          P
                  R8X  g   Q hR# )z:Test that our fix doesn't break forward reference parsing.a.  BEGIN:VCALENDAR
VERSION:2.0
PRODID:test
BEGIN:VEVENT
UID:test-event
DTSTART;TZID=Europe/London:20260319T123000
SUMMARY:Test Event
END:VEVENT
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:STANDARD
DTSTART:20001029T020000
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
TZNAME:GMT
END:STANDARD
END:VTIMEZONE
END:VCALENDARr   N)r   Ú	from_icalÚlenÚeventsr   r    )rC   r!   s     r%   Ú$test_forward_reference_compatibilityrO   �   sj   € ð€Lô( ×!Ò! ,Ó/€HÜˆx�‰Ó 1Ô$Ð$Ð$Üˆx×!Ñ!Ó" aÔ'Ð'Ð'Ø×Ñ˜aÕ ×(Ñ(¨OÔ;Ð;Ò;rJ   c            
     ó´  € ^ RI p V P                  P                  R4      p ! R R4      pV! 4       V P                  R&    \        4       pVP	                  RR4       VP	                  RR4       \        4       pVP	                  R	\        \        P                  ! 4       4      4       \        R
^^^^\        R4      R7      Vn        VP	                  RR4       VP                  V4       VP                  4        VP                   Uu. uF  qUP                  NK  	  ppVRR.8X  g   Q h\!        VP"                  4      ^8X  g   Q hVP"                  ^ ,          P$                  R8X  g   Q h V'       d   WP                  R&   R# V P                  P'                  RR4       R# u upi   T'       d   YP                  R&   i T P                  P'                  RR4       i ; i)z=Test timezone placement. Works even if pytz is not available.NÚpytzc                   ó&   a € ] tR t^Át o R tRtV tR# )Ú6test_timezone_placement_without_pytz.<locals>.MockPytzc                ó   € \        R 4      h)zNo module named 'pytz')ÚImportError)Úselfr   s   &&r%   Ú__getattr__ÚBtest_timezone_placement_without_pytz.<locals>.MockPytz.__getattr__Â   s   € ÜÐ6Ó7Ð7rJ   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rW   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r%   ÚMockPytzrS   Á   s   ø‡ € ÷	8ð 	8rJ   ra   r   r	   r
   r   r   r   r   r   r   r   r   r   )ÚsysÚmodulesÚgetr   r   r   r   r   r   r   r   r   r   r   r   r   rM   r   r    Úpop)rb   Úoriginal_pytzra   r!   r"   r#   r$   s          r%   Ú$test_timezone_placement_without_pytzrg   º   sw  € ãð —K‘K—O‘O FÓ+€M÷8ñ 8ñ #›*€C‡K�K�Ñð*Ü“:ˆØ�‰�Y Ô&Ø�‰�X˜Ô/ä“ˆØ�	‰	�%œœTŸZšZ›\Ó*Ô+Ü˜t Q¨¨B°¼8ÀOÓ;TÔUˆŒØ�	‰	�)˜\Ô*Ø×Ñ˜uÔ%à×&Ñ&Ô(à,4×,BÒ,BÓCÑ,B D—i”iÑ,Bˆ
ÐCØ˜k¨8Ð4Ô4Ð4Ð4Ü�8×%Ñ%Ó&¨!Ô+Ð+Ð+Ø×!Ñ! !Õ$×,Ñ,°Ô?Ð?Ñ?÷ Ø"/�K‰K˜Óà�K‰K�O‰O˜F DÖ)ùò Dø÷ Ø"/�K‰K˜Òà�K‰K�O‰O˜F DÕ)ús   ¿CF" ÄFÄAF" ÆF" Æ"5G)Ú__doc__r   r   Úzoneinfor   Ú	icalendarr   r   Úicalendar.cal.timezoner   r&   r1   r5   r9   r;   rI   rO   rg   rY   rJ   r%   Ú<module>rl      sC   ðÙ Fã Ý Ý ç %Ý +ò<ò*Cò:CòB?ò&	ò(ò@<ô:$*rJ   