Skip to content

Commit 11e6eab

Browse files
committed
[Update] New Parser Assert Tests that check parse Error
Also cleaned some TODO's
1 parent eec04f2 commit 11e6eab

4 files changed

Lines changed: 128 additions & 20 deletions

File tree

src/parser/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ pub const KEYWORDS: &[&str] = &[
2121
"not",
2222
"True",
2323
"False",
24+
"test",
2425
];

src/parser/parser_common.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub const ASSERTFALSE_KEYWORD: &str = "assertfalse";
4040
pub const VAR_KEYWORD: &str = "var";
4141
pub const VAL_KEYWORD: &str = "val";
4242
pub const DEF_KEYWORD: &str = "def";
43+
pub const TEST_KEYWORD: &str = "test";
4344

4445
// Operator and symbol constants
4546
pub const FUNCTION_ARROW: &str = "->";

src/parser/parser_stmt.rs

Lines changed: 125 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub fn parse_statement(input: &str) -> IResult<&str, Statement> {
3333
parse_assertneq_statement,
3434
parse_assertfalse_statement,
3535
parse_asserttrue_statement,
36-
parse_test_function_definition_statement, // FIXME: Being Implemented
36+
parse_test_function_definition_statement,
3737
parse_function_definition_statement,
3838
))(input)
3939
}
@@ -300,17 +300,16 @@ fn parse_function_definition_statement(input: &str) -> IResult<&str, Statement>
300300
)(input)
301301
}
302302

