|
2 | 2 | // cspell: words rangeop RANGEOP |
3 | 3 |
|
4 | 4 | mod common; |
5 | | -use common::{type_declarations::*, CDDLTestParser, Rule}; |
6 | | -use pest::Parser; |
| 5 | +use common::{type_declarations::*, Rule}; |
7 | 6 |
|
8 | | -#[test] |
9 | 7 | /// Test if the `ctlop` rule passes properly. |
10 | 8 | /// This uses a special rule in the Grammar to test `ctlop` exhaustively. |
| 9 | +#[test] |
11 | 10 | fn check_ctlop() { |
12 | 11 | common::check_tests_rule(Rule::ctlop_TEST, CTLOP_PASSES, CTLOP_FAILS); |
13 | 12 | } |
14 | 13 |
|
15 | | -#[test] |
16 | 14 | /// Test if the `rangeop` rule passes properly. |
17 | 15 | /// This uses a special rule in the Grammar to test `rangeop` exhaustively. |
| 16 | +#[test] |
18 | 17 | fn check_rangeop() { |
19 | 18 | common::check_tests_rule(Rule::rangeop_TEST, RANGEOP_PASSES, RANGEOP_FAILS); |
20 | 19 | } |
21 | 20 |
|
22 | | -#[test] |
23 | 21 | /// Test if the `type2` rule passes properly. |
24 | 22 | /// This uses a special rule in the Grammar to test `type2` exhaustively. |
| 23 | +#[test] |
25 | 24 | fn check_type2() { |
26 | 25 | common::check_tests_rule(Rule::type2_TEST, TYPE2_PASSES, TYPE2_FAILS); |
27 | 26 | } |
28 | 27 |
|
29 | | -#[test] |
30 | 28 | /// Test if the `type1` rule passes properly. |
31 | 29 | /// This uses a special rule in the Grammar to test `type1` exhaustively. |
| 30 | +#[test] |
32 | 31 | fn check_type1() { |
33 | 32 | common::check_tests_rule(Rule::type1_TEST, TYPE1_PASSES, TYPE1_FAILS); |
34 | 33 | } |
35 | 34 |
|
36 | | -#[test] |
37 | 35 | /// Test if the `type1` rule passes properly based on composition of type2 test cases. |
| 36 | +#[test] |
38 | 37 | fn check_type1_composition() { |
39 | | - let j_len = CTLOP_PASSES.len() + RANGEOP_PASSES.len(); |
40 | | - for (i, test_i) in [TYPE2_PASSES, TYPE_FAILS].into_iter().flatten().enumerate() { |
41 | | - for (j, test_j) in [CTLOP_PASSES, RANGEOP_PASSES] |
42 | | - .into_iter() |
43 | | - .flatten() |
44 | | - .enumerate() |
45 | | - { |
46 | | - for (k, test_k) in [TYPE2_PASSES, TYPE_FAILS].into_iter().flatten().enumerate() { |
47 | | - let input = [test_i.to_owned(), test_j.to_owned(), test_k.to_owned()].join(" "); |
48 | | - let parse = CDDLTestParser::parse(Rule::type1_TEST, &input); |
49 | | - if (0..TYPE2_PASSES.len()).contains(&i) |
50 | | - && (0..j_len).contains(&j) |
51 | | - && (0..TYPE2_PASSES.len()).contains(&k) |
52 | | - { |
53 | | - assert!(parse.is_ok()); |
54 | | - } else { |
55 | | - assert!(parse.is_err()); |
56 | | - } |
57 | | - } |
58 | | - } |
59 | | - } |
| 38 | + let separator_iter = [CTLOP_PASSES, RANGEOP_PASSES].into_iter().flatten(); |
| 39 | + |
| 40 | + let type_iter = [TYPE2_PASSES, TYPE_FAILS, TYPE1_FAILS, TYPE2_FAILS] |
| 41 | + .into_iter() |
| 42 | + .flatten() |
| 43 | + .enumerate(); |
| 44 | + |
| 45 | + let rules_iter = type_iter.clone().zip(separator_iter).zip(type_iter).map( |
| 46 | + |(((i, type_1), separator), (j, type_2))| { |
| 47 | + let is_passed = i < TYPE2_PASSES.len() && j < TYPE2_PASSES.len(); |
| 48 | + let input = [type_1.to_owned(), separator.to_owned(), type_2.to_owned()].join(" "); |
| 49 | + (input, is_passed) |
| 50 | + }, |
| 51 | + ); |
| 52 | + |
| 53 | + let passes = rules_iter |
| 54 | + .clone() |
| 55 | + .filter(|(_, is_passes)| *is_passes) |
| 56 | + .map(|(input, _)| input) |
| 57 | + .collect::<Vec<_>>(); |
| 58 | + |
| 59 | + let fails = rules_iter |
| 60 | + .filter(|(_, is_passes)| !*is_passes) |
| 61 | + .map(|(input, _)| input) |
| 62 | + .collect::<Vec<_>>(); |
| 63 | + |
| 64 | + common::check_tests_rule(Rule::type1_TEST, &passes, &fails); |
60 | 65 | } |
61 | 66 |
|
62 | | -#[test] |
63 | 67 | /// Test if the `type` rule passes properly. |
64 | 68 | /// This uses a special rule in the Grammar to test `type` exhaustively. |
| 69 | +#[test] |
65 | 70 | fn check_type() { |
66 | 71 | common::check_tests_rule(Rule::type_TEST, TYPE_PASSES, TYPE_FAILS); |
67 | 72 | } |
68 | 73 |
|
69 | | -#[test] |
70 | 74 | /// Test if the `type` rule passes properly based on composition of type2 test cases. |
| 75 | +#[test] |
71 | 76 | fn check_type_composition() { |
72 | 77 | // type2 composition testing |
73 | | - for (i, test_i) in [TYPE2_PASSES, TYPE_FAILS].into_iter().flatten().enumerate() { |
74 | | - for (j, test_j) in [TYPE2_PASSES, TYPE_FAILS].into_iter().flatten().enumerate() { |
| 78 | + let type_iter = [TYPE2_PASSES, TYPE_FAILS, TYPE1_FAILS, TYPE2_FAILS] |
| 79 | + .into_iter() |
| 80 | + .flatten() |
| 81 | + .enumerate(); |
| 82 | + |
| 83 | + let rules_iter = type_iter |
| 84 | + .clone() |
| 85 | + .zip(type_iter) |
| 86 | + .map(|((i, test_i), (j, test_j))| { |
| 87 | + let is_passed = i < TYPE2_PASSES.len() && j < TYPE2_PASSES.len(); |
75 | 88 | let input = [test_i.to_owned(), "/", test_j.to_owned()].join(" "); |
76 | | - let parse = CDDLTestParser::parse(Rule::type_TEST, &input); |
77 | | - |
78 | | - if (0..TYPE2_PASSES.len()).contains(&i) && (0..TYPE2_PASSES.len()).contains(&j) { |
79 | | - assert!(parse.is_ok()); |
80 | | - } else { |
81 | | - assert!(parse.is_err()); |
82 | | - } |
83 | | - } |
84 | | - } |
| 89 | + (input, is_passed) |
| 90 | + }); |
| 91 | + |
| 92 | + let passes = rules_iter |
| 93 | + .clone() |
| 94 | + .filter(|(_, is_passes)| *is_passes) |
| 95 | + .map(|(input, _)| input) |
| 96 | + .collect::<Vec<_>>(); |
| 97 | + |
| 98 | + let fails = rules_iter |
| 99 | + .filter(|(_, is_passes)| !*is_passes) |
| 100 | + .map(|(input, _)| input) |
| 101 | + .collect::<Vec<_>>(); |
| 102 | + |
| 103 | + common::check_tests_rule(Rule::type_TEST, &passes, &fails); |
85 | 104 | } |
0 commit comments