tree_sitter_cli/fuzz/
random.rs

1use rand::{
2    distributions::Alphanumeric,
3    prelude::{Rng, SeedableRng, StdRng},
4};
5
6const OPERATORS: &[char] = &[
7    '+', '-', '<', '>', '(', ')', '*', '/', '&', '|', '!', ',', '.', '%',
8];
9
10pub struct Rand(StdRng);
11
12impl Rand {
13    #[must_use]
14    pub fn new(seed: usize) -> Self {
15        Self(StdRng::seed_from_u64(seed as u64))
16    }
17
18    pub fn unsigned(&mut self, max: usize) -> usize {
19        self.0.gen_range(0..=max)
20    }
21
22    pub fn words(&mut self, max_count: usize) -> Vec<u8> {
23        let mut result = Vec::new();
24        let word_count = self.unsigned(max_count);
25        for i in 0..word_count {
26            if i > 0 {
27                if self.unsigned(5) == 0 {
28                    result.push(b'\n');
29                } else {
30                    result.push(b' ');
31                }
32            }
33            if self.unsigned(3) == 0 {
34                let index = self.unsigned(OPERATORS.len() - 1);
35                result.push(OPERATORS[index] as u8);
36            } else {
37                for _ in 0..self.unsigned(8) {
38                    result.push(self.0.sample(Alphanumeric));
39                }
40            }
41        }
42        result
43    }
44}