lumiera_/tests/core/steam/fixture/fixture-segment-test.cpp
Ichthyostega d109f5e1fb bye bye Monad (closes #1276)
after completing the recent clean-up and refactoring work,
the monad based framework for recursive tree expansion
can be abandoned and retracted.

This approach from functional programming leads to code,
which is ''cool to write'' yet ''hard to understand.''

A second design attempt was based on the pipeline and decorator pattern
and integrates the monadic expansion as a special case, used here to
discover the prerequisites for a render job. This turned out to be
more effective and prolific and became standard for several exploring
and backtracking algorithms in Lumiera.
2023-06-22 20:23:55 +02:00

134 lines
4.9 KiB
C++

/*
FixtureSegment(Test) - verify properties of a single segment in the fixture
Copyright (C) Lumiera.org
2023, 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 fixture-segment-test.cpp
** unit test \ref FixtureSegment_test
*/
#include "lib/test/run.hpp"
#include "steam/fixture/node-graph-attachment.hpp"
#include "steam/engine/mock-dispatcher.hpp"
#include "steam/engine/exit-node.hpp"
#include "lib/util.hpp"
#include <utility>
namespace steam {
namespace fixture {
namespace test {
using std::move;
using util::isnil;
using util::isSameObject;
using engine::ExitNode;
using lib::diff::MakeRec;
using engine::Job;
using engine::JobTicket;
using engine::test::MockSegmentation;
/*****************************************************************************//**
* @test Verify properties and behaviour of a single Segment in the Segmentation
* - construction of a mocked Segment
* - on-demand allocation of a JobTicket for a ModelPort(index)
* @see steam::fixture::Segment
* @see JobPlanningPipeline_test
* @see MockSupport_test
*/
class FixtureSegment_test : public Test
{
virtual void
run (Arg)
{
fabricate_MockSegment();
retrieve_JobTicket();
}
/** @test setup a properly structured ExitNode graph using the
* specification scheme supported by MockSegmentation
* @see MockSupport_test::verify_MockSegmentation
*/
void
fabricate_MockSegment()
{
// Build a Segmentation partitioned at 10s
MockSegmentation segmentation{MakeRec()
.attrib ("start", Time{0,10}
,"mark", 101010)
.genNode()};
CHECK (2 == segmentation.size());
Segment const& seg = segmentation[Time{0,20}]; // access anywhere >= 10s
CHECK (Time(0,10) == seg.start());
CHECK (Time::NEVER == seg.after());
CHECK (101010 == seg.exitNode[0].getPipelineIdentity());
}
/** @test on-demand generate a JobTicket from an existing NodeGraphAttachment
*/
void
retrieve_JobTicket()
{
MockSegmentation segmentation{MakeRec()
.attrib("mark", 13) // top-level: marked with hash/id = 13
.scope(MakeRec() // ... defines two nested prerequisites
.attrib("mark",23) // + Prerequisite-1 hash/id = 23
.genNode()
,MakeRec()
.attrib("mark",55) // + Prerequisite-2 hash/id = 55
.genNode()
)
.genNode()};
CHECK (1 == segmentation.size()); // whole time axis covered by one segment
Segment const& seg = segmentation[Time::ANYTIME]; // thus accessed time point is irrelevant
// verify mapped JobTicket is assembled according to above spec...
auto getMarker = [](JobTicket& ticket)
{
Job job = ticket.createJobFor(Time::ANYTIME);
return job.parameter.invoKey.part.a;
};
JobTicket& ticket = seg.jobTicket(0);
CHECK (13 == getMarker (ticket));
auto prereq = ticket.getPrerequisites();
CHECK (not isnil(prereq));
CHECK (55 == getMarker (*prereq)); // Note: order of prerequisites is flipped (by LinkedElements)
++prereq;
CHECK (23 == getMarker (*prereq));
++prereq;
CHECK (isnil(prereq));
}
};
/** Register this test class... */
LAUNCHER (FixtureSegment_test, "unit fixture");
}}} // namespace steam::fixture::test