Add a unit test for the accelerator configurations

This is meant to test the problems described in the following commits:

96491f3f84
7da5034706

Change-Id: I2f79e8812de6f70d270eefb01aa7e2940c87166a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191173
Tested-by: Jenkins
Tested-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
This commit is contained in:
Neil Roberts
2025-09-24 20:28:13 +02:00
committed by Xisco Fauli
parent 347512a77b
commit 713732b0a2
3 changed files with 181 additions and 0 deletions
@@ -0,0 +1,41 @@
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
$(eval $(call gb_CppunitTest_CppunitTest,framework_accelerators))
$(eval $(call gb_CppunitTest_add_exception_objects,framework_accelerators, \
framework/qa/cppunit/accelerators \
))
$(eval $(call gb_CppunitTest_use_libraries,framework_accelerators, \
comphelper \
cppu \
cppuhelper \
fwk \
sal \
subsequenttest \
utl \
tl \
test \
unotest \
))
$(eval $(call gb_CppunitTest_use_external,framework_accelerators,boost_headers))
$(eval $(call gb_CppunitTest_use_sdk_api,framework_accelerators))
$(eval $(call gb_CppunitTest_use_ure,framework_accelerators))
$(eval $(call gb_CppunitTest_use_vcl,framework_accelerators))
$(eval $(call gb_CppunitTest_use_rdb,framework_accelerators,services))
$(eval $(call gb_CppunitTest_use_configuration,framework_accelerators))
# vim: set noet sw=4 ts=4:
+1
View File
@@ -29,6 +29,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,framework,\
CppunitTest_framework_dispatch \
CppunitTest_framework_loadenv \
CppunitTest_framework_CheckXTitle \
CppunitTest_framework_accelerators \
))
# Not sure why this is not stable on macOS.
+139
View File
@@ -0,0 +1,139 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <com/sun/star/awt/Key.hpp>
#include <com/sun/star/container/NoSuchElementException.hpp>
#include <com/sun/star/ui/XAcceleratorConfiguration.hpp>
#include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
#include <test/unoapi_test.hxx>
#include <array>
using namespace css;
class AcceleratorsTest : public UnoApiTest
{
public:
AcceleratorsTest()
: UnoApiTest(u"/framework/qa/cppunit/data"_ustr)
{
}
void configNotification();
CPPUNIT_TEST_SUITE(AcceleratorsTest);
CPPUNIT_TEST(configNotification);
CPPUNIT_TEST_SUITE_END();
};
void AcceleratorsTest::configNotification()
{
uno::Reference<lang::XMultiServiceFactory> xFactory = getMultiServiceFactory();
uno::Reference<ui::XAcceleratorConfiguration> xGlobalAccelCfg(
xFactory->createInstance(u"com.sun.star.ui.GlobalAcceleratorConfiguration"_ustr),
uno::UNO_QUERY);
CPPUNIT_ASSERT(xGlobalAccelCfg.is());
// Create two instances of the Writer module accelerator config so
// we can test that updates are copied between them
std::array<uno::Reference<ui::XAcceleratorConfiguration>, 2> xSwAccelCfgs;
for (auto& xSwAccelCfg : xSwAccelCfgs)
{
uno::Sequence<uno::Any> args(1);
args.getArray()[0] <<= u"com.sun.star.text.TextDocument"_ustr;
xSwAccelCfg.set(xFactory->createInstanceWithArguments(
u"com.sun.star.ui.ModuleAcceleratorConfiguration"_ustr, args),
uno::UNO_QUERY);
CPPUNIT_ASSERT(xSwAccelCfg.is());
}
// The two modules configs shouldn’t be the same object, otherwise
// the test is not really testing anything
CPPUNIT_ASSERT(xSwAccelCfgs[0] != xSwAccelCfgs[1]);
// Create an instance of another module
uno::Sequence<uno::Any> args(1);
args.getArray()[0] <<= u"com.sun.star.sheet.SpreadsheetDocument"_ustr;
uno::Reference<ui::XAcceleratorConfiguration> xScAccelCfg(
xFactory->createInstanceWithArguments(
u"com.sun.star.ui.ModuleAcceleratorConfiguration"_ustr, args),
uno::UNO_QUERY);
CPPUNIT_ASSERT(xScAccelCfg.is());
awt::KeyEvent aKeyEvent;
aKeyEvent.KeyCode = awt::Key::F16;
// Make sure the key we’re going to test isn’t already defined
CPPUNIT_ASSERT_THROW(xGlobalAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
for (const auto& xSwAccelCfg : xSwAccelCfgs)
{
CPPUNIT_ASSERT_THROW(xSwAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
}
CPPUNIT_ASSERT_THROW(xScAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
// Set the key event on the module
xSwAccelCfgs[0]->setKeyEvent(aKeyEvent, u".uno:Bold"_ustr);
// Store the changed configuration. This should trigger a change event
uno::Reference<ui::XUIConfigurationPersistence> xConfPersistence(xSwAccelCfgs[0],
uno::UNO_QUERY);
xConfPersistence->store();
// The key shouldn’t have been copied to the global configuration
CPPUNIT_ASSERT_THROW(xGlobalAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
// Nor the Calc module
CPPUNIT_ASSERT_THROW(xScAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
// Make sure the key was copied to all of the Writer module
// configurations
for (const auto& xSwAccelCfg : xSwAccelCfgs)
CPPUNIT_ASSERT_EQUAL(u".uno:Bold"_ustr, xSwAccelCfg->getCommandByKeyEvent(aKeyEvent));
// Modify the key to a different command
xSwAccelCfgs[0]->setKeyEvent(aKeyEvent, u".uno:Italic"_ustr);
xConfPersistence->store();
// Check the propagation worked correctly
CPPUNIT_ASSERT_THROW(xGlobalAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
CPPUNIT_ASSERT_THROW(xScAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
for (const auto& xSwAccelCfg : xSwAccelCfgs)
CPPUNIT_ASSERT_EQUAL(u".uno:Italic"_ustr, xSwAccelCfg->getCommandByKeyEvent(aKeyEvent));
// Remove the key binding
xSwAccelCfgs[0]->removeKeyEvent(aKeyEvent);
xConfPersistence->store();
// Now none of the configs should have the key
CPPUNIT_ASSERT_THROW(xGlobalAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
CPPUNIT_ASSERT_THROW(xScAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
for (const auto& xSwAccelCfg : xSwAccelCfgs)
{
CPPUNIT_ASSERT_THROW(xSwAccelCfg->getCommandByKeyEvent(aKeyEvent),
css::container::NoSuchElementException);
}
}
CPPUNIT_TEST_SUITE_REGISTRATION(AcceleratorsTest);
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */