sw/CppunitTest_sw_accessible_relation_set.mk | 59 ++++ sw/JunitTest_sw_complex.mk | 2 sw/Module_sw.mk | 1 sw/qa/complex/accessibility/AccessibleRelationSet.java | 219 --------------- sw/qa/extras/accessibility/accessible_relation_set.cxx | 246 +++++++++++++++++ 5 files changed, 306 insertions(+), 221 deletions(-)
New commits: commit b6d2d6db28eec4ab311c4223cf5be508feb2e057 Author: kadertarlan <kadertarl...@gmail.com> Date: Sun May 1 16:01:45 2016 +0300 tdf#45904 move java based api tests to c++ (AccessibleRelationSet) Change-Id: I2d9d72bbc845acf091570df663849495619ee765 Reviewed-on: https://gerrit.libreoffice.org/24563 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/CppunitTest_sw_accessible_relation_set.mk b/sw/CppunitTest_sw_accessible_relation_set.mk new file mode 100644 index 000000000000..0de87d256d44 --- /dev/null +++ b/sw/CppunitTest_sw_accessible_relation_set.mk @@ -0,0 +1,59 @@ +# -*- 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: diff --git a/sw/JunitTest_sw_complex.mk b/sw/JunitTest_sw_complex.mk index d39f39f22515..a4d7a08ec02b 100644 --- a/sw/JunitTest_sw_complex.mk +++ b/sw/JunitTest_sw_complex.mk @@ -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: diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index 8fb2836f70e6..01a67af503a9 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -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) diff --git a/sw/qa/complex/accessibility/AccessibleRelationSet.java b/sw/qa/complex/accessibility/AccessibleRelationSet.java deleted file mode 100644 index a2b2e2e506fe..000000000000 --- a/sw/qa/complex/accessibility/AccessibleRelationSet.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * 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(); -} diff --git a/sw/qa/extras/accessibility/accessible_relation_set.cxx b/sw/qa/extras/accessibility/accessible_relation_set.cxx new file mode 100644 index 000000000000..2ecb91fc2706 --- /dev/null +++ b/sw/qa/extras/accessibility/accessible_relation_set.cxx @@ -0,0 +1,246 @@ +/* -*- 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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits