1010from avrae_ls .gvar_utils import sanitize_gvar_binding
1111from avrae_ls .runtime .context import ContextBuilder , ContextData
1212from avrae_ls .runtime .runtime import MockExecutor , ModuleExecutionError
13- from avrae_ls .testing ._common import deep_merge_dicts , parse_expected_value , parse_metadata_mapping , value_matches
13+ from avrae_ls .testing ._common import (
14+ deep_merge_dicts ,
15+ merge_new_gvars_into_suite_cache ,
16+ parse_expected_value ,
17+ parse_metadata_mapping ,
18+ value_matches ,
19+ )
1420
1521log = logging .getLogger (__name__ )
1622
@@ -124,7 +130,11 @@ def parse_gvar_tests(path: Path) -> list[GVarTestCase]:
124130
125131
126132async def run_gvar_tests (
127- cases : Iterable [GVarTestCase ], builder : ContextBuilder , executor : MockExecutor
133+ cases : Iterable [GVarTestCase ],
134+ builder : ContextBuilder ,
135+ executor : MockExecutor ,
136+ * ,
137+ suite_gvar_cache : dict [str , Any ] | None = None ,
128138) -> list [GVarTestResult ]:
129139 case_list = list (cases )
130140 gvar_sources : dict [Path , str ] = {}
@@ -141,6 +151,7 @@ async def run_gvar_tests(
141151 log .debug ("Loaded %d gvar source file(s) for tests in %.2fms" , len (gvar_sources ), log_elapsed )
142152
143153 baseline = builder .build_baseline ()
154+ shared_gvar_cache = suite_gvar_cache if suite_gvar_cache is not None else dict (baseline .vars .gvars )
144155 results : list [GVarTestResult ] = []
145156 for case in case_list :
146157 error = gvar_errors .get (case .gvar_path )
@@ -154,6 +165,7 @@ async def run_gvar_tests(
154165 executor ,
155166 gvar_source = gvar_sources .get (case .gvar_path ),
156167 base_context = baseline ,
168+ suite_gvar_cache = shared_gvar_cache ,
157169 )
158170 )
159171 return results
@@ -166,6 +178,7 @@ async def run_gvar_test(
166178 * ,
167179 gvar_source : str | None = None ,
168180 base_context : ContextData | None = None ,
181+ suite_gvar_cache : dict [str , Any ] | None = None ,
169182) -> GVarTestResult :
170183 if gvar_source is None :
171184 source_started = time .perf_counter ()
@@ -186,15 +199,24 @@ async def run_gvar_test(
186199 ctx_data .vars = ctx_data .vars .merge (VarSources .from_data (case .var_overrides ))
187200 if case .character_overrides :
188201 ctx_data .character = deep_merge_dicts (ctx_data .character , case .character_overrides )
189- builder .gvar_resolver .reset (ctx_data .vars .gvars )
202+ shared_gvar_cache = suite_gvar_cache if suite_gvar_cache is not None else dict (ctx_data .vars .gvars )
203+ builder .gvar_resolver .load_snapshot (shared_gvar_cache )
204+ builder .gvar_resolver .seed (ctx_data .vars .gvars )
205+ local_only_gvars = set (ctx_data .vars .gvars .keys ())
190206
191207 collision = _reserved_name_collision (case .binding_name , executor , ctx_data )
192208 if collision is not None :
193209 return GVarTestResult (case = case , passed = False , actual = None , stdout = "" , error = collision )
194210
195211 builder .gvar_resolver .seed ({case .gvar_name : gvar_source })
212+ local_only_gvars .add (case .gvar_name )
196213 wrapped_code = _wrap_test_body (case .binding_name , case .gvar_name , case .body )
197214 result = await executor .run (wrapped_code , ctx_data , builder .gvar_resolver )
215+ merge_new_gvars_into_suite_cache (
216+ shared_gvar_cache ,
217+ builder .gvar_resolver .snapshot (),
218+ exclude_keys = local_only_gvars ,
219+ )
198220 if result .error :
199221 error_line , error_col = _map_error_position (result .error , wrapper_lines = 1 )
200222 return GVarTestResult (
0 commit comments