FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
dom_layout_fuzzer.cpp
Go to the documentation of this file.
1// Copyright 2026 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4#include <cassert>
5#include <vector>
9
10using namespace ftxui;
11
12namespace {
13
14bool GeneratorBool(const char*& data, size_t& size) {
15 if (size == 0) {
16 return false;
17 }
18 auto out = bool(data[0] % 2);
19 data++;
20 size--;
21 return out;
22}
23
24std::string GeneratorString(const char*& data, size_t& size) {
25 int index = 0;
26 while (index < size && data[index]) {
27 ++index;
28 }
29 auto out = std::string(data, data + index);
30 data += index;
31 size -= index;
32 // Make sure it doesn't contain invalid UTF8
33 try {
34 to_wstring(out);
35 } catch (...) {
36 return "0";
37 }
38 return out;
39}
40
41int GeneratorInt(const char*& data, size_t& size) {
42 if (size == 0) {
43 return 0;
44 }
45 auto out = int(data[0]);
46 data++;
47 size--;
48 return out;
49}
50
51float GeneratorFloat(const char*& data, size_t& size) {
52 if (size == 0) {
53 return 0.0f;
54 }
55 auto out = float(data[0]) / 255.0f;
56 data++;
57 size--;
58 return out;
59}
60
61Elements GeneratorElements(const char*& data, size_t& size, int depth);
62
63Element GeneratorElement(const char*& data, size_t& size, int depth) {
64 depth--;
65 int value = GeneratorInt(data, size);
66 if (depth <= 0) {
67 int base_choice = value % 5;
68 if (base_choice == 0) {
69 return text(GeneratorString(data, size));
70 }
71 if (base_choice == 1) {
72 return paragraph(GeneratorString(data, size));
73 }
74 if (base_choice == 2) {
75 return separator();
76 }
77 if (base_choice == 3) {
78 return gauge(GeneratorFloat(data, size));
79 }
80 return emptyElement();
81 }
82
83 constexpr int value_max = 20;
84 value = (value % value_max + value_max) % value_max;
85 switch (value) {
86 case 0:
87 return text(GeneratorString(data, size));
88 case 1:
89 return paragraph(GeneratorString(data, size));
90 case 2:
91 return separator();
92 case 3:
93 return gauge(GeneratorFloat(data, size));
94 case 4:
95 return border(GeneratorElement(data, size, depth));
96 case 5:
97 return borderRounded(GeneratorElement(data, size, depth));
98 case 6:
99 return window(text(GeneratorString(data, size)),
100 GeneratorElement(data, size, depth));
101 case 7:
102 return vbox(GeneratorElements(data, size, depth));
103 case 8:
104 return hbox(GeneratorElements(data, size, depth));
105 case 9:
106 return dbox(GeneratorElements(data, size, depth));
107 case 10:
108 return flexbox(GeneratorElements(data, size, depth));
109 case 11:
110 return bold(GeneratorElement(data, size, depth));
111 case 12:
112 return dim(GeneratorElement(data, size, depth));
113 case 13:
114 return italic(GeneratorElement(data, size, depth));
115 case 14:
116 return inverted(GeneratorElement(data, size, depth));
117 case 15:
118 return underlined(GeneratorElement(data, size, depth));
119 case 16:
120 return blink(GeneratorElement(data, size, depth));
121 case 17:
122 return strikethrough(GeneratorElement(data, size, depth));
123 case 18:
124 return flex(GeneratorElement(data, size, depth));
125 case 19:
126 return filler();
127 default:
128 return emptyElement();
129 }
130}
131
132Elements GeneratorElements(const char*& data, size_t& size, int depth) {
133 Elements out;
134 if (depth > 0) {
135 while (size && (GeneratorInt(data, size) % 2)) {
136 out.push_back(GeneratorElement(data, size, depth - 1));
137 }
138 }
139 return out;
140}
141
142} // namespace
143
144extern "C" int LLVMFuzzerTestOneInput(const char* data, size_t size) {
145 if (size < 5) {
146 return 0;
147 }
148
149 int width = GeneratorInt(data, size);
150 int height = GeneratorInt(data, size);
151
152 width = (width % 200) + 1;
153 height = (height % 200) + 1;
154
155 int depth = 5;
156 auto element = GeneratorElement(data, size, depth);
157
158 auto screen =
159 Screen::Create(Dimension::Fixed(width), Dimension::Fixed(height));
160 Render(screen, element);
161 screen.ToString();
162
163 return 0;
164}
int LLVMFuzzerTestOneInput(const char *data, size_t size)
Element window(Element title, Element content, BorderStyle border=ROUNDED)
要素の周囲にタイトルとボーダーを持つウィンドウを描画します。
Element text(std::string_view text)
UTF8エンコードされたユニコードテキストを表示します。
Element flex(Element child)
子要素をコンテナに残されたスペースに比例して拡大させます。
Definition flex.cpp:93
Element bold(Element child)
より強調したい要素に、太字フォントを使用します。
Definition bold.cpp:33
Element borderRounded(Element child)
要素の周囲に角の丸いボーダーを描画します。
Element emptyElement()
Definition dom/util.cpp:140
Element underlined(Element child)
指定された要素に下線を追加します。
Element inverted(Element child)
前景色と背景色を反転させるフィルターを追加します。
Definition inverted.cpp:33
Element strikethrough(Element child)
テキストに打ち消し線を適用します。
Element italic(Element child)
テキストに二重下線を適用します。
Definition italic.cpp:17
Element dbox(Elements children_)
複数の要素を互いに重ねて表示する。
Element paragraph(std::string_view the_text)
段落を複数行で描画する要素を返します。
Element filler()
コンテナ内の残りのスペースに比例して拡大する要素。
Definition flex.cpp:69
Element dim(Element child)
強調を抑えたい要素に、明るいフォントを使用します。
Definition dim.cpp:33
Element blink(Element child)
描画されたテキストは、可視と非可視の間で交互に切り替わります。
Definition blink.cpp:33
Element gauge(float progress)
高精細プログレスバーを描画します。
Element border(Element child)
要素の周囲にボーダーを描画します。
Element vbox(Elements children)
要素を縦に一つずつ表示するコンテナ。
Definition vbox.cpp:95
FTXUI ftxui::名前空間
Definition animation.hpp:11
Element flexbox(Elements, FlexboxConfig config=FlexboxConfig())
行/列に要素を表示し、一杯になると次の列/行に折り返すことができるコンテナ。
Definition flexbox.cpp:249
std::shared_ptr< Node > Element
Definition elements.hpp:25
Element hbox(Elements children)
要素を水平方向に1つずつ表示するコンテナ。
Definition hbox.cpp:93
std::vector< Element > Elements
Definition elements.hpp:26
FTXUI_EXPORT(SCREEN) std FTXUI_EXPORT(SCREEN) std std::wstring to_wstring(T s)
Definition string.hpp:18
const Element & element
Definition node.hpp:94
void Render(Screen &screen, Node *node, Selection &selection)
Definition node.cpp:105
int value
Definition elements.hpp:192