use crate::rust_macro_graphql_token_source::RustMacroGraphQLTokenSource;
use crate::tests::token_source_parity_utils::tokenize_via_str;
use crate::tests::token_source_parity_utils::tokenize_via_rust;
use libgraphql_parser::token::GraphQLTokenKind;
use libgraphql_parser::token::GraphQLTriviaToken;
use proc_macro2::TokenStream;
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use std::str::FromStr;
#[test]
fn divergence_hash_is_comment_vs_error() {
let str_tokens = tokenize_via_str("# comment\nfield");
assert_eq!(str_tokens.len(), 2); assert!(matches!(
&str_tokens[0].kind,
GraphQLTokenKind::Name(n) if n == "field",
));
assert_eq!(str_tokens[0].preceding_trivia.len(), 1);
assert!(matches!(
&str_tokens[0].preceding_trivia[0],
GraphQLTriviaToken::Comment { value, .. }
if value == " comment",
));
let rust_tokens = tokenize_via_rust("# comment\nfield");
assert!(
rust_tokens.len() >= 3,
"Expected at least 3 tokens, got: {:?}",
rust_tokens
.iter()
.map(|t| format!("{:?}", t.kind))
.collect::<Vec<_>>(),
);
assert!(
rust_tokens[0].kind.is_error(),
"Expected error for `#`, got: {:?}",
rust_tokens[0].kind,
);
}
#[test]
fn divergence_raw_string_rust_only() {
use quote::quote;
let stream = quote! { r"raw content" };
let span_map = Rc::new(RefCell::new(HashMap::new()));
let source =
RustMacroGraphQLTokenSource::new(stream, span_map);
let rust_tokens: Vec<_> = source.collect();
assert!(
rust_tokens[0].kind.is_error(),
"Rust source should produce an error for raw string, \
got: {:?}",
rust_tokens[0].kind,
);
let rust_msg = match &rust_tokens[0].kind {
GraphQLTokenKind::Error(err) => &err.message,
_ => panic!("Expected error"),
};
assert!(
rust_msg.contains("raw string"),
"Error should mention 'raw string', got: {rust_msg}",
);
let str_tokens = tokenize_via_str(r#"r"raw content""#);
assert!(matches!(
&str_tokens[0].kind,
GraphQLTokenKind::Name(n) if n == "r",
));
assert!(matches!(
&str_tokens[1].kind,
GraphQLTokenKind::StringValue(_),
));
}
#[test]
fn divergence_unterminated_string() {
let str_tokens = tokenize_via_str("\"unterminated");
assert!(
str_tokens.iter().any(|t| t.kind.is_error()),
"Str source should report an error for unterminated \
string",
);
let result = TokenStream::from_str("\"unterminated");
assert!(
result.is_err(),
"TokenStream::from_str should reject unterminated string",
);
}