def test_run_output(self):
     base_ctx = self.cmd.success.context
     base_ctx.prompt = 'device#'
     self.context_manager.add(base_ctx)
     cmd = DeviceCommand(self.configuration.get('commands')[1])
     cmd.run(self.terminal, self.context_manager, 'empty')
     assert_equals([cmd.output, base_ctx.prompt], self.terminal.output)
 def setup(self):
     self.configuration = DeviceConfiguration.get(sample_configuration, is_file_path=False)
     self.terminal = MockTerminal()
     self.context_manager = ContextManager()
     self.cmd = DeviceCommand(self.configuration.get('commands')[3])
class TestDeviceCommand(object):
    def setup(self):
        self.configuration = DeviceConfiguration.get(sample_configuration, is_file_path=False)
        self.terminal = MockTerminal()
        self.context_manager = ContextManager()
        self.cmd = DeviceCommand(self.configuration.get('commands')[3])

    def test_default_initialization(self):
        cmd = DeviceCommand(self.configuration.get('commands')[2])
        assert_equals(cmd.name, 'empty')
        assert_equals(cmd.contexts, list())
        assert_equals(cmd.type, 'cmd')
        assert_equals(cmd.output, None)
        assert_equals(cmd._time_delay, 0)
        assert_equals(cmd._required_input, None)
        for result_type in ('success', 'fail'):
            for result_action in ('output', 'context', 'context_method'):
                assert_equals(getattr(getattr(cmd, result_type), result_action), None)
        assert_equals(self.cmd.callback, False)

    def test_full_initialization(self):
        assert_equals(self.cmd.name, 'full')
        assert_is_instance(self.cmd.contexts[0], DeviceContext)
        assert_equals(self.cmd.contexts[0].name, 'fullctx')
        assert_equals(self.cmd.type, 'prompt')
        assert_equals(self.cmd.output, "type ok: ")
        assert_equals(self.cmd._time_delay, 0.5)
        assert_equals(self.cmd._required_input, 'ok')
        assert_equals(self.cmd.success.output, 'success')
        assert_is_instance(self.cmd.success.context, DeviceContext)
        assert_equals(self.cmd.success.context.name, 'success_ctx')
        assert_equals(self.cmd.success.context.prompt, 'success_prompt')
        assert_equals(self.cmd.success.context_method, 'reduce')
        assert_equals(self.cmd.fail.output, 'fail')
        assert_is_instance(self.cmd.fail.context, DeviceContext)
        assert_equals(self.cmd.fail.context.name, 'fail_ctx')
        assert_equals(self.cmd.fail.context.prompt, 'fail_prompt')
        assert_equals(self.cmd.fail.context_method, 'add')
        assert_equals(self.cmd.callback, False)

    def test_invalid_initialization(self):
        command = self.configuration.get('commands')[3]
        command['on_success']['context_method'] = 'invalid'
        assert_raises(ValueError, DeviceCommand, command)
        command['on_success']['context'] = None
        command['on_success']['context_method'] = 'add'
        assert_raises(ValueError, DeviceCommand, command)
        command['on_success']['context_method'] = 'reduce'
        assert_raises(ValueError, DeviceCommand, command)
        command['on_success']['context'] = 'success_ctx'

    def test_delay_simulation(self):
        @timed(.5)
        def simulated_delay():
            self.cmd._delay()

    def test_output(self):
        expected_output = 'type ok: '
        self.cmd._output(self.terminal)
        assert_equals(self.terminal.output[-1], expected_output)
        # self.cmd._output(self.terminal, new_line=True)
        # assert_equals(self.terminal.output[-2], expected_output)
        # assert_equals(self.terminal.output[-1], '')

    def test_run_full(self):
        base_ctx = self.cmd.success.context
        self.context_manager.add(base_ctx)
        self.cmd._time_delay = 0
        pass_test = True
        for action in (self.cmd.success, self.cmd.fail):
            self.cmd.run(self.terminal, self.context_manager, self.cmd.name)
            assert_equals(self.terminal.output[-1], self.cmd.output)
            assert_true(self.cmd.callback)
            self.context_manager.add(action.context)
            self.context_manager.add('ctx01')
            if pass_test:
                self.cmd.run(self.terminal, self.context_manager, self.cmd._required_input)
                assert_equals(self.context_manager.current.name, action.context.name)
                pass_test = not pass_test
            else:
                self.cmd.run(self.terminal, self.context_manager, 'no')
                assert_equals(self.context_manager.current.name, action.context.name)
                assert_equals(self.context_manager.prompt, action.context.prompt)
            assert_equals(self.terminal.output[-2], action.output)
            assert_equals(self.terminal.output[-1], action.context.prompt)

    def test_run_empty(self):
        base_ctx = self.cmd.success.context
        base_ctx.prompt = 'device#'
        self.context_manager.add(base_ctx)
        cmd = DeviceCommand(self.configuration.get('commands')[2])
        cmd.run(self.terminal, self.context_manager, 'empty')
        assert_equals([base_ctx.prompt], self.terminal.output)
        assert_false(cmd.callback)
        cmd.run(self.terminal, self.context_manager, 'empty')
        assert_equals([base_ctx.prompt, base_ctx.prompt], self.terminal.output)

    def test_run_output(self):
        base_ctx = self.cmd.success.context
        base_ctx.prompt = 'device#'
        self.context_manager.add(base_ctx)
        cmd = DeviceCommand(self.configuration.get('commands')[1])
        cmd.run(self.terminal, self.context_manager, 'empty')
        assert_equals([cmd.output, base_ctx.prompt], self.terminal.output)