use dist_agent_lang::lexer::tokens::{Keyword, Literal, Operator, Punctuation, Token};
use dist_agent_lang::lexer::Lexer;
#[test]
fn test_operator_plus() {
let code = "+";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2); assert!(matches!(tokens[0], Token::Operator(Operator::Plus)));
}
#[test]
fn test_operator_minus() {
let code = "-";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Minus)));
}
#[test]
fn test_operator_star() {
let code = "*";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Star)));
}
#[test]
fn test_operator_slash() {
let code = "/";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Slash)));
}
#[test]
fn test_operator_percent() {
let code = "%";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Percent)));
}
#[test]
fn test_operator_less() {
let code = "<";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Less)));
}
#[test]
fn test_operator_less_equal() {
let code = "<=";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::LessEqual)));
}
#[test]
fn test_operator_greater() {
let code = ">";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Greater)));
}
#[test]
fn test_operator_greater_equal() {
let code = ">=";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::GreaterEqual)));
}
#[test]
fn test_operator_equal() {
let code = "==";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Equal)));
}
#[test]
fn test_operator_not_equal() {
let code = "!=";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::NotEqual)));
}
#[test]
fn test_operator_not() {
let code = "!";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Not)));
}
#[test]
fn test_operator_assign() {
let code = "=";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Assign)));
}
#[test]
fn test_operator_and() {
let code = "&&";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::And)));
}
#[test]
fn test_operator_or() {
let code = "||";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Operator(Operator::Or)));
}
#[test]
fn test_operator_comparison_boundary_less_vs_less_equal() {
let code1 = "x < 10";
let code2 = "x <= 10";
let tokens1 = Lexer::new(code1).tokenize_immutable().unwrap();
let tokens2 = Lexer::new(code2).tokenize_immutable().unwrap();
let op1 = tokens1.iter().find(|t| matches!(t, Token::Operator(_)));
let op2 = tokens2.iter().find(|t| matches!(t, Token::Operator(_)));
assert!(op1.is_some() && op2.is_some());
assert!(matches!(op1.unwrap(), Token::Operator(Operator::Less)));
assert!(matches!(op2.unwrap(), Token::Operator(Operator::LessEqual)));
}
#[test]
fn test_operator_comparison_boundary_greater_vs_greater_equal() {
let code1 = "x > 10";
let code2 = "x >= 10";
let tokens1 = Lexer::new(code1).tokenize_immutable().unwrap();
let tokens2 = Lexer::new(code2).tokenize_immutable().unwrap();
let op1 = tokens1.iter().find(|t| matches!(t, Token::Operator(_)));
let op2 = tokens2.iter().find(|t| matches!(t, Token::Operator(_)));
assert!(op1.is_some() && op2.is_some());
assert!(matches!(op1.unwrap(), Token::Operator(Operator::Greater)));
assert!(matches!(
op2.unwrap(),
Token::Operator(Operator::GreaterEqual)
));
}
#[test]
fn test_punctuation_left_paren() {
let code = "(";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::LeftParen)
));
}
#[test]
fn test_punctuation_right_paren() {
let code = ")";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::RightParen)
));
}
#[test]
fn test_punctuation_left_brace() {
let code = "{";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::LeftBrace)
));
}
#[test]
fn test_punctuation_right_brace() {
let code = "}";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::RightBrace)
));
}
#[test]
fn test_punctuation_left_bracket() {
let code = "[";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::LeftBracket)
));
}
#[test]
fn test_punctuation_right_bracket() {
let code = "]";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::RightBracket)
));
}
#[test]
fn test_punctuation_semicolon() {
let code = ";";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::Semicolon)
));
}
#[test]
fn test_punctuation_colon() {
let code = ":";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Punctuation(Punctuation::Colon)));
}
#[test]
fn test_punctuation_double_colon() {
let code = "::";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::DoubleColon)
));
}
#[test]
fn test_punctuation_comma() {
let code = ",";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Punctuation(Punctuation::Comma)));
}
#[test]
fn test_punctuation_dot() {
let code = ".";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Punctuation(Punctuation::Dot)));
}
#[test]
fn test_punctuation_question() {
let code = "?";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(
tokens[0],
Token::Punctuation(Punctuation::Question)
));
}
#[test]
fn test_punctuation_at() {
let code = "@";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Punctuation(Punctuation::At)));
}
#[test]
fn test_punctuation_arrow() {
let code = "->";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Punctuation(Punctuation::Arrow)));
}
#[test]
fn test_punctuation_colon_vs_double_colon_boundary() {
let code1 = ":";
let code2 = "::";
let tokens1 = Lexer::new(code1).tokenize_immutable().unwrap();
let tokens2 = Lexer::new(code2).tokenize_immutable().unwrap();
assert!(matches!(tokens1[0], Token::Punctuation(Punctuation::Colon)));
assert!(matches!(
tokens2[0],
Token::Punctuation(Punctuation::DoubleColon)
));
}
#[test]
fn test_position_tracking_single_char_token() {
let code = "+";
let tokens_with_pos = Lexer::new(code)
.tokenize_with_positions_immutable()
.unwrap();
assert_eq!(tokens_with_pos.len(), 2); assert_eq!(tokens_with_pos[0].line, 1);
assert_eq!(tokens_with_pos[0].column, 1); }
#[test]
fn test_position_tracking_two_char_token() {
let code = "==";
let tokens_with_pos = Lexer::new(code)
.tokenize_with_positions_immutable()
.unwrap();
assert_eq!(tokens_with_pos.len(), 2);
assert_eq!(tokens_with_pos[0].line, 1);
assert_eq!(tokens_with_pos[0].column, 1); assert_eq!(tokens_with_pos[1].column, 3);
}
#[test]
fn test_position_tracking_newline() {
let code = "+\n-";
let tokens_with_pos = Lexer::new(code)
.tokenize_with_positions_immutable()
.unwrap();
assert_eq!(tokens_with_pos.len(), 3); assert_eq!(tokens_with_pos[0].line, 1);
assert_eq!(tokens_with_pos[0].column, 1);
assert_eq!(tokens_with_pos[1].line, 2); assert_eq!(tokens_with_pos[1].column, 1); }
#[test]
fn test_position_tracking_whitespace() {
let code = " +";
let tokens_with_pos = Lexer::new(code)
.tokenize_with_positions_immutable()
.unwrap();
assert_eq!(tokens_with_pos.len(), 2);
assert_eq!(tokens_with_pos[0].line, 1);
assert_eq!(tokens_with_pos[0].column, 3); }
#[test]
fn test_position_tracking_boundary_end_of_input() {
let code = "x";
let tokens_with_pos = Lexer::new(code)
.tokenize_with_positions_immutable()
.unwrap();
assert_eq!(tokens_with_pos.len(), 2); assert_eq!(tokens_with_pos[0].line, 1);
assert_eq!(tokens_with_pos[0].column, 1);
assert!(matches!(tokens_with_pos[1].token, Token::EOF));
assert!(tokens_with_pos[1].column >= 1); }
#[test]
fn test_position_tracking_multi_char_operator() {
let code = "x <= 10";
let tokens_with_pos = Lexer::new(code)
.tokenize_with_positions_immutable()
.unwrap();
let less_equal_token = tokens_with_pos
.iter()
.find(|t| matches!(t.token, Token::Operator(Operator::LessEqual)));
assert!(less_equal_token.is_some());
let token = less_equal_token.unwrap();
assert!(
token.column >= 2 && token.column <= 3,
"<= should be at column 2 or 3, got {}",
token.column
);
assert_eq!(token.line, 1);
}
#[test]
fn test_keyword_let() {
let code = "let";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Keyword(Keyword::Let)));
}
#[test]
fn test_keyword_fn() {
let code = "fn";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Keyword(Keyword::Fn)));
}
#[test]
fn test_keyword_if() {
let code = "if";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Keyword(Keyword::If)));
}
#[test]
fn test_keyword_return() {
let code = "return";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Keyword(Keyword::Return)));
}
#[test]
fn test_keyword_vs_identifier() {
let code1 = "let";
let code2 = "let_var";
let tokens1 = Lexer::new(code1).tokenize_immutable().unwrap();
let tokens2 = Lexer::new(code2).tokenize_immutable().unwrap();
assert!(matches!(tokens1[0], Token::Keyword(Keyword::Let)));
assert!(matches!(tokens2[0], Token::Identifier(_)));
}
#[test]
fn test_literal_bool_true() {
let code = "true";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Literal(Literal::Bool(true))));
}
#[test]
fn test_literal_bool_false() {
let code = "false";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Literal(Literal::Bool(false))));
}
#[test]
fn test_literal_null() {
let code = "null";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
assert!(matches!(tokens[0], Token::Literal(Literal::Null)));
}
#[test]
fn test_literal_int() {
let code = "42";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
if let Token::Literal(Literal::Int(value)) = &tokens[0] {
assert_eq!(*value, 42);
} else {
panic!("Expected Int(42), got {:?}", tokens[0]);
}
}
#[test]
fn test_literal_string() {
let code = r#""hello""#;
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(value, "hello");
} else {
panic!("Expected String(\"hello\"), got {:?}", tokens[0]);
}
}
#[test]
fn test_empty_input() {
let code = "";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 1); assert!(matches!(tokens[0], Token::EOF));
}
#[test]
fn test_whitespace_only() {
let code = " \n\t ";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 1); assert!(matches!(tokens[0], Token::EOF));
}
#[test]
fn test_invalid_single_ampersand() {
let code = "&";
let result = Lexer::new(code).tokenize_immutable();
assert!(result.is_err(), "Single & should be an error");
}
#[test]
fn test_invalid_single_pipe() {
let code = "|";
let result = Lexer::new(code).tokenize_immutable();
assert!(result.is_err(), "Single | should be an error");
}
#[test]
fn test_unterminated_string() {
let code = r#""hello"#;
let result = Lexer::new(code).tokenize_immutable();
assert!(result.is_err(), "Unterminated string should be an error");
}
#[test]
fn test_identifier_with_underscore() {
let code = "_test";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
if let Token::Identifier(name) = &tokens[0] {
assert_eq!(name, "_test");
} else {
panic!("Expected Identifier(\"_test\"), got {:?}", tokens[0]);
}
}
#[test]
fn test_number_parsing() {
let code = "123";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert_eq!(tokens.len(), 2);
if let Token::Literal(Literal::Int(value)) = &tokens[0] {
assert_eq!(*value, 123);
} else {
panic!("Expected Int(123), got {:?}", tokens[0]);
}
}
#[test]
fn test_complex_expression_tokenization() {
let code = "x + y < z && a == b";
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
assert!(tokens.len() >= 9);
let has_plus = tokens
.iter()
.any(|t| matches!(t, Token::Operator(Operator::Plus)));
let has_less = tokens
.iter()
.any(|t| matches!(t, Token::Operator(Operator::Less)));
let has_and = tokens
.iter()
.any(|t| matches!(t, Token::Operator(Operator::And)));
let has_equal = tokens
.iter()
.any(|t| matches!(t, Token::Operator(Operator::Equal)));
assert!(has_plus, "Should have Plus operator");
assert!(has_less, "Should have Less operator");
assert!(has_and, "Should have And operator");
assert!(has_equal, "Should have Equal operator");
}
#[test]
fn test_escape_sequence_double_quote() {
let code = r#""hello\"world""#;
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(
value, "hello\"world",
"Escaped double quote should produce literal quote"
);
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_escape_sequence_backslash() {
let code = r#""path\\to\\file""#;
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(
value, "path\\to\\file",
"Escaped backslash should produce literal backslash"
);
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_escape_sequence_newline() {
let code = r#""line1\nline2""#;
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(
value, "line1\nline2",
"\\n should produce newline character"
);
assert!(
value.contains('\n'),
"String must contain actual newline char"
);
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_escape_sequence_carriage_return() {
let code = r#""before\rafter""#;
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(
value, "before\rafter",
"\\r should produce carriage return character"
);
assert!(
value.contains('\r'),
"String must contain actual carriage return char"
);
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_escape_sequence_tab() {
let code = r#""col1\tcol2""#;
let tokens = Lexer::new(code).tokenize_immutable().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(value, "col1\tcol2", "\\t should produce tab character");
assert!(value.contains('\t'), "String must contain actual tab char");
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_string_exact_value() {
let code = r#""hello world""#;
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(
value, "hello world",
"read_string must return exact string content"
);
assert_ne!(value, "", "read_string must not return empty string");
assert_ne!(value, "xyzzy", "read_string must not return garbage");
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_string_with_escape() {
let code = r#""tab\there""#;
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(value, "tab\there");
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_string_boundary() {
let code = r#""end""#;
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
assert_eq!(tokens.len(), 2); if let Token::Literal(Literal::String(value)) = &tokens[0] {
assert_eq!(value, "end");
} else {
panic!("Expected string literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_number_exact_value() {
let code = "42";
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
if let Token::Literal(Literal::Int(value)) = &tokens[0] {
assert_eq!(*value, 42, "read_number must return exact number");
assert_ne!(*value, 0, "read_number must not return 0");
assert_ne!(*value, 1, "read_number must not return 1");
assert_ne!(*value, -1, "read_number must not return -1");
} else {
panic!("Expected int literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_number_boundary() {
let code = "999";
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
assert_eq!(tokens.len(), 2); if let Token::Literal(Literal::Int(value)) = &tokens[0] {
assert_eq!(*value, 999);
} else {
panic!("Expected int literal, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_number_followed_by_identifier() {
let code = "123abc";
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
if let Token::Literal(Literal::Int(value)) = &tokens[0] {
assert_eq!(*value, 123, "Number should stop at 'a'");
} else {
panic!("Expected int literal, got {:?}", tokens[0]);
}
if let Token::Identifier(name) = &tokens[1] {
assert_eq!(name, "abc", "Identifier should be 'abc' after number");
} else {
panic!("Expected identifier 'abc', got {:?}", tokens[1]);
}
}
#[test]
fn test_mutable_tokenize_identifier_exact_value() {
let code = "myVariable";
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
if let Token::Identifier(name) = &tokens[0] {
assert_eq!(name, "myVariable", "read_identifier must return exact name");
assert_ne!(name, "", "read_identifier must not return empty string");
assert_ne!(name, "xyzzy", "read_identifier must not return garbage");
} else {
panic!("Expected identifier, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_identifier_boundary() {
let code = "x";
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
assert_eq!(tokens.len(), 2); if let Token::Identifier(name) = &tokens[0] {
assert_eq!(name, "x");
} else {
panic!("Expected identifier, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_identifier_with_underscore() {
let code = "has_underscore_here";
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
if let Token::Identifier(name) = &tokens[0] {
assert_eq!(name, "has_underscore_here");
} else {
panic!("Expected identifier, got {:?}", tokens[0]);
}
}
#[test]
fn test_mutable_tokenize_unterminated_string() {
let code = r#""unterminated"#;
let mut lexer = Lexer::new(code);
let result = lexer.tokenize();
assert!(
result.is_err(),
"Unterminated string should fail in mutable tokenize"
);
}
#[test]
fn test_mutable_tokenize_multitoken_statement() {
let code = r#"let name = "hello";"#;
let mut lexer = Lexer::new(code);
let tokens = lexer.tokenize().unwrap();
assert!(tokens.len() >= 5);
assert!(matches!(tokens[0], Token::Keyword(Keyword::Let)));
if let Token::Identifier(name) = &tokens[1] {
assert_eq!(name, "name");
}
if let Token::Literal(Literal::String(value)) = &tokens[3] {
assert_eq!(value, "hello");
}
}