FTXUI 7.0.0
C++ functional terminal UI.
Loading...
Searching...
No Matches
canvas_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 <cstddef>
5#include <string>
6#include <vector>
8
9using namespace ftxui;
10
11namespace {
12
13int GeneratorInt(const char*& data, size_t& size) {
14 if (size == 0) {
15 return 0;
16 }
17 auto out = int(data[0]);
18 data++;
19 size--;
20 return out;
21}
22
23bool GeneratorBool(const char*& data, size_t& size) {
24 if (size == 0) {
25 return false;
26 }
27 auto out = bool(data[0] % 2);
28 data++;
29 size--;
30 return out;
31}
32
33std::string GeneratorString(const char*& data, size_t& size) {
34 int index = 0;
35 while (index < size && data[index]) {
36 ++index;
37 }
38 auto out = std::string(data, data + index);
39 data += index;
40 size -= index;
41 return out;
42}
43
44} // namespace
45
46extern "C" int LLVMFuzzerTestOneInput(const char* data, size_t size) {
47 if (size < 5) {
48 return 0;
49 }
50
51 // Read canvas width and height
52 int width = GeneratorInt(data, size);
53 int height = GeneratorInt(data, size);
54
55 // Keep dimensions bounded but allow some small, zero, negative or moderately
56 // large values
57 width = (width % 100) - 10;
58 height = (height % 100) - 10;
59
60 Canvas canvas(width, height);
61
62 // Perform multiple drawing actions while data is available
63 while (size > 2) {
64 int action = GeneratorInt(data, size) % 15;
65 switch (action) {
66 case 0: {
67 int x = GeneratorInt(data, size);
68 int y = GeneratorInt(data, size);
69 canvas.DrawPointOn(x, y);
70 break;
71 }
72 case 1: {
73 int x = GeneratorInt(data, size);
74 int y = GeneratorInt(data, size);
75 canvas.DrawPointOff(x, y);
76 break;
77 }
78 case 2: {
79 int x = GeneratorInt(data, size);
80 int y = GeneratorInt(data, size);
81 canvas.DrawPointToggle(x, y);
82 break;
83 }
84 case 3: {
85 int x1 = GeneratorInt(data, size);
86 int y1 = GeneratorInt(data, size);
87 int x2 = GeneratorInt(data, size);
88 int y2 = GeneratorInt(data, size);
89 canvas.DrawPointLine(x1, y1, x2, y2);
90 break;
91 }
92 case 4: {
93 int x = GeneratorInt(data, size);
94 int y = GeneratorInt(data, size);
95 int r = GeneratorInt(data, size) % 30;
96 canvas.DrawPointCircle(x, y, r);
97 break;
98 }
99 case 5: {
100 int x = GeneratorInt(data, size);
101 int y = GeneratorInt(data, size);
102 int r = GeneratorInt(data, size) % 30;
103 canvas.DrawPointCircleFilled(x, y, r);
104 break;
105 }
106 case 6: {
107 int x = GeneratorInt(data, size);
108 int y = GeneratorInt(data, size);
109 int r1 = GeneratorInt(data, size) % 30;
110 int r2 = GeneratorInt(data, size) % 30;
111 canvas.DrawPointEllipse(x, y, r1, r2);
112 break;
113 }
114 case 7: {
115 int x = GeneratorInt(data, size);
116 int y = GeneratorInt(data, size);
117 int r1 = GeneratorInt(data, size) % 30;
118 int r2 = GeneratorInt(data, size) % 30;
119 canvas.DrawPointEllipseFilled(x, y, r1, r2);
120 break;
121 }
122 case 8: {
123 int x = GeneratorInt(data, size);
124 int y = GeneratorInt(data, size);
125 canvas.DrawBlockOn(x, y);
126 break;
127 }
128 case 9: {
129 int x1 = GeneratorInt(data, size);
130 int y1 = GeneratorInt(data, size);
131 int x2 = GeneratorInt(data, size);
132 int y2 = GeneratorInt(data, size);
133 canvas.DrawBlockLine(x1, y1, x2, y2);
134 break;
135 }
136 case 10: {
137 int x = GeneratorInt(data, size);
138 int y = GeneratorInt(data, size);
139 int r = GeneratorInt(data, size) % 30;
140 canvas.DrawBlockCircle(x, y, r);
141 break;
142 }
143 case 11: {
144 int x = GeneratorInt(data, size);
145 int y = GeneratorInt(data, size);
146 int r = GeneratorInt(data, size) % 30;
147 canvas.DrawBlockCircleFilled(x, y, r);
148 break;
149 }
150 case 12: {
151 int x = GeneratorInt(data, size);
152 int y = GeneratorInt(data, size);
153 std::string s = GeneratorString(data, size);
154 canvas.DrawText(x, y, s);
155 break;
156 }
157 case 13: {
158 int x = GeneratorInt(data, size);
159 int y = GeneratorInt(data, size);
160 canvas.GetCell(x, y);
161 break;
162 }
163 case 14: {
164 int x = GeneratorInt(data, size);
165 int y = GeneratorInt(data, size);
166 bool val = GeneratorBool(data, size);
167 canvas.DrawPoint(x, y, val);
168 break;
169 }
170 }
171 }
172
173 return 0;
174}
int LLVMFuzzerTestOneInput(const char *data, size_t size)
The FTXUI ftxui:: namespace.
Definition animation.hpp:11
int y
Definition elements.hpp:127
Element canvas(int width, int height, std::function< void(Canvas &)>)
Produce an element drawing a canvas of requested size.