mirror of
https://github.com/Orange-OpenSource/hurl.git
synced 2024-11-27 08:19:22 +03:00
Add predicates for types
This commit is contained in:
parent
6d5239a3d2
commit
367a26bf11
@ -284,6 +284,11 @@ fn expected(
|
|||||||
let expected = eval_template(expected, variables)?;
|
let expected = eval_template(expected, variables)?;
|
||||||
Ok(format!("matches regex <{}>", expected))
|
Ok(format!("matches regex <{}>", expected))
|
||||||
}
|
}
|
||||||
|
PredicateFuncValue::IsInteger {} => Ok("integer".to_string()),
|
||||||
|
PredicateFuncValue::IsFloat {} => Ok("float".to_string()),
|
||||||
|
PredicateFuncValue::IsBoolean {} => Ok("boolean".to_string()),
|
||||||
|
PredicateFuncValue::IsString {} => Ok("string".to_string()),
|
||||||
|
PredicateFuncValue::IsCollection {} => Ok("collection".to_string()),
|
||||||
PredicateFuncValue::Exist {} => Ok("something".to_string()),
|
PredicateFuncValue::Exist {} => Ok("something".to_string()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -498,6 +503,41 @@ fn eval_something(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// types
|
||||||
|
PredicateFuncValue::IsInteger {} => Ok(AssertResult {
|
||||||
|
success: matches!(value, Value::Integer(_)),
|
||||||
|
actual: value.display(),
|
||||||
|
expected: "integer".to_string(),
|
||||||
|
type_mismatch: false,
|
||||||
|
}),
|
||||||
|
PredicateFuncValue::IsFloat {} => Ok(AssertResult {
|
||||||
|
success: matches!(value, Value::Float(_, _)),
|
||||||
|
actual: value.display(),
|
||||||
|
expected: "float".to_string(),
|
||||||
|
type_mismatch: false,
|
||||||
|
}),
|
||||||
|
PredicateFuncValue::IsBoolean {} => Ok(AssertResult {
|
||||||
|
success: matches!(value, Value::Bool(_)),
|
||||||
|
actual: value.display(),
|
||||||
|
expected: "boolean".to_string(),
|
||||||
|
type_mismatch: false,
|
||||||
|
}),
|
||||||
|
PredicateFuncValue::IsString {} => Ok(AssertResult {
|
||||||
|
success: matches!(value, Value::String(_)),
|
||||||
|
actual: value.display(),
|
||||||
|
expected: "string".to_string(),
|
||||||
|
type_mismatch: false,
|
||||||
|
}),
|
||||||
|
PredicateFuncValue::IsCollection {} => Ok(AssertResult {
|
||||||
|
success: matches!(value, Value::Bytes(_))
|
||||||
|
|| matches!(value, Value::List(_))
|
||||||
|
|| matches!(value, Value::Nodeset(_))
|
||||||
|
|| matches!(value, Value::Object(_)),
|
||||||
|
actual: value.display(),
|
||||||
|
expected: "collection".to_string(),
|
||||||
|
type_mismatch: false,
|
||||||
|
}),
|
||||||
|
|
||||||
// exists
|
// exists
|
||||||
PredicateFuncValue::Exist {} => match value {
|
PredicateFuncValue::Exist {} => match value {
|
||||||
Value::Nodeset(0) => Ok(AssertResult {
|
Value::Nodeset(0) => Ok(AssertResult {
|
||||||
@ -1165,7 +1205,7 @@ mod tests {
|
|||||||
success: true,
|
success: true,
|
||||||
type_mismatch: false,
|
type_mismatch: false,
|
||||||
actual: "int <2>".to_string(),
|
actual: "int <2>".to_string(),
|
||||||
expected: "int <1>".to_string()
|
expected: "int <1>".to_string(),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -1174,7 +1214,7 @@ mod tests {
|
|||||||
success: false,
|
success: false,
|
||||||
type_mismatch: false,
|
type_mismatch: false,
|
||||||
actual: "int <1>".to_string(),
|
actual: "int <1>".to_string(),
|
||||||
expected: "int <1>".to_string()
|
expected: "int <1>".to_string(),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -1183,7 +1223,7 @@ mod tests {
|
|||||||
success: true,
|
success: true,
|
||||||
type_mismatch: false,
|
type_mismatch: false,
|
||||||
actual: "float <1.1>".to_string(),
|
actual: "float <1.1>".to_string(),
|
||||||
expected: "int <1>".to_string()
|
expected: "int <1>".to_string(),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -1192,7 +1232,7 @@ mod tests {
|
|||||||
success: false,
|
success: false,
|
||||||
type_mismatch: false,
|
type_mismatch: false,
|
||||||
actual: "float <1.1>".to_string(),
|
actual: "float <1.1>".to_string(),
|
||||||
expected: "int <2>".to_string()
|
expected: "int <2>".to_string(),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1299,6 +1339,38 @@ mod tests {
|
|||||||
assert_eq!(assert_result.expected.as_str(), "count equals to <1>");
|
assert_eq!(assert_result.expected.as_str(), "count equals to <1>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_predicate_type() {
|
||||||
|
let variables = HashMap::new();
|
||||||
|
let assert_result = eval_something(
|
||||||
|
PredicateFunc {
|
||||||
|
value: PredicateFuncValue::IsInteger {},
|
||||||
|
source_info: SourceInfo::init(0, 0, 0, 0),
|
||||||
|
},
|
||||||
|
&variables,
|
||||||
|
Value::Integer(1),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(assert_result.success, true);
|
||||||
|
assert_eq!(assert_result.type_mismatch, false);
|
||||||
|
assert_eq!(assert_result.actual.as_str(), "int <1>");
|
||||||
|
assert_eq!(assert_result.expected.as_str(), "integer");
|
||||||
|
|
||||||
|
let assert_result = eval_something(
|
||||||
|
PredicateFunc {
|
||||||
|
value: PredicateFuncValue::IsInteger {},
|
||||||
|
source_info: SourceInfo::init(0, 0, 0, 0),
|
||||||
|
},
|
||||||
|
&variables,
|
||||||
|
Value::Float(1, 0),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(assert_result.success, false);
|
||||||
|
assert_eq!(assert_result.type_mismatch, false);
|
||||||
|
assert_eq!(assert_result.actual.as_str(), "float <1.0>");
|
||||||
|
assert_eq!(assert_result.expected.as_str(), "integer");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_predicate_not_with_different_types() {
|
fn test_predicate_not_with_different_types() {
|
||||||
// equals predicate does not generate a type error with an integer value
|
// equals predicate does not generate a type error with an integer value
|
||||||
|
@ -422,6 +422,11 @@ pub enum PredicateFuncValue {
|
|||||||
IncludeNull { space0: Whitespace },
|
IncludeNull { space0: Whitespace },
|
||||||
IncludeExpression { space0: Whitespace, value: Expr },
|
IncludeExpression { space0: Whitespace, value: Expr },
|
||||||
Match { space0: Whitespace, value: Template },
|
Match { space0: Whitespace, value: Template },
|
||||||
|
IsInteger {},
|
||||||
|
IsFloat {},
|
||||||
|
IsBoolean {},
|
||||||
|
IsString {},
|
||||||
|
IsCollection {},
|
||||||
Exist {},
|
Exist {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,11 @@ fn predicate_func_value(reader: &mut Reader) -> ParseResult<'static, PredicateFu
|
|||||||
contain_predicate,
|
contain_predicate,
|
||||||
include_predicate,
|
include_predicate,
|
||||||
match_predicate,
|
match_predicate,
|
||||||
|
integer_predicate,
|
||||||
|
float_predicate,
|
||||||
|
boolean_predicate,
|
||||||
|
string_predicate,
|
||||||
|
collection_predicate,
|
||||||
exist_predicate,
|
exist_predicate,
|
||||||
],
|
],
|
||||||
reader,
|
reader,
|
||||||
@ -289,6 +294,31 @@ fn match_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncVal
|
|||||||
Ok(PredicateFuncValue::Match { space0, value })
|
Ok(PredicateFuncValue::Match { space0, value })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn integer_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
||||||
|
try_literal("isInteger", reader)?;
|
||||||
|
Ok(PredicateFuncValue::IsInteger {})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn float_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
||||||
|
try_literal("isFloat", reader)?;
|
||||||
|
Ok(PredicateFuncValue::IsFloat {})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn boolean_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
||||||
|
try_literal("isBoolean", reader)?;
|
||||||
|
Ok(PredicateFuncValue::IsBoolean {})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn string_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
||||||
|
try_literal("isString", reader)?;
|
||||||
|
Ok(PredicateFuncValue::IsString {})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collection_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
||||||
|
try_literal("isCollection", reader)?;
|
||||||
|
Ok(PredicateFuncValue::IsCollection {})
|
||||||
|
}
|
||||||
|
|
||||||
fn exist_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
fn exist_predicate(reader: &mut Reader) -> ParseResult<'static, PredicateFuncValue> {
|
||||||
try_literal("exists", reader)?;
|
try_literal("exists", reader)?;
|
||||||
Ok(PredicateFuncValue::Exist {})
|
Ok(PredicateFuncValue::Exist {})
|
||||||
|
@ -591,6 +591,21 @@ impl Htmlable for PredicateFuncValue {
|
|||||||
buffer.push_str(space0.to_html().as_str());
|
buffer.push_str(space0.to_html().as_str());
|
||||||
buffer.push_str(format!("<span class=\"boolean\">{}</span>", value).as_str());
|
buffer.push_str(format!("<span class=\"boolean\">{}</span>", value).as_str());
|
||||||
}
|
}
|
||||||
|
PredicateFuncValue::IsInteger {} => {
|
||||||
|
buffer.push_str("<span class=\"predicate-type\">isInteger</span>");
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsFloat {} => {
|
||||||
|
buffer.push_str("<span class=\"predicate-type\">isFloat</span>");
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsBoolean {} => {
|
||||||
|
buffer.push_str("<span class=\"predicate-type\">isBoolean</span>");
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsString {} => {
|
||||||
|
buffer.push_str("<span class=\"predicate-type\">isString</span>");
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsCollection {} => {
|
||||||
|
buffer.push_str("<span class=\"predicate-type\">isCollection</span>");
|
||||||
|
}
|
||||||
PredicateFuncValue::Exist {} => {
|
PredicateFuncValue::Exist {} => {
|
||||||
buffer.push_str("<span class=\"predicate-type\">exists</span>");
|
buffer.push_str("<span class=\"predicate-type\">exists</span>");
|
||||||
}
|
}
|
||||||
|
@ -438,6 +438,24 @@ impl ToJson for Predicate {
|
|||||||
attributes.push(("type".to_string(), JValue::String("match".to_string())));
|
attributes.push(("type".to_string(), JValue::String("match".to_string())));
|
||||||
attributes.push(("value".to_string(), JValue::String(value.to_string())));
|
attributes.push(("value".to_string(), JValue::String(value.to_string())));
|
||||||
}
|
}
|
||||||
|
PredicateFuncValue::IsInteger {} => {
|
||||||
|
attributes.push(("type".to_string(), JValue::String("isInteger".to_string())));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsFloat {} => {
|
||||||
|
attributes.push(("type".to_string(), JValue::String("isFloat".to_string())));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsBoolean {} => {
|
||||||
|
attributes.push(("type".to_string(), JValue::String("isBoolean".to_string())));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsString {} => {
|
||||||
|
attributes.push(("type".to_string(), JValue::String("isString".to_string())));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsCollection {} => {
|
||||||
|
attributes.push((
|
||||||
|
"type".to_string(),
|
||||||
|
JValue::String("isCollection".to_string()),
|
||||||
|
));
|
||||||
|
}
|
||||||
PredicateFuncValue::Exist {} => {
|
PredicateFuncValue::Exist {} => {
|
||||||
attributes.push(("type".to_string(), JValue::String("exist".to_string())));
|
attributes.push(("type".to_string(), JValue::String("exist".to_string())));
|
||||||
}
|
}
|
||||||
|
@ -652,6 +652,22 @@ impl Tokenizable for PredicateFuncValue {
|
|||||||
add_tokens(&mut tokens, space0.tokenize());
|
add_tokens(&mut tokens, space0.tokenize());
|
||||||
add_tokens(&mut tokens, value.tokenize());
|
add_tokens(&mut tokens, value.tokenize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PredicateFuncValue::IsInteger {} => {
|
||||||
|
tokens.push(Token::PredicateType(String::from("isInteger")));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsFloat {} => {
|
||||||
|
tokens.push(Token::PredicateType(String::from("isFloat")));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsBoolean {} => {
|
||||||
|
tokens.push(Token::PredicateType(String::from("isBoolean")));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsString {} => {
|
||||||
|
tokens.push(Token::PredicateType(String::from("isString")));
|
||||||
|
}
|
||||||
|
PredicateFuncValue::IsCollection {} => {
|
||||||
|
tokens.push(Token::PredicateType(String::from("isCollection")));
|
||||||
|
}
|
||||||
PredicateFuncValue::Exist {} => {
|
PredicateFuncValue::Exist {} => {
|
||||||
tokens.push(Token::PredicateType(String::from("exists")));
|
tokens.push(Token::PredicateType(String::from("exists")));
|
||||||
}
|
}
|
||||||
|
@ -508,6 +508,11 @@ impl Lintable<PredicateFuncValue> for PredicateFuncValue {
|
|||||||
space0: one_whitespace(),
|
space0: one_whitespace(),
|
||||||
value: value.clone(),
|
value: value.clone(),
|
||||||
},
|
},
|
||||||
|
PredicateFuncValue::IsInteger {} => PredicateFuncValue::IsInteger {},
|
||||||
|
PredicateFuncValue::IsFloat {} => PredicateFuncValue::IsFloat {},
|
||||||
|
PredicateFuncValue::IsBoolean {} => PredicateFuncValue::IsBoolean {},
|
||||||
|
PredicateFuncValue::IsString {} => PredicateFuncValue::IsString {},
|
||||||
|
PredicateFuncValue::IsCollection {} => PredicateFuncValue::IsCollection {},
|
||||||
PredicateFuncValue::Exist {} => PredicateFuncValue::Exist {},
|
PredicateFuncValue::Exist {} => PredicateFuncValue::Exist {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user