1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright (C) 2019-2024 Aleo Systems Inc.
// This file is part of the Leo library.

// The Leo library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// The Leo library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.

use std::{
    fs,
    path::{Path, PathBuf},
};

use walkdir::WalkDir;

pub fn find_tests(path: &Path) -> impl Iterator<Item = (PathBuf, String)> {
    WalkDir::new(path).into_iter().flatten().filter_map(move |f| {
        // Get the path.
        let path = f.path();
        // Check if the file is a .leo file.
        let is_leo_file = path.extension().filter(|s| *s == "leo").is_some();
        // Read the test filter from the environment.
        let filter = std::env::var("TEST_FILTER").unwrap_or_default();
        // Check if the path contains the filter.
        let satisfies_filter = filter.is_empty() || path.to_string_lossy().contains(&filter);
        // If the file is a .leo file and satisfies the filter, return the path and the file contents.
        if is_leo_file && satisfies_filter {
            Some((path.to_path_buf(), fs::read_to_string(path).expect("failed to read test")))
        } else {
            None
        }
    })
}

pub fn split_tests_one_line(source: &str) -> Vec<&str> {
    source.lines().map(|x| x.trim()).filter(|x| !x.is_empty()).collect()
}

pub fn split_tests_two_line(source: &str) -> Vec<String> {
    let mut out = vec![];
    let mut lines = vec![];
    for line in source.lines() {
        let line = line.trim();
        if line.is_empty() {
            if !lines.is_empty() {
                out.push(lines.join("\n"));
            }
            lines.clear();
            continue;
        }
        lines.push(line);
    }
    let last_test = lines.join("\n");
    if !last_test.trim().is_empty() {
        out.push(last_test.trim().to_string());
    }
    out
}