diff --git a/tests/core/steam/engine/job-planning-setup-test.cpp b/tests/core/steam/engine/job-planning-setup-test.cpp
index 26d10722a..2c5ba9803 100644
--- a/tests/core/steam/engine/job-planning-setup-test.cpp
+++ b/tests/core/steam/engine/job-planning-setup-test.cpp
@@ -26,11 +26,13 @@
#include "lib/test/run.hpp"
-#include "lib/error.hpp"
+#include "lib/test/test-helper.hpp"
#include "steam/engine/mock-dispatcher.hpp"
#include "vault/engine/dummy-job.hpp"
#include "lib/format-cout.hpp"///////////////////////TODO
+#include "lib/iter-tree-explorer.hpp"
+#include "lib/format-util.hpp"
//#include "steam/engine/job-planning.hpp"
@@ -38,6 +40,10 @@
using test::Test;
//using std::rand;
+using lib::eachNum;
+using lib::treeExplore;
+using lib::time::PQuant;
+using lib::time::FrameRate;
namespace steam {
@@ -45,9 +51,24 @@ namespace engine{
namespace test {
using vault::engine::DummyJob;
+ using lib::time::FixedFrameQuantiser;
namespace { // test fixture...
+ /** Diagnostic helper: join all the elements from some given container or iterable */
+ template
+ inline string
+ materialise (II&& ii)
+ {
+ return util::join (std::forward (ii), "-");
+ }
+
+ inline PQuant
+ frameGrid (FrameRate fps)
+ {
+ return PQuant (new FixedFrameQuantiser (fps));
+ }
+
} // (End) test fixture
@@ -75,7 +96,6 @@ namespace test {
run (Arg)
{
demonstrateScaffolding();
- UNIMPLEMENTED ("shape the interface of the job-planning pipeline");
buildBaseTickGenerator();
accessTopLevelJobTicket();
exploreJobTickets();
@@ -130,11 +150,24 @@ namespace test {
/** @test use the Dispatcher interface (mocked) to generate a frame »beat«
+ * - demonstrate explicitly the mapping of a (frame) number sequence
+ * onto a sequence of time points with the help of time quantisation
* @remark this is the foundation to generate top-level frame render jobs
*/
void
buildBaseTickGenerator()
{
+ auto grid = frameGrid(FrameRate::PAL);
+
+ CHECK (materialise (
+ treeExplore (eachNum(5,13))
+ .transform([&](FrameCnt frameNr) -> TimeVar
+ {
+ return grid->timeOf (frameNr);
+ })
+ )
+ == "200ms-240ms-280ms-320ms-360ms-400ms-440ms-480ms"_expect);
+
UNIMPLEMENTED ("foundation of state core");
}
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index 82846a6c9..caa850860 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -56926,17 +56926,20 @@
-
-
-
-
+
+
+
+
-
+
-
+
+
+
+
@@ -56959,11 +56962,12 @@
-
-
+
+
-
-
+
+
+
@@ -56984,12 +56988,28 @@
-
+
+
+
+
+
+
+
+
+
+
+ einfach und minimalistisch implementiert — und zudem sind undendliche Folgen nur etwas für Mathematiker und Freunde der funktionalen Programmierung; in der Praxis braucht man zwingend stets eine Abbruch-Bedingung, allein schon weil sonst die Engine „Amok laufen“ könnte (man bedenke nur, daß die interne Zeit-Repräsentation bereits lange vor der Frame-Nummer wrappt)
+
+
+
+
+
-
+
+
@@ -57000,29 +57020,16 @@
-
-
-
-
-
-
-
-
- denn der Standard-Fall ist die unendliche Sequenz — und diese darf keinerlei unnötigen Ballast haben; weder einen Funktor (storage!), noch einen letztlich unnötigen Prädikat-Aufruf (denn sie läuft „für immer“)
-
-
-
-
-
-
-
-
+
+
+
+
-
+
@@ -57038,21 +57045,33 @@
+
-
+
-
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
@@ -73258,8 +73277,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
-
+
+
@@ -73371,9 +73390,27 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ allein schon, weil wir eine limitierte Domäne haben bezüglich lib::time::Time
+
+
+
+
+
+
@@ -73467,7 +73504,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -73478,8 +73515,14 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
+
+
+
+
+