diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2022-11-04 14:00:24 +0100 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2022-11-04 16:51:37 +0100 |
commit | 16b9f9a9aaf7455fe3134d4517511c280aad3ee9 (patch) | |
tree | fe2cffa7ca1d9436fad51f3cb7b6a52049fd4154 /tests/auto/other | |
parent | 7c4b3648cad7faf990397af0b8a81664658c2d4f (diff) |
Merge Objective-C++ parts of tst_QAccessibilityMac into main source file
There's no need to split it, we can use the -x compiler flag to build
the .cpp file as Objective-C++, or, as done here, just rename the file.
This allows us to use QVERIFY and friends, giving more precise failure reporting.
Pick-to: 6.4
Change-Id: I6fb1c4454335082c8a39010c5b75c59e6ec6561b
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'tests/auto/other')
-rw-r--r-- | tests/auto/other/qaccessibilitymac/CMakeLists.txt | 21 | ||||
-rw-r--r-- | tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.cpp | 125 | ||||
-rw-r--r-- | tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm (renamed from tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm) | 267 | ||||
-rw-r--r-- | tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.h | 16 |
4 files changed, 172 insertions, 257 deletions
diff --git a/tests/auto/other/qaccessibilitymac/CMakeLists.txt b/tests/auto/other/qaccessibilitymac/CMakeLists.txt index 223c5213d3..93692c660d 100644 --- a/tests/auto/other/qaccessibilitymac/CMakeLists.txt +++ b/tests/auto/other/qaccessibilitymac/CMakeLists.txt @@ -1,35 +1,16 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -# Generated from qaccessibilitymac.pro. - if(NOT APPLE) return() endif() -##################################################################### -## tst_qaccessibilitymac Test: -##################################################################### - qt_internal_add_test(tst_qaccessibilitymac SOURCES - tst_qaccessibilitymac.cpp - tst_qaccessibilitymac_helpers.h + tst_qaccessibilitymac.mm LIBRARIES Qt::Gui Qt::Widgets -) - -#### Keys ignored in scope 1:.:.:qaccessibilitymac.pro:<TRUE>: -# _REQUIREMENTS = "mac" - -## Scopes: -##################################################################### - -qt_internal_extend_target(tst_qaccessibilitymac CONDITION APPLE - SOURCES - tst_qaccessibilitymac_helpers.mm - LIBRARIES ${FWAppKit} ${FWApplicationServices} ${FWSecurity} diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.cpp b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.cpp deleted file mode 100644 index 2141869f16..0000000000 --- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include <QApplication> -#include <QtWidgets> -#include <QTest> -#include <QtCore/qcoreapplication.h> - -#include "tst_qaccessibilitymac_helpers.h" - -QT_USE_NAMESPACE - - -class AccessibleTestWindow : public QWidget -{ - Q_OBJECT -public: - AccessibleTestWindow() - { - new QHBoxLayout(this); - } - - void addWidget(QWidget* widget) - { - layout()->addWidget(widget); - widget->show(); - QVERIFY(QTest::qWaitForWindowExposed(widget)); - } - - void clearChildren() - { - qDeleteAll(children()); - new QHBoxLayout(this); - } -}; - -class tst_QAccessibilityMac : public QObject -{ -Q_OBJECT -private slots: - void init(); - void cleanup(); - - void singleWidgetTest(); - void lineEditTest(); - void hierarchyTest(); - void notificationsTest(); - void checkBoxTest(); - -private: - AccessibleTestWindow *m_window; -}; - - -void tst_QAccessibilityMac::init() -{ - m_window = new AccessibleTestWindow(); - m_window->setWindowTitle("Test window"); - m_window->show(); - m_window->resize(400, 400); - - QVERIFY(QTest::qWaitForWindowExposed(m_window)); -} - -void tst_QAccessibilityMac::cleanup() -{ - delete m_window; -} - -void tst_QAccessibilityMac::singleWidgetTest() -{ - delete m_window; - m_window = 0; - - QVERIFY(singleWidget()); -} - -void tst_QAccessibilityMac::lineEditTest() -{ - QLineEdit *lineEdit = new QLineEdit(m_window); - lineEdit->setText("a11y test QLineEdit"); - m_window->addWidget(lineEdit); - QVERIFY(QTest::qWaitForWindowExposed(m_window)); - QCoreApplication::processEvents(); - - QVERIFY(testLineEdit()); -} - -void tst_QAccessibilityMac::hierarchyTest() -{ - QWidget *w = new QWidget(m_window); - m_window->addWidget(w); - - w->setLayout(new QVBoxLayout()); - QPushButton *b = new QPushButton(w); - w->layout()->addWidget(b); - b->setText("I am a button"); - - QPushButton *b2 = new QPushButton(w); - w->layout()->addWidget(b2); - b2->setText("Button 2"); - - QVERIFY(QTest::qWaitForWindowExposed(m_window)); - QCoreApplication::processEvents(); - QVERIFY(testHierarchy(w)); -} - -void tst_QAccessibilityMac::notificationsTest() -{ - QVERIFY(notifications(m_window)); -} - -void tst_QAccessibilityMac::checkBoxTest() -{ - QCheckBox *cb = new QCheckBox(m_window); - cb->setText("Great option"); - m_window->addWidget(cb); - QVERIFY(QTest::qWaitForWindowExposed(m_window)); - QCoreApplication::processEvents(); - - QVERIFY(testCheckBox(cb)); -} - -QTEST_MAIN(tst_QAccessibilityMac) -#include "tst_qaccessibilitymac.moc" diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm index ceac828eed..64a48bf3c6 100644 --- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm +++ b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm @@ -1,10 +1,14 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +#include <QApplication> +#include <QtWidgets> +#include <QTest> +#include <QtCore/qcoreapplication.h> + // some versions of CALayer.h use 'slots' as an identifier #define QT_NO_KEYWORDS -#include "tst_qaccessibilitymac_helpers.h" #include <QtWidgets/qapplication.h> #include <QtWidgets/qlineedit.h> #include <QtWidgets/qpushbutton.h> @@ -55,14 +59,6 @@ QDebug operator<<(QDebug dbg, AXErrorTag err) return dbg; } -#define EXPECT(cond) \ - if (!(cond)) { \ - qWarning("Failure in %s, line: %d", __FILE__ , __LINE__); \ - return false; \ - } \ - -#define TRY_EXPECT(cond) EXPECT(QTest::qWaitFor([&]{ return (cond); })) - @interface TestAXObject : NSObject { AXUIElementRef reference; @@ -341,66 +337,140 @@ QDebug operator<<(QDebug dbg, AXErrorTag err) @end +QVector<int> notificationList; + +void observerCallback(AXObserverRef /*observer*/, AXUIElementRef /*element*/, CFStringRef notification, void *) +{ + if ([(NSString*)notification isEqualToString: NSAccessibilityFocusedUIElementChangedNotification]) + notificationList.append(QAccessible::Focus); + else if ([(NSString*)notification isEqualToString: NSAccessibilityValueChangedNotification]) + notificationList.append(QAccessible::ValueChanged); + else + notificationList.append(-1); +} + +class AccessibleTestWindow : public QWidget +{ + Q_OBJECT +public: + AccessibleTestWindow() + { + new QHBoxLayout(this); + } + + void addWidget(QWidget* widget) + { + layout()->addWidget(widget); + widget->show(); + QVERIFY(QTest::qWaitForWindowExposed(widget)); + } + + void clearChildren() + { + qDeleteAll(children()); + new QHBoxLayout(this); + } +}; + +class tst_QAccessibilityMac : public QObject +{ +Q_OBJECT +private Q_SLOTS: + void init(); + void cleanup(); + + void singleWidgetTest(); + void lineEditTest(); + void hierarchyTest(); + void notificationsTest(); + void checkBoxTest(); + +private: + AccessibleTestWindow *m_window; +}; + + +void tst_QAccessibilityMac::init() +{ + m_window = new AccessibleTestWindow(); + m_window->setWindowTitle("Test window"); + m_window->show(); + m_window->resize(400, 400); + + QVERIFY(QTest::qWaitForWindowExposed(m_window)); +} -bool singleWidget() +void tst_QAccessibilityMac::cleanup() { + delete m_window; +} + +void tst_QAccessibilityMac::singleWidgetTest() +{ + delete m_window; + m_window = 0; + QLineEdit *le = new QLineEdit(); le->setText("button"); le->show(); - EXPECT(QTest::qWaitForWindowExposed(le)); + QVERIFY(QTest::qWaitForWindowExposed(le)); QCoreApplication::processEvents(); TestAXObject *appObject = [TestAXObject getApplicationAXObject]; - EXPECT(appObject); + QVERIFY(appObject); NSArray *windows = [appObject windowList]; - EXPECT([windows count] == 1); + QVERIFY([windows count] == 1); AXUIElementRef windowRef = (AXUIElementRef) [windows objectAtIndex: 0]; - EXPECT(windowRef != nil); + QVERIFY(windowRef != nil); TestAXObject *window = [[TestAXObject alloc] initWithAXUIElementRef: windowRef]; AXUIElementRef lineEditRef = [window findDirectChildByRole: kAXTextFieldRole]; - EXPECT(lineEditRef != nil); + QVERIFY(lineEditRef != nil); TestAXObject *lineEdit = [[TestAXObject alloc] initWithAXUIElementRef: lineEditRef]; - EXPECT([[lineEdit value] isEqualToString:@"button"]); + QVERIFY([[lineEdit value] isEqualToString:@"button"]); // Access invalid reference, should return empty value delete le; QCoreApplication::processEvents(); TestAXObject *lineEditInvalid = [[TestAXObject alloc] initWithAXUIElementRef: lineEditRef]; - EXPECT([[lineEditInvalid value] length] == 0); - - return true; + QVERIFY([[lineEditInvalid value] length] == 0); } -bool testLineEdit() +void tst_QAccessibilityMac::lineEditTest() { + QLineEdit *lineEdit = new QLineEdit(m_window); + lineEdit->setText("a11y test QLineEdit"); + m_window->addWidget(lineEdit); + QVERIFY(QTest::qWaitForWindowExposed(m_window)); + QCoreApplication::processEvents(); + TestAXObject *appObject = [TestAXObject getApplicationAXObject]; - EXPECT(appObject); + QVERIFY(appObject); NSArray *windowList = [appObject windowList]; // one window - EXPECT([windowList count] == 1); + QVERIFY([windowList count] == 1); AXUIElementRef windowRef = (AXUIElementRef) [windowList objectAtIndex: 0]; - EXPECT(windowRef != nil); + QVERIFY(windowRef != nil); TestAXObject *window = [[TestAXObject alloc] initWithAXUIElementRef: windowRef]; - EXPECT([window rect].size.width == 400); + QVERIFY([window rect].size.width == 400); // height of window includes title bar - EXPECT([window rect].size.height >= 400); + QVERIFY([window rect].size.height >= 400); - EXPECT([window.title isEqualToString:@"Test window"]); + QVERIFY([window.title isEqualToString:@"Test window"]); // children of window: - AXUIElementRef lineEdit = [window findDirectChildByRole: kAXTextFieldRole]; - EXPECT(lineEdit != nil); + AXUIElementRef lineEditElement = [window findDirectChildByRole: kAXTextFieldRole]; + QVERIFY(lineEditElement != nil); - TestAXObject *le = [[TestAXObject alloc] initWithAXUIElementRef: lineEdit]; + TestAXObject *le = [[TestAXObject alloc] initWithAXUIElementRef: lineEditElement]; NSString *value = @"a11y test QLineEdit"; - EXPECT([le.value isEqualToString:value]); - EXPECT(value.length <= NSIntegerMax); - EXPECT(le.numberOfCharacters == static_cast<NSInteger>(value.length)); + QVERIFY([le.value isEqualToString:value]); + QVERIFY(value.length <= NSIntegerMax); + QVERIFY(le.numberOfCharacters == static_cast<NSInteger>(value.length)); const NSRange ranges[] = { { 0, 0}, { 0, 1}, @@ -415,82 +485,82 @@ bool testLineEdit() NSString *expectedSubstring = [value substringWithRange:range]; NSString *actualSubstring = [le stringForRange:range]; NSString *actualAttributedSubstring = [le attributedStringForRange:range].string; - EXPECT([actualSubstring isEqualTo:expectedSubstring]); - EXPECT([actualAttributedSubstring isEqualTo:expectedSubstring]); + QVERIFY([actualSubstring isEqualTo:expectedSubstring]); + QVERIFY([actualAttributedSubstring isEqualTo:expectedSubstring]); } - return true; } -bool testHierarchy(QWidget *w) +void tst_QAccessibilityMac::hierarchyTest() { + QWidget *w = new QWidget(m_window); + m_window->addWidget(w); + + w->setLayout(new QVBoxLayout()); + QPushButton *b = new QPushButton(w); + w->layout()->addWidget(b); + b->setText("I am a button"); + + QPushButton *b2 = new QPushButton(w); + w->layout()->addWidget(b2); + b2->setText("Button 2"); + + QVERIFY(QTest::qWaitForWindowExposed(m_window)); + QCoreApplication::processEvents(); + TestAXObject *appObject = [TestAXObject getApplicationAXObject]; - EXPECT(appObject); + QVERIFY(appObject); NSArray *windowList = [appObject windowList]; // one window - EXPECT([windowList count] == 1); + QVERIFY([windowList count] == 1); AXUIElementRef windowRef = (AXUIElementRef) [windowList objectAtIndex: 0]; - EXPECT(windowRef != nil); + QVERIFY(windowRef != nil); TestAXObject *window = [[TestAXObject alloc] initWithAXUIElementRef: windowRef]; // Because the plain widget is filtered out of the hierarchy, we expect the button // to be a direct child of the window AXUIElementRef buttonRef = [window findDirectChildByRole: kAXButtonRole]; - EXPECT(buttonRef != nil); + QVERIFY(buttonRef != nil); TestAXObject *buttonObject = [[TestAXObject alloc] initWithAXUIElementRef: buttonRef]; TestAXObject *parentObject = [[TestAXObject alloc] initWithAXUIElementRef: [buttonObject parent]]; // check that the parent is a window - EXPECT([[parentObject role] isEqualToString: NSAccessibilityWindowRole]); + QVERIFY([[parentObject role] isEqualToString: NSAccessibilityWindowRole]); // test the focus // child 0 is the layout, then button1 and 2 QPushButton *button1 = qobject_cast<QPushButton*>(w->children().at(1)); - EXPECT(button1); + QVERIFY(button1); QPushButton *button2 = qobject_cast<QPushButton*>(w->children().at(2)); - EXPECT(button2); + QVERIFY(button2); button2->setFocus(); AXUIElementRef systemWideElement = AXUIElementCreateSystemWide(); AXUIElementRef focussedElement = NULL; AXError error = AXUIElementCopyAttributeValue(systemWideElement, (CFStringRef)NSAccessibilityFocusedUIElementAttribute, (CFTypeRef*)&focussedElement); - EXPECT(!error); - EXPECT(focussedElement); + QVERIFY(!error); + QVERIFY(focussedElement); TestAXObject *focusButton2 = [[TestAXObject alloc] initWithAXUIElementRef: focussedElement]; - EXPECT([[focusButton2 role] isEqualToString: NSAccessibilityButtonRole]); - EXPECT([[focusButton2 title] isEqualToString: @"Button 2"]); + QVERIFY([[focusButton2 role] isEqualToString: NSAccessibilityButtonRole]); + QVERIFY([[focusButton2 title] isEqualToString: @"Button 2"]); button1->setFocus(); error = AXUIElementCopyAttributeValue(systemWideElement, (CFStringRef)NSAccessibilityFocusedUIElementAttribute, (CFTypeRef*)&focussedElement); - EXPECT(!error); - EXPECT(focussedElement); + QVERIFY(!error); + QVERIFY(focussedElement); TestAXObject *focusButton1 = [[TestAXObject alloc] initWithAXUIElementRef: focussedElement]; - EXPECT([[focusButton1 role] isEqualToString: NSAccessibilityButtonRole]); - EXPECT([[focusButton1 title] isEqualToString: @"I am a button"]); - - return true; -} - -QVector<int> notificationList; - -void observerCallback(AXObserverRef /*observer*/, AXUIElementRef /*element*/, CFStringRef notification, void *) -{ - if ([(NSString*)notification isEqualToString: NSAccessibilityFocusedUIElementChangedNotification]) - notificationList.append(QAccessible::Focus); - else if ([(NSString*)notification isEqualToString: NSAccessibilityValueChangedNotification]) - notificationList.append(QAccessible::ValueChanged); - else - notificationList.append(-1); + QVERIFY([[focusButton1 role] isEqualToString: NSAccessibilityButtonRole]); + QVERIFY([[focusButton1 title] isEqualToString: @"I am a button"]); } - -bool notifications(QWidget *w) +void tst_QAccessibilityMac::notificationsTest() { + auto *w = m_window; QLineEdit *le1 = new QLineEdit(w); QLineEdit *le2 = new QLineEdit(w); w->layout()->addWidget(le1); @@ -500,76 +570,81 @@ bool notifications(QWidget *w) QTest::qWait(100); TestAXObject *appObject = [TestAXObject getApplicationAXObject]; - EXPECT(appObject); + QVERIFY(appObject); NSArray *windowList = [appObject windowList]; // one window - EXPECT([windowList count] == 1); + QVERIFY([windowList count] == 1); AXUIElementRef windowRef = (AXUIElementRef) [windowList objectAtIndex: 0]; - EXPECT(windowRef != nil); + QVERIFY(windowRef != nil); TestAXObject *window = [[TestAXObject alloc] initWithAXUIElementRef: windowRef]; AXUIElementRef lineEdit1 = [window findDirectChildByRole: kAXTextFieldRole]; - EXPECT(lineEdit1 != nil); + QVERIFY(lineEdit1 != nil); AXObserverRef observer = 0; AXError err = AXObserverCreate(getpid(), observerCallback, &observer); - EXPECT(!err); + QVERIFY(!err); AXObserverAddNotification(observer, appObject.ref, kAXFocusedUIElementChangedNotification, 0); AXObserverAddNotification(observer, lineEdit1, kAXValueChangedNotification, 0); CFRunLoopAddSource( [[NSRunLoop currentRunLoop] getCFRunLoop], AXObserverGetRunLoopSource(observer), kCFRunLoopDefaultMode); - EXPECT(notificationList.length() == 0); + QVERIFY(notificationList.length() == 0); le2->setFocus(); - TRY_EXPECT(notificationList.length() == 1); - TRY_EXPECT(notificationList.at(0) == QAccessible::Focus); + QTRY_VERIFY(notificationList.length() == 1); + QTRY_VERIFY(notificationList.at(0) == QAccessible::Focus); le1->setFocus(); - TRY_EXPECT(notificationList.length() == 2); - TRY_EXPECT(notificationList.at(1) == QAccessible::Focus); + QTRY_VERIFY(notificationList.length() == 2); + QTRY_VERIFY(notificationList.at(1) == QAccessible::Focus); le1->setText("hello"); - TRY_EXPECT(notificationList.length() == 3); - TRY_EXPECT(notificationList.at(2) == QAccessible::ValueChanged); + QTRY_VERIFY(notificationList.length() == 3); + QTRY_VERIFY(notificationList.at(2) == QAccessible::ValueChanged); le1->setText("foo"); - TRY_EXPECT(notificationList.length() == 4); - TRY_EXPECT(notificationList.at(3) == QAccessible::ValueChanged); - - return true; + QTRY_VERIFY(notificationList.length() == 4); + QTRY_VERIFY(notificationList.at(3) == QAccessible::ValueChanged); } -bool testCheckBox(QCheckBox *ckBox) +void tst_QAccessibilityMac::checkBoxTest() { + QCheckBox *ckBox = new QCheckBox(m_window); + ckBox->setText("Great option"); + m_window->addWidget(ckBox); + QVERIFY(QTest::qWaitForWindowExposed(m_window)); + QCoreApplication::processEvents(); + TestAXObject *appObject = [TestAXObject getApplicationAXObject]; - EXPECT(appObject); + QVERIFY(appObject); NSArray *windowList = [appObject windowList]; // one window - EXPECT([windowList count] == 1); + QVERIFY([windowList count] == 1); AXUIElementRef windowRef = (AXUIElementRef) [windowList objectAtIndex: 0]; - EXPECT(windowRef != nil); + QVERIFY(windowRef != nil); TestAXObject *window = [[TestAXObject alloc] initWithAXUIElementRef: windowRef]; // children of window: AXUIElementRef checkBox = [window findDirectChildByRole: kAXCheckBoxRole]; - EXPECT(checkBox != nil); + QVERIFY(checkBox != nil); TestAXObject *cb = [[TestAXObject alloc] initWithAXUIElementRef: checkBox]; // here start actual checkbox tests - EXPECT([cb valueNumber] == 0); - EXPECT([cb.title isEqualToString:@"Great option"]); + QVERIFY([cb valueNumber] == 0); + QVERIFY([cb.title isEqualToString:@"Great option"]); // EXPECT(cb.description == nil); // currently returns "" instead of nil - EXPECT([cb.actions containsObject:(NSString*)kAXPressAction]); + QVERIFY([cb.actions containsObject:(NSString*)kAXPressAction]); [cb performAction:kAXPressAction]; - EXPECT([cb valueNumber] == 1); + QVERIFY([cb valueNumber] == 1); [cb performAction:kAXPressAction]; - EXPECT([cb valueNumber] == 0); + QVERIFY([cb valueNumber] == 0); ckBox->setCheckState(Qt::PartiallyChecked); - EXPECT([cb valueNumber] == 2); - - return true; + QVERIFY([cb valueNumber] == 2); } + +QTEST_MAIN(tst_QAccessibilityMac) +#include "tst_qaccessibilitymac.moc" diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.h b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.h deleted file mode 100644 index 003aa90dfd..0000000000 --- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include <QtCore/QString> -#include <QtCore/QPair> -#include <QtWidgets/QWidget> -#include <QtWidgets/QCheckBox> - -#pragma once // Yeah, it's deprecated in general, but it's standard practice for Mac OS X. - -QT_USE_NAMESPACE - -bool testLineEdit(); -bool testHierarchy(QWidget *w); -bool singleWidget(); -bool notifications(QWidget *w); -bool testCheckBox(QCheckBox *ckBox); |