§
    ßþ¾j*!  ã                   óô   — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
mZmZ ddlmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZ  G d	„ d
e	j        ¦  «        Zedk    r e	j         ¦   «          dS dS )uë   
Unit test suite for Expanded Server-Authoritative Meridian Passive Tree.
Verifies 29-node multi-cluster constellation, Minor/Notable/Keystone hierarchy,
Linh Tháº¡ch (Jewel) socketing/unsocketing, anti-cheat pathing, and persistence.
é    N)ÚCombatActorÚFiveElements)ÚLevelUpEvent)ÚCANONICAL_JEWELSÚCANONICAL_MERIDIAN_NODESÚget_all_canonical_jewelsÚget_all_meridian_nodesÚget_canonical_jewelÚget_meridian_nodeÚget_node_neighbors)ÚMeridianService)ÚMeridianNodeType)ÚQuestEnginec                   óV   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„ZdS )ÚTestMeridianServerServiceÚreturnNc                 ó  — t          j        ¦   «         | _        t          j                             | j        j        d¦  «        | _        t          ¦   «         | _	        t          | j        | j	        ¬¦  «        | _        d| _        d S )Nztest_game_state.db)Údb_pathÚquest_engineÚtest_player_feral_01)ÚtempfileÚTemporaryDirectoryÚtemp_dirÚosÚpathÚjoinÚnamer   r   r   r   ÚserviceÚ	player_id©Úselfs    ú@C:\Projects\FreeExile\tests\unit\test_meridian_server_service.pyÚsetUpzTestMeridianServerService.setUp   si   € Ý Ô3Ñ5Ô5ˆŒÝ”w—|’| D¤MÔ$6Ð8LÑMÔMˆŒÝ'™MœMˆÔÝ&Ø”LØÔ*ð
ñ 
ô 
ˆŒð 0ˆŒˆˆó    c                 ó\   — 	 | j                              ¦   «          d S # t          $ r Y d S w xY w)N)r   ÚcleanupÚ	Exceptionr    s    r"   ÚtearDownz"TestMeridianServerService.tearDown&   sC   € ð	ØŒM×!Ò!Ñ#Ô#Ð#Ð#Ð#øÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ �
+ª+c                 ó  — t          ¦   «         }|                      t          |¦  «        d¦  «         d„ |                     ¦   «         D ¦   «         }|                      |h d£¦  «         d„ |                     ¦   «         D ¦   «         }|                      t
          j        |¦  «         |                      t
          j        |¦  «         |                      t
          j        |¦  «         |                      t
          j	        |¦  «         |                      t
          j
        |¦  «         d„ |                     ¦   «         D ¦   «         }|                      t          |¦  «        d¦  «         d„ |                     ¦   «         D ¦   «         }|                      t          |¦  «        d¦  «         t          ¦   «         }|                      t          |¦  «        d¦  «         |                      d|¦  «         |                      d	|¦  «         d
