import sys from pathlib import Path _EXAMPLES = Path(__file__).resolve().parents[1] / "examples" if str(_EXAMPLES) not in sys.path: sys.path.insert(0, str(_EXAMPLES)) from viz.contact_arrow import ( ContactArrowStyle, DEFAULT_CONTACT_ARROW_STYLE, force_visual_strength, length_from_force, thickness_scale_from_force, ) REFERENCE_NORMAL_FORCE = DEFAULT_CONTACT_ARROW_STYLE.reference_normal_force def test_force_visual_strength_monotonic(): forces = [0.0, 50.0, 175.0, 1000.0, 5000.0, REFERENCE_NORMAL_FORCE, 20000.0] strengths = [force_visual_strength(f) for f in forces] assert strengths[0] == 0.0 assert all(strengths[i] <= strengths[i + 1] for i in range(len(strengths) - 1)) assert strengths[-1] == 1.0 def test_log_mode_more_sensitive_than_linear_at_low_force(): low = 175.0 log_style = ContactArrowStyle(force_strength_mode="log") lin_style = ContactArrowStyle(force_strength_mode="linear") assert force_visual_strength(low, style=log_style) > force_visual_strength(low, style=lin_style) def test_length_and_thickness_track_same_strength(): force = 2500.0 mesh_span = 10.0 strength = force_visual_strength(force) length = length_from_force(force, mesh_span) thick = thickness_scale_from_force(force) assert length > mesh_span * 0.02 assert thick > 0.20 assert strength == force_visual_strength(force)