use crate::lexer::*; use crate::parser::*; #[test] fn test_parse_empty_function() { let raw = "main :: () {}"; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_function_with_return() { let raw = " main :: () { return 1; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_missing_semicolon() { let raw = " main :: () { return 1 } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_err()) } #[test] fn test_parse_no_function_context() { let raw = " let x = 1; "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_err()) } #[test] fn test_parse_multiple_functions() { let raw = " foo :: () { let x = 2; return x; } bar :: () { let y = 5; return y; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_variable_declaration() { let raw = " main :: () { let x = 1; return x; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_function_with_args() { let raw = " main :: (foo) { return foo; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_function_call() { let raw = " main :: (foo) { foo(); } foo :: () { foo(2); } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_return_function_call() { let raw = " main :: () { return fib(2); } fib :: () { return fib(2); } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_function_call_multiple_arguments() { let raw = " main :: () { fib(1, 2, 3); } fib :: () { return 2; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_nexted_function_call() { let raw = " main :: () { fib(fib(2), 2); } fib :: (n) { return 2; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_basic_ops() { let raw = " main :: () { return 2 * 5; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_compound_ops() { let raw = " main :: () { 2 * 5 / 3; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_compound_ops_with_function_call() { let raw = " main :: () { return 2 * fib(1) / 3; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_compound_ops_with_strings() { let raw = " main :: () { return 2 * \"Hello\"; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_compound_ops_with_identifier() { let raw = " main :: (n) { return 2 * n; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] #[ignore] fn test_parse_compound_ops_with_identifier_first() { let raw = " main :: (n) { return n * 2; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } #[test] fn test_parse_compound_ops_return() { let raw = " main :: (n) { return 2 * n; } "; let tokens = tokenize(raw); let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) }