S )zWVerifies 29 nodes across 5 clusters, with Minor, Notable, Keystones, and Jewel Sockets.é   c                 ó   — h | ]	}|j         ’Œ
S © )Úcluster©Ú.0Úns     r"   ú	<setcomp>zLTestMeridianServerService.test_expanded_catalog_integrity.<locals>.<setcomp>2   s   € Ð6Ð6Ð6 !�A”IÐ6Ð6Ð6r$   >   ÚEASTÚWESTÚNORTHÚSOUTHÚCENTERc                 ó   — h | ]	}|j         ’Œ
S r,   )Ú	node_typer.   s     r"   r1   zLTestMeridianServerService.test_expanded_catalog_integrity.<locals>.<setcomp>6   s   € Ð5Ð5Ð5 �”Ð5Ð5Ð5r$   c                 ó<   — g | ]}|j         t          j        k    ¯|‘ŒS r,   )r8   r   ÚKEYSTONEr.   s     r"   ú
<listcomp>zMTestMeridianServerService.test_expanded_catalog_integrity.<locals>.<listcomp>>   s(   € Ð[Ð[Ð[˜1°!´+ÕAQÔAZÒ2ZÐ2Z�QÐ2ZÐ2ZÐ2Zr$   é   c                 ó<   — g | ]}|j         t          j        k    ¯|‘ŒS r,   )r8   r   ÚJEWEL_SOCKETr.   s     r"   r;   zMTestMeridianServerService.test_expanded_catalog_integrity.<locals>.<listcomp>A   s(   € Ð]Ð]Ð]˜°´Õ?OÔ?\Ò0\Ð0\�1Ð0\Ð0\Ð0\r$   Újewel_red_bloodstoneÚjewel_gold_thunderN)r	   ÚassertEqualÚlenÚvaluesÚassertInr   ÚORIGINÚVESSELÚMAJORr:   r>   r   )r!   ÚnodesÚclustersÚtypesÚ	keystonesÚsocketsÚjewelss          r"   Útest_expanded_catalog_integrityz9TestMeridianServerService.test_expanded_catalog_integrity,   sÂ  € å&Ñ(Ô(ˆØ×Ò�˜U™œ RÑ(Ô(Ð(ð 7Ð6 u§|¢|¡~¤~Ð6Ñ6Ô6ˆØ×Ò˜Ð#OÐ#OÐ#OÑPÔPÐPð 6Ð5 e§l¢l¡n¤nÐ5Ñ5Ô5ˆØ�ŠÕ&Ô-¨uÑ5Ô5Ð5Ø�ŠÕ&Ô-¨uÑ5Ô5Ð5Ø�ŠÕ&Ô,¨eÑ4Ô4Ð4Ø�ŠÕ&Ô/°Ñ7Ô7Ð7Ø�ŠÕ&Ô3°UÑ;Ô;Ð;ð \Ð[ §¢¡¤Ð[Ñ[Ô[ˆ	Ø×Ò�˜Y™œ¨Ñ+Ô+Ð+à]Ð]˜eŸlšl™nœnÐ]Ñ]Ô]ˆØ×Ò�˜W™œ qÑ)Ô)Ð)õ *Ñ+Ô+ˆØ×Ò�˜V™œ aÑ(Ô(Ð(Ø�ŠÐ,¨fÑ5Ô5Ð5Ø�ŠÐ*¨FÑ3Ô3Ð3Ð3Ð3r$   c                 óP  — | j                              | j        ¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      t          |j        ¦  «        d¦  «         |                      t          |j        ¦  «        d¦  «         dS )zEEvery new character begins with authoritative 5 points on the server.é   r   N)	r   Úget_or_create_playerr   rA   Úavailable_pointsÚspent_pointsrB   Úunlocked_nodesÚsocketed_jewels)r!   Ústates     r"   Ú!test_initial_authoritative_pointsz;TestMeridianServerService.test_initial_authoritative_pointsJ   s“   € à”×1Ò1°$´.ÑAÔAˆØ×Ò˜Ô/°Ñ3Ô3Ð3Ø×Ò˜Ô+¨QÑ/Ô/Ð/Ø×Ò�˜UÔ1Ñ2Ô2°AÑ6Ô6Ð6Ø×Ò�˜UÔ2Ñ3Ô3°QÑ7Ô7Ð7Ð7Ð7r$   c                 óL  — | j                              | j        d¦  «        \  }}|                      |¦  «         |                      d|¦  «         | j                              | j        d¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         dS )zHRejects unlocking distant clusters or keystones without contiguous path.Úm_n_keystoneu
   káº¿ cáº­nrP   N)	r   Úcan_unlock_noder   ÚassertFalserD   Úunlock_nodeÚsuccessrA   rR   )r!   Ú
can_unlockÚreasonÚress       r"   Ú"test_topological_anti_cheat_gatingz<TestMeridianServerService.test_topological_anti_cheat_gatingR   s˜   € ð "œ\×9Ò9¸$¼.È.ÑYÔYÑˆ
�FØ×Ò˜Ñ$Ô$Ð$Ø�Š�l FÑ+Ô+Ð+àŒl×&Ò& t¤~°~ÑFÔFˆØ×Ò˜œÑ%Ô%Ð%Ø×Ò˜Ô-¨qÑ1Ô1Ð1Ð1Ð1r$   c                 ód  — | j                              | j        d¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |                      |j        j        d¦  «         | j                              | j        d¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         | j                              | j        d¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         | j                              | j        d¦  «        }|                      |j        ¦  «         |                      |j        d	¦  «         |  	                    d|j
        ¦  «         |                      |j        j        d
¦  «         dS )z=Validates pathing: Center m_c1 -> m_c3 -> North m_n1 -> m_n3.Úm_c1r<   éÈ   Úm_c3é   Úm_n1é   Úm_n3é   gš™™™™™É?N)r   r\   r   Ú
assertTruer]   rA   rR   Úaggregated_statsÚhprD   rT   ÚassertGreaterÚdps_mult)r!   Úr1Úr2Úr3Úr4s        r"   Útest_sequential_path_unlockingz8TestMeridianServerService.test_sequential_path_unlocking]   sw  € ð Œ\×%Ò% d¤n°fÑ=Ô=ˆØ�Š˜œ
Ñ#Ô#Ð#Ø×Ò˜Ô,¨aÑ0Ô0Ð0Ø×Ò˜Ô,Ô/°Ñ5Ô5Ð5ð Œ\×%Ò% d¤n°fÑ=Ô=ˆØ�Š˜œ
Ñ#Ô#Ð#Ø×Ò˜Ô,¨aÑ0Ô0Ð0ð Œ\×%Ò% d¤n°fÑ=Ô=ˆØ�Š˜œ
Ñ#Ô#Ð#Ø×Ò˜Ô,¨aÑ0Ô0Ð0ð Œ\×%Ò% d¤n°fÑ=Ô=ˆØ�Š˜œ
Ñ#Ô#Ð#Ø×Ò˜Ô,¨aÑ0Ô0Ð0Ø�Š�f˜bÔ/Ñ0Ô0Ð0Ø×Ò˜2Ô.Ô7¸Ñ>Ô>Ð>Ð>Ð>r$   c                 ó¦  — | j                              | j        dd¦  «        }|                      |j        ¦  «         |                      d|j        ¦  «         g d¢}|D ]@}| j                              | j        |¦  «        }|                      |j        d|› �¦  «         ŒA| j          	                    | j        ¦  «        }| j                              | j        dd¦  «        }|                      |j        ¦  «         |                      d|j        ¦  «         | j          	                    | j        ¦  «        }|  
                    |j        |j        dz   ¦  «         |  
                    |j        |j        dz   ¦  «         |                      |j        |j        d	z   d
¬¦  «         | j                              | j        d¦  «        }|                      |j        ¦  «         |  
                    |j        d¦  «         | j          	                    | j        ¦  «        }	|  
                    |	j        |j        ¦  «         |  
                    |	j        |j        ¦  «         dS )uC   Verifies full lifecycle of Jewel Sockets (Linh Cá»‘t Kháº£m Tá»�a).Ú	m_n_jewelr?   u   chÆ°a Ä‘Æ°á»£c khai thÃ´ng©rc   re   rg   Úm_n2rv   z
Failed on u   Kháº£m náº¡p thÃ nh cÃ´ngéx   é   ç¸…ëQ¸¾?rh   )ÚplacesN)r   Úsocket_jewelr   r[   r]   rD   Úmessager\   rk   Úcompute_total_statsrA   rm   ÚarmorÚassertAlmostEqualro   Úunsocket_jewelÚremoved_jewel_id)
r!   Ú	sock_failr   ÚnidÚrÚstats_before_jewelÚsock_resÚstats_with_jewelÚ
unsock_resÚstats_after_unsockets
             r"   Ú$test_jewel_socketing_and_unsocketingz>TestMeridianServerService.test_jewel_socketing_and_unsocketingv   s5  € ð ”L×-Ò-¨d¬n¸kÐKaÑbÔbˆ	Ø×Ò˜Ô*Ñ+Ô+Ð+Ø�ŠÐ2°IÔ4EÑFÔFÐFð =Ð<Ð<ˆØð 	;ð 	;ˆCØ”×(Ò(¨¬¸Ñ=Ô=ˆAØ�OŠO˜AœIÐ'9°CÐ'9Ð'9Ñ:Ô:Ð:Ð:à!œ\×=Ò=¸d¼nÑMÔMÐð ”<×,Ò,¨T¬^¸[ÐJ`ÑaÔaˆØ�Š˜Ô(Ñ)Ô)Ð)Ø�ŠÐ1°8Ô3CÑDÔDÐDàœ<×;Ò;¸D¼NÑKÔKÐØ×ÒÐ)Ô,Ð.@Ô.CÀcÑ.IÑJÔJÐJØ×ÒÐ)Ô/Ð1CÔ1IÈBÑ1NÑOÔOÐOØ×ÒÐ/Ô8Ð:LÔ:UÐX\Ñ:\ÐefÐÑgÔgÐgð ”\×0Ò0°´ÀÑMÔMˆ
