1616#include < optional>
1717#include < sstream>
1818#include < string>
19+ #include < string_view>
1920
2021#ifdef _MSC_VER
2122// clang-format off
2425#include < minwindef.h>
2526#include < processenv.h>
2627#include < WinBase.h>
28+ #include < winnls.h>
2729// clang-format on
2830#endif
2931
@@ -133,6 +135,23 @@ namespace cucumber_cpp::library::report
133135
134136 return out.str ();
135137 }
138+
139+ std::string Repeat (std::string_view input, std::size_t count)
140+ {
141+ std::string result;
142+ result.reserve (input.size () * count);
143+ for (std::size_t i = 0 ; i < count; ++i)
144+ result += input;
145+ return result;
146+ }
147+ }
148+
149+ StdOutReport::StdOutReport ()
150+ {
151+ #ifdef _MSC_VER
152+ SetConsoleOutputCP (CP_UTF8);
153+ SetConsoleCP (CP_UTF8);
154+ #endif
136155 }
137156
138157 void StdOutReport::FeatureStart (const engine::FeatureInfo& featureInfo)
@@ -163,9 +182,19 @@ namespace cucumber_cpp::library::report
163182 << scenarioInfo.Title ();
164183 }
165184
166- void StdOutReport::ScenarioEnd (engine::Result result, const engine::ScenarioInfo& scenarioInfo, TraceTime::Duration /* duration*/ )
185+ void StdOutReport::ScenarioEnd (engine::Result result, const engine::ScenarioInfo& scenarioInfo, TraceTime::Duration duration)
167186 {
168- std::cout << " \n " ;
187+
188+ using enum engine::Result;
189+
190+ std::cout << " \n "
191+ << " \\ -> " ;
192+
193+ auto & coloured = ((result == passed) ? std::cout << TcGreen : std::cout << TcRed);
194+
195+ coloured << successLut.at (result)
196+ << " (" << ScaledDuration (duration) << " )"
197+ << TcDefault << ' \n ' ;
169198
170199 if (result != engine::Result::passed)
171200 {
@@ -176,6 +205,7 @@ namespace cucumber_cpp::library::report
176205 void StdOutReport::StepSkipped (const engine::StepInfo& stepInfo)
177206 {
178207 std::cout << " \n "
208+ << Repeat (" | " , nestedSteps)
179209 << TcCyan;
180210 std::cout << successLut.at (engine::Result::skipped) << " " << stepTypeLut.at (stepInfo.Type ()) << " " << stepInfo.Text ();
181211 std::cout << TcDefault;
@@ -184,20 +214,27 @@ namespace cucumber_cpp::library::report
184214 void StdOutReport::StepStart (const engine::StepInfo& stepInfo)
185215 {
186216 std::cout << " \n "
217+ << Repeat (" | " , nestedSteps)
187218 << stepTypeLut.at (stepInfo.Type ()) << " " << stepInfo.Text ()
188219 << std::flush;
220+ ++nestedSteps;
189221 }
190222
191223 void StdOutReport::StepEnd (engine::Result result, const engine::StepInfo& stepInfo, TraceTime::Duration duration)
192224 {
225+ --nestedSteps;
226+
193227 using enum engine::Result;
194228
229+ std::cout << " \n "
230+ << Repeat (" | " , nestedSteps) << " \\ -> " ;
231+
195232 if (result == passed)
196233 std::cout << TcGreen;
197234 else
198235 std::cout << TcRed;
199236
200- std::cout << " \n -> " << successLut.at (result);
237+ std::cout << successLut.at (result);
201238
202239 if (result != passed)
203240 std::cout << " " << stepInfo.ScenarioInfo ().FeatureInfo ().Path () << " :" << stepInfo.Line () << " :" << stepInfo.Column ();
0 commit comments