Home | History | Annotate | Download | only in system
      1 # Copyright (C) 2010 Research in Motion Ltd. All rights reserved.
      2 #
      3 # Redistribution and use in source and binary forms, with or without
      4 # modification, are permitted provided that the following conditions are
      5 # met:
      6 #
      7 #    * Redistributions of source code must retain the above copyright
      8 # notice, this list of conditions and the following disclaimer.
      9 #    * Redistributions in binary form must reproduce the above
     10 # copyright notice, this list of conditions and the following disclaimer
     11 # in the documentation and/or other materials provided with the
     12 # distribution.
     13 #    * Neither the name of Research in Motion Ltd. nor the names of its
     14 # contributors may be used to endorse or promote products derived from
     15 # this software without specific prior written permission.
     16 #
     17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 import unittest
     30 
     31 from webkitpy.common.system.outputcapture import OutputCapture
     32 from webkitpy.common.system.user import User
     33 
     34 class UserTest(unittest.TestCase):
     35 
     36     example_user_response = "example user response"
     37 
     38     def test_prompt_repeat(self):
     39         self.repeatsRemaining = 2
     40         def mock_raw_input(message):
     41             self.repeatsRemaining -= 1
     42             if not self.repeatsRemaining:
     43                 return UserTest.example_user_response
     44             return None
     45         self.assertEqual(User.prompt("input", repeat=self.repeatsRemaining, raw_input=mock_raw_input), UserTest.example_user_response)
     46 
     47     def test_prompt_when_exceeded_repeats(self):
     48         self.repeatsRemaining = 2
     49         def mock_raw_input(message):
     50             self.repeatsRemaining -= 1
     51             return None
     52         self.assertEqual(User.prompt("input", repeat=self.repeatsRemaining, raw_input=mock_raw_input), None)
     53 
     54     def test_prompt_with_multiple_lists(self):
     55         def run_prompt_test(inputs, expected_result, can_choose_multiple=False):
     56             def mock_raw_input(message):
     57                 return inputs.pop(0)
     58             output_capture = OutputCapture()
     59             actual_result = output_capture.assert_outputs(
     60                 self,
     61                 User.prompt_with_multiple_lists,
     62                 args=["title", ["subtitle1", "subtitle2"], [["foo", "bar"], ["foobar", "barbaz", "foobaz"]]],
     63                 kwargs={"can_choose_multiple": can_choose_multiple, "raw_input": mock_raw_input},
     64                 expected_stdout="title\n\nsubtitle1\n 1. foo\n 2. bar\n\nsubtitle2\n 3. foobar\n 4. barbaz\n 5. foobaz\n")
     65             self.assertEqual(actual_result, expected_result)
     66             self.assertEqual(len(inputs), 0)
     67 
     68         run_prompt_test(["1"], "foo")
     69         run_prompt_test(["badinput", "2"], "bar")
     70         run_prompt_test(["3"], "foobar")
     71         run_prompt_test(["4"], "barbaz")
     72         run_prompt_test(["5"], "foobaz")
     73 
     74         run_prompt_test(["1,2"], ["foo", "bar"], can_choose_multiple=True)
     75         run_prompt_test(["1-3"], ["foo", "bar", "foobar"], can_choose_multiple=True)
     76         run_prompt_test(["1-2,3"], ["foo", "bar", "foobar"], can_choose_multiple=True)
     77         run_prompt_test(["2-1,3"], ["foobar"], can_choose_multiple=True)
     78         run_prompt_test(["  1,  2   "], ["foo", "bar"], can_choose_multiple=True)
     79         run_prompt_test(["all"], ["foo", "bar", 'foobar', 'barbaz', 'foobaz'], can_choose_multiple=True)
     80         run_prompt_test([""], ["foo", "bar", 'foobar', 'barbaz', 'foobaz'], can_choose_multiple=True)
     81         run_prompt_test(["  "], ["foo", "bar", 'foobar', 'barbaz', 'foobaz'], can_choose_multiple=True)
     82         run_prompt_test(["badinput", "all"], ["foo", "bar", 'foobar', 'barbaz', 'foobaz'], can_choose_multiple=True)
     83 
     84     def test_prompt_with_list(self):
     85         def run_prompt_test(inputs, expected_result, can_choose_multiple=False):
     86             def mock_raw_input(message):
     87                 return inputs.pop(0)
     88             output_capture = OutputCapture()
     89             actual_result = output_capture.assert_outputs(
     90                 self,
     91                 User.prompt_with_list,
     92                 args=["title", ["foo", "bar"]],
     93                 kwargs={"can_choose_multiple": can_choose_multiple, "raw_input": mock_raw_input},
     94                 expected_stdout="title\n 1. foo\n 2. bar\n")
     95             self.assertEqual(actual_result, expected_result)
     96             self.assertEqual(len(inputs), 0)
     97 
     98         run_prompt_test(["1"], "foo")
     99         run_prompt_test(["badinput", "2"], "bar")
    100 
    101         run_prompt_test(["1,2"], ["foo", "bar"], can_choose_multiple=True)
    102         run_prompt_test(["  1,  2   "], ["foo", "bar"], can_choose_multiple=True)
    103         run_prompt_test(["all"], ["foo", "bar"], can_choose_multiple=True)
    104         run_prompt_test([""], ["foo", "bar"], can_choose_multiple=True)
    105         run_prompt_test(["  "], ["foo", "bar"], can_choose_multiple=True)
    106         run_prompt_test(["badinput", "all"], ["foo", "bar"], can_choose_multiple=True)
    107 
    108     def test_confirm(self):
    109         test_cases = (
    110             (("Continue? [Y/n]: ", True), (User.DEFAULT_YES, 'y')),
    111             (("Continue? [Y/n]: ", False), (User.DEFAULT_YES, 'n')),
    112             (("Continue? [Y/n]: ", True), (User.DEFAULT_YES, '')),
    113             (("Continue? [Y/n]: ", False), (User.DEFAULT_YES, 'q')),
    114             (("Continue? [y/N]: ", True), (User.DEFAULT_NO, 'y')),
    115             (("Continue? [y/N]: ", False), (User.DEFAULT_NO, 'n')),
    116             (("Continue? [y/N]: ", False), (User.DEFAULT_NO, '')),
    117             (("Continue? [y/N]: ", False), (User.DEFAULT_NO, 'q')),
    118         )
    119         for test_case in test_cases:
    120             expected, inputs = test_case
    121 
    122             def mock_raw_input(message):
    123                 self.assertEqual(expected[0], message)
    124                 return inputs[1]
    125 
    126             result = User().confirm(default=inputs[0],
    127                                     raw_input=mock_raw_input)
    128             self.assertEqual(expected[1], result)
    129 
    130     def test_warn_if_application_is_xcode(self):
    131         output = OutputCapture()
    132         user = User()
    133         output.assert_outputs(self, user._warn_if_application_is_xcode, ["TextMate"])
    134         output.assert_outputs(self, user._warn_if_application_is_xcode, ["/Applications/TextMate.app"])
    135         output.assert_outputs(self, user._warn_if_application_is_xcode, ["XCode"])  # case sensitive matching
    136 
    137         xcode_warning = "Instead of using Xcode.app, consider using EDITOR=\"xed --wait\".\n"
    138         output.assert_outputs(self, user._warn_if_application_is_xcode, ["Xcode"], expected_stdout=xcode_warning)
    139         output.assert_outputs(self, user._warn_if_application_is_xcode, ["/Developer/Applications/Xcode.app"], expected_stdout=xcode_warning)
    140