parent
a75685b624
commit
d9c5d5dbbb
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
* Builtin functions to check for nan, infinity and subnormality in floats (#101)
|
* Builtin functions to check for nan, infinity and subnormality in floats (#101)
|
||||||
* Builtin random function (#102)
|
* Builtin random function (#102)
|
||||||
|
* Implement `TryFrom<Value>` for all types a value can hold (#105)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
@ -22,6 +23,7 @@
|
|||||||
My warmhearted thanks goes to:
|
My warmhearted thanks goes to:
|
||||||
|
|
||||||
* [Ophir LOJKINE](https://github.com/lovasoa)
|
* [Ophir LOJKINE](https://github.com/lovasoa)
|
||||||
|
* [Joe Grund](https://github.com/jgrund)
|
||||||
|
|
||||||
## [7.2.0](https://github.com/ISibboI/evalexpr/compare/7.1.1...7.2.0) - 2022-03-16
|
## [7.2.0](https://github.com/ISibboI/evalexpr/compare/7.1.1...7.2.0) - 2022-03-16
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#![cfg(not(tarpaulin_include))]
|
#![cfg(not(tarpaulin_include))]
|
||||||
|
|
||||||
use evalexpr::{error::*, *};
|
use evalexpr::{error::*, *};
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_unary_examples() {
|
fn test_unary_examples() {
|
||||||
@ -1876,3 +1877,209 @@ fn test_parenthese_combinations() {
|
|||||||
assert_eq!(eval_int("(((1+2)*(3+4)+(5-(6)))/((7-8)))"), Ok(-20));
|
assert_eq!(eval_int("(((1+2)*(3+4)+(5-(6)))/((7-8)))"), Ok(-20));
|
||||||
assert_eq!(eval_int("(((((5)))))"), Ok(5));
|
assert_eq!(eval_int("(((((5)))))"), Ok(5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_try_from() {
|
||||||
|
#![allow(clippy::redundant_clone)]
|
||||||
|
|
||||||
|
let value = Value::String("abc".to_string());
|
||||||
|
assert_eq!(String::try_from(value.clone()), Ok("abc".to_string()));
|
||||||
|
assert_eq!(
|
||||||
|
FloatType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedFloat {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IntType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedInt {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
bool::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedBoolean {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
TupleType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedTuple {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
EmptyType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedEmpty {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let value = Value::Float(1.3);
|
||||||
|
assert_eq!(
|
||||||
|
String::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedString {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(FloatType::try_from(value.clone()), Ok(1.3));
|
||||||
|
assert_eq!(
|
||||||
|
IntType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedInt {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
bool::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedBoolean {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
TupleType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedTuple {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
EmptyType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedEmpty {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let value = Value::Int(13);
|
||||||
|
assert_eq!(
|
||||||
|
String::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedString {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FloatType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedFloat {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(IntType::try_from(value.clone()), Ok(13));
|
||||||
|
assert_eq!(
|
||||||
|
bool::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedBoolean {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
TupleType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedTuple {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
EmptyType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedEmpty {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let value = Value::Boolean(true);
|
||||||
|
assert_eq!(
|
||||||
|
String::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedString {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FloatType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedFloat {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IntType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedInt {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(bool::try_from(value.clone()), Ok(true));
|
||||||
|
assert_eq!(
|
||||||
|
TupleType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedTuple {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
EmptyType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedEmpty {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let value = Value::Tuple(vec![Value::Int(1), Value::String("abc".to_string())]);
|
||||||
|
assert_eq!(
|
||||||
|
String::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedString {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FloatType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedFloat {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IntType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedInt {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
bool::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedBoolean {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
TupleType::try_from(value.clone()),
|
||||||
|
Ok(vec![Value::Int(1), Value::String("abc".to_string())])
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
EmptyType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedEmpty {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let value = Value::Empty;
|
||||||
|
assert_eq!(
|
||||||
|
String::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedString {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
FloatType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedFloat {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IntType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedInt {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
bool::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedBoolean {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
TupleType::try_from(value.clone()),
|
||||||
|
Err(EvalexprError::ExpectedTuple {
|
||||||
|
actual: value.clone()
|
||||||
|
})
|
||||||
|
);
|
||||||
|
assert_eq!(EmptyType::try_from(value.clone()), Ok(()));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user