Skip to content

Commit 93c5419

Browse files
committed
Exercise Str builtins in build fuzzer
1 parent 2a6dd92 commit 93c5419

1 file changed

Lines changed: 275 additions & 0 deletions

File tree

test/fuzzing/BuildCodeGenerator.zig

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ const Symbols = struct {
9595
score_control: Symbol,
9696
score_dict: Symbol,
9797
score_list_ops: Symbol,
98+
score_str_ops: Symbol,
9899
};
99100

100101
pub fn init(allocator: std.mem.Allocator, reader: *FuzzReader) Self {
@@ -211,6 +212,7 @@ pub fn generate(self: *Self) std.mem.Allocator.Error!void {
211212
.score_control = self.fresh(.function),
212213
.score_dict = self.fresh(.function),
213214
.score_list_ops = self.fresh(.function),
215+
.score_str_ops = self.fresh(.function),
214216
};
215217

216218
try self.setFileNames(app_file, platform_file, module_file);
@@ -594,6 +596,7 @@ fn writeTopLevelFunctions(self: *Self) std.mem.Allocator.Error!void {
594596
try self.writeControlFlowScoring();
595597
try self.writeDictScoring();
596598
try self.writeListOpsScoring();
599+
try self.writeStrOpsScoring();
597600
}
598601

599602
fn writeMakeItem(self: *Self) std.mem.Allocator.Error!void {
@@ -2157,6 +2160,250 @@ fn writeListOpsScoring(self: *Self) std.mem.Allocator.Error!void {
21572160
try self.writeAppText(")\n}\n\n");
21582161
}
21592162

2163+
fn writeStrOpsScoring(self: *Self) std.mem.Allocator.Error!void {
2164+
const text = self.fresh(.value);
2165+
const seed = self.fresh(.value);
2166+
const delimiter = self.fresh(.value);
2167+
const suffix = self.fresh(.value);
2168+
const joined_seed = self.fresh(.value);
2169+
const normalized = self.fresh(.value);
2170+
const repeated = self.fresh(.value);
2171+
const prefixed = self.fresh(.value);
2172+
const dropped = self.fresh(.value);
2173+
const pieces = self.fresh(.value);
2174+
const joined = self.fresh(.value);
2175+
const bytes = self.fresh(.value);
2176+
const roundtrip = self.fresh(.value);
2177+
const roundtrip_ok = self.fresh(.value);
2178+
const quoted = self.fresh(.value);
2179+
const quoted_ok = self.fresh(.value);
2180+
const reserved = self.fresh(.value);
2181+
const contains_score = self.fresh(.value);
2182+
const starts_score = self.fresh(.value);
2183+
const ends_score = self.fresh(.value);
2184+
2185+
try self.writeAppSymbol(self.symbols.score_str_ops);
2186+
try self.writeAppText(" : Str, U64 -> U64\n");
2187+
try self.writeAppSymbol(self.symbols.score_str_ops);
2188+
try self.writeAppText(" = |");
2189+
try self.writeAppSymbol(text);
2190+
try self.writeAppText(", ");
2191+
try self.writeAppSymbol(seed);
2192+
try self.writeAppText("| {\n");
2193+
2194+
try self.writeIndent(1);
2195+
try self.writeAppSymbol(delimiter);
2196+
try self.writeAppText(" : Str\n");
2197+
try self.writeIndent(1);
2198+
try self.writeAppSymbol(delimiter);
2199+
try self.writeAppText(" = ");
2200+
try self.writeNonEmptyStringLiteral();
2201+
try self.writeAppText("\n");
2202+
2203+
try self.writeIndent(1);
2204+
try self.writeAppSymbol(suffix);
2205+
try self.writeAppText(" : Str\n");
2206+
try self.writeIndent(1);
2207+
try self.writeAppSymbol(suffix);
2208+
try self.writeAppText(" = ");
2209+
try self.writeNonEmptyStringLiteral();
2210+
try self.writeAppText("\n");
2211+
2212+
try self.writeIndent(1);
2213+
try self.writeAppSymbol(joined_seed);
2214+
try self.writeAppText(" : Str\n");
2215+
try self.writeIndent(1);
2216+
try self.writeAppSymbol(joined_seed);
2217+
try self.writeAppText(" = Str.concat(Str.trim(");
2218+
try self.writeAppSymbol(text);
2219+
try self.writeAppText("), U64.to_str(");
2220+
try self.writeAppSymbol(seed);
2221+
try self.writeAppText("))\n");
2222+
2223+
try self.writeIndent(1);
2224+
try self.writeAppSymbol(normalized);
2225+
try self.writeAppText(" : Str\n");
2226+
try self.writeIndent(1);
2227+
try self.writeAppSymbol(normalized);
2228+
try self.writeAppText(" = Str.with_ascii_lowercased(Str.with_ascii_uppercased(");
2229+
try self.writeAppSymbol(joined_seed);
2230+
try self.writeAppText("))\n");
2231+
2232+
try self.writeIndent(1);
2233+
try self.writeAppSymbol(repeated);
2234+
try self.writeAppText(" : Str\n");
2235+
try self.writeIndent(1);
2236+
try self.writeAppSymbol(repeated);
2237+
try self.writeAppText(" = Str.repeat(");
2238+
try self.writeAppSymbol(delimiter);
2239+
try self.writeAppText(", ");
2240+
try self.writeAppSymbol(seed);
2241+
try self.writeAppText(" % 4 + 1)\n");
2242+
2243+
try self.writeIndent(1);
2244+
try self.writeAppSymbol(prefixed);
2245+
try self.writeAppText(" : Str\n");
2246+
try self.writeIndent(1);
2247+
try self.writeAppSymbol(prefixed);
2248+
try self.writeAppText(" = Str.with_prefix(Str.concat(");
2249+
try self.writeAppSymbol(normalized);
2250+
try self.writeAppText(", ");
2251+
try self.writeAppSymbol(suffix);
2252+
try self.writeAppText("), ");
2253+
try self.writeAppSymbol(repeated);
2254+
try self.writeAppText(")\n");
2255+
2256+
try self.writeIndent(1);
2257+
try self.writeAppSymbol(dropped);
2258+
try self.writeAppText(" : Str\n");
2259+
try self.writeIndent(1);
2260+
try self.writeAppSymbol(dropped);
2261+
try self.writeAppText(" = Str.drop_suffix(Str.drop_prefix(");
2262+
try self.writeAppSymbol(prefixed);
2263+
try self.writeAppText(", ");
2264+
try self.writeAppSymbol(repeated);
2265+
try self.writeAppText("), ");
2266+
try self.writeAppSymbol(suffix);
2267+
try self.writeAppText(")\n");
2268+
2269+
try self.writeIndent(1);
2270+
try self.writeAppSymbol(pieces);
2271+
try self.writeAppText(" : List(Str)\n");
2272+
try self.writeIndent(1);
2273+
try self.writeAppSymbol(pieces);
2274+
try self.writeAppText(" = Str.split_on(Str.concat(");
2275+
try self.writeAppSymbol(dropped);
2276+
try self.writeAppText(", ");
2277+
try self.writeAppSymbol(delimiter);
2278+
try self.writeAppText("), ");
2279+
try self.writeAppSymbol(delimiter);
2280+
try self.writeAppText(")\n");
2281+
2282+
try self.writeIndent(1);
2283+
try self.writeAppSymbol(joined);
2284+
try self.writeAppText(" : Str\n");
2285+
try self.writeIndent(1);
2286+
try self.writeAppSymbol(joined);
2287+
try self.writeAppText(" = Str.join_with(");
2288+
try self.writeAppSymbol(pieces);
2289+
try self.writeAppText(", ");
2290+
try self.writeAppSymbol(delimiter);
2291+
try self.writeAppText(")\n");
2292+
2293+
try self.writeIndent(1);
2294+
try self.writeAppSymbol(bytes);
2295+
try self.writeAppText(" : List(U8)\n");
2296+
try self.writeIndent(1);
2297+
try self.writeAppSymbol(bytes);
2298+
try self.writeAppText(" = Str.to_utf8(");
2299+
try self.writeAppSymbol(joined);
2300+
try self.writeAppText(")\n");
2301+
2302+
try self.writeIndent(1);
2303+
try self.writeAppSymbol(roundtrip);
2304+
try self.writeAppText(" : Str\n");
2305+
try self.writeIndent(1);
2306+
try self.writeAppSymbol(roundtrip);
2307+
try self.writeAppText(" = match Str.from_utf8(");
2308+
try self.writeAppSymbol(bytes);
2309+
try self.writeAppText(") {\n");
2310+
try self.writeIndent(2);
2311+
try self.writeAppText("Ok(");
2312+
try self.writeAppSymbol(roundtrip_ok);
2313+
try self.writeAppText(") => ");
2314+
try self.writeAppSymbol(roundtrip_ok);
2315+
try self.writeAppText("\n");
2316+
try self.writeIndent(2);
2317+
try self.writeAppText("Err(_) => Str.from_utf8_lossy(");
2318+
try self.writeAppSymbol(bytes);
2319+
try self.writeAppText(")\n");
2320+
try self.writeIndent(1);
2321+
try self.writeAppText("}\n");
2322+
2323+
try self.writeIndent(1);
2324+
try self.writeAppSymbol(quoted);
2325+
try self.writeAppText(" : Str\n");
2326+
try self.writeIndent(1);
2327+
try self.writeAppSymbol(quoted);
2328+
try self.writeAppText(" = match Str.from_quote(");
2329+
try self.writeAppSymbol(joined);
2330+
try self.writeAppText(") {\n");
2331+
try self.writeIndent(2);
2332+
try self.writeAppText("Ok(");
2333+
try self.writeAppSymbol(quoted_ok);
2334+
try self.writeAppText(") => ");
2335+
try self.writeAppSymbol(quoted_ok);
2336+
try self.writeAppText("\n");
2337+
try self.writeIndent(2);
2338+
try self.writeAppText("Err(_) => ");
2339+
try self.writeAppSymbol(joined);
2340+
try self.writeAppText("\n");
2341+
try self.writeIndent(1);
2342+
try self.writeAppText("}\n");
2343+
2344+
try self.writeIndent(1);
2345+
try self.writeAppSymbol(reserved);
2346+
try self.writeAppText(" : Str\n");
2347+
try self.writeIndent(1);
2348+
try self.writeAppSymbol(reserved);
2349+
try self.writeAppText(" = Str.release_excess_capacity(Str.reserve(Str.with_capacity(List.len(");
2350+
try self.writeAppSymbol(bytes);
2351+
try self.writeAppText(")), ");
2352+
try self.writeAppSymbol(seed);
2353+
try self.writeAppText(" % 8))\n");
2354+
2355+
try self.writeIndent(1);
2356+
try self.writeAppSymbol(contains_score);
2357+
try self.writeAppText(" : U64\n");
2358+
try self.writeIndent(1);
2359+
try self.writeAppSymbol(contains_score);
2360+
try self.writeAppText(" = if Str.contains(");
2361+
try self.writeAppSymbol(joined);
2362+
try self.writeAppText(", ");
2363+
try self.writeAppSymbol(delimiter);
2364+
try self.writeAppText(") 1 else 0\n");
2365+
2366+
try self.writeIndent(1);
2367+
try self.writeAppSymbol(starts_score);
2368+
try self.writeAppText(" : U64\n");
2369+
try self.writeIndent(1);
2370+
try self.writeAppSymbol(starts_score);
2371+
try self.writeAppText(" = if Str.starts_with(");
2372+
try self.writeAppSymbol(prefixed);
2373+
try self.writeAppText(", ");
2374+
try self.writeAppSymbol(repeated);
2375+
try self.writeAppText(") 2 else 0\n");
2376+
2377+
try self.writeIndent(1);
2378+
try self.writeAppSymbol(ends_score);
2379+
try self.writeAppText(" : U64\n");
2380+
try self.writeIndent(1);
2381+
try self.writeAppSymbol(ends_score);
2382+
try self.writeAppText(" = if Str.ends_with(Str.concat(");
2383+
try self.writeAppSymbol(joined);
2384+
try self.writeAppText(", ");
2385+
try self.writeAppSymbol(suffix);
2386+
try self.writeAppText("), ");
2387+
try self.writeAppSymbol(suffix);
2388+
try self.writeAppText(") 3 else 0\n");
2389+
2390+
try self.writeIndent(1);
2391+
try self.writeAppSymbol(contains_score);
2392+
try self.writeAppText(" + ");
2393+
try self.writeAppSymbol(starts_score);
2394+
try self.writeAppText(" + ");
2395+
try self.writeAppSymbol(ends_score);
2396+
try self.writeAppText(" + List.len(");
2397+
try self.writeAppSymbol(bytes);
2398+
try self.writeAppText(") + List.len(Str.to_utf8(");
2399+
try self.writeAppSymbol(roundtrip);
2400+
try self.writeAppText(")) + List.len(Str.to_utf8(");
2401+
try self.writeAppSymbol(quoted);
2402+
try self.writeAppText(")) + List.len(Str.to_utf8(");
2403+
try self.writeAppSymbol(reserved);
2404+
try self.writeAppText("))\n}\n\n");
2405+
}
2406+
21602407
fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
21612408
const input = self.fresh(.value);
21622409
const first = self.fresh(.value);
@@ -2177,6 +2424,7 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
21772424
const control_score = self.fresh(.value);
21782425
const dict_score = self.fresh(.value);
21792426
const list_ops_score = self.fresh(.value);
2427+
const str_score = self.fresh(.value);
21802428
const imported_record = self.fresh(.value);
21812429
const alternate_imported = self.fresh(.value);
21822430
const generic_imported = self.fresh(.value);
@@ -2426,6 +2674,19 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
24262674
try self.writeAppSymbol(dict_score);
24272675
try self.writeAppText(")\n");
24282676

2677+
try self.writeIndent(1);
2678+
try self.writeAppSymbol(str_score);
2679+
try self.writeAppText(" : U64\n");
2680+
try self.writeIndent(1);
2681+
try self.writeAppSymbol(str_score);
2682+
try self.writeAppText(" = ");
2683+
try self.writeAppSymbol(self.symbols.score_str_ops);
2684+
try self.writeAppText("(");
2685+
try self.writeAppSymbol(generic_text);
2686+
try self.writeAppText(", ");
2687+
try self.writeAppSymbol(list_ops_score);
2688+
try self.writeAppText(")\n");
2689+
24292690
try self.writeLocalHeader(imported_record, self.symbols.imported_type);
24302691
try self.writeAppSymbol(self.symbols.imported_type);
24312692
try self.writeAppText(".");
@@ -2444,6 +2705,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
24442705
try self.writeAppSymbol(dict_score);
24452706
try self.writeAppText(" + ");
24462707
try self.writeAppSymbol(list_ops_score);
2708+
try self.writeAppText(" + ");
2709+
try self.writeAppSymbol(str_score);
24472710
try self.writeAppText(", ");
24482711
try self.writeAppSymbol(generic_text);
24492712
try self.writeAppText(")\n");
@@ -2574,6 +2837,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
25742837
try self.writeAppText(" + ");
25752838
try self.writeAppSymbol(list_ops_score);
25762839
try self.writeAppText(" + ");
2840+
try self.writeAppSymbol(str_score);
2841+
try self.writeAppText(" + ");
25772842
try self.writeAppSymbol(imported_score);
25782843
try self.writeAppText(" + ");
25792844
try self.writeAppSymbol(tree_score);
@@ -2607,6 +2872,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
26072872
try self.writeAppText(" + ");
26082873
try self.writeAppSymbol(list_ops_score);
26092874
try self.writeAppText(" + ");
2875+
try self.writeAppSymbol(str_score);
2876+
try self.writeAppText(" + ");
26102877
try self.writeAppSymbol(imported_score);
26112878
try self.writeAppText(" + ");
26122879
try self.writeAppSymbol(tree_score);
@@ -2701,7 +2968,15 @@ fn writeTreeNamed(self: *Self, text_seed: Symbol, depth: u8) std.mem.Allocator.E
27012968

27022969
fn writeStringLiteral(self: *Self) std.mem.Allocator.Error!void {
27032970
const len = self.reader.intRangeAtMost(u8, 0, 4);
2971+
try self.writeAsciiStringLiteral(len);
2972+
}
2973+
2974+
fn writeNonEmptyStringLiteral(self: *Self) std.mem.Allocator.Error!void {
2975+
const len = self.reader.intRangeAtMost(u8, 1, 4);
2976+
try self.writeAsciiStringLiteral(len);
2977+
}
27042978

2979+
fn writeAsciiStringLiteral(self: *Self, len: u8) std.mem.Allocator.Error!void {
27052980
try self.writeAppText("\"");
27062981
for (0..len) |_| {
27072982
const byte = @as(u8, 'a') + self.reader.intRangeLessThan(u8, 0, 26);

0 commit comments

Comments
 (0)