LUMIERA.clone/tests/gui/ctrl/element-access-test.cpp
Ichthyostega 22f50b1b00 ElementAccess: streamline error cases
My understanding is that in the standard use case, we precisely know what to expect
and just go ahead and perform the conversion. Thus it is pointless to introduce
fine grained distinctions. When the access fails, this always indicates some broken
application logic, and just raises an error.
2018-04-13 03:29:08 +02:00

169 lines
5.2 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 "test/mock-elm.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
: public gui::test::MockElm
{
protected:
virtual ~DummyWidget() { } ///< is an interface
DummyWidget()
: MockElm("DummyWidget")
{ }
};
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