FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
component_fuzzer.cpp
Go to the documentation of this file.
1// Copyright 2021 Arthur Sonzogni. All rights reserved.
2// このソースコードの使用は、LICENSE ファイルにある MIT ライセンスによって管理されています。
3#include <cassert>
5#include <vector>
8
9using namespace ftxui;
10namespace {
11
12bool GeneratorBool(const char*& data, size_t& size) {
13 if (size == 0) {
14 return false;
15 }
16
17 auto out = bool(data[0] % 2);
18 data++;
19 size--;
20 return out;
21}
22
23std::string GeneratorString(const char*& data, size_t& size) {
24 int index = 0;
25 while (index < size && data[index]) {
26 ++index;
27 }
28
29 auto out = std::string(data, data + index);
30 data += index;
31 size -= index;
32
33 // 入力コンポーネントはまだ無効な UTF8 をサポートしていません。
34 try {
35 to_wstring(out);
36 } catch (...) {
37 return "0";
38 }
39 return std::move(out);
40}
41
42int GeneratorInt(const char* data, size_t size) {
43 if (size == 0) {
44 return 0;
45 }
46 auto out = int(data[0]);
47 data++;
48 size--;
49 return out;
50}
51
52Color GeneratorColor(const char* data, size_t size) {
53 return Color::RGB(GeneratorInt(data, size), GeneratorInt(data, size),
54 GeneratorInt(data, size));
55}
56
57AnimatedColorOption GeneratorAnimatedColorOption(const char* data,
58 size_t size) {
60 option.enabled = GeneratorBool(data, size);
61 option.inactive = GeneratorColor(data, size);
62 option.active = GeneratorColor(data, size);
63 option.duration = std::chrono::milliseconds(GeneratorInt(data, size));
64 return option;
65}
66
67AnimatedColorsOption GeneratorAnimatedColorsOptions(const char* data,
68 size_t size) {
70 option.background = GeneratorAnimatedColorOption(data, size);
71 option.foreground = GeneratorAnimatedColorOption(data, size);
72 return option;
73}
74
75ButtonOption GeneratorButtonOption(const char* data, size_t size) {
76 ButtonOption option;
77 option.animated_colors = GeneratorAnimatedColorsOptions(data, size);
78 return option;
79}
80
81UnderlineOption GeneratorUnderlineOption(const char* data, size_t size) {
82 UnderlineOption option;
83 option.enabled = GeneratorBool(data, size);
84 option.color_active = GeneratorColor(data, size);
85 option.color_inactive = GeneratorColor(data, size);
86 option.leader_duration = std::chrono::milliseconds(GeneratorInt(data, size));
87 option.follower_duration =
88 std::chrono::milliseconds(GeneratorInt(data, size));
89 option.leader_delay = std::chrono::milliseconds(GeneratorInt(data, size));
90 option.follower_delay = std::chrono::milliseconds(GeneratorInt(data, size));
91 return option;
92}
93
94MenuEntryOption GeneratorMenuEntryOption(const char* data, size_t size) {
95 MenuEntryOption option;
96 option.animated_colors = GeneratorAnimatedColorsOptions(data, size);
97 return option;
98}
99
100MenuOption GeneratorMenuOption(const char* data, size_t size) {
101 MenuOption option;
102 option.underline = GeneratorUnderlineOption(data, size);
103 option.entries_option = GeneratorMenuEntryOption(data, size);
104 option.direction = static_cast<Direction>(GeneratorInt(data, size) % 4);
105 return option;
106}
107
108bool g_bool;
109int g_int;
110std::vector<std::string> g_list;
111
112Components GeneratorComponents(const char*& data, size_t& size, int depth);
113
114Component GeneratorComponent(const char*& data, size_t& size, int depth) {
115 depth--;
116 int value = GeneratorInt(data, size);
117 if (depth <= 0) {
118 return Button(GeneratorString(data, size), [] {});
119 }
120
121 constexpr int value_max = 19;
122 value = (value % value_max + value_max) % value_max;
123 switch (value) {
124 case 0:
125 return Button(
126 GeneratorString(data, size), [] {},
127 GeneratorButtonOption(data, size));
128 case 1:
129 return Checkbox(GeneratorString(data, size), &g_bool);
130 case 2:
131 return Input(GeneratorString(data, size), GeneratorString(data, size));
132 case 3:
133 return Menu(&g_list, &g_int, GeneratorMenuOption(data, size));
134 case 4:
135 return Radiobox(&g_list, &g_int);
136 case 5:
137 return Toggle(&g_list, &g_int);
138 case 6:
139 return Slider(GeneratorString(data, size), &g_int,
140 GeneratorInt(data, size), GeneratorInt(data, size),
141 GeneratorInt(data, size));
142 case 7:
143 return ResizableSplitLeft(GeneratorComponent(data, size, depth - 1),
144 GeneratorComponent(data, size, depth - 1),
145 &g_int);
146 case 8:
147 return ResizableSplitRight(GeneratorComponent(data, size, depth - 1),
148 GeneratorComponent(data, size, depth - 1),
149 &g_int);
150 case 9:
151 return ResizableSplitTop(GeneratorComponent(data, size, depth - 1),
152 GeneratorComponent(data, size, depth - 1),
153 &g_int);
154 case 10:
155 return ResizableSplitBottom(GeneratorComponent(data, size, depth - 1),
156 GeneratorComponent(data, size, depth - 1),
157 &g_int);
158 case 11:
159 return Container::Vertical(GeneratorComponents(data, size, depth - 1));
160
161 case 12:
162 return Container::Vertical(GeneratorComponents(data, size, depth - 1),
163 &g_int);
164
165 case 13:
166 return Container::Horizontal(GeneratorComponents(data, size, depth - 1));
167 case 14:
168 return Container::Horizontal(GeneratorComponents(data, size, depth - 1),
169 &g_int);
170 case 15:
171 return Container::Tab(GeneratorComponents(data, size, depth - 1), &g_int);
172 case 16:
173 return Maybe(GeneratorComponent(data, size, depth - 1), &g_bool);
174 case 17:
175 return Dropdown(&g_list, &g_int);
176 case 18:
177 return Collapsible(GeneratorString(data, size),
178 GeneratorComponent(data, size, depth - 1),
179 GeneratorBool(data, size));
180 default:
181 assert(false);
182 }
183}
184
185Components GeneratorComponents(const char*& data, size_t& size, int depth) {
186 Components out;
187 if (depth > 0) {
188 while (size && GeneratorInt(data, size) % 2) {
189 out.push_back(GeneratorComponent(data, size, depth - 1));
190 }
191 }
192 return std::move(out);
193}
194
195} // namespace
196extern "C" int LLVMFuzzerTestOneInput(const char* data, size_t size) {
197 g_bool = GeneratorBool(data, size);
198 g_int = GeneratorInt(data, size);
199 g_list = {
200 "test_1", "test_2", "test_3", "test_4", "test_5",
201 };
202
203 int depth = 10;
204 auto component = GeneratorComponent(data, size, depth);
205
206 int width = GeneratorInt(data, size);
207 int height = GeneratorInt(data, size);
208
209 width %= 500;
210 width += 500;
211
212 height %= 500;
213 height += 500;
214
215 auto screen =
216 Screen::Create(Dimension::Fixed(width), Dimension::Fixed(height));
217
218 // いくつかのイベントを生成します。
219 std::vector<Event> events;
220 auto parser =
221 TerminalInputParser([&](const Event& event) { events.push_back(event); });
222
223 for (size_t i = 0; i < size; ++i) {
224 parser.Add(data[i]);
225 }
226
227 for (const auto& event : events) {
228 component->OnEvent(event);
229 auto document = component->Render();
230 Render(screen, document);
231 }
232 return 0; // ゼロ以外の戻り値は将来の使用のために予約されています。
233}
int LLVMFuzzerTestOneInput(const char *data, size_t size)
animation::Duration follower_duration
MenuEntryOption entries_option
animation::Duration follower_delay
UnderlineOption underline
animation::Duration leader_duration
AnimatedColorsOption animated_colors
animation::Duration leader_delay
Component Maybe(Component, const bool *show)
コンポーネント|child|を装飾します。|show|がtrueの場合にのみ表示されます。
Component ResizableSplitTop(Component main, Component back, int *main_size)
2つのコンポーネント間の垂直分割。マウスで設定可能。
Component Menu(MenuOption options)
テキストのリスト。フォーカスされた要素が選択されます。
Component Toggle(ConstStringListRef entries, int *selected)
要素の水平リスト。ユーザーはこれらを操作できます。
Component Radiobox(RadioboxOption options)
1つだけ選択できる要素のリスト。
Component Button(ButtonOption options)
Draw a button. Execute a function when clicked. (ja: ボタンを描画します。クリックされたときに機能を実行します。)
Component ResizableSplitRight(Component main, Component back, int *main_size)
2つのコンポーネント間の水平分割。マウスで設定可能。
Component Dropdown(ConstStringListRef entries, int *selected)
ドロップダウンメニュー。
Component ResizableSplitBottom(Component main, Component back, int *main_size)
2つのコンポーネント間の垂直分割。マウスで設定可能。
Component Checkbox(CheckboxOption options)
チェック可能な要素を描画します。
Component ResizableSplitLeft(Component main, Component back, int *main_size)
2つのコンポーネント間の水平分割。マウスで設定可能。
アニメーション化された可能性のある色に関するオプション。
AnimatedButtonコンポーネントのオプション。
イベントを表します。キープレスイベント、ターミナルのリサイズなど、さまざまなイベントがあります。
Definition event.hpp:28
MenuEntryコンポーネントのオプション。
Menuコンポーネントのオプション。
下線効果のオプション。
Direction
Directionは、東西南北の4つの基本方向を表す列挙型です。
Definition direction.hpp:11
void Render(Screen &screen, const Element &element)
要素をftxui::Screenに表示します。
Definition node.cpp:84
static Screen Create(Dimensions dimension)
指定された次元を持つスクリーンを作成します。
Definition screen.cpp:394
static Color RGB(uint8_t red, uint8_t green, uint8_t blue)
RGB表現から色を構築します。 https://en.wikipedia.org/wiki/RGB_color_model.
Colorは、ターミナルユーザーインターフェースにおける色を表すクラスです。
Definition color.hpp:25
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
std::vector< Component > Components
std::wstring to_wstring(const std::string &s)
Component Collapsible(ConstStringRef label, Component child, Ref< bool > show=false)
折りたたみ可能なコンポーネント。矢印付きのチェックボックスを表示します。アクティブ化されると、子が 表示されます。
Component Input(InputOption options={})
Component Slider(SliderOption< T > options)
どの方向にも対応するスライダー。
std::shared_ptr< ComponentBase > Component
return size
Definition string.cpp:1516