LUMIERA.clone/tests/gui/interact/ui-coord-test.cpp

248 lines
7.3 KiB
C++
Raw Normal View History

/*
UICoord(Test) - properties of topological UI coordinate specifications
Copyright (C) Lumiera.org
2017, 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 ui-coord-test.cpp
** unit test \ref UICoord_test
*/
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "gui/interact/ui-coord.hpp"
#include "lib/format-cout.hpp"
#include "lib/format-util.hpp"
//#include "lib/idi/entry-id.hpp"
//#include "lib/diff/gen-node.hpp"
#include "lib/util.hpp"
#include <string>
using std::string;
//using lib::idi::EntryID;
//using lib::diff::GenNode;
//using util::isSameObject;
using util::isnil;
using util::join;
namespace gui {
namespace interact {
namespace test {
// using lumiera::error::LUMIERA_ERROR_WRONG_TYPE;
using lumiera::error::LUMIERA_ERROR_INDEX_BOUNDS;
using lumiera::error::LUMIERA_ERROR_LOGIC;
namespace { //Test fixture...
}//(End)Test fixture
/******************************************************************************//**
* @test verify the mechanics of a functor based internal DSL
* to configure access and allocation patters for component views.
*
* @see id-scheme.hpp
* @see ViewLocator
* @see UICoord_test
*/
class UICoord_test : public Test
{
virtual void
run (Arg)
{
2017-09-23 17:55:40 +02:00
verify_basics();
verify_builder();
verify_comparisons();
verify_queryAnchor();
verify_queryCoverage();
verify_mutateAnchor();
verify_mutateCover();
verify_mutateExtend();
verify_mutateCreate();
}
void
2017-09-23 17:55:40 +02:00
verify_basics()
{
UICoord undef;
CHECK (isnil (undef));
UICoord uic{"Γ","Δ","Θ","Ξ","Σ","Ψ","Φ","Ω"};
CHECK (not isnil (uic));
CHECK (8 == uic.size());
// path is iterable
CHECK ("ΓΔΘΞΣΨΦΩ" == join(uic,""));
// indexed access
CHECK ("Γ" == uic[UIC_WINDOW]);
CHECK ("Δ" == uic[UIC_PERSP]);
CHECK ("Θ" == uic[UIC_PANEL]);
CHECK ("Ξ" == uic[UIC_VIEW]);
CHECK ("Σ" == uic[UIC_TAB]);
CHECK ("Ψ" == uic[UIC_PART]);
CHECK ("Φ" == uic[UIC_PART+1]);
CHECK ("Ω" == uic[UIC_PART+2]);
// iteration matches index order
uint i=0;
for (UICoord::iterator ii = uic.begin(); ii; ++ii, ++i)
CHECK (uic[i] == *ii);
CHECK (8 == i);
VERIFY_ERROR (INDEX_BOUNDS, uic[8]);
// string representation
CHECK ("UI:Γ[Δ]-Θ.Ξ.Σ/Ψ/Φ/Ω" == string(uic));
CHECK ("Γ[Δ]-Θ.Ξ.Σ" == uic.getComp());
CHECK ("Ψ/Φ/Ω" == uic.getPath());
// new value can be assigned, but not altered in place
uic = UICoord{nullptr,nullptr,"Θ",nullptr,nullptr,nullptr,"Φ"};
CHECK (7 == uic.size());
// representation is trimmed and filled
CHECK ("UI:Θ.*.*/*/Φ" == string(uic));
CHECK (NULL == uic[UIC_WINDOW]);
CHECK (NULL == uic[UIC_PERSP]);
CHECK ("Θ" == uic[UIC_PANEL]);
CHECK ("*" == uic[UIC_VIEW]);
CHECK ("*" == uic[UIC_TAB]);
CHECK ("*" == uic[UIC_PART]);
CHECK ("Φ" == uic[UIC_PART+1]);
VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PART+2]);
}
void
2017-09-23 17:55:40 +02:00
verify_builder()
{
UICoord uic1 = UICoord::window("window");
UICoord uic2 = uic2.view("view");
CHECK ("UI:window" == string(uic1));
CHECK ("UI:window[*]-*.view" == string(uic2));
CHECK (1 == uic1.size());
CHECK (4 == uic2.size());
// fault-tolerant accessors for the generic part
CHECK ("window" == uic1.getWindow());
CHECK ("window" == uic2.getWindow());
CHECK ("" == uic1.getPersp());
CHECK ("*" == uic2.getPersp());
CHECK ("" == uic1.getPanel());
CHECK ("*" == uic2.getPanel());
CHECK ("" == uic1.getView());
CHECK ("view" == uic2.getView());
CHECK ("" == uic1.getTab());
CHECK ("" == uic2.getTab());
CHECK ("" == uic1.getPath());
CHECK ("" == uic2.getPath());
CHECK ("window" == uic1.getComp());
CHECK ("window[*]-*.view" == uic2.getComp());
VERIFY_ERROR (INDEX_BOUNDS, uic1[UIC_PERSP]);
VERIFY_ERROR (INDEX_BOUNDS, uic2[UIC_TAB]);
UICoord uic3 = UICoord::view("view");
CHECK (4 == uic3.size());
CHECK ("UI:?.view" == string(uic3));
CHECK ("" == uic3.getWindow());
CHECK ("" == uic3.getPersp());
CHECK ("" == uic3.getPanel());
CHECK ("view" == uic3.getView());
UICoord uic4 = uic3.persp("persp");
CHECK (4 == uic4.size());
CHECK ("UI:?[persp]-*.view" == string(uic4));
uic4 = uic3.append("tab");
CHECK (5 == uic4.size());
CHECK ("UI:?.view.tab" == string(uic4));
uic4 = uic3.prepend("panel");
CHECK (4 == uic4.size());
CHECK ("UI:?-panel.view" == string(uic4));
VERIFY_ERROR(LOGIC, uic1.prepend("root"));
2017-09-23 17:55:40 +02:00
UNIMPLEMENTED ("verify the UI coordinate builder DSL");
}
void
verify_comparisons()
{
UNIMPLEMENTED ("verify comparison of UI coordinates");
}
void
verify_queryAnchor()
{
UNIMPLEMENTED ("query anchorage of given UI coordinates");
}
void
verify_queryCoverage()
{
UNIMPLEMENTED ("query coverage of given UI coordinates with respect to actual UI");
}
void
verify_mutateAnchor()
{
UNIMPLEMENTED ("mutate given UI coordinates by anchoring them");
}
void
verify_mutateCover()
{
UNIMPLEMENTED ("mutate given UI coordinates by reducing to covered part");
}
void
verify_mutateExtend()
{
UNIMPLEMENTED ("mutate given UI coordinates by uncovered extension");
}
void
verify_mutateCreate()
{
UNIMPLEMENTED ("mutate given UI coordinates by creating new components");
}
};
/** Register this test class... */
LAUNCHER (UICoord_test, "unit gui");
}}} // namespace gui::interact::test