use crate::parser::types::{Tabs, TestClass, Whitespace};
use crate::parser::{Parser, Token};
use crate::tester;
use crate::tester::Tester;
use std::fs;
pub fn run_testfile(filename: String, url: String) {
println!("----------------------------------------------------------------");
println!("Testing file: {}", filename);
println!("----------------------------------------------------------------");
let all_testers = parse_testers_for_file_or_panic(filename);
for (identifier, t) in all_testers {
print_test_title(&identifier, &url, &t);
tester::runner::run(url.clone(), t);
}
}
fn print_test_title(identifier: &String, url: &String, tester: &Tester) {
let url_postfix = tester
.request_info
.url_postfix
.clone()
.unwrap_or("".to_string());
println!("{}{} :: {}", url, url_postfix, identifier);
}
fn parse_testers_for_file_or_panic(filename: String) -> Vec<(String, Tester)> {
let contents =
fs::read_to_string(filename).expect("File not found. This shouldn't be possible.");
let mut split: Vec<(usize, &str)> = contents
.split('\n')
.filter(|s| not_empty(s))
.map(|s| {
let len = get_tabs(s);
(len, &s[len..])
})
.rev()
.collect();
let mut test_class = TestClass::match_token("").unwrap();
let success = test_class.match_next(&mut split, "");
if success.is_err() {
panic!("Couldn't parse file:");
}
let all_testers = test_class.get_all_testers();
if all_testers.len() == 0 {
panic!("No test cases");
}
all_testers
}
fn get_tabs(s: &str) -> usize {
match Tabs::match_token(s) {
Ok(t) => t.size(),
Err(_) => 0,
}
}
fn not_empty(s: &str) -> bool {
Whitespace::match_token(s).is_err()
}