You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

265 lines
4.8 KiB

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_redundant_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())
}
#[test]
fn test_parse_basic_conditional() {
let raw = "
main :: (n) {
if n {
return n
}
}
";
let tokens = tokenize(raw);
let tree = parse(tokens, Some(raw.to_string()));
assert!(tree.is_ok())
}
#[test]
fn test_parse_basic_conditional_with_multiple_statements() {
let raw = "
main :: (n) {
if n {
let x = 2 * n
return x
}
}
";
let tokens = tokenize(raw);
let tree = parse(tokens, Some(raw.to_string()));
assert!(tree.is_ok())
}