← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/refactor26 into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/refactor26 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~trb143/openlp/refactor26/+merge/290775

move moving around!

lp:~trb143/openlp/refactor26 (revision 2642)
[SUCCESS] https://ci.openlp.io/job/Branch-01-Pull/1368/
[SUCCESS] https://ci.openlp.io/job/Branch-02-Functional-Tests/1287/
[SUCCESS] https://ci.openlp.io/job/Branch-03-Interface-Tests/1226/
[SUCCESS] https://ci.openlp.io/job/Branch-04a-Windows_Functional_Tests/1058/
[SUCCESS] https://ci.openlp.io/job/Branch-04b-Windows_Interface_Tests/649/
[SUCCESS] https://ci.openlp.io/job/Branch-05a-Code_Analysis/716/
[SUCCESS] https://ci.openlp.io/job/Branch-05b-Test_Coverage/584/

-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~trb143/openlp/refactor26 into lp:openlp.
=== modified file 'openlp/core/common/__init__.py'
--- openlp/core/common/__init__.py	2016-03-31 16:42:42 +0000
+++ openlp/core/common/__init__.py	2016-04-01 19:21:43 +0000
@@ -24,13 +24,12 @@
 OpenLP work.
 """
 import hashlib
+import logging
+import os
 import re
-import os
-import logging
 import sys
 import traceback
 from ipaddress import IPv4Address, IPv6Address, AddressValueError
-from codecs import decode, encode
 
 from PyQt5 import QtCore
 from PyQt5.QtCore import QCryptographicHash as QHash
@@ -241,6 +240,20 @@
 from .uistrings import UiStrings
 from .settings import Settings
 from .applocation import AppLocation
-from .historycombobox import HistoryComboBox
 from .actions import ActionList
 from .languagemanager import LanguageManager
+
+
+def add_actions(target, actions):
+    """
+    Adds multiple actions to a menu or toolbar in one command.
+
+    :param target: The menu or toolbar to add actions to
+    :param actions: The actions to be added. An action consisting of the keyword ``None``
+        will result in a separator being inserted into the target.
+    """
+    for action in actions:
+        if action is None:
+            target.addSeparator()
+        else:
+            target.addAction(action)

=== removed file 'openlp/core/common/historycombobox.py'
--- openlp/core/common/historycombobox.py	2015-12-31 22:46:06 +0000
+++ openlp/core/common/historycombobox.py	1970-01-01 00:00:00 +0000
@@ -1,84 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection                                      #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2016 OpenLP Developers                                   #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it     #
-# under the terms of the GNU General Public License as published by the Free  #
-# Software Foundation; version 2 of the License.                              #
-#                                                                             #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
-# more details.                                                               #
-#                                                                             #
-# You should have received a copy of the GNU General Public License along     #
-# with this program; if not, write to the Free Software Foundation, Inc., 59  #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
-###############################################################################
-"""
-The :mod:`~openlp.core.common.historycombobox` module contains the HistoryComboBox widget
-"""
-
-from PyQt5 import QtCore, QtWidgets
-
-
-class HistoryComboBox(QtWidgets.QComboBox):
-    """
-    The :class:`~openlp.core.common.historycombobox.HistoryComboBox` widget emulates the QLineEdit ``returnPressed``
-    signal for when the :kbd:`Enter` or :kbd:`Return` keys are pressed, and saves anything that is typed into the edit
-    box into its list.
-    """
-    returnPressed = QtCore.pyqtSignal()
-
-    def __init__(self, parent=None):
-        """
-        Initialise the combo box, setting duplicates to False and the insert policy to insert items at the top.
-
-        :param parent: The parent widget
-        """
-        super().__init__(parent)
-        self.setDuplicatesEnabled(False)
-        self.setEditable(True)
-        self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
-        self.setInsertPolicy(QtWidgets.QComboBox.InsertAtTop)
-
-    def keyPressEvent(self, event):
-        """
-        Override the inherited keyPressEvent method to emit the ``returnPressed`` signal and to save the current text to
-        the dropdown list.
-
-        :param event: The keyboard event
-        """
-        # Handle Enter and Return ourselves
-        if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return:
-            # Emit the returnPressed signal
-            self.returnPressed.emit()
-            # Save the current text to the dropdown list
-            if self.currentText() and self.findText(self.currentText()) == -1:
-                self.insertItem(0, self.currentText())
-        # Let the parent handle any keypress events
-        super().keyPressEvent(event)
-
-    def focusOutEvent(self, event):
-        """
-        Override the inherited focusOutEvent to save the current text to the dropdown list.
-
-        :param event: The focus event
-        """
-        # Save the current text to the dropdown list
-        if self.currentText() and self.findText(self.currentText()) == -1:
-            self.insertItem(0, self.currentText())
-        # Let the parent handle any keypress events
-        super().focusOutEvent(event)
-
-    def getItems(self):
-        """
-        Get all the items from the history
-
-        :return: A list of strings
-        """
-        return [self.itemText(i) for i in range(self.count())]

=== added directory 'openlp/core/ui/lib'
=== added file 'openlp/core/ui/lib/__init__.py'
--- openlp/core/ui/lib/__init__.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/lib/__init__.py	2016-04-01 19:21:43 +0000
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2016 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################

=== added file 'openlp/core/ui/lib/historycombobox.py'
--- openlp/core/ui/lib/historycombobox.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/lib/historycombobox.py	2016-04-01 19:21:43 +0000
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2016 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+The :mod:`~openlp.core.ui.lib.historycombobox` module contains the HistoryComboBox widget
+"""
+
+from PyQt5 import QtCore, QtWidgets
+
+
+class HistoryComboBox(QtWidgets.QComboBox):
+    """
+    The :class:`~openlp.core.common.historycombobox.HistoryComboBox` widget emulates the QLineEdit ``returnPressed``
+    signal for when the :kbd:`Enter` or :kbd:`Return` keys are pressed, and saves anything that is typed into the edit
+    box into its list.
+    """
+    returnPressed = QtCore.pyqtSignal()
+
+    def __init__(self, parent=None):
+        """
+        Initialise the combo box, setting duplicates to False and the insert policy to insert items at the top.
+
+        :param parent: The parent widget
+        """
+        super().__init__(parent)
+        self.setDuplicatesEnabled(False)
+        self.setEditable(True)
+        self.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+        self.setInsertPolicy(QtWidgets.QComboBox.InsertAtTop)
+
+    def keyPressEvent(self, event):
+        """
+        Override the inherited keyPressEvent method to emit the ``returnPressed`` signal and to save the current text to
+        the dropdown list.
+
+        :param event: The keyboard event
+        """
+        # Handle Enter and Return ourselves
+        if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return:
+            # Emit the returnPressed signal
+            self.returnPressed.emit()
+            # Save the current text to the dropdown list
+            if self.currentText() and self.findText(self.currentText()) == -1:
+                self.insertItem(0, self.currentText())
+        # Let the parent handle any keypress events
+        super().keyPressEvent(event)
+
+    def focusOutEvent(self, event):
+        """
+        Override the inherited focusOutEvent to save the current text to the dropdown list.
+
+        :param event: The focus event
+        """
+        # Save the current text to the dropdown list
+        if self.currentText() and self.findText(self.currentText()) == -1:
+            self.insertItem(0, self.currentText())
+        # Let the parent handle any keypress events
+        super().focusOutEvent(event)
+
+    def getItems(self):
+        """
+        Get all the items from the history
+
+        :return: A list of strings
+        """
+        return [self.itemText(i) for i in range(self.count())]

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2016-03-31 16:47:42 +0000
+++ openlp/core/ui/mainwindow.py	2016-04-01 19:21:43 +0000
@@ -35,7 +35,7 @@
 from PyQt5 import QtCore, QtGui, QtWidgets
 
 from openlp.core.common import Registry, RegistryProperties, AppLocation, LanguageManager, Settings, \
