emlabcpp
modern opinionated embedded C++ library
executor.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "./base.h"
27 #include "./interface.h"
28 
29 namespace emlabcpp::testing
30 {
31 
32 class executor
33 {
34  enum class phase : uint8_t
35  {
36  INIT,
37  SETUP,
38  RUN,
39  TEARDOWN,
40  FINISHED
41  };
42 
43 public:
45  : rid_( rid )
46  , mem_( mem )
47  , test_( test )
48  , coro_()
49  {
50  }
51 
52  [[nodiscard]] test_status status() const
53  {
54  return status_;
55  }
56 
57  [[nodiscard]] run_id get_run_id() const
58  {
59  return rid_;
60  }
61 
62  void tick()
63  {
64  switch ( phas_ ) {
65  case phase::INIT:
66  coro_ = test_.setup( mem_ );
67  phas_ = phase::SETUP;
68  break;
69  case phase::SETUP: {
70  if ( !coro_.done() ) {
71  coro_.tick();
72  break;
73  }
74  coro_state const s = coro_.get_state();
75  if ( s != coro_state::DONE ) {
76  status_ = status_cnv( coro_.get_state() );
77  phas_ = phase::FINISHED;
78  } else {
79  coro_ = coroutine< void >();
80  coro_ = test_.run( mem_ );
81  phas_ = phase::RUN;
82  }
83  break;
84  }
85  case phase::RUN:
86  if ( !coro_.done() ) {
87  coro_.tick();
88  break;
89  }
90  status_ = status_cnv( coro_.get_state() );
91  coro_ = coroutine< void >();
92  coro_ = test_.teardown( mem_ );
93  phas_ = phase::TEARDOWN;
94  break;
95  case phase::TEARDOWN:
96  if ( !coro_.done() ) {
97  coro_.tick();
98  break;
99  }
100  if ( coro_.get_state() == coro_state::ERRORED )
101  status_ = test_status::ERRORED;
102  coro_ = coroutine< void >();
103  phas_ = phase::FINISHED;
104  break;
105  case phase::FINISHED:
106  break;
107  }
108  }
109 
110  [[nodiscard]] bool finished() const
111  {
112  return phas_ == phase::FINISHED;
113  }
114 
115 private:
116  static test_status status_cnv( coro_state s )
117  {
118  switch ( s ) {
119  case coro_state::DONE:
120  return test_status::SUCCESS;
121  case coro_state::SKIPPED:
122  return test_status::SKIPPED;
123  case coro_state::FAILED:
124  return test_status::FAILED;
125  default:
126  break;
127  }
128  return test_status::ERRORED;
129  }
130 
131  run_id rid_;
133  pmr::memory_resource& mem_;
134  test_interface& test_;
135  coroutine< void > coro_;
136  phase phas_{ phase::INIT };
137 };
138 
139 } // namespace emlabcpp::testing
Definition: memory_resource.h:33
void tick() override
Definition: coroutine.h:137
coro_state get_state() const override
Definition: coroutine.h:107
bool done() const
Definition: coroutine.h:100
Definition: executor.h:33
test_status status() const
Definition: executor.h:52
run_id get_run_id() const
Definition: executor.h:57
void tick()
Definition: executor.h:62
bool finished() const
Definition: executor.h:110
executor(run_id const rid, pmr::memory_resource &mem, test_interface &test)
Definition: executor.h:44
Definition: interface.h:38
virtual coroutine< void > run(pmr::memory_resource &)=0
virtual coroutine< void > setup(pmr::memory_resource &)
virtual coroutine< void > teardown(pmr::memory_resource &)
MIT License.
Definition: base.h:37
test_status
Definition: base.h:62
coro_state
Definition: coroutine.h:36
uint32_t run_id
Definition: base.h:53