use crate::GraphQLParseError;
use crate::GraphQLParseErrorKind;
use crate::ParseResult;
use crate::SourceMap;
use crate::SourceSpan;
fn test_error(message: &str) -> GraphQLParseError {
GraphQLParseError::new(
message,
GraphQLParseErrorKind::UnexpectedToken {
expected: vec!["test".to_string()],
found: "other".to_string(),
},
SourceSpan::zero(),
)
}
#[test]
fn parse_result_ok_creates_success_state() {
let result: ParseResult<'_, String> =
ParseResult::new_ok("test value".to_string(), SourceMap::empty());
assert!(!result.has_errors(), "ok() should have no errors");
assert!(result.errors().is_empty(), "ok() errors slice should be empty");
assert_eq!(
result.valid().map(|(v, _)| v),
Some(&"test value".to_string()),
);
}
#[test]
fn parse_result_recovered_creates_mixed_state() {
let errors = vec![test_error("syntax error")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"partial result".to_string(),
errors,
SourceMap::empty(),
);
assert!(result.has_errors(), "recovered() should have errors");
assert_eq!(result.errors().len(), 1);
assert_eq!(result.into_ast(), "partial result".to_string());
}
#[test]
fn parse_result_valid_ast_returns_none_when_errors() {
let errors = vec![test_error("some error")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
assert!(
result.valid().is_none(),
"valid_ast() should return None when errors present",
);
}
#[test]
fn parse_result_into_valid_ast_consumes() {
let result: ParseResult<'_, String> =
ParseResult::new_ok("value".to_string(), SourceMap::empty());
let ast = result.into_valid().map(|(v, _)| v);
assert_eq!(ast, Some("value".to_string()));
let errors = vec![test_error("error")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
let ast = result.into_valid();
assert!(ast.is_none());
}
#[test]
fn parse_result_into_ast_consumes() {
let result: ParseResult<'_, String> =
ParseResult::new_ok("value".to_string(), SourceMap::empty());
let ast = result.into_ast();
assert_eq!(ast, "value".to_string());
let errors = vec![test_error("error")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"recovered".to_string(),
errors,
SourceMap::empty(),
);
let ast = result.into_ast();
assert_eq!(ast, "recovered".to_string());
}
#[test]
fn parse_result_has_errors_checks_variant() {
let result: ParseResult<'_, String> =
ParseResult::new_ok("value".to_string(), SourceMap::empty());
assert!(!result.has_errors());
let errors = vec![test_error("error")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
assert!(result.has_errors());
}
#[test]
fn parse_result_errors_returns_correct_slice() {
let result: ParseResult<'_, String> =
ParseResult::new_ok("value".to_string(), SourceMap::empty());
assert!(result.errors().is_empty());
let errors = vec![test_error("first"), test_error("second")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
assert_eq!(result.errors().len(), 2);
}
#[test]
fn parse_result_format_errors() {
let errors = vec![test_error("first error"), test_error("second error")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
let formatted = result.formatted_errors();
assert!(formatted.contains("first error"));
assert!(formatted.contains("second error"));
}
#[test]
fn parse_result_format_errors_with_source() {
let errors = vec![test_error("error here")];
let result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
let formatted = result.formatted_errors();
assert!(formatted.contains("error here"));
}
#[test]
fn parse_result_format_errors_empty_for_ok() {
let result: ParseResult<'_, String> =
ParseResult::new_ok("value".to_string(), SourceMap::empty());
let formatted = result.formatted_errors();
assert!(formatted.is_empty());
}
#[test]
#[cfg(debug_assertions)]
#[should_panic(expected = "ParseResult::new_recovered() called with empty errors vec")]
fn parse_result_recovered_empty_errors_panics_in_debug() {
let _result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
Vec::new(),
SourceMap::empty(),
);
}
#[test]
fn parse_result_from_conversion_ok() {
let parse_result: ParseResult<'_, String> =
ParseResult::new_ok("value".to_string(), SourceMap::empty());
let std_result: Result<(String, SourceMap<'_>), Vec<GraphQLParseError>> =
parse_result.into();
assert!(std_result.is_ok());
assert_eq!(std_result.unwrap().0, "value");
}
#[test]
fn parse_result_from_conversion_recovered() {
let errors = vec![test_error("error")];
let parse_result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
let std_result: Result<(String, SourceMap<'_>), Vec<GraphQLParseError>> =
parse_result.into();
assert!(std_result.is_err());
let err_vec = std_result.unwrap_err();
assert_eq!(err_vec.len(), 1);
}
#[test]
fn parse_result_from_conversion_recovered_multiple_errors() {
let errors = vec![test_error("error 1"), test_error("error 2")];
let parse_result: ParseResult<'_, String> = ParseResult::new_recovered(
"value".to_string(),
errors,
SourceMap::empty(),
);
let std_result: Result<(String, SourceMap<'_>), Vec<GraphQLParseError>> =
parse_result.into();
assert!(std_result.is_err());
let err_vec = std_result.unwrap_err();
assert_eq!(err_vec.len(), 2);
}