// Copyright 2021 Arthur Sonzogni. All rights reserved. // Use of this source code is governed by the MIT license that can be found in // the LICENSE file. #include // for Test, TestInfo (ptr only), TEST, EXPECT_EQ, Message, TestPartResult #include // for raise, SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM #include // for Event, Event::Custom #include // for _Swallow_assign, ignore #include "ftxui/component/component.hpp" // for Renderer #include "ftxui/component/screen_interactive.hpp" #include "ftxui/dom/elements.hpp" // for text, Element namespace ftxui { namespace { bool TestSignal(int signal) { int called = 0; // The tree of components. This defines how to navigate using the keyboard. auto component = Renderer([&] { called++; std::ignore = std::raise(signal); called++; return text(""); }); auto screen = ScreenInteractive::FitComponent(); screen.Loop(component); EXPECT_EQ(called, 2); return true; } } // namespace TEST(ScreenInteractive, Signal_SIGTERM) { TestSignal(SIGTERM); } TEST(ScreenInteractive, Signal_SIGSEGV) { TestSignal(SIGSEGV); } TEST(ScreenInteractive, Signal_SIGINT) { TestSignal(SIGINT); } TEST(ScreenInteractive, Signal_SIGILL) { TestSignal(SIGILL); } TEST(ScreenInteractive, Signal_SIGABRT) { TestSignal(SIGABRT); } TEST(ScreenInteractive, Signal_SIGFPE) { TestSignal(SIGFPE); } // Regression test for: // https://github.com/ArthurSonzogni/FTXUI/issues/402 TEST(ScreenInteractive, PostEventToNonActive) { auto screen = ScreenInteractive::FitComponent(); screen.Post(Event::Custom); } // Regression test for: // https://github.com/ArthurSonzogni/FTXUI/issues/402 TEST(ScreenInteractive, PostTaskToNonActive) { auto screen = ScreenInteractive::FitComponent(); screen.Post([] {}); } TEST(ScreenInteractive, CtrlC) { auto screen = ScreenInteractive::FitComponent(); bool called = false; auto component = Renderer([&] { if (!called) { called = true; screen.PostEvent(Event::CtrlC); } return text(""); }); screen.Loop(component); } TEST(ScreenInteractive, CtrlC_Forced) { auto screen = ScreenInteractive::FitComponent(); screen.ForceHandleCtrlC(true); auto component = Renderer([&] { screen.PostEvent(Event::CtrlC); return text(""); }); int ctrl_c_count = 0; component |= CatchEvent([&](Event event) { if (event != Event::CtrlC) { return false; } ++ctrl_c_count; if (ctrl_c_count == 100) { return false; } return true; }); screen.Loop(component); ASSERT_LE(ctrl_c_count, 50); } TEST(ScreenInteractive, CtrlC_NotForced) { auto screen = ScreenInteractive::FitComponent(); screen.ForceHandleCtrlC(false); auto component = Renderer([&] { screen.PostEvent(Event::CtrlC); return text(""); }); int ctrl_c_count = 0; component |= CatchEvent([&](Event event) { if (event != Event::CtrlC) { return false; } ++ctrl_c_count; if (ctrl_c_count == 100) { return false; } return true; }); screen.Loop(component); ASSERT_GE(ctrl_c_count, 50); } } // namespace ftxui