LUMIERA.clone/tests/gui/ctrl/element-access-test.cpp
Ichthyostega 20ecc3f0d0 DI: allow to trigger the lazy instantiation of a mock service instance directly
Basically the mocking mechanism just switches the configuration
and then waits for the service to be accessed in order to cause acutual
instantiation of the mock service implementation. But sometimes we want
to prepare and rig the mock instance prior to the first invocation;
in such cases it can be handy just to trigger the lazy creating process
2018-04-08 18:43:27 +02:00

165 lines
5 KiB
C++

/*
ElementAccess(Test) - verify mechanics of low-level UI element access
Copyright (C) Lumiera.org
2018, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file element-access-test.cpp
** unit test \ref ElementAccess_test
*/
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
//#include "gui/interact/view-spec-dsl.hpp"
#include "test/test-element-access.hpp"
#include "gui/interact/ui-coord.hpp"
//#include "gen-node-location-query.hpp"
#include "lib/depend-inject.hpp"
#include "lib/format-cout.hpp"
//#include "lib/idi/entry-id.hpp"
//#include "lib/diff/gen-node.hpp"
#include "lib/util.hpp"
//#include <string>
//#include <vector>
//using std::string;
//using lib::diff::MakeRec;
//using lib::diff::Rec;
//using lib::idi::EntryID;
//using lib::diff::GenNode;
using util::isSameObject;
//using util::isnil;
namespace gui {
namespace model {
namespace test {
// using lumiera::error::LUMIERA_ERROR_WRONG_TYPE;
// using lib::test::showSizeof;
using interact::UICoord;
using MockAccess = lib::DependInject<ElementAccess>::Local<TestElementAccess>;
using AccessAPI = lib::Depend<ElementAccess>;
namespace { //Test fixture...
class DummyWidget
: ::util::NonCopyable
{
protected:
virtual ~DummyWidget() { } ///< is an interface
};
class DummyTab
: public DummyWidget
{ };
}//(End)Test fixture
/******************************************************************************//**
* @test verify the usage pattern of low-level UI element access, based on a
* mock implementation of the accessor directory.
* @todo 4/2018 in the course of establishing an UI backbone, it is sufficient
* just to _have_ that abstraction interface; so the test focuses merely
* on the invocation, and documents how the mock be used. Which is a
* prerequisite to get the ViewSpecDSL_test finished. The intention is
* to elaborate the mock in a second step later and use it to build a
* draft of the implementation mechanics, but based on `Rec<GenNode>`
* rather than on the real UI topology.
* @see GenNodeLocationQuery
*
* @see id-scheme.hpp
* @see ViewLocator
* @see ViewSpecDSL_test
*/
class ElementAccess_test : public Test
{
virtual void
run (Arg)
{
verify_simpleAccess();
verify_standardUsage();
verify_alternatives();
verify_genericInvocation();
}
/** @test simple access to an existing element designated by coordinates */
void
verify_simpleAccess()
{
MockAccess fakeDirectory;
auto location = UICoord{"win-1","persp-A","thePanel","someView","tab#5"};
DummyTab dummyTab;
fakeDirectory.triggerCreate();
fakeDirectory->expectedQuery = location;
fakeDirectory->expectedAnswer = &dummyTab;
AccessAPI accessAPI;
auto answer = accessAPI().access<DummyWidget> (location);
CHECK (answer.isValid());
DummyWidget& widget = answer;
CHECK (INSTANCEOF (DummyTab, &widget));
CHECK (isSameObject (widget, dummyTab));
}
void
verify_standardUsage()
{
}
void
verify_alternatives()
{
UNIMPLEMENTED ("querying and selection of location alternatives");
}
void
verify_genericInvocation()
{
/////////////////////////////////////////////////////////////////////////////////////////TICKET 1134 : how to create ViewLocator mock without global context??
//-------------------------------------------------------------Test-Fixture
//--------------------------------------------------------------(End)Test-Fixture
// ErrorLogView errorLog = viwLocator.get<ErrorLogView>();
// TimelineView timeline = viwLocator.get<TimelineView>();
/////////////////////////////////////////////////////////////////////////////////////////TICKET 1134 : use an EventLog to verify the forwarded invocations??
}
};
/** Register this test class... */
LAUNCHER (ElementAccess_test, "unit gui");
}}} // namespace gui::model::test