
    `gj                     n   d dl Zd dlZd dlmZ  ee      j                         j                  d   dz  dz  Zej                  j                  de      Zej                  j                  e      Zej                  j                  e        G d dej                         Zed	k(  r ej&                          yy)
    N)Path   	dashboardzplugin_api.py
plugin_apic                   N    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)AchievementEngineTestsc                    ddddiigddddddddd	iigdg}t         j                  d
d|      }| j                  |d   d       | j                  |d   dd	h       | j                  |d   d       | j                  |d   d       y )N	assistantfunctionnameterminal)role
tool_callstoolzError: port 3000 already in use)r   	tool_namecontent
web_searchs1zFix dev servertool_call_count   
tool_nameserror_countr   port_conflictT)r   analyze_messagesassertEqualassertIs)selfmessagesstatss      l/root/.hermes/venv/lib/python3.12/site-packages/plugins/hermes-achievements/tests/test_achievement_engine.py1test_tool_call_stats_detect_tool_names_and_errorszHAchievementEngineTests.test_tool_call_stats_detect_tool_names_and_errors   s     *vz>R1S0TU*Abc *v|>T1U0VW
 ++D2BHM0115|,z<.HI}-q1eO,d3    c                    dddddddddd	dgd
}ddi}t         j                  ||      }| j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  |d   d       y )Nlet_him_cookmax_tool_calls_in_sessionCopper
   r   	thresholdSilver   Gold2   idthreshold_metrictiers   unlockedTtierprogress	next_tierr   evaluate_tieredr   r   r   
definition	aggregateresults       r    5test_tiered_achievement_reaches_highest_matching_tierzLAchievementEngineTests.test_tiered_achievement_reaches_highest_matching_tier   s      ;!3!3b1

 1"5	++J	BfZ($/2
+R0,f5r"   c                    dddddgd}ddi}t         j                  ||      }| j                  |d   d	       | j                  |d
   d       | j                  |d   d
       | j                  |d   d       | j                  |d   d       y )Nterminal_goblintotal_terminal_callsr&   r-   r(   r.      r3   F
discoveredTstater5   next_thresholdr7   r9   s       r    ;test_tiered_achievement_can_be_discovered_without_unlockingzRAchievementEngineTests.test_tiered_achievement_can_be_discovered_without_unlocking-   s    # 6'b9:


 ,R0	++J	BfZ(%0f\*D1,7
+R0 0126r"   c                     ddddddgd}ddi}t         j                  ||      }t         j                  i ||      }| j                  |d	   d
       | j                  |d   d       | j	                  d|d          y )Npermission_denied_any_percentzPermission Denied Any%Tpermission_denied_events   metricgte)r/   r   secretrequirementsr   rC   rM   r   z???
Permissiondescription)r   evaluate_requirementsdisplay_achievementr   assertNotIn)r   r:   r;   r<   displays        r    5test_secret_achievement_stays_hidden_without_progresszLAchievementEngineTests.test_secret_achievement_stays_hidden_without_progress=   s    1,(B1MN	

 03	11*iH001IJ1I&1IJ(3%0w}'=>r"   c                 `   ddddddddddgd	}t         j                  |d
ddd      }t         j                  |d
ddd      }| j                  |d   d       | j                  |d   d       | j	                  |d   d       | j                  |d   d       | j                  |d   d       y )N	full_sendmax_terminal_calls_in_sessionr'   rJ   max_file_tool_calls_in_session   max_web_calls_in_sessionr   )r/   rN   rA   r   )rX   rY   r[      rC   rB   r3   Fprogress_pctd   T)r   rQ   r   r   
assertLess)r   r:   partialcompletes       r    5test_multi_condition_unlock_requires_all_requirementszLAchievementEngineTests.test_multi_condition_unlock_requires_all_requirementsM   s    :2F;AF5a@

 22:-/./()@
 
 33J-/./()A
  	)<8gj)51/5'*J7hz*D1r"   c                     t         j                  D cg c]  }|d   	 }}| j                  t        |      d       | j	                  t        |      t        t        |                   y c c}w )Nr/   <   )r   ACHIEVEMENTSassertGreaterEquallenr   setr   achievementidss      r    ,test_catalog_has_60_plus_unique_achievementszCAchievementEngineTests.test_catalog_has_60_plus_unique_achievementsh   sV    4>4K4KL[{4 LLC"-S3s3x=1 Ms   A*c                 ^   dddhidddhiddhig}t         j                  |      }| j                  |d   d       | j                  |d	   d       t         j                  t	        d
 t         j
                  D              |      }| j                  |d   d       | j                  |d   d       y )Nmodel_namesopenai/gpt-5zanthropic/claude-sonnet-4zgoogle/gemini-prozmistral/largez
