use super::*;
#[test]
fn test_looks_like_comprehension_negation() {
use crate::Parser;
let mut parser = Parser::new("[x for x in range(10)]");
let result = parser.parse();
assert!(
result.is_ok(),
"Array comprehension should parse (tests ! in while condition)"
);
let mut parser2 = Parser::new("[1, 2, 3, 4, 5]");
let result2 = parser2.parse();
assert!(result2.is_ok(), "Regular array should parse");
}
#[test]
fn test_parse_constructor_pattern_not_stub() {
use crate::Parser;
let mut parser = Parser::new("match value { Some(x) => x, None => 0 }");
let result = parser.parse();
assert!(
result.is_ok(),
"Enum constructor pattern should parse correctly"
);
}
#[test]
fn test_declaration_token_to_key_var_match_arm() {
let result = declaration_token_to_key(&Token::Var);
assert!(result.is_some(), "Token::Var should map to a key");
assert_eq!(
result.unwrap(),
"var",
"Token::Var should map to 'var' string"
);
}
#[test]
fn test_add_non_empty_row_negation() {
use crate::Parser;
let mut parser = Parser::new("[[1, 2], [3, 4]]");
let result = parser.parse();
assert!(
result.is_ok(),
"Nested arrays should parse (tests ! in add_non_empty_row)"
);
}
#[test]
fn test_control_flow_token_to_key() {
assert_eq!(
control_flow_token_to_key(&Token::If),
Some("if".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::Else),
Some("else".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::Match),
Some("match".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::While),
Some("while".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::For),
Some("for".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::Loop),
Some("loop".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::Break),
Some("break".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::Continue),
Some("continue".to_string())
);
assert_eq!(
control_flow_token_to_key(&Token::Return),
Some("return".to_string())
);
assert_eq!(control_flow_token_to_key(&Token::Plus), None);
}
#[test]
fn test_declaration_token_to_key_all() {
assert_eq!(
declaration_token_to_key(&Token::Let),
Some("let".to_string())
);
assert_eq!(
declaration_token_to_key(&Token::Var),
Some("var".to_string())
);
assert_eq!(
declaration_token_to_key(&Token::Const),
Some("const".to_string())
);
assert_eq!(
declaration_token_to_key(&Token::Static),
Some("static".to_string())
);
assert_eq!(
declaration_token_to_key(&Token::Pub),
Some("pub".to_string())
);
assert_eq!(
declaration_token_to_key(&Token::Mut),
Some("mut".to_string())
);
assert_eq!(
declaration_token_to_key(&Token::Fun),
Some("fun".to_string())
);
assert_eq!(declaration_token_to_key(&Token::Fn), Some("fn".to_string()));
assert_eq!(declaration_token_to_key(&Token::Plus), None);
}
#[test]
fn test_type_token_to_key() {
assert_eq!(type_token_to_key(&Token::Type), Some("type".to_string()));
assert_eq!(
type_token_to_key(&Token::Struct),
Some("struct".to_string())
);
assert_eq!(type_token_to_key(&Token::Enum), Some("enum".to_string()));
assert_eq!(type_token_to_key(&Token::Impl), Some("impl".to_string()));
assert_eq!(type_token_to_key(&Token::Trait), Some("trait".to_string()));
assert_eq!(type_token_to_key(&Token::Plus), None);
}
#[test]
fn test_module_token_to_key() {
assert_eq!(
module_token_to_key(&Token::Module),
Some("module".to_string())
);
assert_eq!(
module_token_to_key(&Token::Import),
Some("import".to_string())
);
assert_eq!(
module_token_to_key(&Token::Export),
Some("export".to_string())
);
assert_eq!(module_token_to_key(&Token::Use), Some("use".to_string()));
assert_eq!(module_token_to_key(&Token::As), Some("as".to_string()));
assert_eq!(module_token_to_key(&Token::From), Some("from".to_string()));
assert_eq!(module_token_to_key(&Token::Self_), Some("self".to_string()));
assert_eq!(
module_token_to_key(&Token::Super),
Some("super".to_string())
);
assert_eq!(
module_token_to_key(&Token::Crate),
Some("crate".to_string())
);
assert_eq!(module_token_to_key(&Token::In), Some("in".to_string()));
assert_eq!(
module_token_to_key(&Token::Where),
Some("where".to_string())
);
assert_eq!(module_token_to_key(&Token::Plus), None);
}
#[test]
fn test_async_error_token_to_key() {
assert_eq!(
async_error_token_to_key(&Token::Async),
Some("async".to_string())
);
assert_eq!(
async_error_token_to_key(&Token::Await),
Some("await".to_string())
);
assert_eq!(
async_error_token_to_key(&Token::Try),
Some("try".to_string())
);
assert_eq!(
async_error_token_to_key(&Token::Catch),
Some("catch".to_string())
);
assert_eq!(
async_error_token_to_key(&Token::Throw),
Some("throw".to_string())
);
assert_eq!(async_error_token_to_key(&Token::Plus), None);
}
#[test]
fn test_can_be_object_key() {
use crate::frontend::lexer::Token;
assert!(can_be_object_key(&Token::Identifier("name".to_string())));
assert!(can_be_object_key(&Token::String("key".to_string())));
assert!(can_be_object_key(&Token::If));
assert!(can_be_object_key(&Token::While));
assert!(!can_be_object_key(&Token::Plus));
assert!(!can_be_object_key(&Token::LeftParen));
}
#[test]
fn test_parse_block_empty() {
use crate::Parser;
let mut parser = Parser::new("{}");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_block_single_expr() {
use crate::Parser;
let mut parser = Parser::new("{ 42 }");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_block_multiple_exprs() {
use crate::Parser;
let mut parser = Parser::new("{ let x = 1; let y = 2; x + y }");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_array_empty() {
use crate::Parser;
let mut parser = Parser::new("[]");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_array_single() {
use crate::Parser;
let mut parser = Parser::new("[1]");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_array_multiple() {
use crate::Parser;
let mut parser = Parser::new("[1, 2, 3, 4, 5]");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_array_nested() {
use crate::Parser;
let mut parser = Parser::new("[[1, 2], [3, 4], [5, 6]]");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_map_constructor() {
use crate::Parser;
let mut parser = Parser::new("HashMap()");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_object_with_string_key() {
use crate::Parser;
let mut parser = Parser::new("{ \"key\": 42 }");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_set_braces() {
use crate::Parser;
let mut parser = Parser::new("{1, 2, 3}");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_tuple_single() {
use crate::Parser;
let mut parser = Parser::new("(1,)");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_tuple_multiple() {
use crate::Parser;
let mut parser = Parser::new("(1, 2, 3)");
let result = parser.parse();
assert!(result.is_ok());
}
#[test]
fn test_parse_object_keyword_keys() {
use crate::Parser;
let mut parser = Parser::new("{ if: 1, for: 2, let: 3 }");
let result = parser.parse();
assert!(result.is_ok(), "Object with keyword keys should parse");
}
#[test]
fn test_parse_object_spread() {
use crate::Parser;
let mut parser = Parser::new("{ ...other, x: 1 }");
let result = parser.parse();
assert!(result.is_ok(), "Object spread should parse");
}