From 4f38b2ec29bc9e103083530e21ca3aafdacba627 Mon Sep 17 00:00:00 2001 From: feder-cr <85809106+feder-cr@users.noreply.github.com> Date: Fri, 15 May 2026 20:01:55 -0700 Subject: [PATCH] tests: add/update tests/test_fpforge.py --- tests/test_fpforge.py | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tests/test_fpforge.py diff --git a/tests/test_fpforge.py b/tests/test_fpforge.py new file mode 100644 index 0000000..72fd052 --- /dev/null +++ b/tests/test_fpforge.py @@ -0,0 +1,77 @@ +"""Profile generator — seed reproducibility and basic shape.""" +import pytest + +from invisible_playwright._fpforge import ( + Profile, + GPUProfile, + ScreenProfile, + HardwareProfile, + AudioProfile, + generate_profile, +) + + +def test_profile_has_expected_fields(): + p = generate_profile(seed=42) + assert isinstance(p.gpu, GPUProfile) + assert isinstance(p.screen, ScreenProfile) + assert isinstance(p.hardware, HardwareProfile) + assert isinstance(p.audio, AudioProfile) + + +def test_same_seed_reproduces_profile(): + a = generate_profile(seed=1234) + b = generate_profile(seed=1234) + assert a.gpu.renderer == b.gpu.renderer + assert a.gpu.vendor == b.gpu.vendor + assert a.screen.width == b.screen.width + assert a.screen.height == b.screen.height + assert a.hardware.concurrency == b.hardware.concurrency + + +def test_different_seeds_produce_different_profiles(): + a = generate_profile(seed=1) + b = generate_profile(seed=999) + # Not every field needs to differ, but at least one should + diffs = [ + a.gpu.renderer != b.gpu.renderer, + a.screen.width != b.screen.width, + a.hardware.concurrency != b.hardware.concurrency, + a.audio.sample_rate != b.audio.sample_rate, + ] + assert any(diffs), "seeds 1 and 999 produced identical profiles across all sampled fields" + + +def test_screen_dimensions_are_positive_integers(): + p = generate_profile(seed=42) + assert isinstance(p.screen.width, int) and p.screen.width > 0 + assert isinstance(p.screen.height, int) and p.screen.height > 0 + # Sanity: not larger than 8K, not smaller than 1024 + assert 1024 <= p.screen.width <= 7680 + assert 600 <= p.screen.height <= 4320 + + +def test_hardware_concurrency_in_realistic_range(): + p = generate_profile(seed=42) + # Real consumer hardware: 2-32 logical CPUs. Anything outside is a sampler bug. + assert 2 <= p.hardware.concurrency <= 32 + + +def test_audio_sample_rate_is_standard(): + p = generate_profile(seed=42) + # Real audio devices report one of these standard rates + assert p.audio.sample_rate in (44100, 48000, 96000) + + +def test_gpu_renderer_is_non_empty_string(): + p = generate_profile(seed=42) + assert isinstance(p.gpu.renderer, str) and p.gpu.renderer.strip() + assert isinstance(p.gpu.vendor, str) and p.gpu.vendor.strip() + + +@pytest.mark.parametrize("seed", [1, 42, 100, 9999, 2**31 - 1]) +def test_generation_is_stable_across_seed_range(seed): + """No exceptions on a representative seed range.""" + p = generate_profile(seed=seed) + assert p.gpu.renderer + assert p.screen.width > 0