enfa_tests.rs (2954B)
1 use crate::{ 2 enfa::ENFA, 3 tests::testlib::util::{rand_string, read_directory}, 4 Automaton, Encodable, FiniteStateAutomaton, 5 }; 6 use std::fs; 7 8 #[test] 9 fn run_static_tests() { 10 const NUM_EXTS: usize = 2; 11 let expected_exts: [&str; NUM_EXTS] = [".input", ".expect"]; 12 let mut expected_files: [String; NUM_EXTS] = ["".to_owned(), "".to_owned()]; 13 let mut expected_paths: [String; NUM_EXTS] = ["".to_owned(), "".to_owned()]; 14 15 let enfas = read_directory("ENFAs").expect("Unable to read items in ENFAs directory"); 16 let enfa_tests = 17 read_directory("ENFAs/tests").expect("Unable to read items in the ENFAs/tests directory"); 18 19 for (filename, file) in enfas.iter() { 20 for i in 0..NUM_EXTS { 21 expected_files[i] = format!("{}{}", filename, expected_exts[i]); 22 expected_paths[i] = format!("ENFAs/tests/{}{}", filename, expected_exts[i]); 23 } 24 if expected_files 25 .iter() 26 .all(|fname| enfa_tests.contains_key(fname)) 27 { 28 let enfa = ENFA::parse(file.as_str()).expect("Unable to parse ENFA!"); 29 let inputs: Vec<String> = fs::read_to_string(expected_paths[0].clone()) 30 .expect(&format!( 31 "Unable to read file {} to string", 32 expected_paths[0] 33 )) 34 .lines() 35 .map(String::from) 36 .collect(); 37 let expected: Vec<bool> = fs::read_to_string(expected_paths[1].clone()) 38 .expect(&format!( 39 "Unable to read file {} to string", 40 expected_paths[0] 41 )) 42 .lines() 43 .map(|str| match str { 44 "t" => true, 45 _ => false, 46 }) 47 .collect(); 48 assert_eq!(inputs.len(), expected.len()); 49 for ((index, input), expect) in inputs.iter().enumerate().zip(expected) { 50 assert_eq!( 51 enfa.accepts(input), 52 expect, 53 "Test no: {index}, input: {input}, file: {filename}" 54 ); 55 } 56 println!( 57 "Successfully ran {} tests in {}", 58 inputs.len(), 59 expected_paths[0] 60 ) 61 } 62 } 63 } 64 65 #[test] 66 fn dfa_conversion() { 67 let enfas: Vec<String> = read_directory("ENFAs") 68 .expect("Unable to read items in the ENFAs directory") 69 .values() 70 .map(String::to_owned) 71 .collect(); 72 73 for enfa_enc in enfas.iter() { 74 let enfa = ENFA::parse(enfa_enc.as_str()).expect("Unable to parse NFA!"); 75 let as_dfa = enfa.as_dfa().expect("Error converting NFA to DFA!"); 76 77 for i in 1..500 { 78 let input = rand_string(i, enfa.alphabet.iter().map(char::to_owned).collect()); 79 assert_eq!(enfa.accepts(&input), as_dfa.accepts(&input)); 80 } 81 } 82 }