1import pytest
2
3from tests.support.asserts import assert_error, assert_success
4from tests.support.helpers import center_point
5
6
7def element_click(session, element):
8    return session.transport.send(
9        "POST", "session/{session_id}/element/{element_id}/click".format(
10            session_id=session.session_id,
11            element_id=element.id))
12
13
14def square(inline, size):
15    return inline("""
16        <style>
17        body {{ margin: 0 }}
18
19        div {{
20          background: blue;
21          width: {size}px;
22          height: {size}px;
23        }}
24        </style>
25
26        <div id=target></div>
27
28        <script>
29        window.clicks = [];
30        let div = document.querySelector("div");
31        div.addEventListener("click", function(e) {{ window.clicks.push([e.clientX, e.clientY]) }});
32        </script>
33        """.format(size=size))
34
35
36def assert_one_click(session):
37    """Asserts there has only been one click, and returns that."""
38    clicks = session.execute_script("return window.clicks")
39    assert len(clicks) == 1
40    return tuple(clicks[0])
41
42
43def test_entirely_in_view(session, inline):
44    session.url = square(inline, 444)
45    element = session.find.css("#target", all=False)
46
47    response = element_click(session, element)
48    assert_success(response)
49
50    click_point = assert_one_click(session)
51    assert click_point == (222, 222)
52
53
54@pytest.mark.parametrize("size", range(1, 11))
55def test_css_pixel_rounding(session, inline, size):
56    session.url = square(inline, size)
57    element = session.find.css("#target", all=False)
58    expected_click_point = center_point(element)
59
60    response = element_click(session, element)
61    assert_success(response)
62
63    actual_click_point = assert_one_click(session)
64    assert actual_click_point == expected_click_point
65