-    check_directory_exists, translate, is_win, is_macosx
+    check_directory_exists, translate, is_win, is_macosx, add_actions
 from openlp.core.common.actions import ActionList, CategoryOrder
 from openlp.core.lib import Renderer, OpenLPDockWidget, PluginManager, ImageManager, PluginStatus, ScreenList, \
     build_icon
@@ -46,7 +46,7 @@
 from openlp.core.ui.media import MediaController
 from openlp.core.ui.printserviceform import PrintServiceForm
 from openlp.core.ui.projector.manager import ProjectorManager
-from openlp.core.utils import get_application_version, add_actions
+from openlp.core.utils import get_application_version
 
 log = logging.getLogger(__name__)
 

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2016-03-31 16:42:42 +0000
+++ openlp/core/utils/__init__.py	2016-04-01 19:21:43 +0000
@@ -267,21 +267,6 @@
     return version_string
 
 
-def add_actions(target, actions):
-    """
-    Adds multiple actions to a menu or toolbar in one command.
-
-    :param target: The menu or toolbar to add actions to
-    :param actions: The actions to be added. An action consisting of the keyword ``None``
-        will result in a separator being inserted into the target.
-    """
-    for action in actions:
-        if action is None:
-            target.addSeparator()
-        else:
-            target.addAction(action)
-
-
 def get_filesystem_encoding():
     """
     Returns the name of the encoding used to convert Unicode filenames into system file names.
@@ -450,7 +435,7 @@
 
 def get_uno_command(connection_type='pipe'):
     """
