jsonpath/tests/selector.rs

178 lines
3.8 KiB
Rust
Raw Normal View History

2019-06-09 22:55:35 +09:00
extern crate jsonpath_lib as jsonpath;
#[macro_use]
extern crate serde_json;
use common::{read_json, setup};
2019-08-11 11:18:07 +03:00
use jsonpath::{Parser, Selector, SelectorMut};
2019-06-09 22:55:35 +09:00
use serde_json::Value;
mod common;
#[test]
fn selector_mut() {
setup();
2019-06-25 18:58:25 +09:00
let mut selector_mut = SelectorMut::default();
2019-06-09 22:55:35 +09:00
let mut nums = Vec::new();
let result = selector_mut
2019-06-19 11:34:47 +09:00
.str_path(r#"$.store..price"#)
.unwrap()
2019-06-26 16:33:58 +09:00
.value(read_json("./benchmark/example.json"))
2019-06-09 22:55:35 +09:00
.replace_with(&mut |v| {
2019-06-25 22:42:21 +09:00
if let Value::Number(n) = v {
nums.push(n.as_f64().unwrap());
2019-06-09 22:55:35 +09:00
}
Some(Value::String("a".to_string()))
2019-06-19 11:34:47 +09:00
})
.unwrap()
.take()
.unwrap();
2019-06-09 22:55:35 +09:00
2019-06-19 11:34:47 +09:00
assert_eq!(
nums,
vec![8.95_f64, 12.99_f64, 8.99_f64, 22.99_f64, 19.95_f64]
);
2019-06-09 22:55:35 +09:00
2019-06-25 18:58:25 +09:00
let mut selector = Selector::default();
2019-06-19 11:34:47 +09:00
let result = selector
.str_path(r#"$.store..price"#)
.unwrap()
2019-06-09 22:55:35 +09:00
.value(&result)
2019-06-19 11:34:47 +09:00
.select()
.unwrap();
assert_eq!(
vec![
&json!("a"),
&json!("a"),
&json!("a"),
&json!("a"),
&json!("a")
],
result
);
}
2019-06-26 15:07:49 +09:00
#[test]
fn selector_node_ref() {
let node = Parser::compile("$.*").unwrap();
let mut selector = Selector::default();
selector.compiled_path(&node);
assert!(std::ptr::eq(selector.node_ref().unwrap(), &node));
}
2019-08-11 11:18:07 +03:00
#[test]
fn selector_delete() {
setup();
let mut selector_mut = SelectorMut::default();
let result = selector_mut
.str_path(r#"$.store..price[?(@>13)]"#)
.unwrap()
.value(read_json("./benchmark/example.json"))
.delete()
.unwrap()
.take()
.unwrap();
let mut selector = Selector::default();
let result = selector
.str_path(r#"$.store..price"#)
.unwrap()
.value(&result)
.select()
.unwrap();
assert_eq!(
result,
vec![
&json!(8.95),
&json!(12.99),
&json!(8.99),
&Value::Null,
&Value::Null
]
);
}
2019-08-26 17:47:22 +03:00
#[test]
fn selector_remove() {
setup();
let mut selector_mut = SelectorMut::default();
let result = selector_mut
.str_path(r#"$.store..price[?(@>13)]"#)
.unwrap()
.value(read_json("./benchmark/example.json"))
.remove()
.unwrap()
.take()
.unwrap();
let mut selector = Selector::default();
let result = selector
.str_path(r#"$.store..price"#)
.unwrap()
.value(&result)
.select()
.unwrap();
2020-11-23 07:45:26 +03:00
assert_eq!(result, vec![&json!(8.95), &json!(12.99), &json!(8.99)]);
}
#[test]
fn iter_test() {
use std::rc::Rc;
struct T {
pub value: Rc<Value>,
pub tt: i32,
};
let t = Value::Array(vec![
Value::String(String::from("vv")),
Value::Array(vec![]),
]);
let t1 = T {
value: Rc::new(t.clone()),
tt: 1,
};
let t2 = T {
value: Rc::new(t.clone()),
tt: 1,
};
let values = vec![t1, t2];
let mut selector = Selector::default();
let path = "$.[0]";
let result = selector
.str_path(path)
.unwrap()
.values_iter(values.iter().map(|v| v.value.as_ref()))
.select()
.unwrap();
assert_eq!(result, vec![&json!(["vv", []])]);
let result = jsonpath::select_with_iter(values.iter().map(|v| v.value.as_ref()), path).unwrap();
assert_eq!(result.0, vec![&json!(["vv", []])]);
assert_eq!(result.1, vec![0]);
let values = vec![json!([1, 2, 3, 4]), json!([2, 2]), json!(3)];
let mut selector = Selector::default();
let result = selector
.str_path(path)
.unwrap()
.values_iter(values.iter())
.select()
.unwrap();
assert_eq!(result, vec![&json!([1, 2, 3, 4])]);
2019-08-26 17:47:22 +03:00
}