import pytest
import math
from src.browser.ghost_cursor import GhostCursorEngine

def test_bezier_curve_generation():
    engine = GhostCursorEngine()
    start = (0, 0)
    end = (100, 100)
    
    # Test control point generation
    c1, c2 = engine._generate_bezier_controls(start, end)
    
    # Basic bounds check: Control points should be somewhat between start and end 
    # but can overshoot. 
    # Just ensure they are tuples of floats
    assert isinstance(c1, tuple)
    assert len(c1) == 2
    assert isinstance(c2, tuple)
    assert len(c2) == 2

def test_bezier_point_calculation():
    engine = GhostCursorEngine()
    p0 = (0,0)
    p1 = (10, 20)
    p2 = (80, 90)
    p3 = (100, 100)
    
    # t=0 should be start
    res_0 = engine._bezier_point(0, p0, p1, p2, p3)
    assert math.isclose(res_0[0], 0)
    assert math.isclose(res_0[1], 0)
    
    # t=1 should be end
    res_1 = engine._bezier_point(1, p0, p1, p2, p3)
    assert math.isclose(res_1[0], 100)
    assert math.isclose(res_1[1], 100)
    
    # t=0.5 should be somewhere in between
    res_mid = engine._bezier_point(0.5, p0, p1, p2, p3)
    assert 0 < res_mid[0] < 100
    assert 0 < res_mid[1] < 100

def test_waypoints_generation():
    engine = GhostCursorEngine()
    start = (0, 0)
    end = (300, 300)
    count = 3
    
    waypoints = engine._generate_waypoints(start, end, count)
    
    assert len(waypoints) == count + 1 # +1 for the end point
    assert waypoints[0] == start
    assert waypoints[-1] == end
    
    # Check intermediate points exist
    for i in range(1, count):
        assert waypoints[i] != start
        assert waypoints[i] != end