-    Returns the UNO command to launch an openoffice.org instance.
+    Returns the UNO command to launch an libreoffice.org instance.
     """
     for command in ['libreoffice', 'soffice']:
         if which(command):
@@ -468,7 +453,7 @@
 
 def get_uno_instance(resolver, connection_type='pipe'):
     """
-    Returns a running openoffice.org instance.
+    Returns a running libreoffice.org instance.
 
     :param resolver: The UNO resolver to use to find a running instance.
     """
@@ -535,5 +520,5 @@
     return key
 
 __all__ = ['get_application_version', 'check_latest_version',
-           'add_actions', 'get_filesystem_encoding', 'get_web_page', 'get_uno_command', 'get_uno_instance',
+           'get_filesystem_encoding', 'get_web_page', 'get_uno_command', 'get_uno_instance',
            'delete_file', 'clean_filename', 'format_time', 'get_locale_key', 'get_natural_key']

=== modified file 'openlp/plugins/songs/forms/songselectdialog.py'
--- openlp/plugins/songs/forms/songselectdialog.py	2016-01-09 18:01:49 +0000
+++ openlp/plugins/songs/forms/songselectdialog.py	2016-04-01 19:21:43 +0000
@@ -25,7 +25,7 @@
 
 from PyQt5 import QtCore, QtWidgets
 
-from openlp.core.common import HistoryComboBox
+from openlp.core.ui.lib.historycombobox import HistoryComboBox
 from openlp.core.lib import translate, build_icon
 from openlp.core.ui import SingleColumnTableWidget
 

=== added file 'tests/functional/openlp_core_common/test_init.py'
--- tests/functional/openlp_core_common/test_init.py	1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_core_common/test_init.py	2016-04-01 19:21:43 +0000
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2016 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+Functional tests to test the AppLocation class and related methods.
+"""
+import os
+from unittest import TestCase
+
+from openlp.core.common import add_actions
+from tests.functional import MagicMock, patch
+
+
+class TestInit(TestCase):
+    """
+    A test suite to test out various methods around the common __init__ class.
+    """
+
+    def add_actions_empty_list_test(self):
+        """
+        Test that no actions are added when the list is empty
+        """
+        # GIVEN: a mocked action list, and an empty list
+        mocked_target = MagicMock()
+        empty_list = []
+
+        # WHEN: The empty list is added to the mocked target
+        add_actions(mocked_target, empty_list)
+
+        # THEN: The add method on the mocked target is never called
+        self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called')
+        self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called')
+
+    def add_actions_none_action_test(self):
+        """
+        Test that a separator is added when a None action is in the list
+        """
+        # GIVEN: a mocked action list, and a list with None in it
+        mocked_target = MagicMock()
+        separator_list = [None]
+
+        # WHEN: The list is added to the mocked target
+        add_actions(mocked_target, separator_list)
+
+        # THEN: The addSeparator method is called, but the addAction method is never called
+        mocked_target.addSeparator.assert_called_with()
+        self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called')
+
+    def add_actions_add_action_test(self):
+        """
+        Test that an action is added when a valid action is in the list
+        """
+        # GIVEN: a mocked action list, and a list with an action in it
+        mocked_target = MagicMock()
+        action_list = ['action']
+
+        # WHEN: The list is added to the mocked target
+        add_actions(mocked_target, action_list)
+
+        # THEN: The addSeparator method is not called, and the addAction method is called
+        self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called')
+        mocked_target.addAction.assert_called_with('action')
+
+    def add_actions_action_and_none_test(self):
+        """
+        Test that an action and a separator are added when a valid action and None are in the list
+        """
+        # GIVEN: a mocked action list, and a list with an action and None in it
+        mocked_target = MagicMock()
+        action_list = ['action', None]
+
+        # WHEN: The list is added to the mocked target
+        add_actions(mocked_target, action_list)
+
+        # THEN: The addSeparator method is called, and the addAction method is called
+        mocked_target.addSeparator.assert_called_with()
+        mocked_target.addAction.assert_called_with('action')

