use crate::ast;
use crate::tests::ast_utils::extract_query;
use crate::tests::ast_utils::first_arg_value;
use crate::tests::ast_utils::first_field;
use crate::tests::ast_utils::object_field_value;
use crate::tests::utils::parse_executable;
#[test]
fn value_int() {
let query = extract_query("query { field(arg: 123) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Int(iv) = value {
assert_eq!(iv.value, 123);
} else {
panic!("Expected Int value, got: {value:?}");
}
}
#[test]
fn value_int_negative() {
let query = extract_query("query { field(arg: -456) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Int(iv) = value {
assert_eq!(iv.value, -456);
} else {
panic!("Expected Int value, got: {value:?}");
}
}
#[test]
fn value_float() {
let query = extract_query("query { field(arg: 1.5) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Float(fv) = value {
assert!((fv.value - 1.5).abs() < f64::EPSILON);
} else {
panic!("Expected Float value, got: {value:?}");
}
}
#[test]
fn value_string() {
let query = extract_query(r#"query { field(arg: "hello") }"#);
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::String(sv) = value {
assert_eq!(sv.value, "hello");
} else {
panic!("Expected String value, got: {value:?}");
}
}
#[test]
fn value_string_with_escapes() {
let query = extract_query(r#"query { field(arg: "hello\nworld") }"#);
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::String(sv) = value {
assert!(sv.value.contains('\n') || sv.value.contains("\\n"));
} else {
panic!("Expected String value, got: {value:?}");
}
}
#[test]
fn value_boolean_true() {
let query = extract_query("query { field(arg: true) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Boolean(bv) = value {
assert!(bv.value);
} else {
panic!("Expected Boolean value, got: {value:?}");
}
}
#[test]
fn value_boolean_false() {
let query = extract_query("query { field(arg: false) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Boolean(bv) = value {
assert!(!bv.value);
} else {
panic!("Expected Boolean value, got: {value:?}");
}
}
#[test]
fn value_null() {
let query = extract_query("query { field(arg: null) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if !matches!(value, ast::Value::Null(_)) {
panic!("Expected Null value, got: {value:?}");
}
}
#[test]
fn value_enum() {
let query = extract_query("query { field(arg: ACTIVE) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Enum(ev) = value {
assert_eq!(ev.value, "ACTIVE");
} else {
panic!("Expected Enum value, got: {value:?}");
}
}
#[test]
fn value_enum_looks_like_keyword() {
let query = extract_query("query { field(arg: type) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Enum(ev) = value {
assert_eq!(ev.value, "type");
} else {
panic!("Expected Enum value, got: {value:?}");
}
}
#[test]
fn value_list_empty() {
let query = extract_query("query { field(arg: []) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::List(lv) = value {
assert!(lv.values.is_empty());
} else {
panic!("Expected List value, got: {value:?}");
}
}
#[test]
fn value_list_simple() {
let query = extract_query("query { field(arg: [1, 2, 3]) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::List(lv) = value {
assert_eq!(lv.values.len(), 3);
if let ast::Value::Int(iv) = &lv.values[0] {
assert_eq!(iv.value, 1);
} else {
panic!("Expected first element to be Int");
}
if let ast::Value::Int(iv) = &lv.values[1] {
assert_eq!(iv.value, 2);
} else {
panic!("Expected second element to be Int");
}
if let ast::Value::Int(iv) = &lv.values[2] {
assert_eq!(iv.value, 3);
} else {
panic!("Expected third element to be Int");
}
} else {
panic!("Expected List value, got: {value:?}");
}
}
#[test]
fn value_list_nested() {
let query = extract_query("query { field(arg: [[1], [2]]) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::List(outer) = value {
assert_eq!(outer.values.len(), 2);
if let ast::Value::List(inner1) = &outer.values[0] {
assert_eq!(inner1.values.len(), 1);
if let ast::Value::Int(iv) = &inner1.values[0] {
assert_eq!(iv.value, 1);
}
} else {
panic!("Expected first element to be a List");
}
if let ast::Value::List(inner2) = &outer.values[1] {
assert_eq!(inner2.values.len(), 1);
if let ast::Value::Int(iv) = &inner2.values[0] {
assert_eq!(iv.value, 2);
}
} else {
panic!("Expected second element to be a List");
}
} else {
panic!("Expected List value, got: {value:?}");
}
}
#[test]
fn value_list_mixed_types() {
let query = extract_query(r#"query { field(arg: [1, "two", true]) }"#);
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::List(lv) = value {
assert_eq!(lv.values.len(), 3);
assert!(matches!(&lv.values[0], ast::Value::Int(_)));
assert!(matches!(&lv.values[1], ast::Value::String(_)));
assert!(
matches!(&lv.values[2], ast::Value::Boolean(bv) if bv.value)
);
} else {
panic!("Expected List value, got: {value:?}");
}
}
#[test]
fn value_object_empty() {
let query = extract_query("query { field(arg: {}) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Object(ov) = value {
assert!(ov.fields.is_empty());
} else {
panic!("Expected Object value, got: {value:?}");
}
}
#[test]
fn value_object_simple() {
let query = extract_query(r#"query { field(arg: {key: "value"}) }"#);
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Object(ov) = value {
assert_eq!(ov.fields.len(), 1);
let field_value =
object_field_value(ov, "key").expect("Expected 'key' field");
if let ast::Value::String(sv) = field_value {
assert_eq!(sv.value, "value");
} else {
panic!("Expected String value for 'key' field");
}
} else {
panic!("Expected Object value, got: {value:?}");
}
}
#[test]
fn value_object_multiple_fields() {
let query = extract_query("query { field(arg: {a: 1, b: 2, c: 3}) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Object(ov) = value {
assert_eq!(ov.fields.len(), 3);
assert!(ov.fields.iter().any(|f| f.name.value == "a"));
assert!(ov.fields.iter().any(|f| f.name.value == "b"));
assert!(ov.fields.iter().any(|f| f.name.value == "c"));
} else {
panic!("Expected Object value, got: {value:?}");
}
}
#[test]
fn value_object_nested() {
let query = extract_query("query { field(arg: {outer: {inner: 1}}) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Object(ov) = value {
assert_eq!(ov.fields.len(), 1);
let outer_value =
object_field_value(ov, "outer").expect("Expected 'outer' field");
if let ast::Value::Object(inner_ov) = outer_value {
assert_eq!(inner_ov.fields.len(), 1);
let inner_value =
object_field_value(inner_ov, "inner").expect("Expected 'inner' field");
if let ast::Value::Int(iv) = inner_value {
assert_eq!(iv.value, 1);
} else {
panic!("Expected Int value for 'inner' field");
}
} else {
panic!("Expected Object value for 'outer' field");
}
} else {
panic!("Expected Object value, got: {value:?}");
}
}
#[test]
fn value_variable() {
let query = extract_query("query($var: Int) { field(arg: $var) }");
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::Variable(vv) = value {
assert_eq!(vv.name.value, "var");
} else {
panic!("Expected Variable value, got: {value:?}");
}
}
#[test]
fn value_variable_in_const_error() {
let result = parse_executable("query($var: Int = $other) { field }");
assert!(
result.has_errors(),
"Expected error for variable in default value"
);
}
#[test]
fn value_block_string() {
let query = extract_query(
r#"query { field(arg: """multi
line
string""") }"#,
);
let field = first_field(&query.selection_set);
let value = first_arg_value(field);
if let ast::Value::String(sv) = value {
assert!(sv.value.contains("multi"));
assert!(sv.value.contains("line"));
assert!(sv.value.contains("string"));
} else {
panic!("Expected String value for block string, got: {value:?}");
}
}