# NAME Test::QuickGen - Utilities for generating random test data # SYNOPSIS use Test::QuickGen qw(:all); my $id = id(); my $str = ascii_string(10); my $utf8 = utf8_string(20); my $clean = utf8_sanitized(15); my $rand = between(1, 100); my $opt = nullable("value"); my $item = pick(qw(a b c)); my $words = words(\&ascii_string, 5); # DESCRIPTION `Test::QuickGen` provides a set of utility functions for generating random data, primarily intended for testing purposes. These generators are simple, fast, and have minimal dependencies. All functions are exported by default. # COMMAND LINE TOOL This module comes bundled with an optional test runner, see [quicktest](https://metacpan.org/pod/quicktest) for more details. # IMPORTING Nothing is exported by default. Import functions explicitly: use Test::QuickGen qw(id ascii_string); Import groups of functions using tags: use Test::QuickGen qw(:all); use Test::QuickGen qw(:utf8); use Test::QuickGen qw(:basic); - `:all` All available functions. - `:utf8` UTF-8 specific functions. - `:basic` Simple utils like `pick` or `id`. See source for exact composition of the imports. # FUNCTIONS ## id my $id1 = id(); my $id2 = id(); # $id1 != $id2 Returns a monotonically increasing integer starting from 0. The counter is process-local and resets each time the program runs. ## string\_of($n, @chars) my $str = string_of(10, qw(a b c)); Generates a random string of length `$n` using the provided list of characters `@chars`. - `$n` must be a non-negative integer. - At least one character must be provided. - Characters are selected uniformly at random. ## ascii\_string($n) my $str = ascii_string(10); Generates a random ASCII string length `$n`. The character set includes all lowercase letters (a-z), uppercase letters (A-Z), digits (0-9) and underscore (\_). ## utf8\_string($n) my $str = utf8_string(10); Generates a random UTF-8 string of `$n` characters. The generator: - Includes visible Unicode characters up to code point `0x2FFF`. - Excludes control characters and invalid Unicode ranges. - Skips surrogate pairs and non-characters. Note: Because characters may vary in byte length, this function targets character count (not byte length). ## utf8\_sanitized($n) my $clean = utf8_sanitized(10); Generates a UTF-8 string of length `$n` and removes all non-alphanumeric characters, retaining only: - Unicode letters (`\p{L}`) - Unicode numbers (`\p{N}`) - Whitespace If all characters are filtered out, the function retries until a non-empty string is produced. ## words($gen, $n, $max\_len = 70) my $str = words(\&string_generator, 5); Generates a string made up of `$n` space-separated "words". Each word is produced by calling the generator function `$gen`. - `$gen` A coderef that is called once per word. It accepts a single integer argument (the desired length), and returns a string. For example: sub string_generator { my ($len) = @_; # return a string of length $len } - `$max_len` An optional parameter to set the maximum length (inclusive) of a word. Defaults to 70. Must be a positive number. - Word generation For each of the `$n` words, a random length between 1 and `$max_len` is chosen. That length is passed to `$gen`, which returns the word. - Output format The generated words are joined together with a single space. Example: words(\&ascii_string, 3); # might return: "aZ3 kLm92 Q" ## between($min, $max) my $n = between(1, 10); Returns a random integer between `$min` and `$max` (inclusive). The distribution is uniform and `$min` must be <= `$max`. ## nullable($val) my $value = nullable("data"); Returns either the given value or `undef`. 25% chance of returning `undef`, 75% chance of returning the original value. Useful for testing optional fields. ## pick(@items) my $item = pick(qw(a b c)); Returns a random element from the provided list. If provided an empty list, will return `undef`. Randomness is uniform in its distribution. # NOTES - These functions are not cryptographically secure. - They are intended for testing, fuzzing, and data generation only. # AUTHOR Antonis Kalou # LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See `LICENSE` for details.