1# This Source Code Form is subject to the terms of the Mozilla Public
2# License, v. 2.0. If a copy of the MPL was not distributed with this
3# file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5from __future__ import absolute_import
6
7from six.moves.urllib.parse import quote
8
9from marionette_driver.by import By
10from marionette_driver.keys import Keys
11from marionette_harness import MarionetteTestCase, WindowManagerMixin
12
13
14def inline(doc):
15    return "data:text/html;charset=utf-8,{}".format(quote(doc))
16
17
18class TestKeyActions(WindowManagerMixin, MarionetteTestCase):
19    def setUp(self):
20        super(TestKeyActions, self).setUp()
21        self.key_chain = self.marionette.actions.sequence("key", "keyboard_id")
22
23        if self.marionette.session_capabilities["platformName"] == "mac":
24            self.mod_key = Keys.META
25        else:
26            self.mod_key = Keys.CONTROL
27
28        test_html = self.marionette.absolute_url("keyboard.html")
29        self.marionette.navigate(test_html)
30        self.reporter_element = self.marionette.find_element(By.ID, "keyReporter")
31        self.reporter_element.click()
32
33    def tearDown(self):
34        self.marionette.actions.release()
35
36        super(TestKeyActions, self).tearDown()
37
38    @property
39    def key_reporter_value(self):
40        return self.reporter_element.get_property("value")
41
42    def test_basic_input(self):
43        self.key_chain.key_down("a").key_down("b").key_down("c").perform()
44        self.assertEqual(self.key_reporter_value, "abc")
45
46    def test_upcase_input(self):
47        self.key_chain.key_down(Keys.SHIFT).key_down("a").key_up(Keys.SHIFT).key_down(
48            "b"
49        ).key_down("c").perform()
50        self.assertEqual(self.key_reporter_value, "Abc")
51
52    def test_replace_input(self):
53        self.key_chain.key_down("a").key_down("b").key_down("c").perform()
54        self.assertEqual(self.key_reporter_value, "abc")
55
56        self.key_chain.key_down(self.mod_key).key_down("a").key_up(
57            self.mod_key
58        ).key_down("x").perform()
59        self.assertEqual(self.key_reporter_value, "x")
60
61    def test_clear_input(self):
62        self.key_chain.key_down("a").key_down("b").key_down("c").perform()
63        self.assertEqual(self.key_reporter_value, "abc")
64
65        self.key_chain.key_down(self.mod_key).key_down("a").key_down("x").perform()
66        self.assertEqual(self.key_reporter_value, "")
67
68    def test_input_with_wait(self):
69        self.key_chain.key_down("a").key_down("b").key_down("c").perform()
70        self.key_chain.key_down(self.mod_key).key_down("a").pause(250).key_down(
71            "x"
72        ).perform()
73        self.assertEqual(self.key_reporter_value, "")
74