/* -*- 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 #include #include #include #include #include #include #include using namespace css; namespace { class LpSolverTest: public test::BootstrapFixture { uno::Reference m_xDocument; void test(); void testSolver(const uno::Reference& xSolver); public: virtual void setUp() override; virtual void tearDown() override; CPPUNIT_TEST_SUITE(LpSolverTest); CPPUNIT_TEST(test); CPPUNIT_TEST_SUITE_END(); }; void LpSolverTest::setUp() { test::BootstrapFixture::setUp(); uno::Reference xComponentLoader = frame::Desktop::create(m_xContext); uno::Reference xComponent(xComponentLoader->loadComponentFromURL( "private:factory/scalc", "_blank", 0, uno::Sequence < css::beans::PropertyValue >())); m_xDocument.set(xComponent, uno::UNO_QUERY_THROW); } void LpSolverTest::tearDown() { uno::Reference(m_xDocument, uno::UNO_QUERY_THROW)->dispose(); test::BootstrapFixture::tearDown(); } void LpSolverTest::test() { uno::Reference xEnAc( m_xContext->getServiceManager(), uno::UNO_QUERY_THROW); uno::Reference xEnum = xEnAc-> createContentEnumeration( "com.sun.star.sheet.Solver" ); CPPUNIT_ASSERT(xEnum.is()); sal_Int32 nCount = 0; while (xEnum->hasMoreElements()) { uno::Reference xIntFac; xEnum->nextElement() >>= xIntFac; CPPUNIT_ASSERT(xIntFac.is()); uno::Reference xInfo(xIntFac, uno::UNO_QUERY_THROW); const OUString sName(xInfo->getImplementationName()); uno::Reference xSolver(m_xContext->getServiceManager()-> createInstanceWithContext(sName, m_xContext), uno::UNO_QUERY_THROW); testSolver(xSolver); uno::Reference xDesc(xSolver, uno::UNO_QUERY_THROW); const OString sMessage("Empty description for " + OUStringToOString(sName, RTL_TEXTENCODING_UTF8)); CPPUNIT_ASSERT_MESSAGE(sMessage.getStr(), !xDesc->getComponentDescription().isEmpty()); ++nCount; } sal_Int32 nExpected = 0; #ifdef ENABLE_COINMP ++nExpected; #endif #ifdef ENABLE_LPSOLVE ++nExpected; #endif CPPUNIT_ASSERT_EQUAL(nExpected, nCount); } void LpSolverTest::testSolver(const uno::Reference& xSolver) { table::CellAddress aObjective(0, 0, 0); // "changing cells" - unknown variables uno::Sequence aVariables(1); aVariables[0] = table::CellAddress(0, 0, 0); // constraints uno::Sequence aConstraints(1); aConstraints[0].Left = table::CellAddress(0, 0, 0); aConstraints[0].Operator = sheet::SolverConstraintOperator_LESS_EQUAL; aConstraints[0].Right <<= 5.0; // initialize solver xSolver->setDocument( m_xDocument ); xSolver->setObjective( aObjective ); xSolver->setVariables( aVariables ); xSolver->setConstraints( aConstraints ); xSolver->setMaximize( true ); // test results xSolver->solve(); CPPUNIT_ASSERT(xSolver->getSuccess()); uno::Sequence aSolution = xSolver->getSolution(); CPPUNIT_ASSERT_EQUAL(aSolution.getLength(), aVariables.getLength()); CPPUNIT_ASSERT_EQUAL(aSolution[0], (double)5.0); } CPPUNIT_TEST_SUITE_REGISTRATION(LpSolverTest); } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */