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)
Dibuja una ventana con un título y un borde alrededor del elemento.
Element text(std::string_view text)
Muestra un fragmento de texto Unicode codificado en UTF8.
Element flex(Element child)
Hace que un elemento hijo se expanda proporcionalmente al espacio restante en un contenedor.
Definition flex.cpp:95
Element bold(Element child)
Utiliza una fuente en negrita, para elementos con más énfasis.
Definition bold.cpp:33
Element borderRounded(Element child)
Dibuja un borde redondeado alrededor del elemento.
Element emptyElement()
Definition dom/util.cpp:140
Element underlined(Element child)
Subraya el elemento dado.
Element inverted(Element child)
Agrega un filtro que invertirá los colores de primer plano y de fondo. colores.
Definition inverted.cpp:34
Element strikethrough(Element child)
Aplica un tachado al texto.
Element italic(Element child)
Aplica un doble subrayado al texto.
Definition italic.cpp:17
Element dbox(Elements children_)
Apila varios elementos uno encima de otro.
Element paragraph(std::string_view the_text)
Devuelve un elemento que dibuja el párrafo en varias líneas.
Element separator()
Dibuja una separación vertical u horizontal entre otros dos elementos.
Element filler()
Un elemento que se expandirá proporcionalmente al espacio restante en un contenedor.
Definition flex.cpp:70
Element dim(Element child)
Usa una fuente clara para elementos con menos énfasis.
Definition dim.cpp:33
Element blink(Element child)
El texto dibujado alterna entre visible y oculto.
Definition blink.cpp:33
Element gauge(float progress)
Dibuja una barra de progreso de alta definición.
Element border(Element child)
Dibuja un borde alrededor del elemento.
Element vbox(Elements children)
Un contenedor que muestra elementos verticalmente uno por uno.
Definition vbox.cpp:96
El espacio de nombres ftxui:: de FTXUI.
Definition animation.hpp:11
Element flexbox(Elements, FlexboxConfig config=FlexboxConfig())
Un contenedor que muestra elementos en filas/columnas y es capaz de ajustarse a la siguiente columna/...
Definition flexbox.cpp:252
std::shared_ptr< Node > Element
Definition elements.hpp:25
Element hbox(Elements children)
Un contenedor que muestra elementos horizontalmente uno por uno.
Definition hbox.cpp:94
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:95
void Render(Screen &screen, Node *node, Selection &selection)
Definition node.cpp:105
int value
Definition elements.hpp:195