diff --git a/openlp/core/lib/formattingtags.py b/openlp/core/lib/formattingtags.py index b7bbd7322..b2d8f6ea7 100644 --- a/openlp/core/lib/formattingtags.py +++ b/openlp/core/lib/formattingtags.py @@ -36,8 +36,7 @@ from openlp.core.lib import Settings, translate class FormattingTags(object): """ - Static Class to HTML Tags to be access around the code the list is managed - by the Options Tab. + Static Class to HTML Tags to be access around the code the list is managed by the Options Tab. """ html_expands = [] @@ -56,12 +55,11 @@ class FormattingTags(object): tags = [] for tag in FormattingTags.html_expands: if not tag[u'protected'] and not tag.get(u'temporary'): - # Using dict ensures that copy is made and encoding of values - # a little later does not affect tags in the original list + # Using dict ensures that copy is made and encoding of values a little later does not affect tags in + # the original list tags.append(dict(tag)) tag = tags[-1] - # Remove key 'temporary' from tags. - # It is not needed to be saved. + # Remove key 'temporary' from tags. It is not needed to be saved. if u'temporary' in tag: del tag[u'temporary'] for element in tag: @@ -73,15 +71,12 @@ class FormattingTags(object): @staticmethod def load_tags(): """ - Load the Tags from store so can be used in the system or used to - update the display. + Load the Tags from store so can be used in the system or used to update the display. """ - temporary_tags = [tag for tag in FormattingTags.html_expands - if tag.get(u'temporary')] + temporary_tags = [tag for tag in FormattingTags.html_expands if tag.get(u'temporary')] FormattingTags.html_expands = [] base_tags = [] # Append the base tags. - # Hex Color tags from http://www.w3schools.com/html/html_colornames.asp base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Red'), u'start tag': u'{r}', u'start html': u'', @@ -195,19 +190,17 @@ class FormattingTags(object): The end tag, e. g. ``{/r}`` * start html - The start html tag. For instance ```` + The start html tag. For instance ```` * end html The end html tag. For example ```` * protected - A boolean stating whether this is a build-in tag or not. Should be - ``True`` in most cases. + A boolean stating whether this is a build-in tag or not. Should be ``True`` in most cases. * temporary - A temporary tag will not be saved, but is also considered when - displaying text containing the tag. It has to be a ``boolean``. + A temporary tag will not be saved, but is also considered when displaying text containing the tag. It has + to be a ``boolean``. """ FormattingTags.html_expands.extend(tags) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 5a8106f7d..d4c933d33 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -58,6 +58,7 @@ else: from PyQt4 import QtCore +from openlp.core.lib import ScreenList from openlp.core.utils import delete_file, get_uno_command, get_uno_instance from presentationcontroller import PresentationController, PresentationDocument @@ -254,7 +255,7 @@ class ImpressDocument(PresentationDocument): window = self.document.getCurrentController().getFrame().getContainerWindow() window.setVisible(False) self.presentation = self.document.getPresentation() - self.presentation.Display = self.controller.plugin.renderer.screens.current[u'number'] + 1 + self.presentation.Display = ScreenList().current[u'number'] + 1 self.control = None self.create_thumbnails() return True diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index d62465ee7..7a9f548ee 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -36,6 +36,7 @@ if os.name == u'nt': import win32ui import pywintypes +from openlp.core.lib import ScreenList from presentationcontroller import PresentationController, PresentationDocument log = logging.getLogger(__name__) @@ -252,8 +253,7 @@ class PowerpointDocument(PresentationDocument): dpi = win32ui.GetForegroundWindow().GetDC().GetDeviceCaps(88) except win32ui.error: dpi = 96 - renderer = self.controller.plugin.renderer - rect = renderer.screens.current[u'size'] + rect = ScreenList().current[u'size'] ppt_window = self.presentation.SlideShowSettings.Run() if not ppt_window: return diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index ec3adebe4..af66f623d 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -34,6 +34,7 @@ if os.name == u'nt': from ctypes import cdll from ctypes.wintypes import RECT +from openlp.core.lib import ScreenList from presentationcontroller import PresentationController, PresentationDocument log = logging.getLogger(__name__) @@ -120,8 +121,7 @@ class PptviewDocument(PresentationDocument): PptView task started earlier. """ log.debug(u'LoadPresentation') - renderer = self.controller.plugin.renderer - rect = renderer.screens.current[u'size'] + rect = ScreenList().current[u'size'] rect = RECT(rect.x(), rect.y(), rect.right(), rect.bottom()) filepath = str(self.filepath.replace(u'/', u'\\')) if not os.path.isdir(self.get_temp_folder()): diff --git a/tests/functional/__init__.py b/tests/functional/__init__.py index e0da50eb3..0b5157b46 100644 --- a/tests/functional/__init__.py +++ b/tests/functional/__init__.py @@ -5,4 +5,9 @@ sip.setapi(u'QString', 2) sip.setapi(u'QTextStream', 2) sip.setapi(u'QTime', 2) sip.setapi(u'QUrl', 2) -sip.setapi(u'QVariant', 2) \ No newline at end of file +sip.setapi(u'QVariant', 2) + +from PyQt4 import QtGui + +# Only one QApplication can be created. Use QtGui.QApplication.instance() when you need to "create" a QApplication. +application = QtGui.QApplication([]) diff --git a/tests/functional/openlp_core_lib/test_formattingtags.py b/tests/functional/openlp_core_lib/test_formattingtags.py new file mode 100644 index 000000000..335650112 --- /dev/null +++ b/tests/functional/openlp_core_lib/test_formattingtags.py @@ -0,0 +1,78 @@ +""" +Package to test the openlp.core.lib.formattingtags package. +""" +import copy +from unittest import TestCase + +from mock import patch + +from openlp.core.lib import FormattingTags + + +TAG = { + u'end tag': '{/aa}', + u'start html': '', + u'start tag': '{aa}', + u'protected': False, + u'end html': '', + u'desc': 'name' +} + + +class TestFormattingTags(TestCase): + + def tearDown(self): + """ + Clean up the FormattingTags class. + """ + FormattingTags.html_expands = [] + + def get_html_tags_no_user_tags_test(self): + """ + Test the FormattingTags class' get_html_tags static method. + """ + with patch(u'openlp.core.lib.translate') as mocked_translate, \ + patch(u'openlp.core.lib.settings') as mocked_settings, \ + patch(u'openlp.core.lib.formattingtags.cPickle') as mocked_cPickle: + # GIVEN: Our mocked modules and functions. + mocked_translate.side_effect = lambda module, string_to_translate, comment: string_to_translate + mocked_settings.value.return_value = u'' + mocked_cPickle.load.return_value = [] + + # WHEN: Get the display tags. + FormattingTags.load_tags() + old_tags_list = copy.deepcopy(FormattingTags.get_html_tags()) + FormattingTags.load_tags() + new_tags_list = FormattingTags.get_html_tags() + + # THEN: Lists should be identically. + assert old_tags_list == new_tags_list, u'The formatting tag lists should be identically.' + + def get_html_tags_with_user_tags_test(self): + """ + Test the FormattingTags class' get_html_tags static method in combination with user tags. + """ + with patch(u'openlp.core.lib.translate') as mocked_translate, \ + patch(u'openlp.core.lib.settings') as mocked_settings, \ + patch(u'openlp.core.lib.formattingtags.cPickle') as mocked_cPickle: + # GIVEN: Our mocked modules and functions. + mocked_translate.side_effect = lambda module, string_to_translate: string_to_translate + mocked_settings.value.return_value = u'' + mocked_cPickle.loads.side_effect = [[], [TAG]] + + # WHEN: Get the display tags. + FormattingTags.load_tags() + old_tags_list = copy.deepcopy(FormattingTags.get_html_tags()) + + # WHEN: Add our tag and get the tags again. + FormattingTags.load_tags() + FormattingTags.add_html_tags([TAG]) + new_tags_list = FormattingTags.get_html_tags() + + # THEN: Lists should not be identically. + assert old_tags_list != new_tags_list, u'The lists should be different.' + + # THEN: Added tag and last tag should be the same. + new_tag = new_tags_list.pop() + assert TAG == new_tag, u'Tags should be identically.' + diff --git a/tests/functional/openlp_core_lib/test_image_manager.py b/tests/functional/openlp_core_lib/test_image_manager.py index d13c82c04..3256ef86f 100644 --- a/tests/functional/openlp_core_lib/test_image_manager.py +++ b/tests/functional/openlp_core_lib/test_image_manager.py @@ -20,7 +20,7 @@ class TestImageManager(TestCase): Create the UI """ Registry.create() - self.app = QtGui.QApplication([]) + self.app = QtGui.QApplication.instance() ScreenList.create(self.app.desktop()) self.image_manager = ImageManager() diff --git a/tests/functional/openlp_core_lib/test_screen.py b/tests/functional/openlp_core_lib/test_screen.py new file mode 100644 index 000000000..92dd48172 --- /dev/null +++ b/tests/functional/openlp_core_lib/test_screen.py @@ -0,0 +1,55 @@ +""" +Package to test the openlp.core.lib.screenlist package. +""" +import copy +from unittest import TestCase + +from mock import MagicMock +from PyQt4 import QtGui, QtCore + +from openlp.core.lib import ScreenList + + +SCREEN = { + u'primary': False, + u'number': 1, + u'size': QtCore.QRect(0, 0, 1024, 768) +} + + +class TestScreenList(TestCase): + + def setUp(self): + """ + Set up the components need for all tests. + """ + self.application = QtGui.QApplication.instance() + self.screens = ScreenList.create(self.application.desktop()) + + def tearDown(self): + """ + Delete QApplication. + """ + del self.application + + def add_desktop_test(self): + """ + Test the ScreenList class' screen_count_changed method to check if new monitors are detected by OpenLP. + """ + # GIVEN: The screen list. + old_screens = copy.deepcopy(self.screens.screen_list) + # Mock the attributes. + self.screens.desktop.primaryScreen = MagicMock(return_value=SCREEN[u'primary']) + self.screens.desktop.screenCount = MagicMock(return_value=SCREEN[u'number'] + 1) + self.screens.desktop.screenGeometry = MagicMock(return_value=SCREEN[u'size']) + + # WHEN: Add a new screen. + self.screens.screen_count_changed(len(old_screens)) + + # THEN: The screen should have been added. + new_screens = self.screens.screen_list + assert len(old_screens) + 1 == len(new_screens), u'The new_screens list should be bigger.' + + # THEN: The screens should be identically. + assert SCREEN == new_screens.pop(), u'The new screen should be identically to the screen defined above.' + diff --git a/tests/functional/openlp_core_lib/test_serviceitem.py b/tests/functional/openlp_core_lib/test_serviceitem.py index 68af612ed..6c4302361 100644 --- a/tests/functional/openlp_core_lib/test_serviceitem.py +++ b/tests/functional/openlp_core_lib/test_serviceitem.py @@ -39,7 +39,7 @@ class TestServiceItem(TestCase): """ # GIVEN: A new service item - # WHEN:A service item is created (without a plugin) + # WHEN: A service item is created (without a plugin) service_item = ServiceItem(None) # THEN: We should get back a valid service item @@ -270,4 +270,5 @@ class TestServiceItem(TestCase): first_line = items[0] except IOError: first_line = u'' - return first_line \ No newline at end of file + return first_line + diff --git a/tests/functional/openlp_core_lib/test_uistrings.py b/tests/functional/openlp_core_lib/test_uistrings.py new file mode 100644 index 000000000..3351657d1 --- /dev/null +++ b/tests/functional/openlp_core_lib/test_uistrings.py @@ -0,0 +1,22 @@ +""" +Package to test the openlp.core.lib.uistrings package. +""" + +from unittest import TestCase + +from openlp.core.lib import UiStrings + +class TestUiStrings(TestCase): + + def check_same_instance_test(self): + """ + Test the UiStrings class - we always should have only one instance of the UiStrings class. + """ + # WHEN: Create two instances of the UiStrings class. + first_instance = UiStrings() + second_instance = UiStrings() + + # THEN: Check if the instances are the same. + assert first_instance is second_instance, "They should be the same instance!" + + diff --git a/tests/interfaces/__init__.py b/tests/interfaces/__init__.py index e0da50eb3..0b5157b46 100644 --- a/tests/interfaces/__init__.py +++ b/tests/interfaces/__init__.py @@ -5,4 +5,9 @@ sip.setapi(u'QString', 2) sip.setapi(u'QTextStream', 2) sip.setapi(u'QTime', 2) sip.setapi(u'QUrl', 2) -sip.setapi(u'QVariant', 2) \ No newline at end of file +sip.setapi(u'QVariant', 2) + +from PyQt4 import QtGui + +# Only one QApplication can be created. Use QtGui.QApplication.instance() when you need to "create" a QApplication. +application = QtGui.QApplication([]) diff --git a/tests/interfaces/openlp_core_lib/test_pluginmanager.py b/tests/interfaces/openlp_core_lib/test_pluginmanager.py index 609af01fb..ca8ed3f07 100644 --- a/tests/interfaces/openlp_core_lib/test_pluginmanager.py +++ b/tests/interfaces/openlp_core_lib/test_pluginmanager.py @@ -26,13 +26,14 @@ class TestPluginManager(TestCase): Settings().set_filename(self.ini_file) Registry.create() Registry().register(u'service_list', MagicMock()) - self.app = QtGui.QApplication([]) + self.app = QtGui.QApplication.instance() self.main_window = QtGui.QMainWindow() Registry().register(u'main_window', self.main_window) self.plugins_dir = os.path.abspath(os.path.join(os.path.basename(__file__), u'..', u'openlp', u'plugins')) def tearDown(self): os.unlink(self.ini_file) + del self.app def find_plugins_test(self): """ diff --git a/tests/interfaces/openlp_core_ui/test_filerenamedialog.py b/tests/interfaces/openlp_core_ui/test_filerenamedialog.py index 74fe83b26..941b1485a 100644 --- a/tests/interfaces/openlp_core_ui/test_filerenamedialog.py +++ b/tests/interfaces/openlp_core_ui/test_filerenamedialog.py @@ -15,7 +15,7 @@ class TestStartFileRenameForm(TestCase): Create the UI """ registry = Registry.create() - self.app = QtGui.QApplication([]) + self.app = QtGui.QApplication.instance() self.main_window = QtGui.QMainWindow() Registry().register(u'main_window', self.main_window) self.form = filerenameform.FileRenameForm() diff --git a/tests/interfaces/openlp_core_ui/test_servicemanager.py b/tests/interfaces/openlp_core_ui/test_servicemanager.py index bb62bd6e6..e06edd4a6 100644 --- a/tests/interfaces/openlp_core_ui/test_servicemanager.py +++ b/tests/interfaces/openlp_core_ui/test_servicemanager.py @@ -18,7 +18,7 @@ class TestStartNoteDialog(TestCase): Create the UI """ Registry.create() - self.app = QtGui.QApplication([]) + self.app = QtGui.QApplication.instance() ScreenList.create(self.app.desktop()) Registry().register(u'application', MagicMock()) self.main_window = MainWindow() diff --git a/tests/interfaces/openlp_core_ui/test_servicenotedialog.py b/tests/interfaces/openlp_core_ui/test_servicenotedialog.py index 1cf3fef38..e04f9975d 100644 --- a/tests/interfaces/openlp_core_ui/test_servicenotedialog.py +++ b/tests/interfaces/openlp_core_ui/test_servicenotedialog.py @@ -17,7 +17,7 @@ class TestStartNoteDialog(TestCase): Create the UI """ Registry.create() - self.app = QtGui.QApplication([]) + self.app = QtGui.QApplication.instance() self.main_window = QtGui.QMainWindow() Registry().register(u'main_window', self.main_window) self.form = servicenoteform.ServiceNoteForm() @@ -66,4 +66,5 @@ class TestStartNoteDialog(TestCase): QtTest.QTest.mouseClick(okWidget, QtCore.Qt.LeftButton) # THEN the following text is returned - self.assertEqual(self.form.text_edit.toPlainText(), text, u'The new text should be returned') \ No newline at end of file + self.assertEqual(self.form.text_edit.toPlainText(), text, u'The new text should be returned') + diff --git a/tests/interfaces/openlp_core_ui/test_starttimedialog.py b/tests/interfaces/openlp_core_ui/test_starttimedialog.py index 888402235..c09426a1f 100644 --- a/tests/interfaces/openlp_core_ui/test_starttimedialog.py +++ b/tests/interfaces/openlp_core_ui/test_starttimedialog.py @@ -17,7 +17,7 @@ class TestStartTimeDialog(TestCase): Create the UI """ Registry.create() - self.app = QtGui.QApplication([]) + self.app = QtGui.QApplication.instance() self.main_window = QtGui.QMainWindow() Registry().register(u'main_window', self.main_window) self.form = starttimeform.StartTimeForm() @@ -93,4 +93,4 @@ class TestStartTimeDialog(TestCase): self.assertEqual(self.form.hourSpinBox.value(), 0) self.assertEqual(self.form.minuteSpinBox.value(), 2) self.assertEqual(self.form.secondSpinBox.value(), 3) - self.assertEqual(self.form.item[u'service_item'].start_time, 123, u'The start time should have changed') \ No newline at end of file + self.assertEqual(self.form.item[u'service_item'].start_time, 123, u'The start time should have changed')