Skip to content

Commit d0e6f03

Browse files
committed
(tests) add: nested & list initialiser
1 parent 7b349a1 commit d0e6f03

File tree

4 files changed

+92
-77
lines changed

4 files changed

+92
-77
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ repository = "https://www.github.com/t-webber/ccompiler"
88

99
[dependencies]
1010

11-
[features]
11+
[features]
12+
debug = []

tests/lexer.rs

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use std::fs;
22

33
use ccompiler::prelude::*;
4-
use number_types::Number;
5-
use tokens_types::TokenValue;
64

75
const PREFIX: &str = "./tests/data/";
86

@@ -14,22 +12,6 @@ fn test_lexer_on_file(file: &str) {
1412
let _tokens = lex_file(&content, &mut location).unwrap_or_display(&[(path, &content)], "lexer");
1513
}
1614

17-
fn test_lexer_on_number(content: &str, expected: Number) {
18-
let path = String::new();
19-
let mut location = Location::from(path.as_str());
20-
let tokens = lex_file(content, &mut location).unwrap_or_display(&[(path, content)], "lexer");
21-
assert!(tokens.len() == 1, "Lexer error: cut expression into 2 tokens, but only a number was expected: {content} was cut into {tokens:?}");
22-
let value = tokens.first().unwrap().get_value();
23-
if let TokenValue::Number(nb) = value {
24-
assert!(
25-
*nb == expected,
26-
"Lexer error: computed wrong number: Expected: {expected:?}\n != Computed: {value:?}"
27-
);
28-
} else {
29-
panic!("Lexer error: waiting for Number, but lexer returned {value:?}")
30-
}
31-
}
32-
3315
#[test]
3416
fn lexer_escape() {
3517
test_lexer_on_file("escape");
@@ -44,55 +26,3 @@ fn lexer_general() {
4426
fn lexer_operators() {
4527
test_lexer_on_file("general");
4628
}
47-
48-
macro_rules! gen_number_test {
49-
($($name:ident: $input:expr => $output:expr;)*) => {
50-
$(
51-
#[test]
52-
fn $name() {
53-
test_lexer_on_number($input, $output)
54-
}
55-
)*
56-
};
57-
}
58-
59-
gen_number_test!(
60-
lexer_numbers_1: "1" => Number::Int(1);
61-
lexer_numbers_2: "0xf.ep+02f" => Number::Float(63.5);
62-
lexer_numbers_3: "1.23e+10" => Number::Double(1.23e10);
63-
lexer_numbers_4: "3.14159265358979323846e-2" => Number::Double(0.031415926535897934);
64-
lexer_numbers_5: "0x1.abc2p+4f" => Number::Float(26.734863);
65-
lexer_numbers_6: "0.0e-0" => Number::Double(0.);
66-
lexer_numbers_7: "0x1.2p+3f" => Number::Float(9.);
67-
lexer_numbers_8: "1e+1000" => Number::Double(f64::INFINITY);
68-
lexer_numbers_9: "1e-1000" => Number::Double(0.);
69-
lexer_numbers_10: "0x1.23p+4" => Number::Double(18.1875);
70-
lexer_numbers_11: "1.23E4f" => Number::Float(12300.);
71-
lexer_numbers_12: "9.87E-3f" => Number::Float(0.00987);
72-
lexer_numbers_13: "0x1.abc3p+10" => Number::Double(1711.046875);
73-
lexer_numbers_14: "0x10.0p+3f" => Number::Float(128.);
74-
lexer_numbers_15: "0xA.Fp+2" => Number::Double(43.75);
75-
lexer_numbers_16: "0x1.1p-2" => Number::Double(0.265625);
76-
lexer_numbers_17: "0xF.FFFp+3" => Number::Double(127.998046875);
77-
lexer_numbers_18: "0b101010" => Number::Int(42);
78-
lexer_numbers_19: "072" => Number::Int(58);
79-
lexer_numbers_20: "0xA7F" => Number::Int(2687);
80-
lexer_numbers_21: "12345" => Number::Int(12345);
81-
lexer_numbers_22: "1.23e+10" => Number::Double(1.23e10);
82-
lexer_numbers_23: "4.56e-5" => Number::Double(4.56e-5);
83-
lexer_numbers_24: "7.89E-2" => Number::Double(7.89e-2);
84-
lexer_numbers_25: "1.23E+100" => Number::Double(1.23e100);
85-
lexer_numbers_26: "1.23F" => Number::Float(1.23);
86-
// lexer_numbers_27: "4.56L" => Number::LongDouble(4.56); // long double not supported
87-
lexer_numbers_28: ".5" => Number::Double(0.5);
88-
lexer_numbers_29: "5." => Number::Double(5.);
89-
lexer_numbers_30: "1e10" => Number::Double(1e10);
90-
lexer_numbers_31: "3.45E-2" => Number::Double(3.45e-2);
91-
lexer_numbers_32: "0b11111111" => Number::Int(255);
92-
lexer_numbers_33: "0xABC12345" => Number::UInt(2881561413);
93-
lexer_numbers_34: "04567U" => Number::UInt(2423);
94-
lexer_numbers_35: "1000000000000000LL" => Number::LongLong(1000000000000000);
95-
lexer_numbers_36: "123.456f" => Number::Float(123.456);
96-
lexer_numbers_37: "789.0123" => Number::Double(789.0123);
97-
lexer_numbers_38: "0.0001e5f" => Number::Float(10.);
98-
);

tests/numbers.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use ccompiler::prelude::*;
2+
use number_types::Number;
3+
use tokens_types::TokenValue;
4+
5+
fn test_number(content: &str, expected: Number) {
6+
let path = String::new();
7+
let mut location = Location::from(path.as_str());
8+
let tokens = lex_file(content, &mut location).unwrap_or_display(&[(path, content)], "lexer");
9+
assert!(tokens.len() == 1, "Lexer error: cut expression into 2 tokens, but only a number was expected: {content} was cut into {tokens:?}");
10+
let value = tokens.first().unwrap().get_value();
11+
if let TokenValue::Number(nb) = value {
12+
assert!(
13+
*nb == expected,
14+
"Lexer error: computed wrong number: Expected: {expected:?}\n != Computed: {value:?}"
15+
);
16+
} else {
17+
panic!("Lexer error: waiting for Number, but lexer returned {value:?}")
18+
}
19+
}
20+
21+
macro_rules! gen_number_test {
22+
($($name:ident: $input:expr => $output:expr;)*) => {
23+
$(
24+
#[test]
25+
fn $name() {
26+
test_number($input, $output)
27+
}
28+
)*
29+
};
30+
}
31+
32+
gen_number_test!(
33+
numbers_1: "1" => Number::Int(1);
34+
numbers_2: "0xf.ep+02f" => Number::Float(63.5);
35+
numbers_3: "1.23e+10" => Number::Double(1.23e10);
36+
numbers_4: "3.14159265358979323846e-2" => Number::Double(0.031415926535897934);
37+
numbers_5: "0x1.abc2p+4f" => Number::Float(26.734863);
38+
numbers_6: "0.0e-0" => Number::Double(0.);
39+
numbers_7: "0x1.2p+3f" => Number::Float(9.);
40+
numbers_8: "1e+1000" => Number::Double(f64::INFINITY);
41+
numbers_9: "1e-1000" => Number::Double(0.);
42+
numbers_10: "0x1.23p+4" => Number::Double(18.1875);
43+
numbers_11: "1.23E4f" => Number::Float(12300.);
44+
numbers_12: "9.87E-3f" => Number::Float(0.00987);
45+
numbers_13: "0x1.abc3p+10" => Number::Double(1711.046875);
46+
numbers_14: "0x10.0p+3f" => Number::Float(128.);
47+
numbers_15: "0xA.Fp+2" => Number::Double(43.75);
48+
numbers_16: "0x1.1p-2" => Number::Double(0.265625);
49+
numbers_17: "0xF.FFFp+3" => Number::Double(127.998046875);
50+
numbers_18: "0b101010" => Number::Int(42);
51+
numbers_19: "072" => Number::Int(58);
52+
numbers_20: "0xA7F" => Number::Int(2687);
53+
numbers_21: "12345" => Number::Int(12345);
54+
numbers_22: "1.23e+10" => Number::Double(1.23e10);
55+
numbers_23: "4.56e-5" => Number::Double(4.56e-5);
56+
numbers_24: "7.89E-2" => Number::Double(7.89e-2);
57+
numbers_25: "1.23E+100" => Number::Double(1.23e100);
58+
numbers_26: "1.23F" => Number::Float(1.23);
59+
// numbers_27: "4.56L" => Number::LongDouble(4.56); // long double not supported
60+
numbers_28: ".5" => Number::Double(0.5);
61+
numbers_29: "5." => Number::Double(5.);
62+
numbers_30: "1e10" => Number::Double(1e10);
63+
numbers_31: "3.45E-2" => Number::Double(3.45e-2);
64+
numbers_32: "0b11111111" => Number::Int(255);
65+
numbers_33: "0xABC12345" => Number::UInt(2881561413);
66+
numbers_34: "04567U" => Number::UInt(2423);
67+
numbers_35: "1000000000000000LL" => Number::LongLong(1000000000000000);
68+
numbers_36: "123.456f" => Number::Float(123.456);
69+
numbers_37: "789.0123" => Number::Double(789.0123);
70+
numbers_38: "0.0001e5f" => Number::Float(10.);
71+
);

tests/parser.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,15 @@ fn test_parser_on_string(content: &str, output: &str) {
1313
}
1414

1515
#[test]
16-
fn parser_1() {
17-
// unary, binary
16+
fn parser_unary_binary() {
1817
test_parser_on_string(
1918
"a + b * c - d / e % f + g - h * i + j % k * l ^ !m++ & n | o || p && q",
2019
"[((((((((a + (b * c)) - ((d / e) % f)) + g) - (h * i)) + ((j % k) * l)) ^ ((!(m++)) & n)) | o) || (p && q))]",
2120
);
2221
}
2322

2423
#[test]
25-
fn parser_2() {
26-
// unary, binary, ternary, blocks
24+
fn parser_ternary_blocks() {
2725
test_parser_on_string(
2826
"a * b + c - d / e % f * g + h & i | j ^ k && l ||
2927
m * n + o - p * q / r + s % t
@@ -34,8 +32,7 @@ fn parser_2() {
3432
}
3533

3634
#[test]
37-
fn parser_3() {
38-
// unary, binary, ternary, parens, assign
35+
fn parser_parens_asign() {
3936
test_parser_on_string(
4037
"ex2 = a * (b + c - d / e % f * g) +
4138
(h > i ? j : k) * (l && m || n ^ o) / (p ? q : r) +
@@ -47,3 +44,19 @@ fn parser_3() {
4744
: y ^ z",
4845
"[(ex2 = (((((((a * (((b + c) - (((d / e) % f) * g)))) + (((((h > i) ? j : k)) * (((l && m) || (n ^ o)))) / ((p ? q : r)))) + t) & u) | v) && w) ? x : (y ^ z)))]");
4946
}
47+
48+
#[test]
49+
fn parser_list_initialiser() {
50+
test_parser_on_string(
51+
"n[3][3] = {{1, 2, 3}[2 + !3 * m[3]], {1, 2, 3}[2 + 1] + 2};",
52+
"[(((n[3])[3]) = {({1, 2, 3}[(2 + ((!3) * (m[3])))]), (({1, 2, 3}[(2 + 1)]) + 2)})]",
53+
);
54+
}
55+
56+
#[test]
57+
fn parser_nested() {
58+
test_parser_on_string(
59+
"n[3][(3+(1+2))] = {{1, 2, 3}[2 + !3 * m[m[(a+m[(2)])]]], {1, 2, 3}[2 + 1] + 2};",
60+
"[(((n[3])[((3 + ((1 + 2))))]) = {({1, 2, 3}[(2 + ((!3) * (m[(m[((a + (m[(2)])))])])))]), (({1, 2, 3}[(2 + 1)]) + 2)})]",
61+
);
62+
}

0 commit comments

Comments
 (0)