select code coverage

This commit is contained in:
freestrings 2019-06-20 18:55:41 +09:00
parent c19c75dac5
commit f536391b71
2 changed files with 53 additions and 21 deletions

View File

@ -995,28 +995,44 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> {
.push(Some(ExprTerm::Number(Number::from_f64(*v).unwrap()))); .push(Some(ExprTerm::Number(Number::from_f64(*v).unwrap())));
} }
ParseToken::Filter(ref ft) => { ParseToken::Filter(ref ft) => {
if let Some(Some(ref right)) = self.terms.pop() { let ref right = match self.terms.pop() {
if let Some(Some(left)) = self.terms.pop() { Some(Some(right)) => right,
let mut ret = None; Some(None) => ExprTerm::Json(
match ft { None,
FilterToken::Equal => left.eq(right, &mut ret), match &self.current {
FilterToken::NotEqual => left.ne(right, &mut ret), Some(current) => current.to_vec(),
FilterToken::Greater => left.gt(right, &mut ret), _ => unreachable!(),
FilterToken::GreaterOrEqual => left.ge(right, &mut ret), },
FilterToken::Little => left.lt(right, &mut ret), ),
FilterToken::LittleOrEqual => left.le(right, &mut ret), _ => panic!("empty term right"),
FilterToken::And => left.and(right, &mut ret), };
FilterToken::Or => left.or(right, &mut ret),
};
if let Some(e) = ret { let left = match self.terms.pop() {
self.terms.push(Some(e)); Some(Some(left)) => left,
} Some(None) => ExprTerm::Json(
} else { None,
unreachable!() match &self.current {
} Some(current) => current.to_vec(),
} else { _ => unreachable!(),
unreachable!() },
),
_ => panic!("empty term left"),
};
let mut ret = None;
match ft {
FilterToken::Equal => left.eq(right, &mut ret),
FilterToken::NotEqual => left.ne(right, &mut ret),
FilterToken::Greater => left.gt(right, &mut ret),
FilterToken::GreaterOrEqual => left.ge(right, &mut ret),
FilterToken::Little => left.lt(right, &mut ret),
FilterToken::LittleOrEqual => left.le(right, &mut ret),
FilterToken::And => left.and(right, &mut ret),
FilterToken::Or => left.or(right, &mut ret),
};
if let Some(e) = ret {
self.terms.push(Some(e));
} }
} }
ParseToken::Range(from, to, step) => { ParseToken::Range(from, to, step) => {

View File

@ -343,6 +343,22 @@ fn op_complex() {
); );
} }
#[test]
fn op_compare() {
setup();
for path in [
r#"$[?("1" == 1)]"#,
r#"$[?(1 == "1")]"#,
r#"$[?(true == 1)]"#,
r#"$[?(@ == 1)]"#,
]
.iter()
{
select_and_then_compare(path, json!({}), json!([Value::Null]));
}
}
#[test] #[test]
fn example() { fn example() {
setup(); setup();