forked from openlp/openlp
head
This commit is contained in:
commit
8038388110
@ -342,18 +342,16 @@ def create_valign_selection_widgets(parent):
|
|||||||
return label, combo_box
|
return label, combo_box
|
||||||
|
|
||||||
|
|
||||||
def find_and_set_in_combo_box(combo_box, value_to_find):
|
def find_and_set_in_combo_box(combo_box, value_to_find, set_missing=True):
|
||||||
"""
|
"""
|
||||||
Find a string in a combo box and set it as the selected item if present
|
Find a string in a combo box and set it as the selected item if present
|
||||||
|
|
||||||
``combo_box``
|
:param combo_box: The combo box to check for selected items
|
||||||
The combo box to check for selected items
|
:param value_to_find: The value to find
|
||||||
|
:param set_missing: if not found leave value as current
|
||||||
``value_to_find``
|
|
||||||
The value to find
|
|
||||||
"""
|
"""
|
||||||
index = combo_box.findText(value_to_find, QtCore.Qt.MatchExactly)
|
index = combo_box.findText(value_to_find, QtCore.Qt.MatchExactly)
|
||||||
if index == -1:
|
if index == -1:
|
||||||
# Not Found.
|
# Not Found.
|
||||||
index = 0
|
index = 0 if set_missing else combo_box.currentIndex()
|
||||||
combo_box.setCurrentIndex(index)
|
combo_box.setCurrentIndex(index)
|
||||||
|
@ -475,6 +475,19 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
Settings().setValue('servicemanager/last file', '')
|
Settings().setValue('servicemanager/last file', '')
|
||||||
self.plugin_manager.new_service_created()
|
self.plugin_manager.new_service_created()
|
||||||
|
|
||||||
|
def create_basic_service(self):
|
||||||
|
"""
|
||||||
|
Create the initial service array with the base items to be saved.
|
||||||
|
|
||||||
|
:return service array
|
||||||
|
"""
|
||||||
|
service = []
|
||||||
|
core = {'lite-service': self._save_lite,
|
||||||
|
'service-theme': self.service_theme
|
||||||
|
}
|
||||||
|
service.append({'openlp_core': core})
|
||||||
|
return service
|
||||||
|
|
||||||
def save_file(self):
|
def save_file(self):
|
||||||
"""
|
"""
|
||||||
Save the current service file.
|
Save the current service file.
|
||||||
@ -495,7 +508,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
service_file_name = '%s.osj' % base_name
|
service_file_name = '%s.osj' % base_name
|
||||||
self.log_debug('ServiceManager.save_file - %s' % path_file_name)
|
self.log_debug('ServiceManager.save_file - %s' % path_file_name)
|
||||||
Settings().setValue(self.main_window.service_manager_settings_section + '/last directory', path)
|
Settings().setValue(self.main_window.service_manager_settings_section + '/last directory', path)
|
||||||
service = []
|
service = self.create_basic_service()
|
||||||
write_list = []
|
write_list = []
|
||||||
missing_list = []
|
missing_list = []
|
||||||
audio_files = []
|
audio_files = []
|
||||||
@ -607,9 +620,9 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
path, file_name = os.path.split(path_file_name)
|
path, file_name = os.path.split(path_file_name)
|
||||||
base_name = os.path.splitext(file_name)[0]
|
base_name = os.path.splitext(file_name)[0]
|
||||||
service_file_name = '%s.osj' % base_name
|
service_file_name = '%s.osj' % base_name
|
||||||
self.log_debug('ServiceManager.save_file - %s', path_file_name)
|
self.log_debug('ServiceManager.save_file - %s' % path_file_name)
|
||||||
Settings().setValue(self.main_window.service_manager_settings_section + '/last directory', path)
|
Settings().setValue(self.main_window.service_manager_settings_section + '/last directory', path)
|
||||||
service = []
|
service = self.create_basic_service()
|
||||||
self.application.set_busy_cursor()
|
self.application.set_busy_cursor()
|
||||||
# Number of items + 1 to zip it
|
# Number of items + 1 to zip it
|
||||||
self.main_window.display_progress_bar(len(self.service_items) + 1)
|
self.main_window.display_progress_bar(len(self.service_items) + 1)
|
||||||
@ -647,7 +660,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
delete_file(temp_file_name)
|
delete_file(temp_file_name)
|
||||||
return success
|
return success
|
||||||
|
|
||||||
def save_file_as(self):
|
def save_file_as(self, field=None):
|
||||||
"""
|
"""
|
||||||
Get a file name and then call :func:`ServiceManager.save_file` to save the file.
|
Get a file name and then call :func:`ServiceManager.save_file` to save the file.
|
||||||
"""
|
"""
|
||||||
@ -748,19 +761,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
self.new_file()
|
self.new_file()
|
||||||
self.set_file_name(file_name)
|
self.set_file_name(file_name)
|
||||||
self.main_window.display_progress_bar(len(items))
|
self.main_window.display_progress_bar(len(items))
|
||||||
for item in items:
|
self.process_service_items(items)
|
||||||
self.main_window.increment_progress_bar()
|
|
||||||
service_item = ServiceItem()
|
|
||||||
if self._save_lite:
|
|
||||||
service_item.set_from_service(item)
|
|
||||||
else:
|
|
||||||
service_item.set_from_service(item, self.service_path)
|
|
||||||
service_item.validate_item(self.suffixes)
|
|
||||||
if service_item.is_capable(ItemCapabilities.OnLoadUpdate):
|
|
||||||
new_item = Registry().get(service_item.name).service_load(service_item)
|
|
||||||
if new_item:
|
|
||||||
service_item = new_item
|
|
||||||
self.add_service_item(service_item, repaint=False)
|
|
||||||
delete_file(p_file)
|
delete_file(p_file)
|
||||||
self.main_window.add_recent_file(file_name)
|
self.main_window.add_recent_file(file_name)
|
||||||
self.set_modified(False)
|
self.set_modified(False)
|
||||||
@ -794,6 +795,34 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
self.application.set_normal_cursor()
|
self.application.set_normal_cursor()
|
||||||
self.repaint_service_list(-1, -1)
|
self.repaint_service_list(-1, -1)
|
||||||
|
|
||||||
|
def process_service_items(self, service_items):
|
||||||
|
"""
|
||||||
|
Process all the array of service items loaded from the saved service
|
||||||
|
|
||||||
|
:param service_items: list of service_items
|
||||||
|
"""
|
||||||
|
for item in service_items:
|
||||||
|
self.main_window.increment_progress_bar()
|
||||||
|
service_item = ServiceItem()
|
||||||
|
if 'openlp_core' in item:
|
||||||
|
item = item.get('openlp_core')
|
||||||
|
theme = item.get('service-theme', None)
|
||||||
|
if theme:
|
||||||
|
find_and_set_in_combo_box(self.theme_combo_box, theme, set_missing=False)
|
||||||
|
if theme == self.theme_combo_box.currentText():
|
||||||
|
self.renderer.set_service_theme(theme)
|
||||||
|
else:
|
||||||
|
if self._save_lite:
|
||||||
|
service_item.set_from_service(item)
|
||||||
|
else:
|
||||||
|
service_item.set_from_service(item, self.service_path)
|
||||||
|
service_item.validate_item(self.suffixes)
|
||||||
|
if service_item.is_capable(ItemCapabilities.OnLoadUpdate):
|
||||||
|
new_item = Registry().get(service_item.name).service_load(service_item)
|
||||||
|
if new_item:
|
||||||
|
service_item = new_item
|
||||||
|
self.add_service_item(service_item, repaint=False)
|
||||||
|
|
||||||
def load_last_file(self):
|
def load_last_file(self):
|
||||||
"""
|
"""
|
||||||
Load the last service item from the service manager when the service was last closed. Can be blank if there was
|
Load the last service item from the service manager when the service was last closed. Can be blank if there was
|
||||||
@ -896,6 +925,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
def toggle_auto_play_slides_once(self, field=None):
|
def toggle_auto_play_slides_once(self, field=None):
|
||||||
"""
|
"""
|
||||||
Toggle Auto play slide once. Inverts auto play once option for the item
|
Toggle Auto play slide once. Inverts auto play once option for the item
|
||||||
|
|
||||||
:param field:
|
:param field:
|
||||||
"""
|
"""
|
||||||
item = self.find_service_item()[0]
|
item = self.find_service_item()[0]
|
||||||
@ -912,6 +942,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
|
|||||||
def toggle_auto_play_slides_loop(self, field=None):
|
def toggle_auto_play_slides_loop(self, field=None):
|
||||||
"""
|
"""
|
||||||
Toggle Auto play slide loop.
|
Toggle Auto play slide loop.
|
||||||
|
|
||||||
:param field:
|
:param field:
|
||||||
"""
|
"""
|
||||||
item = self.find_service_item()[0]
|
item = self.find_service_item()[0]
|
||||||
|
@ -72,6 +72,11 @@ WIDE_MENU = [
|
|||||||
'desktop_screen_button'
|
'desktop_screen_button'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
NON_TEXT_MENU = [
|
||||||
|
'blank_screen_button',
|
||||||
|
'desktop_screen_button'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class DisplayController(QtGui.QWidget):
|
class DisplayController(QtGui.QWidget):
|
||||||
"""
|
"""
|
||||||
@ -116,6 +121,9 @@ class SlideController(DisplayController):
|
|||||||
self.screen_size_changed()
|
self.screen_size_changed()
|
||||||
|
|
||||||
def initialise(self):
|
def initialise(self):
|
||||||
|
"""
|
||||||
|
Initialise the UI elements of the controller
|
||||||
|
"""
|
||||||
self.screens = ScreenList()
|
self.screens = ScreenList()
|
||||||
try:
|
try:
|
||||||
self.ratio = self.screens.current['size'].width() / self.screens.current['size'].height()
|
self.ratio = self.screens.current['size'].width() / self.screens.current['size'].height()
|
||||||
@ -442,6 +450,8 @@ class SlideController(DisplayController):
|
|||||||
def set_live_hot_keys(self, parent=None):
|
def set_live_hot_keys(self, parent=None):
|
||||||
"""
|
"""
|
||||||
Set the live hotkeys
|
Set the live hotkeys
|
||||||
|
|
||||||
|
:param parent: The parent UI object for actions to be added to.
|
||||||
"""
|
"""
|
||||||
self.previous_service = create_action(parent, 'previousService',
|
self.previous_service = create_action(parent, 'previousService',
|
||||||
text=translate('OpenLP.SlideController', 'Previous Service'),
|
text=translate('OpenLP.SlideController', 'Previous Service'),
|
||||||
@ -469,6 +479,8 @@ class SlideController(DisplayController):
|
|||||||
def toggle_display(self, action):
|
def toggle_display(self, action):
|
||||||
"""
|
"""
|
||||||
Toggle the display settings triggered from remote messages.
|
Toggle the display settings triggered from remote messages.
|
||||||
|
|
||||||
|
:param action: The blank action to be processed.
|
||||||
"""
|
"""
|
||||||
if action == 'blank' or action == 'hide':
|
if action == 'blank' or action == 'hide':
|
||||||
self.on_blank_display(True)
|
self.on_blank_display(True)
|
||||||
@ -544,6 +556,8 @@ class SlideController(DisplayController):
|
|||||||
def __add_actions_to_widget(self, widget):
|
def __add_actions_to_widget(self, widget):
|
||||||
"""
|
"""
|
||||||
Add actions to the widget specified by `widget`
|
Add actions to the widget specified by `widget`
|
||||||
|
|
||||||
|
:param widget: The UI widget for the actions
|
||||||
"""
|
"""
|
||||||
widget.addActions([
|
widget.addActions([
|
||||||
self.previous_item, self.next_item,
|
self.previous_item, self.next_item,
|
||||||
@ -574,6 +588,8 @@ class SlideController(DisplayController):
|
|||||||
def on_controller_size_changed(self, width):
|
def on_controller_size_changed(self, width):
|
||||||
"""
|
"""
|
||||||
Change layout of display control buttons on controller size change
|
Change layout of display control buttons on controller size change
|
||||||
|
|
||||||
|
:param width: the new width of the display
|
||||||
"""
|
"""
|
||||||
if self.is_live:
|
if self.is_live:
|
||||||
# Space used by the toolbar.
|
# Space used by the toolbar.
|
||||||
@ -581,12 +597,24 @@ class SlideController(DisplayController):
|
|||||||
# Add the threshold to prevent flickering.
|
# Add the threshold to prevent flickering.
|
||||||
if width > used_space + HIDE_MENU_THRESHOLD and self.hide_menu.isVisible():
|
if width > used_space + HIDE_MENU_THRESHOLD and self.hide_menu.isVisible():
|
||||||
self.toolbar.set_widget_visible(NARROW_MENU, False)
|
self.toolbar.set_widget_visible(NARROW_MENU, False)
|
||||||
self.toolbar.set_widget_visible(WIDE_MENU)
|
self.set_blank_menu()
|
||||||
# Take away a threshold to prevent flickering.
|
# Take away a threshold to prevent flickering.
|
||||||
elif width < used_space - HIDE_MENU_THRESHOLD and not self.hide_menu.isVisible():
|
elif width < used_space - HIDE_MENU_THRESHOLD and not self.hide_menu.isVisible():
|
||||||
self.toolbar.set_widget_visible(WIDE_MENU, False)
|
self.set_blank_menu(False)
|
||||||
self.toolbar.set_widget_visible(NARROW_MENU)
|
self.toolbar.set_widget_visible(NARROW_MENU)
|
||||||
|
|
||||||
|
def set_blank_menu(self, visible=True):
|
||||||
|
"""
|
||||||
|
Set the correct menu type dependent on the service item type
|
||||||
|
|
||||||
|
:param visible: Do I need to hide the menu?
|
||||||
|
"""
|
||||||
|
self.toolbar.set_widget_visible(WIDE_MENU, False)
|
||||||
|
if self.service_item and self.service_item.is_text():
|
||||||
|
self.toolbar.set_widget_visible(WIDE_MENU, visible)
|
||||||
|
else:
|
||||||
|
self.toolbar.set_widget_visible(NON_TEXT_MENU, visible)
|
||||||
|
|
||||||
def on_song_bar_handler(self):
|
def on_song_bar_handler(self):
|
||||||
"""
|
"""
|
||||||
Some song handler
|
Some song handler
|
||||||
@ -612,6 +640,8 @@ class SlideController(DisplayController):
|
|||||||
def enable_tool_bar(self, item):
|
def enable_tool_bar(self, item):
|
||||||
"""
|
"""
|
||||||
Allows the toolbars to be reconfigured based on Controller Type and ServiceItem Type
|
Allows the toolbars to be reconfigured based on Controller Type and ServiceItem Type
|
||||||
|
|
||||||
|
:param item: current service item being processed
|
||||||
"""
|
"""
|
||||||
if self.is_live:
|
if self.is_live:
|
||||||
self.enable_live_tool_bar(item)
|
self.enable_live_tool_bar(item)
|
||||||
@ -621,6 +651,8 @@ class SlideController(DisplayController):
|
|||||||
def enable_live_tool_bar(self, item):
|
def enable_live_tool_bar(self, item):
|
||||||
"""
|
"""
|
||||||
Allows the live toolbar to be customised
|
Allows the live toolbar to be customised
|
||||||
|
|
||||||
|
:param item: The current service item
|
||||||
"""
|
"""
|
||||||
# Work-around for OS X, hide and then show the toolbar
|
# Work-around for OS X, hide and then show the toolbar
|
||||||
# See bug #791050
|
# See bug #791050
|
||||||
@ -643,6 +675,7 @@ class SlideController(DisplayController):
|
|||||||
self.mediabar.show()
|
self.mediabar.show()
|
||||||
self.previous_item.setVisible(not item.is_media())
|
self.previous_item.setVisible(not item.is_media())
|
||||||
self.next_item.setVisible(not item.is_media())
|
self.next_item.setVisible(not item.is_media())
|
||||||
|
self.set_blank_menu()
|
||||||
# Work-around for OS X, hide and then show the toolbar
|
# Work-around for OS X, hide and then show the toolbar
|
||||||
# See bug #791050
|
# See bug #791050
|
||||||
self.toolbar.show()
|
self.toolbar.show()
|
||||||
|
@ -59,22 +59,18 @@ class TestRegistry(TestCase):
|
|||||||
with self.assertRaises(KeyError) as context:
|
with self.assertRaises(KeyError) as context:
|
||||||
Registry().register('test1', mock_1)
|
Registry().register('test1', mock_1)
|
||||||
self.assertEqual(context.exception.args[0], 'Duplicate service exception test1',
|
self.assertEqual(context.exception.args[0], 'Duplicate service exception test1',
|
||||||
'KeyError exception should have been thrown for duplicate service')
|
'KeyError exception should have been thrown for duplicate service')
|
||||||
|
|
||||||
# WHEN I try to get back a non existent component
|
# WHEN I try to get back a non existent component
|
||||||
# THEN I will get an exception
|
# THEN I will get an exception
|
||||||
with self.assertRaises(KeyError) as context:
|
temp = Registry().get('test2')
|
||||||
temp = Registry().get('test2')
|
self.assertEqual(temp, None, 'None should have been returned for missing service')
|
||||||
self.assertEqual(context.exception.args[0], 'Service test2 not found in list',
|
|
||||||
'KeyError exception should have been thrown for missing service')
|
|
||||||
|
|
||||||
# WHEN I try to replace a component I should be allowed (testing only)
|
# WHEN I try to replace a component I should be allowed (testing only)
|
||||||
Registry().remove('test1')
|
Registry().remove('test1')
|
||||||
# THEN I will get an exception
|
# THEN I will get an exception
|
||||||
with self.assertRaises(KeyError) as context:
|
temp = Registry().get('test1')
|
||||||
temp = Registry().get('test1')
|
self.assertEqual(temp, None, 'None should have been returned for deleted service')
|
||||||
self.assertEqual(context.exception.args[0], 'Service test1 not found in list',
|
|
||||||
'KeyError exception should have been thrown for deleted service')
|
|
||||||
|
|
||||||
def registry_function_test(self):
|
def registry_function_test(self):
|
||||||
"""
|
"""
|
||||||
|
85
tests/functional/openlp_core_ui/test_servicemanager.py
Normal file
85
tests/functional/openlp_core_ui/test_servicemanager.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# OpenLP - Open Source Lyrics Projection #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# Copyright (c) 2008-2014 Raoul Snyman #
|
||||||
|
# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
|
||||||
|
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
|
||||||
|
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
|
||||||
|
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
|
||||||
|
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||||
|
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
|
||||||
|
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# 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 #
|
||||||
|
###############################################################################
|
||||||
|
"""
|
||||||
|
Package to test the openlp.core.ui.slidecontroller package.
|
||||||
|
"""
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
from openlp.core.common import Registry
|
||||||
|
from openlp.core.ui import ServiceManager
|
||||||
|
|
||||||
|
from tests.interfaces import MagicMock, patch
|
||||||
|
|
||||||
|
|
||||||
|
class TestServiceManager(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""
|
||||||
|
Create the UI
|
||||||
|
"""
|
||||||
|
Registry.create()
|
||||||
|
#self.app = QtGui.QApplication([])
|
||||||
|
#ScreenList.create(self.app.desktop())
|
||||||
|
#Registry().register('application', MagicMock())
|
||||||
|
#with patch('openlp.core.lib.PluginManager'):
|
||||||
|
# self.main_window = MainWindow()
|
||||||
|
#self.service_manager = Registry().get('service_manager')
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
"""
|
||||||
|
Delete all the C++ objects at the end so that we don't have a segfault
|
||||||
|
"""
|
||||||
|
#del self.main_window
|
||||||
|
#del self.app
|
||||||
|
pass
|
||||||
|
|
||||||
|
def initial_service_manager_test(self):
|
||||||
|
"""
|
||||||
|
Test the initial of service manager.
|
||||||
|
"""
|
||||||
|
# GIVEN: A new service manager instance.
|
||||||
|
ServiceManager(None)
|
||||||
|
# WHEN: the default service manager is built.
|
||||||
|
# THEN: The the controller should be registered in the registry.
|
||||||
|
self.assertNotEqual(Registry().get('service_manager'), None, 'The base service manager should be registered')
|
||||||
|
|
||||||
|
def create_basic_service_test(self):
|
||||||
|
"""
|
||||||
|
Test the create basic service array
|
||||||
|
"""
|
||||||
|
# GIVEN: A new service manager instance.
|
||||||
|
service_manager = ServiceManager(None)
|
||||||
|
# WHEN: when the basic service array is created.
|
||||||
|
service_manager._save_lite = False
|
||||||
|
service_manager.service_theme = 'test_theme'
|
||||||
|
service = service_manager.create_basic_service()[0]
|
||||||
|
# THEN: The the controller should be registered in the registry.
|
||||||
|
self.assertNotEqual(service, None, 'The base service should be created')
|
||||||
|
self.assertEqual(service['openlp_core']['service-theme'], 'test_theme', 'The test theme should be saved')
|
||||||
|
self.assertEqual(service['openlp_core']['lite-service'], False, 'The lite service should be saved')
|
78
tests/functional/openlp_core_ui/test_slidecontroller.py
Normal file
78
tests/functional/openlp_core_ui/test_slidecontroller.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# OpenLP - Open Source Lyrics Projection #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# Copyright (c) 2008-2014 Raoul Snyman #
|
||||||
|
# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
|
||||||
|
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
|
||||||
|
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
|
||||||
|
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
|
||||||
|
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
|
||||||
|
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
|
||||||
|
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# 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 #
|
||||||
|
###############################################################################
|
||||||
|
"""
|
||||||
|
Package to test the openlp.core.ui.slidecontroller package.
|
||||||
|
"""
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
from openlp.core.ui import SlideController
|
||||||
|
|
||||||
|
from tests.interfaces import MagicMock, patch
|
||||||
|
|
||||||
|
|
||||||
|
class TestSlideController(TestCase):
|
||||||
|
|
||||||
|
def initial_slide_controller_test(self):
|
||||||
|
"""
|
||||||
|
Test the initial slide controller state .
|
||||||
|
"""
|
||||||
|
# GIVEN: A new slideController instance.
|
||||||
|
slide_controller = SlideController(None)
|
||||||
|
# WHEN: the default controller is built.
|
||||||
|
# THEN: The controller should not be a live controller.
|
||||||
|
self.assertEqual(slide_controller.is_live, False, 'The base slide controller should not be a live controller')
|
||||||
|
|
||||||
|
def toggle_blank_test(self):
|
||||||
|
"""
|
||||||
|
Test the setting of the display blank icons by display type.
|
||||||
|
"""
|
||||||
|
# GIVEN: A new slideController instance.
|
||||||
|
slide_controller = SlideController(None)
|
||||||
|
service_item = MagicMock()
|
||||||
|
toolbar = MagicMock()
|
||||||
|
toolbar.set_widget_visible = self.dummy_widget_visible
|
||||||
|
slide_controller.toolbar = toolbar
|
||||||
|
slide_controller.service_item = service_item
|
||||||
|
|
||||||
|
# WHEN a text based service item is used
|
||||||
|
slide_controller.service_item.is_text = MagicMock(return_value=True)
|
||||||
|
slide_controller.set_blank_menu()
|
||||||
|
|
||||||
|
# THEN: then call set up the toolbar to blank the display screen.
|
||||||
|
self.assertEqual(len(self.test_widget), 3, 'There should be three icons to display on the screen')
|
||||||
|
|
||||||
|
# WHEN a non text based service item is used
|
||||||
|
slide_controller.service_item.is_text = MagicMock(return_value=False)
|
||||||
|
slide_controller.set_blank_menu()
|
||||||
|
|
||||||
|
# THEN: then call set up the toolbar to blank the display screen.
|
||||||
|
self.assertEqual(len(self.test_widget), 2, 'There should be only two icons to display on the screen')
|
||||||
|
|
||||||
|
def dummy_widget_visible(self, widget, visible=True):
|
||||||
|
self.test_widget = widget
|
@ -38,7 +38,7 @@ class TestListPreviewWidget(TestCase):
|
|||||||
|
|
||||||
def initial_slide_count_test(self):
|
def initial_slide_count_test(self):
|
||||||
"""
|
"""
|
||||||
Test the inital slide count.
|
Test the initial slide count .
|
||||||
"""
|
"""
|
||||||
# GIVEN: A new ListPreviewWidget instance.
|
# GIVEN: A new ListPreviewWidget instance.
|
||||||
# WHEN: No SlideItem has been added yet.
|
# WHEN: No SlideItem has been added yet.
|
||||||
@ -47,7 +47,7 @@ class TestListPreviewWidget(TestCase):
|
|||||||
|
|
||||||
def initial_slide_number_test(self):
|
def initial_slide_number_test(self):
|
||||||
"""
|
"""
|
||||||
Test the inital slide number.
|
Test the initial current slide number.
|
||||||
"""
|
"""
|
||||||
# GIVEN: A new ListPreviewWidget instance.
|
# GIVEN: A new ListPreviewWidget instance.
|
||||||
# WHEN: No SlideItem has been added yet.
|
# WHEN: No SlideItem has been added yet.
|
||||||
|
@ -22,12 +22,13 @@ class TestMainWindow(TestCase):
|
|||||||
# Mock cursor busy/normal methods.
|
# Mock cursor busy/normal methods.
|
||||||
self.app.set_busy_cursor = MagicMock()
|
self.app.set_busy_cursor = MagicMock()
|
||||||
self.app.set_normal_cursor = MagicMock()
|
self.app.set_normal_cursor = MagicMock()
|
||||||
self.app.args =[]
|
self.app.args = []
|
||||||
Registry().register('application', self.app)
|
Registry().register('application', self.app)
|
||||||
# Mock classes and methods used by mainwindow.
|
# Mock classes and methods used by mainwindow.
|
||||||
with patch('openlp.core.ui.mainwindow.SettingsForm') as mocked_settings_form, \
|
with patch('openlp.core.ui.mainwindow.SettingsForm') as mocked_settings_form, \
|
||||||
patch('openlp.core.ui.mainwindow.ImageManager') as mocked_image_manager, \
|
patch('openlp.core.ui.mainwindow.ImageManager') as mocked_image_manager, \
|
||||||
patch('openlp.core.ui.mainwindow.SlideController') as mocked_slide_controller, \
|
patch('openlp.core.ui.mainwindow.LiveController') as mocked_live_controller, \
|
||||||
|
patch('openlp.core.ui.mainwindow.PreviewController') as mocked_preview_controller, \
|
||||||
patch('openlp.core.ui.mainwindow.OpenLPDockWidget') as mocked_dock_widget, \
|
patch('openlp.core.ui.mainwindow.OpenLPDockWidget') as mocked_dock_widget, \
|
||||||
patch('openlp.core.ui.mainwindow.QtGui.QToolBox') as mocked_q_tool_box_class, \
|
patch('openlp.core.ui.mainwindow.QtGui.QToolBox') as mocked_q_tool_box_class, \
|
||||||
patch('openlp.core.ui.mainwindow.QtGui.QMainWindow.addDockWidget') as mocked_add_dock_method, \
|
patch('openlp.core.ui.mainwindow.QtGui.QMainWindow.addDockWidget') as mocked_add_dock_method, \
|
||||||
@ -53,7 +54,7 @@ class TestMainWindow(TestCase):
|
|||||||
mocked_value.side_effect = [True, 2]
|
mocked_value.side_effect = [True, 2]
|
||||||
|
|
||||||
# WHEN: Call the restore method.
|
# WHEN: Call the restore method.
|
||||||
Registry().execute('bootstrap_post_set_up')
|
self.main_window.restore_current_media_manager_item()
|
||||||
|
|
||||||
# THEN: The current widget should have been set.
|
# THEN: The current widget should have been set.
|
||||||
self.main_window.media_tool_box.setCurrentIndex.assert_called_with(2)
|
self.main_window.media_tool_box.setCurrentIndex.assert_called_with(2)
|
||||||
|
@ -34,28 +34,28 @@ class TestStartTimeDialog(TestCase):
|
|||||||
"""
|
"""
|
||||||
Test StartTimeDialog are defaults correct
|
Test StartTimeDialog are defaults correct
|
||||||
"""
|
"""
|
||||||
self.assertEqual(self.form.hourSpinBox.minimum(), 0, 'The minimum hour should stay the same as the dialog')
|
self.assertEqual(self.form.hour_spin_box.minimum(), 0, 'The minimum hour should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.hourSpinBox.maximum(), 4, 'The maximum hour should stay the same as the dialog')
|
self.assertEqual(self.form.hour_spin_box.maximum(), 4, 'The maximum hour should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.minuteSpinBox.minimum(), 0,
|
self.assertEqual(self.form.minute_spin_box.minimum(), 0,
|
||||||
'The minimum minute should stay the same as the dialog')
|
'The minimum minute should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.minuteSpinBox.maximum(), 59,
|
self.assertEqual(self.form.minute_spin_box.maximum(), 59,
|
||||||
'The maximum minute should stay the same as the dialog')
|
'The maximum minute should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.secondSpinBox.minimum(), 0,
|
self.assertEqual(self.form.second_spin_box.minimum(), 0,
|
||||||
'The minimum second should stay the same as the dialog')
|
'The minimum second should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.secondSpinBox.maximum(), 59,
|
self.assertEqual(self.form.second_spin_box.maximum(), 59,
|
||||||
'The maximum second should stay the same as the dialog')
|
'The maximum second should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.hourFinishSpinBox.minimum(), 0,
|
self.assertEqual(self.form.hour_finish_spin_box.minimum(), 0,
|
||||||
'The minimum finish hour should stay the same as the dialog')
|
'The minimum finish hour should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.hourFinishSpinBox.maximum(), 4,
|
self.assertEqual(self.form.hour_finish_spin_box.maximum(), 4,
|
||||||
'The maximum finish hour should stay the same as the dialog')
|
'The maximum finish hour should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.minuteFinishSpinBox.minimum(), 0,
|
self.assertEqual(self.form.minute_finish_spin_box.minimum(), 0,
|
||||||
'The minimum finish minute should stay the same as the dialog')
|
'The minimum finish minute should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.minuteFinishSpinBox.maximum(), 59,
|
self.assertEqual(self.form.minute_finish_spin_box.maximum(), 59,
|
||||||
'The maximum finish minute should stay the same as the dialog')
|
'The maximum finish minute should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.secondFinishSpinBox.minimum(), 0,
|
self.assertEqual(self.form.second_finish_spin_box.minimum(), 0,
|
||||||
'The minimum finish second should stay the same as the dialog')
|
'The minimum finish second should stay the same as the dialog')
|
||||||
self.assertEqual(self.form.secondFinishSpinBox.maximum(), 59,
|
self.assertEqual(self.form.second_finish_spin_box.maximum(), 59,
|
||||||
'The maximum finish second should stay the same as the dialog')
|
'The maximum finish second should stay the same as the dialog')
|
||||||
|
|
||||||
def time_display_test(self):
|
def time_display_test(self):
|
||||||
"""
|
"""
|
||||||
@ -75,22 +75,22 @@ class TestStartTimeDialog(TestCase):
|
|||||||
QtTest.QTest.mouseClick(ok_widget, QtCore.Qt.LeftButton)
|
QtTest.QTest.mouseClick(ok_widget, QtCore.Qt.LeftButton)
|
||||||
|
|
||||||
# THEN the following input values are returned
|
# THEN the following input values are returned
|
||||||
self.assertEqual(self.form.hourSpinBox.value(), 0)
|
self.assertEqual(self.form.hour_spin_box.value(), 0)
|
||||||
self.assertEqual(self.form.minuteSpinBox.value(), 1)
|
self.assertEqual(self.form.minute_spin_box.value(), 1)
|
||||||
self.assertEqual(self.form.secondSpinBox.value(), 1)
|
self.assertEqual(self.form.second_spin_box.value(), 1)
|
||||||
self.assertEqual(self.form.item['service_item'].start_time, 61, 'The start time should stay the same')
|
self.assertEqual(self.form.item['service_item'].start_time, 61, 'The start time should stay the same')
|
||||||
|
|
||||||
# WHEN displaying the UI, changing the time to 2min 3secs and pressing enter
|
# WHEN displaying the UI, changing the time to 2min 3secs and pressing enter
|
||||||
self.form.item = {'service_item': mocked_serviceitem}
|
self.form.item = {'service_item': mocked_serviceitem}
|
||||||
with patch('PyQt4.QtGui.QDialog.exec_'):
|
with patch('PyQt4.QtGui.QDialog.exec_'):
|
||||||
self.form.exec_()
|
self.form.exec_()
|
||||||
self.form.minuteSpinBox.setValue(2)
|
self.form.minute_spin_box.setValue(2)
|
||||||
self.form.secondSpinBox.setValue(3)
|
self.form.second_spin_box.setValue(3)
|
||||||
ok_widget = self.form.button_box.button(self.form.button_box.Ok)
|
ok_widget = self.form.button_box.button(self.form.button_box.Ok)
|
||||||
QtTest.QTest.mouseClick(ok_widget, QtCore.Qt.LeftButton)
|
QtTest.QTest.mouseClick(ok_widget, QtCore.Qt.LeftButton)
|
||||||
|
|
||||||
# THEN the following values are returned
|
# THEN the following values are returned
|
||||||
self.assertEqual(self.form.hourSpinBox.value(), 0)
|
self.assertEqual(self.form.hour_spin_box.value(), 0)
|
||||||
self.assertEqual(self.form.minuteSpinBox.value(), 2)
|
self.assertEqual(self.form.minute_spin_box.value(), 2)
|
||||||
self.assertEqual(self.form.secondSpinBox.value(), 3)
|
self.assertEqual(self.form.second_spin_box.value(), 3)
|
||||||
self.assertEqual(self.form.item['service_item'].start_time, 123, 'The start time should have changed')
|
self.assertEqual(self.form.item['service_item'].start_time, 123, 'The start time should have changed')
|
||||||
|
@ -33,6 +33,8 @@ import os
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from tempfile import mkstemp
|
from tempfile import mkstemp
|
||||||
|
|
||||||
|
from PyQt4 import QtGui
|
||||||
|
|
||||||
from openlp.core.common import Registry, Settings
|
from openlp.core.common import Registry, Settings
|
||||||
from openlp.core.ui import ThemeManager
|
from openlp.core.ui import ThemeManager
|
||||||
from tests.functional import patch, MagicMock
|
from tests.functional import patch, MagicMock
|
||||||
@ -48,6 +50,7 @@ class TestThemeManager(TestCase):
|
|||||||
"""
|
"""
|
||||||
fd, self.ini_file = mkstemp('.ini')
|
fd, self.ini_file = mkstemp('.ini')
|
||||||
Settings().set_filename(self.ini_file)
|
Settings().set_filename(self.ini_file)
|
||||||
|
self.app = QtGui.QApplication([])
|
||||||
Registry.create()
|
Registry.create()
|
||||||
self.theme_manager = ThemeManager()
|
self.theme_manager = ThemeManager()
|
||||||
|
|
||||||
@ -57,6 +60,7 @@ class TestThemeManager(TestCase):
|
|||||||
"""
|
"""
|
||||||
os.unlink(self.ini_file)
|
os.unlink(self.ini_file)
|
||||||
os.unlink(Settings().fileName())
|
os.unlink(Settings().fileName())
|
||||||
|
del self.app
|
||||||
|
|
||||||
def initialise_test(self):
|
def initialise_test(self):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user