From abff0fb62b819e2cc54033ca52717877ecadfa85 Mon Sep 17 00:00:00 2001 From: gryf Date: Tue, 20 Dec 2016 20:05:20 +0100 Subject: [PATCH] Added tests for wrapper module finctions --- fs_uae_wrapper/wrapper.py | 21 ++++++---- tests/test_wrapper.py | 87 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 8 deletions(-) diff --git a/fs_uae_wrapper/wrapper.py b/fs_uae_wrapper/wrapper.py index 5a09a48..82d4fa5 100644 --- a/fs_uae_wrapper/wrapper.py +++ b/fs_uae_wrapper/wrapper.py @@ -19,7 +19,7 @@ def get_wrapper_from_conf(conf): with open(conf) as fobj: for line in fobj.readlines(): if WRAPPER_KEY in line and '=' in line: - key, val = parse_options(line) + key, val = parse_option(line) if key == WRAPPER_KEY: break else: @@ -28,7 +28,7 @@ def get_wrapper_from_conf(conf): return val -def parse_options(string): +def parse_option(string): """ Return parsed option as an key/value tuple, where key is an stripped from dash option name and the value is an value stripped of whitespace. @@ -44,7 +44,8 @@ def parse_options(string): val = val.strip() elif string.startswith('--'): key = string[2:].strip() - val = 1 + # parameters are always as strings - parse them when need it later + val = '1' return key, val @@ -58,7 +59,7 @@ def parse_args(): fs_uae_options = [] wrapper_options = {} for parameter in sys.argv[1:]: - key, val = parse_options(parameter) + key, val = parse_option(parameter) if key is not None and val is not None: if key == WRAPPER_KEY: wrapper_options[key] = val @@ -98,16 +99,22 @@ def run(): if not config_file: sys.stderr.write('Error: Configuration file not found\nSee --help' ' for usage\n') - sys.exit(10) + sys.exit(1) wrapper_module = wrapper_options.get(WRAPPER_KEY) if not wrapper_module: - wrapper_module = get_wrapper_from_conf(wrapper_options) + wrapper_module = get_wrapper_from_conf(config_file) if not wrapper_module: wrapper = importlib.import_module('fs_uae_wrapper.plain') else: - wrapper = importlib.import_module('fs_uae_wrapper.' + wrapper_module) + try: + wrapper = importlib.import_module('fs_uae_wrapper.' + + wrapper_module) + except ImportError: + sys.stderr.write("Error: provided wrapper module: `%s' doesn't" + "exists.\n" % wrapper_module) + sys.exit(2) wrapper.run(config_file, fs_uae_options, wrapper_options) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 0276cc5..bba9a9d 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -1,7 +1,13 @@ import os -from tempfile import mkstemp +import sys +from tempfile import mkstemp, mkdtemp from unittest import TestCase +import shutil +try: + from unittest import mock +except ImportError: + import mock from fs_uae_wrapper import wrapper @@ -10,10 +16,17 @@ class TestWrapper(TestCase): def setUp(self): fd, self.fname = mkstemp() + self.dirname = mkdtemp() os.close(fd) + self._argv = sys.argv[:] + sys.argv = ['fs-uae-wrapper'] + self.curdir = os.path.abspath(os.curdir) def tearDown(self): + os.chdir(self.curdir) + shutil.rmtree(self.dirname) os.unlink(self.fname) + sys.argv = self._argv[:] def test_get_wrapper_from_conf_positive(self): @@ -52,3 +65,75 @@ class TestWrapper(TestCase): val = wrapper.get_wrapper_from_conf(self.fname) self.assertEqual(val, result) + + @mock.patch('fs_uae_wrapper.plain.run') + def test_run(self, mock_plain_run): + + sys.argv.append('--help') + self.assertRaises(SystemExit, wrapper.run) + + sys.argv.pop() + self.assertRaises(SystemExit, wrapper.run) + + sys.argv.append('--fullscreen') + sys.argv.append('--fade_out_duration=0') + # will exit due to not found configuration + self.assertRaises(SystemExit, wrapper.run) + + os.chdir(self.dirname) + with open('Config.fs-uae', 'w') as fobj: + fobj.write('\n') + + wrapper.run() + mock_plain_run.called_once_with('Config.fs-uae', + ['--fullscreen', + '--fade_out_duration=0'], + []) + + # This will obviously fail for nonexistent module + sys.argv.append('--wrapper=dummy_wrapper') + self.assertRaises(SystemExit, wrapper.run) + + def test_parse_option(self): + + # commandline origin + self.assertEqual(wrapper.parse_option('--fullscreen'), + ('fullscreen', '1')) + + self.assertEqual(wrapper.parse_option('--fade_out_duration=0'), + ('fade_out_duration', '0')) + + # pass the wrong parameter to fs-uae + self.assertEqual(wrapper.parse_option('-typo=true'), ('-typo', 'true')) + + # pass the wrong parameter to fs-uae again + self.assertEqual(wrapper.parse_option('typo=true'), ('typo', 'true')) + + # We have no idea what to do with this - might be a conf file + self.assertEqual(wrapper.parse_option('this-is-odd'), (None, None)) + + def test_parse_args(self): + + # Looking for configuration file... first, we have nothing + self.assertEqual(wrapper.parse_args(), (None, [], {})) + + # still no luck - nonexistent file + sys.argv.append('there-is-no-config.fs-uae') + self.assertEqual(wrapper.parse_args(), (None, [], {})) + + # lets make it + os.chdir(self.dirname) + with open('there-is-no-config.fs-uae', 'w') as fobj: + fobj.write('\n') + + self.assertEqual(wrapper.parse_args(), + ('there-is-no-config.fs-uae', [], {})) + + # remove argument, try to find default one + sys.argv.pop() + self.assertListEqual(sys.argv, ['fs-uae-wrapper']) + + with open('Config.fs-uae', 'w') as fobj: + fobj.write('\n') + + self.assertEqual(wrapper.parse_args(), ('Config.fs-uae', [], {}))