qwen/qwen3distinct_model_countrZ   distinct_provider_countc              3   2   K   | ]  }|d    dk(  s|  yw)r/   five_model_flightN .0as     r    	<genexpr>zTAchievementEngineTests.test_model_provider_metrics_are_aggregated.<locals>.<genexpr>y   s     VqqwBU7UV   rC   r3   r4   r&   )r   aggregate_statsr   evaluate_definitionnextre   )r   sessionsr;   r<   s       r    *test_model_provider_metrics_are_aggregatedzAAchievementEngineTests.test_model_provider_metrics_are_aggregatedm   s    ^-HIJ0/BC\N+
 ..x8	#9:A>#<=qA//VJ33VV
 	*52r"   c                     t         j                  D ch c]  }|d   	 }}| j                  d|       | j                  d|       | j                  d|       y c c}w )Nr/   fallback_pilotbrowser_sleuthrelease_ritualist)r   re   rS   ri   s      r    2test_removed_noisy_achievements_are_not_in_catalogzIAchievementEngineTests.test_removed_noisy_achievements_are_not_in_catalog   sY    4>4K4KL[{4 LL)3/)3/,c2 Ms   Ac                    t         j                  dhddg      }t         j                  ddhiddhig      }t        d t         j                  D              }| j	                  |d   d       | j	                  t         j                  ||      d	   d
       | j	                  |d   d       | j	                  t         j                  ||      d	   d       y )Nro   i  )rn   local_model_eventsrn   zollama/llama3c              3   2   K   | ]  }|d    dk(  s|  yw)r/   open_weights_pilgrimNrt   ru   s     r    rx   zdAchievementEngineTests.test_open_weights_pilgrim_counts_only_local_model_metadata.<locals>.<genexpr>   s     b$Ka@a!bry   local_model_chat_sessionsr   rC   rB   r   r3   )r   rz   r|   re   r   r{   )r   aggregate_mentions_onlyaggregate_local_chatr:   s       r    :test_open_weights_pilgrim_counts_only_local_model_metadatazQAchievementEngineTests.test_open_weights_pilgrim_counts_only_local_model_metadata   s    ","<"<+,CH>
 #  *99^,-_-.;
   bZ%<%<bb
01LMqQ77
D[\]degst-.IJAN77
DXYZabdnor"   c                     t         j                  ddddig      }| j                  |d   d       t         j                  dddd	ig      }| j                  |d   d
       y )Nr   zConfig talkr   z*config config configuration not configuredconfig_eventsr   s2zReal configz1edited config.yaml, manifest.json, and .env.localrI   )r   r   r   rf   )r   r   s     r    3test_config_surgeon_ignores_generic_config_mentionszJAchievementEngineTests.test_config_surgeon_ignores_generic_config_mentions   su    ++D-9NzB{A|}/3++D-9  OB  CC  BD  Eo 6:r"   c                 6   t        t              j                         j                  d   dz  dz  dz  j	                  d      }t        d |j                         D              }| j                  d|       | j                  d	|       | j                  d
|       y )Nr   r   distz	style.csszutf-8)encodingc              3   D   K   | ]  }|j                  d       s|  yw)z.ha-card:hoverN)
startswith)rv   lines     r    rx   z^AchievementEngineTests.test_dashboard_card_hover_does_not_move_click_target.<locals>.<genexpr>   s!      
tGW7XD
s     z
transform:zborder-color: var(--ha-tier)zbox-shadow:)	r   __file__resolveparents	read_textr|   
splitlinesrS   assertIn)r   	style_css
hover_rules      r    4test_dashboard_card_hover_does_not_move_click_targetzKAchievementEngineTests.test_dashboard_card_hover_does_not_move_click_target   s    N""$,,Q/  )W)
% 	  
&113
 

 	z24jAmZ0r"   N)__name__
__module____qualname__r!   r=   rE   rU   rb   rl   r~   r   r   r   r   rt   r"   r    r   r      s:    46&7 ? 262
3$3p;1r"   r   __main__)importlib.util	importlibunittestpathlibr   r   r   r   MODULE_PATHutilspec_from_file_locationspecmodule_from_specr   loaderexec_moduleTestCaser   r   mainrt   r"   r    <module>r      s      8n$$&..q1K?/Q~~--lKH^^,,T2
   
 #\1X.. \1~ zHMMO r"   