=== modified file 'tests/functional/openlp_core_utils/test_utils.py'
--- tests/functional/openlp_core_utils/test_utils.py	2016-03-31 16:56:32 +0000
+++ tests/functional/openlp_core_utils/test_utils.py	2016-04-01 19:21:43 +0000
@@ -26,7 +26,8 @@
 from unittest import TestCase
 
 from openlp.core.utils import clean_filename, delete_file, get_filesystem_encoding, get_locale_key, \
-    get_natural_key, split_filename, _get_user_agent, get_web_page, get_uno_instance, add_actions
+    get_natural_key, split_filename, _get_user_agent, get_web_page, get_uno_instance
+
 from tests.functional import MagicMock, patch
 
 
@@ -34,65 +35,6 @@
     """
     A test suite to test out various methods around the AppLocation class.
     """
-    def add_actions_empty_list_test(self):
-        """
-        Test that no actions are added when the list is empty
-        """
-        # GIVEN: a mocked action list, and an empty list
-        mocked_target = MagicMock()
-        empty_list = []
-
-        # WHEN: The empty list is added to the mocked target
-        add_actions(mocked_target, empty_list)
-
-        # THEN: The add method on the mocked target is never called
-        self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called')
-        self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called')
-
-    def add_actions_none_action_test(self):
-        """
-        Test that a separator is added when a None action is in the list
-        """
-        # GIVEN: a mocked action list, and a list with None in it
-        mocked_target = MagicMock()
-        separator_list = [None]
-
-        # WHEN: The list is added to the mocked target
-        add_actions(mocked_target, separator_list)
-
-        # THEN: The addSeparator method is called, but the addAction method is never called
-        mocked_target.addSeparator.assert_called_with()
-        self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called')
-
-    def add_actions_add_action_test(self):
-        """
-        Test that an action is added when a valid action is in the list
-        """
-        # GIVEN: a mocked action list, and a list with an action in it
-        mocked_target = MagicMock()
-        action_list = ['action']
-
-        # WHEN: The list is added to the mocked target
-        add_actions(mocked_target, action_list)
-
-        # THEN: The addSeparator method is not called, and the addAction method is called
-        self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called')
-        mocked_target.addAction.assert_called_with('action')
-
-    def add_actions_action_and_none_test(self):
-        """
-        Test that an action and a separator are added when a valid action and None are in the list
-        """
-        # GIVEN: a mocked action list, and a list with an action and None in it
-        mocked_target = MagicMock()
-        action_list = ['action', None]
-
-        # WHEN: The list is added to the mocked target
-        add_actions(mocked_target, action_list)
-
-        # THEN: The addSeparator method is called, and the addAction method is called
-        mocked_target.addSeparator.assert_called_with()
-        mocked_target.addAction.assert_called_with('action')
 
     def get_filesystem_encoding_sys_function_not_called_test(self):
         """

=== removed file 'tests/interfaces/openlp_core_common/test_historycombobox.py'
--- tests/interfaces/openlp_core_common/test_historycombobox.py	2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_core_common/test_historycombobox.py	1970-01-01 00:00:00 +0000
@@ -1,65 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection                                      #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2016 OpenLP Developers                                   #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it     #
-# under the terms of the GNU General Public License as published by the Free  #
-# Software Foundation; version 2 of the License.                              #
-#                                                                             #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
-# more details.                                                               #
-#                                                                             #
-# You should have received a copy of the GNU General Public License along     #
-# with this program; if not, write to the Free Software Foundation, Inc., 59  #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
-###############################################################################
-"""
-Module to test the :mod:`~openlp.core.common.historycombobox` module.
-"""
-
-from unittest import TestCase
-
-from PyQt5 import QtWidgets
-
-from openlp.core.common import Registry
-from openlp.core.common import HistoryComboBox
-from tests.helpers.testmixin import TestMixin
-from tests.interfaces import MagicMock, patch
-
-
-class TestHistoryComboBox(TestCase, TestMixin):
-    def setUp(self):
-        """
-        Some pre-test setup required.
-        """
-        Registry.create()
-        self.setup_application()
-        self.main_window = QtWidgets.QMainWindow()
-        Registry().register('main_window', self.main_window)
-        self.combo = HistoryComboBox(self.main_window)
-
-    def tearDown(self):
-        """
-        Delete all the C++ objects at the end so that we don't have a segfault
-        """
-        del self.combo
-        del self.main_window
-
-    def get_items_test(self):
-        """
-        Test the getItems() method
-        """
-        # GIVEN: The combo.
-
-        # WHEN: Add two items.
-        self.combo.addItem('test1')
-        self.combo.addItem('test2')
-
-        # THEN: The list of items should contain both strings.
-        self.assertEqual(self.combo.getItems(), ['test1', 'test2'])

=== added directory 'tests/interfaces/openlp_core_ui_lib'
=== added file 'tests/interfaces/openlp_core_ui_lib/__init__.py'
--- tests/interfaces/openlp_core_ui_lib/__init__.py	1970-01-01 00:00:00 +0000
+++ tests/interfaces/openlp_core_ui_lib/__init__.py	2016-04-01 19:21:43 +0000
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2016 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################

=== added file 'tests/interfaces/openlp_core_ui_lib/test_historycombobox.py'
--- tests/interfaces/openlp_core_ui_lib/test_historycombobox.py	1970-01-01 00:00:00 +0000
+++ tests/interfaces/openlp_core_ui_lib/test_historycombobox.py	2016-04-01 19:21:43 +0000
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2016 OpenLP Developers                                   #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+Module to test the :mod:`~openlp.core.common.historycombobox` module.
+"""
+
+from unittest import TestCase
+
+from PyQt5 import QtWidgets
+
+from openlp.core.common import Registry
+from openlp.core.ui.lib.historycombobox import HistoryComboBox
+from tests.helpers.testmixin import TestMixin
+
+
+class TestHistoryComboBox(TestCase, TestMixin):
+    def setUp(self):
+        """
+        Some pre-test setup required.
+        """
+        Registry.create()
+        self.setup_application()
+        self.main_window = QtWidgets.QMainWindow()
+        Registry().register('main_window', self.main_window)
+        self.combo = HistoryComboBox(self.main_window)
+
+    def tearDown(self):
+        """
+        Delete all the C++ objects at the end so that we don't have a segfault
+        """
+        del self.combo
+        del self.main_window
+
+    def get_items_test(self):
+        """
+        Test the getItems() method
+        """
+        # GIVEN: The combo.
+
+        # WHEN: Add two items.
+        self.combo.addItem('test1')
+        self.combo.addItem('test2')
+
+        # THEN: The list of items should contain both strings.
+        self.assertEqual(self.combo.getItems(), ['test1', 'test2'])


Follow ups