Ø�Š˜
Ô*Ñ+Ô+Ð+Ø×Ò˜Ô4Ð6LÑMÔMÐMà#œ|×?Ò?ÀÄÑOÔOÐØ×ÒÐ-Ô0Ð2DÔ2GÑHÔHÐHØ×ÒÐ-Ô3Ð5GÔ5MÑNÔNÐNÐNÐNr$   c                 ó  — dD ]"}| j                              | j        |¦  «         Œ#| j                              | j        ¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         |                      |j        d¦  «         | j          	                    | j        ¦  «        }|                      t          |j        ¦  «        d¦  «         |                      t          |j        ¦  «        d¦  «         dS )z?Reset refunds spent points, clears nodes, and unsockets jewels.)rc   re   rg   rf   rP   r   N)r   r\   r   Úreset_meridianrk   r]   rA   Úrefunded_pointsrR   rQ   rB   rT   rU   )r!   r…   Ú	reset_resrV   s       r"   Ú+test_reset_refunds_points_and_clears_jewelszETestMeridianServerService.test_reset_refunds_points_and_clears_jewels˜   sí   € ð ,ð 	:ð 	:ˆCØŒL×$Ò$ T¤^°SÑ9Ô9Ð9Ð9à”L×/Ò/°´Ñ?Ô?ˆ	Ø�Š˜	Ô)Ñ*Ô*Ð*Ø×Ò˜Ô2°AÑ6Ô6Ð6Ø×Ò˜Ô3°QÑ7Ô7Ð7à”×1Ò1°$´.ÑAÔAˆØ×Ò�˜UÔ1Ñ2Ô2°AÑ6Ô6Ð6Ø×Ò�˜UÔ2Ñ3Ô3°QÑ7Ô7Ð7Ð7Ð7r$   c                 óÖ  — g d¢}|D ]"}| j                              | j        |¦  «         Œ#| j                              | j        dd¦  «         t	          | j        ¬¦  «        }|                     | j        ¦  «        }|                      |j        d¦  «         |                      |j	        d¦  «         |                      t          |j        ¦  «        d¦  «         |                      d|j        ¦  «         |                      |j        d         j        d¦  «         |                     | j        ¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         d	S )
zNState including unlocked nodes and socketed jewels persists across DB reloads.rw   rv   r@   )r   r   rP   r{   gffffffÖ?N)r   r\   r   r}   r   r   rQ   rA   rR   rS   rB   rT   rD   rU   Újewel_idr   ÚassertGreaterEqualÚ	crit_rateÚcrit_dmg)r!   r   r…   Únew_serviceÚloaded_stateÚtotal_statss         r"   Ú#test_sqlite_persistence_with_jewelsz=TestMeridianServerService.test_sqlite_persistence_with_jewels§   s\  € ð =Ð<Ð<ˆØð 	:ð 	:ˆCØŒL×$Ò$ T¤^°SÑ9Ô9Ð9Ð9ØŒ×!Ò! $¤.°+Ð?SÑTÔTÐTõ &¨d¬lÐ;Ñ;Ô;ˆØ"×7Ò7¸¼ÑGÔGˆà×Ò˜Ô6¸Ñ:Ô:Ð:Ø×Ò˜Ô2°AÑ6Ô6Ð6Ø×Ò�˜\Ô8Ñ9Ô9¸1Ñ=Ô=Ð=Ø�Š�k <Ô#?Ñ@Ô@Ð@Ø×Ò˜Ô5°kÔBÔKÐMaÑbÔbÐbð "×5Ò5°d´nÑEÔEˆØ×Ò Ô 5°tÑ<Ô<Ð<Ø×Ò Ô 4°dÑ;Ô;Ð;Ð;Ð;r$   )r   N)Ú__name__Ú
__module__Ú__qualname__r#   r(   rN   rW   ra   rt   rŒ   r‘   rš   r,   r$   r"   r   r      sÍ   € € € € € ð0ð 0ð 0ð 0ðð ð ð ð4ð 4ð 4ð 4ð<8ð 8ð 8ð 8ð	2ð 	2ð 	2ð 	2ð?ð ?ð ?ð ?ð2 Oð  Oð  Oð  OðD8ð 8ð 8ð 8ð<ð <ð <ð <ð <ð <r$   r   Ú__main__)!Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr   r   ÚunittestÚserver.world.combat_enginer   r   Ú$server.world.level_progression_typesr   Úserver.world.meridian_catalogr   r   r   r	   r
   r   r   Úserver.world.meridian_servicer   Úserver.world.meridian_typesr   Úserver.world.quest_enginer   ÚTestCaser   r›   Úmainr,   r$   r"   ú<module>r¯      s^  ððð ð € € € € € € € € € € € € €	€	€	€	Ø €€€Ø €€€à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ða<ð a<ð a<ð a<ð a< Ô 1ñ a<ô a<ð a<ðH ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr$   