303-
// TODO: alterar, não há mais necessidade de checar se o nome é test, usaremos uma keyword "test"
303+
304304
fn parse_test_function_definition_statement(input: &str) -> IResult<&str, Statement> {
305305
map(
306306
tuple((
307-
//keyword(DEF_KEYWORD),
307+
//keyword(TEST_KEYWORD),
308308
tag("test"),
309309
preceded(multispace1, identifier),
310-
//identifier,
311310
delimited(
312311
char::<&str, Error<&str>>(LEFT_PAREN),
313-
multispace0, // Permite `()` com espaços, mas sem argumentos
312+
multispace0,
314313
char::<&str, Error<&str>>(RIGHT_PAREN),
315314
),
316315
parse_block,
@@ -420,19 +419,7 @@ mod tests {
420419
assert_eq!(parsed, expected);
421420
}
422421

423-
#[test]
424-
fn test_parse_assert_statement() {
425-
let input = "assert(1 == 2, \"expecting an error\")";
426-
let expected = Statement::Assert(
427-
Box::new(Expression::EQ(
428-
Box::new(Expression::CInt(1)),
429-
Box::new(Expression::CInt(2)),
430-
)),
431-
Box::new(Expression::CString("expecting an error".to_string())),
432-
);
433-
let parsed = parse_assert_statement(input).unwrap().1;
434-
assert_eq!(parsed, expected);
435-
}
422+
436423

437424
#[test]
438425
#[ignore]
@@ -591,9 +578,23 @@ mod tests {
591578
}
592579

593580
//TODO: Apresentar Parser de Asserts (Testes)
594-
mod assignment_tests {
581+
mod assert_tests {
595582
use super::*;
596583

584+
#[test]
585+
fn test_parse_assert_statement() {
586+
let input = "assert(1 == 2, \"expecting an error\")";
587+
let expected = Statement::Assert(
588+
Box::new(Expression::EQ(
589+
Box::new(Expression::CInt(1)),
590+
Box::new(Expression::CInt(2)),
591+
)),
592+
Box::new(Expression::CString("expecting an error".to_string())),
593+
);
594+
let parsed = parse_assert_statement(input).unwrap().1;
595+
assert_eq!(parsed, expected);
596+
}
597+
597598
#[test]
598599
fn test_parse_asserteq_statement() {
599600
let input = "asserteq(1, 2, \"msg\")";
@@ -639,5 +640,110 @@ mod tests {
639640
let parsed = parse_assertfalse_statement(input).unwrap().1;
640641
assert_eq!(parsed, expected);
641642
}
643+
644+
#[test]
645+
fn test_parse_assert_statement_invalid_argnumber() {
646+
let input = "assert(False, False, \"should be false\")";
647+
648+
let result = std::panic::catch_unwind(|| {
649+
parse_assert_statement(input)
650+
});
651+
652+
assert!(result.is_err(), "Expected panic for invalid number of arguments");
653+
654+
if let Err(err) = result {
655+
if let Some(s) = err.downcast_ref::<&str>() {
656+
assert_eq!(*s, "Assert statement requires exactly 2 arguments");
657+
} else if let Some(s) = err.downcast_ref::<String>() {
658+
assert_eq!(s, "Assert statement requires exactly 2 arguments");
659+
} else {
660+
panic!("Panic occurred, but message is not a string");
661+
}
662+
}
663+
}
664+
665+
#[test]
666+
fn test_parse_asserteq_statement_invalid_argnumber() {
667+
let input = "asserteq(1, 2, 3, \"msg\")";
668+
669+
let result = std::panic::catch_unwind(|| {
670+
parse_asserteq_statement(input)
671+
});
672+
673+
assert!(result.is_err(), "Expected panic for invalid number of arguments");
674+
675+
if let Err(err) = result {
676+
if let Some(s) = err.downcast_ref::<&str>() {
677+
assert_eq!(*s, "AssertEQ statement requires exactly 3 arguments");
678+
} else if let Some(s) = err.downcast_ref::<String>() {
679+
assert_eq!(s, "AssertEQ statement requires exactly 3 arguments");
680+
} else {
681+
panic!("Panic occurred, but message is not a string");
682+
}
683+
}
684+
}
685+
686+
#[test]
687+
fn test_parse_assertneq_statement_invalid_argnumber() {
688+
let input = "assertneq(3, 4, 5, \"fail\")";
689+
690+
let result = std::panic::catch_unwind(|| {
691+
parse_assertneq_statement(input)
692+
});
693+
694+
assert!(result.is_err(), "Expected panic for invalid number of arguments");
695+
696+
if let Err(err) = result {
697+
if let Some(s) = err.downcast_ref::<&str>() {
698+
assert_eq!(*s, "AssertNEQ statement requires exactly 3 arguments");
699+
} else if let Some(s) = err.downcast_ref::<String>() {
700+
assert_eq!(s, "AssertNEQ statement requires exactly 3 arguments");
701+
} else {
702+
panic!("Panic occurred, but message is not a string");
703+
}
704+
}
705+
}
706+
707+
#[test]
708+
fn test_parse_asserttrue_statement_invalid_argnumber() {
709+
let input = "asserttrue(True, True, \"should be true\")";
710+
711+
let result = std::panic::catch_unwind(|| {
712+
parse_asserttrue_statement(input)
713+
});
714+
715+
assert!(result.is_err(), "Expected panic for invalid number of arguments");
716+
717+
if let Err(err) = result {
718+
if let Some(s) = err.downcast_ref::<&str>() {
719+
assert_eq!(*s, "AssertTrue statement requires exactly 2 arguments");
720+
} else if let Some(s) = err.downcast_ref::<String>() {
721+
assert_eq!(s, "AssertTrue statement requires exactly 2 arguments");
722+
} else {
723+
panic!("Panic occurred, but message is not a string");
724+
}
725+
}
726+
}
727+
728+
#[test]
729+
fn test_parse_assertfalse_statement_invalid_argnumber() {
730+
let input = "assertfalse(False, False, \"should be false\")";
731+
732+
let result = std::panic::catch_unwind(|| {
733+
parse_assertfalse_statement(input)
734+
});
735+
736+
assert!(result.is_err(), "Expected panic for invalid number of arguments");
737+
if let Err(err) = result {
738+
if let Some(s) = err.downcast_ref::<&str>() {
739+
assert_eq!(*s, "AssertFalse statement requires exactly 2 arguments");
740+
} else if let Some(s) = err.downcast_ref::<String>() {
741+
assert_eq!(s, "AssertFalse statement requires exactly 2 arguments");
742+
} else {
743+
panic!("Panic occurred, but message is not a string");
744+
}
745+
}
746+
}
747+
642748
}
643749
}

src/type_checker/statement_type_checker.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ mod tests {
810810
}
811811

812812
//TODO: Apresentar TypeChecker de Asserts (Testes)
813-
mod assignment_tests {
813+
mod assert_tests {
814814
use super::*;
815815

816816
#[test]

0 commit comments

Comments
 (0)