Skip to content

Commit 28614f6

Browse files
author
DrGeoff
committed
test: refactor header deps tests & cleanup reload boilerplate
Replace try/except reload(unittest) blocks with direct from importlib import reload Refactor test_headerdeps: extract reusable helper funcs, remove duplicated setup, consolidate scenario loops Add unittesthelper utilities: headerdeps_result(), compare_headerdeps_kinds() for isolated, DRY headerdeps testing Keep all original assertions/semantics (direct vs cpp parity, expected/forbidden headers, macro scenarios) Pure maintainability/clarity; no intentional behavior change
1 parent 8e631a6 commit 28614f6

File tree

7 files changed

+225
-489
lines changed

7 files changed

+225
-489
lines changed

src/compiletools/test_apptools.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import argparse # Used for the parse_args test
66
import configargparse
77

8-
try:
9-
reload(unittest)
10-
except NameError:
11-
from importlib import reload
8+
from importlib import reload
129

1310

1411
class FakeNamespace(object):

src/compiletools/test_base.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@
1010
import compiletools.configutils
1111
import compiletools.wrappedos
1212

13-
try:
14-
reload(unittest)
15-
except NameError:
16-
from importlib import reload
13+
from importlib import reload
1714

1815

1916
class BaseCompileToolsTestCase:

src/compiletools/test_cppdeps.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
import io
66
from contextlib import redirect_stdout
77

8-
try:
9-
# This call to reload is simply to test
10-
# that reload is in the current namespace
11-
reload(unittest)
12-
except NameError:
13-
from importlib import reload
8+
from importlib import reload
149

1510
import compiletools.cppdeps
1611
import compiletools.unittesthelper as uth

src/compiletools/test_headerdeps.py

Lines changed: 147 additions & 463 deletions
Large diffs are not rendered by default.

src/compiletools/test_hunter.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,7 @@
66
import configargparse
77
import compiletools.unittesthelper
88

9-
try:
10-
# This call to reload is simply to test
11-
# that reload is in the current namespace
12-
reload(unittest)
13-
except NameError:
14-
from importlib import reload
9+
from importlib import reload
1510

1611
import compiletools.unittesthelper as uth
1712
import compiletools.wrappedos

src/compiletools/unittesthelper.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,3 +388,76 @@ def CPPDepsTestContext(variant_configs=None, reload_modules=None, ctcache=None):
388388
yield temp_context
389389
finally:
390390
reset()
391+
392+
393+
def headerdeps_result(filename, kind="direct", cppflags=None, include=None, extra_args=None, cache="None"):
394+
"""Return set of headers for given filename using specified headerdeps kind.
395+
Provides full isolation (TempConfig, Environment, Parser).
396+
Args:
397+
filename: Path to file to analyse (can be relative; will be realpathed by headerdeps)
398+
kind: 'direct' or 'cpp'
399+
cppflags: Raw CPPFLAGS string (pass full string, do NOT auto-prepend -I)
400+
include: Directory to use with --include (defaults to samplesdir())
401+
extra_args: List of extra CLI args (e.g., ["--something", "value"])
402+
cache: CTCACHE value (default 'None' for disabling disk cache)
403+
Returns: set of header paths
404+
"""
405+
include = include or samplesdir()
406+
if extra_args is None:
407+
extra_args = []
408+
from importlib import reload
409+
import compiletools.headerdeps
410+
import compiletools.dirnamer
411+
412+
# Save original cache setting
413+
origcache = compiletools.dirnamer.user_cache_dir()
414+
415+
try:
416+
# Create config with custom CPPFLAGS if needed
417+
config_extralines = []
418+
if cppflags:
419+
config_extralines.append(f'CPPFLAGS="-std=c++20 {cppflags}"')
420+
421+
with TempConfigContext(extralines=config_extralines) as temp_config_name:
422+
with EnvironmentContext({"CTCACHE": cache}):
423+
reload(compiletools.dirnamer)
424+
reload(compiletools.headerdeps)
425+
426+
# Create fresh parser with complete isolation
427+
with ParserContext():
428+
cap = configargparse.ArgumentParser(
429+
description="HeaderDeps test parser",
430+
formatter_class=configargparse.ArgumentDefaultsHelpFormatter,
431+
args_for_setting_config_path=["-c", "--config"],
432+
ignore_unknown_config_file_keys=False,
433+
)
434+
compiletools.headerdeps.add_arguments(cap)
435+
argv = ["--config=" + temp_config_name, f"--headerdeps={kind}", "--include", include] + extra_args
436+
args = compiletools.apptools.parseargs(cap, argv)
437+
h = compiletools.headerdeps.create(args)
438+
return set(h.process(filename))
439+
finally:
440+
# Restore original cache
441+
with EnvironmentContext({"CTCACHE": origcache}):
442+
reload(compiletools.dirnamer)
443+
reload(compiletools.headerdeps)
444+
445+
446+
def compare_headerdeps_kinds(filename, cppflags=None, kinds=("direct", "cpp"), include=None, extra_args=None, cache="None", scenario_name=None):
447+
"""Run multiple headerdeps kinds and assert their results match (if >1 kinds).
448+
Returns dict kind->set.
449+
scenario_name included in assertion message if provided.
450+
"""
451+
results = {}
452+
for kind in kinds:
453+
results[kind] = headerdeps_result(filename, kind=kind, cppflags=cppflags, include=include, extra_args=extra_args, cache=cache)
454+
if len(kinds) > 1:
455+
baseline = results[kinds[0]]
456+
for kind in kinds[1:]:
457+
if results[kind] != baseline:
458+
raise AssertionError(
459+
f"HeaderDeps results differ{(' for ' + scenario_name) if scenario_name else ''}: "
460+
f"{kinds[0]}={sorted(os.path.basename(f) for f in baseline)} vs "
461+
f"{kind}={sorted(os.path.basename(f) for f in results[kind])}"
462+
)
463+
return results

src/compiletools/uth_reload.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@
44
import compiletools.magicflags
55
import os
66

7-
try:
8-
# This call to reload is simply to test
9-
# that reload is in the current namespace
10-
reload(unittest)
11-
except NameError:
12-
from importlib import reload
7+
from importlib import reload
138

149

1510
def reload_ct(cache_home):

0 commit comments

Comments
 (0)