Kaydet (Commit) b6d2d6db authored tarafından kadertarlan's avatar kadertarlan Kaydeden (comit) Michael Stahl

tdf#45904 move java based api tests to c++ (AccessibleRelationSet)

Change-Id: I2d9d72bbc845acf091570df663849495619ee765
Reviewed-on: https://gerrit.libreoffice.org/24563Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
üst da356329
# -*- 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,sw_accessible_relation_set))
$(eval $(call gb_CppunitTest_add_exception_objects,sw_accessible_relation_set, \
sw/qa/extras/accessibility/accessible_relation_set \
))
$(eval $(call gb_CppunitTest_use_libraries,sw_accessible_relation_set, \
comphelper \
cppu \
cppuhelper \
i18nlangtag \
sal \
subsequenttest \
sw \
test \
tl \
unotest \
utl \
vcl \
$(gb_UWINAPI) \
))
$(eval $(call gb_CppunitTest_use_externals,sw_accessible_relation_set,\
boost_headers \
libxml2 \
))
$(eval $(call gb_CppunitTest_set_include,sw_htmlexport,\
-I$(SRCDIR)/sw/inc \
-I$(SRCDIR)/sw/source/core/inc \
-I$(SRCDIR)/sw/source/uibase/inc \
-I$(SRCDIR)/sw/qa/extras/inc \
$$(INCLUDE) \
))
$(eval $(call gb_CppunitTest_use_api,sw_accessible_relation_set,\
offapi \
udkapi \
))
$(eval $(call gb_CppunitTest_use_ure,sw_accessible_relation_set))
$(eval $(call gb_CppunitTest_use_vcl,sw_accessible_relation_set))
$(eval $(call gb_CppunitTest_use_rdb,sw_accessible_relation_set,services))
$(eval $(call gb_CppunitTest_use_configuration,sw_accessible_relation_set))
# vim: set noet sw=4 ts=4:
......@@ -20,7 +20,6 @@
$(eval $(call gb_JunitTest_JunitTest,sw_complex))
$(eval $(call gb_JunitTest_add_sourcefiles,sw_complex,\
sw/qa/complex/accessibility/AccessibleRelationSet \
sw/qa/complex/indeterminateState/CheckIndeterminateState \
))
......@@ -33,7 +32,6 @@ $(eval $(call gb_JunitTest_use_jars,sw_complex,\
))
$(eval $(call gb_JunitTest_add_classes,sw_complex,\
complex.accessibility.AccessibleRelationSet \
))
# vim: set noet sw=4 ts=4:
......@@ -91,6 +91,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\
CppunitTest_sw_layoutwriter \
CppunitTest_sw_mailmerge \
CppunitTest_sw_globalfilter \
CppunitTest_sw_accessible_relation_set \
))
ifneq ($(ENABLE_HEADLESS),TRUE)
......
/*
* 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
package complex.accessibility;
import com.sun.star.accessibility.AccessibleRole;
import com.sun.star.accessibility.XAccessible;
import com.sun.star.accessibility.XAccessibleText;
import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.accessibility.XAccessibleRelationSet;
import com.sun.star.awt.XWindow;
import com.sun.star.frame.XModel;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.text.ControlCharacter;
import com.sun.star.text.XText;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.uno.UnoRuntime;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openoffice.test.OfficeConnection;
import util.AccessibilityTools;
import util.WriterTools;
import static org.junit.Assert.*;
public class AccessibleRelationSet {
private XAccessible para1 = null;
private XAccessible para2 = null;
private XAccessible para3 = null;
private XTextDocument xTextDoc = null;
private static final String[] types = {"INVALID","CONTENT_FLOWS_FROM","CONTENT_FLOWS_TO","CONTROLLED_BY","CONTROLLER_FOR","LABEL_FOR","LABELED_BY","MEMBER_OF","SUB_WINDOW_OF"};
@Test public void contents_flows_to() {
XAccessibleRelationSet set = getAccessibleRelation(para1);
short firstrelation=-1;
XAccessibleText atarget=null;
if (set != null) {
assertEquals(
"didn't gain correct count of relations", 1,
set.getRelationCount());
try {
firstrelation = set.getRelation(0).RelationType;
Object oTmp = set.getRelation(0).TargetSet[0];
atarget = UnoRuntime.queryInterface(XAccessibleText.class, oTmp);
} catch (IndexOutOfBoundsException e) {
fail("Exception when getting relations "+e);
}
}
assertEquals(
"didn't gain correct relation type for paragraph 0", types[2],
types[firstrelation]);
XAccessibleText paraText2 =
UnoRuntime.queryInterface(XAccessibleText.class, para2);
assertEquals(
"didn't gain correct target paragraph", atarget.getText(),
paraText2.getText());
}
@Test public void contents_flows_from() {
XAccessibleRelationSet set = getAccessibleRelation(para2);
short[] relationtypes = new short[2];
XAccessibleText[] atargets = new XAccessibleText[2];
if (set != null) {
assertEquals(
"didn't gain correct count of relations", 2,
set.getRelationCount());
try {
short tmprelation = set.getRelation(0).RelationType;
if ( tmprelation == 1 )
{
Object oTmp = set.getRelation(0).TargetSet[0];
atargets[0] = UnoRuntime.queryInterface(XAccessibleText.class, oTmp);
relationtypes[0] = tmprelation;
}
else if ( tmprelation == 2 )
{
Object oTmp = set.getRelation(0).TargetSet[0];
atargets[1] = UnoRuntime.queryInterface(XAccessibleText.class, oTmp);
relationtypes[1] = tmprelation;
}
else
{
fail("didn't gain correct relation type");
}
tmprelation = set.getRelation(1).RelationType;
if ( tmprelation == 1 )
{
Object oTmp = set.getRelation(1).TargetSet[0];
atargets[0] = UnoRuntime.queryInterface(XAccessibleText.class, oTmp);
relationtypes[0] = tmprelation;
}
else if ( tmprelation == 2 )
{
Object oTmp = set.getRelation(1).TargetSet[0];
atargets[1] = UnoRuntime.queryInterface(XAccessibleText.class, oTmp);
relationtypes[1] = tmprelation;
}
else
{
fail("didn't gain correct relation type");
}
} catch (IndexOutOfBoundsException e) {
fail("Exception when getting relations "+e);
}
}
assertEquals(
"didn't gain correct relation type for paragraph 1", types[1],
types[relationtypes[0]]);
XAccessibleText paraText1 =
UnoRuntime.queryInterface(XAccessibleText.class, para1);
assertEquals(
"didn't gain correct target paragraph", atargets[0].getText(),
paraText1.getText());
assertEquals(
"didn't gain correct relation type for paragraph 3", types[2],
types[relationtypes[1]]);
XAccessibleText paraText3 =
UnoRuntime.queryInterface(XAccessibleText.class, para3);
assertEquals(
"didn't gain correct target paragraph", atargets[1].getText(),
paraText3.getText());
}
@Before public void before()
throws com.sun.star.lang.IllegalArgumentException,
IndexOutOfBoundsException
{
XMultiServiceFactory factory = UnoRuntime.queryInterface(
XMultiServiceFactory.class,
connection.getComponentContext().getServiceManager());
xTextDoc = WriterTools.createTextDoc(factory);
XText oText = xTextDoc.getText();
XTextCursor oCursor = oText.createTextCursor();
for (int i=0; i<5; i++){
oText.insertString( oCursor,"Paragraph Number: " + i, false);
oText.insertControlCharacter(
oCursor, ControlCharacter.PARAGRAPH_BREAK, false );
}
XModel aModel = UnoRuntime.queryInterface(XModel.class, xTextDoc);
XAccessibleContext ctx;
for (int i = 0;; ++i) {
XWindow xWindow = AccessibilityTools.getCurrentWindow(aModel);
XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow);
ctx = AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.DOCUMENT_TEXT);
if (ctx != null) {
break;
}
if (i == 20) { // give up after 10 sec
throw new RuntimeException(
"Couldn't get AccessibleRole.DOCUMENT_TEXT object");
}
System.out.println("No DOCUMENT_TEXT found yet, retrying");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
para1 = ctx.getAccessibleChild(0);
para2 = ctx.getAccessibleChild(1);
para3 = ctx.getAccessibleChild(2);
}
@After public void after() {
util.DesktopTools.closeDoc(xTextDoc);
}
public XAccessibleRelationSet getAccessibleRelation(XAccessible xAcc) {
XAccessibleContext oObj = UnoRuntime.queryInterface(XAccessibleContext.class, xAcc);
XAccessibleRelationSet set = oObj.getAccessibleRelationSet();
return set;
}
@BeforeClass public static void setUpConnection() throws Exception {
connection.setUp();
}
@AfterClass public static void tearDownConnection()
throws InterruptedException, com.sun.star.uno.Exception
{
connection.tearDown();
}
private static final OfficeConnection connection = new OfficeConnection();
}
/* -*- 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/
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0
*/
#include <test/unoapi_test.hxx>
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
#include <com/sun/star/accessibility/AccessibleRole.hpp>
#include <com/sun/star/accessibility/XAccessibleText.hpp>
#include <com/sun/star/accessibility/XAccessible.hpp>
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/text/XText.hpp>
#include <com/sun/star/text/XTextDocument.hpp>
#include <com/sun/star/text/XTextCursor.hpp>
#include <com/sun/star/text/ControlCharacter.hpp>
#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
using namespace com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::accessibility;
using namespace css::lang;
class AccessibilityTools
{
public:
static css::uno::Reference<css::accessibility::XAccessibleContext>
getAccessibleObjectForRole(css::uno::Reference<css::accessibility::XAccessible> xacc,
sal_Int16 role);
};
css::uno::Reference<css::accessibility::XAccessibleContext>
AccessibilityTools::getAccessibleObjectForRole(
css::uno::Reference<css::accessibility::XAccessible> xacc, sal_Int16 role)
{
css::uno::Reference<css::accessibility::XAccessibleContext> ac = xacc->getAccessibleContext();
bool isShowing = ac->getAccessibleStateSet()->contains(AccessibleStateType::SHOWING);
if ((ac->getAccessibleRole() == role) && isShowing)
{
css::uno::Reference<css::accessibility::XAccessible> SearchedAccessible(xacc,
uno::UNO_QUERY);
return ac;
}
else
{
int k = ac->getAccessibleChildCount();
if (ac->getAccessibleChildCount() > 100)
{
k = 50;
}
for (int i = 0; i < k; i++)
{
css::uno::Reference<css::accessibility::XAccessibleContext> ac2
= AccessibilityTools::getAccessibleObjectForRole(ac->getAccessibleChild(i), role);
if (ac2.is())
{
return ac2;
}
}
}
return nullptr;
}
class AccessibleRelationSet : public UnoApiTest
{
public:
AccessibleRelationSet()
: UnoApiTest("")
{
}
uno::Reference<lang::XComponent> init(uno::Reference<css::accessibility::XAccessible>& para1,
uno::Reference<css::accessibility::XAccessible>& para2,
uno::Reference<css::accessibility::XAccessible>& para3);
void contents_flows_to_and_from();
CPPUNIT_TEST_SUITE(AccessibleRelationSet);
CPPUNIT_TEST(contents_flows_to_and_from);
CPPUNIT_TEST_SUITE_END();
};
uno::Reference<lang::XComponent>
AccessibleRelationSet::init(uno::Reference<css::accessibility::XAccessible>& para1,
uno::Reference<css::accessibility::XAccessible>& para2,
uno::Reference<css::accessibility::XAccessible>& para3)
{
uno::Reference<css::lang::XComponent> xComponent
= loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument");
uno::Reference<text::XTextDocument> xTextDoc(xComponent, uno::UNO_QUERY);
css::uno::Reference<text::XText> oText(xTextDoc->getText(), uno::UNO_QUERY_THROW);
css::uno::Reference<text::XTextCursor> oCursor = oText->createTextCursor();
for (int i = 0; i < 5; i++)
{
oText->insertString(oCursor, "Paragraph Number: " + OUString::number(i), false);
oText->insertControlCharacter(oCursor, text::ControlCharacter::PARAGRAPH_BREAK, false);
}
css::uno::Reference<css::frame::XModel> aModel(xTextDoc, uno::UNO_QUERY_THROW);
css::uno::Reference<css::frame::XController> xController(aModel->getCurrentController());
css::uno::Reference<css::accessibility::XAccessibleContext> ctx;
uno::Reference<frame::XFrame> xFrame(xController->getFrame(), uno::UNO_SET_THROW);
uno::Reference<awt::XWindow> xWindow(xFrame->getComponentWindow(), uno::UNO_SET_THROW);
css::uno::Reference<css::accessibility::XAccessible> xRoot(xWindow, uno::UNO_QUERY_THROW);
ctx = AccessibilityTools::getAccessibleObjectForRole(xRoot, AccessibleRole::DOCUMENT_TEXT);
CPPUNIT_ASSERT_MESSAGE("Couldn't get AccessibleRole.DOCUMENT_TEXT object", ctx.is());
para1 = ctx->getAccessibleChild(0);
para2 = ctx->getAccessibleChild(1);
para3 = ctx->getAccessibleChild(2);
return xComponent;
}
void AccessibleRelationSet::contents_flows_to_and_from()
{
//contents_flows_to
std::vector<OUString> types{ "INVALID", "CONTENT_FLOWS_FROM", "CONTENT_FLOWS_TO",
"CONTROLLED_BY", "CONTROLLER_FOR", "LABEL_FOR",
"LABELED_BY", "MEMBER_OF", "SUB_WINDOW_OF" };
css::uno::Reference<css::accessibility::XAccessible> para1;
css::uno::Reference<css::accessibility::XAccessible> para2;
css::uno::Reference<css::accessibility::XAccessible> para3;
uno::Reference<lang::XComponent> xComponent(init(para1, para2, para3));
css::uno::Reference<css::accessibility::XAccessibleContext> oObj(para1, uno::UNO_QUERY_THROW);
css::uno::Reference<css::accessibility::XAccessibleRelationSet> set
= oObj->getAccessibleRelationSet();
sal_Int16 firstrelation = -1;
css::uno::Reference<css::accessibility::XAccessibleText> atarget;
if (set.is())
{
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct count of relations", sal_Int32(1),
set->getRelationCount());
firstrelation = set->getRelation(0).RelationType;
css::uno::Reference<css::accessibility::XAccessibleText> adummy(
set->getRelation(0).TargetSet[0], uno::UNO_QUERY_THROW);
atarget = adummy;
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct relation type for paragraph 0", types[2],
types[firstrelation]);
css::uno::Reference<css::accessibility::XAccessibleText> paraText2(para2,
uno::UNO_QUERY_THROW);
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct target paragraph", atarget->getText(),
paraText2->getText());
}
//contents_flows_from()
css::uno::Reference<css::accessibility::XAccessibleContext> oObj2(para2, uno::UNO_QUERY_THROW);
css::uno::Reference<css::accessibility::XAccessibleRelationSet> set2
= oObj2->getAccessibleRelationSet();
sal_Int16 relationtypes[2];
css::uno::Reference<css::accessibility::XAccessibleText> atargets[2];
if (set2.is())
{
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct count of relations", sal_Int32(2),
set2->getRelationCount());
sal_Int16 tmprelation = set2->getRelation(0).RelationType;
if (tmprelation == 1)
{
css::uno::Reference<css::accessibility::XAccessibleText> adummy(
set2->getRelation(0).TargetSet[0], uno::UNO_QUERY_THROW);
atargets[0] = adummy;
relationtypes[0] = tmprelation;
}
else if (tmprelation == 2)
{
css::uno::Reference<css::accessibility::XAccessibleText> adummy(
set2->getRelation(0).TargetSet[0], uno::UNO_QUERY_THROW);
atargets[1] = adummy;
relationtypes[1] = tmprelation;
}
else
{
CPPUNIT_FAIL("didn't gain correct relation type");
}
tmprelation = set2->getRelation(1).RelationType;
if (tmprelation == 1)
{
css::uno::Reference<css::accessibility::XAccessibleText> adummy(
set2->getRelation(1).TargetSet[0], uno::UNO_QUERY_THROW);
atargets[0] = adummy;
relationtypes[0] = tmprelation;
}
else if (tmprelation == 2)
{
css::uno::Reference<css::accessibility::XAccessibleText> adummy(
set2->getRelation(1).TargetSet[0], uno::UNO_QUERY_THROW);
atargets[1] = adummy;
relationtypes[1] = tmprelation;
}
else
{
CPPUNIT_FAIL("didn't gain correct relation type");
}
}
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct relation type for paragraph 1", types[1],
types[relationtypes[0]]);
css::uno::Reference<css::accessibility::XAccessibleText> paraText1(para1, uno::UNO_QUERY_THROW);
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct target paragraph", atargets[0]->getText(),
paraText1->getText());
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct relation type for paragraph 3", types[2],
types[relationtypes[1]]);
css::uno::Reference<css::accessibility::XAccessibleText> paraText3(para3, uno::UNO_QUERY_THROW);
CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct target paragraph", atargets[1]->getText(),
paraText3->getText());
closeDocument(xComponent);
}
CPPUNIT_TEST_SUITE_REGISTRATION(AccessibleRelationSet);
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment