mirror of
https://github.com/fluencelabs/jsonpath
synced 2025-04-25 09:22:19 +00:00
close #37
This commit is contained in:
commit
6f20013076
12
.idea/runConfigurations/filter.xml
generated
12
.idea/runConfigurations/filter.xml
generated
@ -1,12 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="filter" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
|
||||||
<option name="channel" value="DEFAULT" />
|
|
||||||
<option name="command" value="test --package jsonpath_lib --test filter """ />
|
|
||||||
<option name="allFeatures" value="false" />
|
|
||||||
<option name="nocapture" value="false" />
|
|
||||||
<option name="backtrace" value="SHORT" />
|
|
||||||
<option name="workingDirectory" value="file://$PROJECT_DIR$" />
|
|
||||||
<envs />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
12
.idea/runConfigurations/lib.xml
generated
12
.idea/runConfigurations/lib.xml
generated
@ -1,12 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="lib" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
|
||||||
<option name="channel" value="DEFAULT" />
|
|
||||||
<option name="command" value="test --package jsonpath_lib --test lib """ />
|
|
||||||
<option name="allFeatures" value="false" />
|
|
||||||
<option name="nocapture" value="false" />
|
|
||||||
<option name="backtrace" value="SHORT" />
|
|
||||||
<option name="workingDirectory" value="file://$PROJECT_DIR$" />
|
|
||||||
<envs />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
12
.idea/runConfigurations/mutable.xml
generated
12
.idea/runConfigurations/mutable.xml
generated
@ -1,12 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="mutable" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
|
||||||
<option name="channel" value="DEFAULT" />
|
|
||||||
<option name="command" value="test --package jsonpath_lib --test mutable """ />
|
|
||||||
<option name="allFeatures" value="false" />
|
|
||||||
<option name="nocapture" value="false" />
|
|
||||||
<option name="backtrace" value="SHORT" />
|
|
||||||
<option name="workingDirectory" value="file://$PROJECT_DIR$" />
|
|
||||||
<envs />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
12
.idea/runConfigurations/readme.xml
generated
12
.idea/runConfigurations/readme.xml
generated
@ -1,12 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="readme" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
|
||||||
<option name="channel" value="DEFAULT" />
|
|
||||||
<option name="command" value="test --package jsonpath_lib --test readme """ />
|
|
||||||
<option name="allFeatures" value="false" />
|
|
||||||
<option name="nocapture" value="false" />
|
|
||||||
<option name="backtrace" value="SHORT" />
|
|
||||||
<option name="workingDirectory" value="file://$PROJECT_DIR$" />
|
|
||||||
<envs />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
10
.travis.yml
10
.travis.yml
@ -24,15 +24,9 @@ matrix:
|
|||||||
before_script:
|
before_script:
|
||||||
- rustup component add clippy
|
- rustup component add clippy
|
||||||
script:
|
script:
|
||||||
- cargo clean
|
- ./clippy.sh
|
||||||
- cargo clippy -- -D warnings
|
|
||||||
- cargo build --verbose --all
|
|
||||||
- cargo clippy --all-targets --all-features -- -D warnings -A clippy::cognitive_complexity
|
|
||||||
- cargo test --verbose --all
|
|
||||||
- cd wasm && cargo clippy -- -D warnings -A clippy::suspicious_else_formatting
|
|
||||||
- cd ../../
|
|
||||||
after_success: |
|
after_success: |
|
||||||
cargo tarpaulin --exclude-files nodejs wasm parser/mod.rs --out Xml
|
cargo tarpaulin --exclude-files wasm parser/mod.rs --out Xml
|
||||||
bash <(curl -s https://codecov.io/bash)
|
bash <(curl -s https://codecov.io/bash)
|
||||||
- rust: stable
|
- rust: stable
|
||||||
os: osx
|
os: osx
|
||||||
|
11
clippy.sh
Executable file
11
clippy.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cargo clean
|
||||||
|
cargo clippy -- -D warnings
|
||||||
|
cargo build --verbose --all
|
||||||
|
cargo clippy --all-targets --all-features -- -D warnings -A clippy::cognitive_complexity
|
||||||
|
cargo test --verbose --all
|
||||||
|
cd wasm && cargo clippy -- -D warnings -A clippy::suspicious_else_formatting
|
||||||
|
cd ../
|
@ -710,18 +710,38 @@ impl<'a, 'b> Selector<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn next_from_current_with_num(&mut self, index: f64) {
|
fn next_from_current_with_num(&mut self, index: f64) {
|
||||||
if let Some(current) = self.current.take() {
|
fn _collect<'a>(tmp: &mut Vec<&'a Value>, vec: &'a [Value], index: f64) {
|
||||||
let mut tmp = Vec::new();
|
|
||||||
for c in current {
|
|
||||||
if let Value::Array(vec) = c {
|
|
||||||
let index = abs_index(index as isize, vec.len());
|
let index = abs_index(index as isize, vec.len());
|
||||||
if let Some(v) = c.get(index) {
|
if let Some(v) = vec.get(index) {
|
||||||
tmp.push(v);
|
tmp.push(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(current) = self.current.take() {
|
||||||
|
let mut tmp = Vec::new();
|
||||||
|
for c in current {
|
||||||
|
match c {
|
||||||
|
Value::Object(map) => {
|
||||||
|
for k in map.keys() {
|
||||||
|
if let Some(Value::Array(vec)) = map.get(k) {
|
||||||
|
_collect(&mut tmp, vec, index);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Value::Array(vec) => {
|
||||||
|
_collect(&mut tmp, vec, index);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if tmp.is_empty() {
|
||||||
|
self.terms.pop();
|
||||||
|
self.current = Some(vec![&Value::Null]);
|
||||||
|
} else {
|
||||||
self.current = Some(tmp);
|
self.current = Some(tmp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
"next_from_current_with_num : {:?}, {:?}",
|
"next_from_current_with_num : {:?}, {:?}",
|
||||||
@ -729,27 +749,6 @@ impl<'a, 'b> Selector<'a, 'b> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next_from_current_with_str(&mut self, keys: &[String]) {
|
|
||||||
if let Some(current) = self.current.take() {
|
|
||||||
let mut tmp = Vec::new();
|
|
||||||
for c in current {
|
|
||||||
if let Value::Object(map) = c {
|
|
||||||
for key in keys {
|
|
||||||
if let Some(v) = map.get(key) {
|
|
||||||
tmp.push(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.current = Some(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
debug!(
|
|
||||||
"next_from_current_with_str : {:?}, {:?}",
|
|
||||||
keys, self.current
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn next_all_from_current(&mut self) {
|
fn next_all_from_current(&mut self) {
|
||||||
if let Some(current) = self.current.take() {
|
if let Some(current) = self.current.take() {
|
||||||
let mut tmp = Vec::new();
|
let mut tmp = Vec::new();
|
||||||
@ -774,6 +773,32 @@ impl<'a, 'b> Selector<'a, 'b> {
|
|||||||
debug!("next_all_from_current : {:?}", self.current);
|
debug!("next_all_from_current : {:?}", self.current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn next_from_current_with_str(&mut self, keys: &[String]) {
|
||||||
|
if let Some(current) = self.current.take() {
|
||||||
|
let mut tmp = Vec::new();
|
||||||
|
for c in current {
|
||||||
|
if let Value::Object(map) = c {
|
||||||
|
for key in keys {
|
||||||
|
if let Some(v) = map.get(key) {
|
||||||
|
tmp.push(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if tmp.is_empty() {
|
||||||
|
self.current = Some(vec![&Value::Null]);
|
||||||
|
} else {
|
||||||
|
self.current = Some(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug!(
|
||||||
|
"next_from_current_with_str : {:?}, {:?}",
|
||||||
|
keys, self.current
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
fn all_from_current(&mut self) {
|
fn all_from_current(&mut self) {
|
||||||
if let Some(current) = self.current.take() {
|
if let Some(current) = self.current.take() {
|
||||||
let mut tmp = Vec::new();
|
let mut tmp = Vec::new();
|
||||||
|
218
tests/array_filter.rs
Normal file
218
tests/array_filter.rs
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate serde_json;
|
||||||
|
|
||||||
|
use common::{read_json, select_and_then_compare, setup};
|
||||||
|
|
||||||
|
mod common;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_default() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school.friends[1, 2]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_all() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[ : ]",
|
||||||
|
json!(["first", "second"]),
|
||||||
|
json!(["first", "second"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_all() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[::]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_only_step_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[::2]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["first", "third", "fifth"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_only_start_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[1::]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["second", "third", "forth", "fifth"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_empty_step_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[1:2:]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["second"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_empty_end_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[1::2]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["second", "forth"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_by_1() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[0:3:1]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["first", "second", "third"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_step_by_2() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[0:3:2]",
|
||||||
|
json!(["first", "second", "third", "forth", "fifth"]),
|
||||||
|
json!(["first", "third"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_only_negative_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[-4:]",
|
||||||
|
json!(["first", "second", "third"]),
|
||||||
|
json!(["first", "second", "third"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_only_end_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$[:4]",
|
||||||
|
json!(["first", "second", "third"]),
|
||||||
|
json!(["first", "second", "third"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_only_from_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school.friends[1: ]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_range_only_nagative_end_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school.friends[:-2]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
{"id": 0, "name": "Millicent Norman"}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..friends[2].name",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!(["Gray Berry", "Gray Berry"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_all_index() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..friends[*].name",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
"Vincent Cannon",
|
||||||
|
"Gray Berry",
|
||||||
|
"Millicent Norman",
|
||||||
|
"Vincent Cannon",
|
||||||
|
"Gray Berry"
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_all_and_then_key() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$['school']['friends'][*].['name']",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!(["Millicent Norman", "Vincent Cannon", "Gray Berry"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_index_and_then_key() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$['school']['friends'][0].['name']",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!(["Millicent Norman"]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn array_multiple_key() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.["eyeColor", "name"]"#,
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!(["blue", "Leonor Herman"]),
|
||||||
|
);
|
||||||
|
}
|
646
tests/filter.rs
646
tests/filter.rs
@ -1,619 +1,10 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
|
|
||||||
use serde_json::Value;
|
|
||||||
|
|
||||||
use common::{read_json, select_and_then_compare, setup};
|
use common::{read_json, select_and_then_compare, setup};
|
||||||
|
|
||||||
mod common;
|
mod common;
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn array() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school.friends[1, 2]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school.friends[1: ]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school.friends[:-2]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
{"id": 0, "name": "Millicent Norman"}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..friends[2].name",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!(["Gray Berry", "Gray Berry"]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..friends[*].name",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
"Vincent Cannon",
|
|
||||||
"Gray Berry",
|
|
||||||
"Millicent Norman",
|
|
||||||
"Vincent Cannon",
|
|
||||||
"Gray Berry"
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$['school']['friends'][*].['name']",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!(["Millicent Norman", "Vincent Cannon", "Gray Berry"]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$['school']['friends'][0].['name']",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!(["Millicent Norman"]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.["eyeColor", "name"]"#,
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!(["blue", "Leonor Herman"]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_type() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([{
|
|
||||||
"friends": [
|
|
||||||
{"id": 0, "name": "Millicent Norman"},
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]
|
|
||||||
}]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school[?(@.friends[0])]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([{
|
|
||||||
"friends": [
|
|
||||||
{"id": 0, "name": "Millicent Norman"},
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]
|
|
||||||
}]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school[?(@.friends[10])]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([{
|
|
||||||
"friends": [
|
|
||||||
{"id": 0, "name": "Millicent Norman"},
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]
|
|
||||||
}]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school[?(1==1)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([{
|
|
||||||
"friends": [
|
|
||||||
{"id": 0, "name": "Millicent Norman"},
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]
|
|
||||||
}]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school.friends[?(1==1)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([[
|
|
||||||
{"id": 0, "name": "Millicent Norman"},
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn op_default() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.school[?(@.friends == @.friends)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([{
|
|
||||||
"friends": [
|
|
||||||
{"id": 0, "name": "Millicent Norman"},
|
|
||||||
{"id": 1, "name": "Vincent Cannon" },
|
|
||||||
{"id": 2, "name": "Gray Berry"}
|
|
||||||
]
|
|
||||||
}]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.friends[?(@.name)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
{ "id" : 1, "name" : "Vincent Cannon" },
|
|
||||||
{ "id" : 2, "name" : "Gray Berry" }
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.friends[?(@.id >= 2)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
{ "id" : 2, "name" : "Gray Berry" }
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.friends[?(@.id >= 2 || @.id == 1)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([
|
|
||||||
{ "id" : 2, "name" : "Gray Berry" },
|
|
||||||
{ "id" : 1, "name" : "Vincent Cannon" }
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$.friends[?( (@.id >= 2 || @.id == 1) && @.id == 0)]",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..friends[?(@.id == $.index)].id",
|
|
||||||
read_json("./benchmark/data_obj.json"),
|
|
||||||
json!([0, 0]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..book[?($.store.bicycle.price < @.price)].price",
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([22.99]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..book[?( (@.price == 12.99 || @.category == 'reference') && @.price > 10)].price",
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([12.99]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..[?(@.age > 40)]",
|
|
||||||
json!([
|
|
||||||
{ "name": "이름1", "age": 40, "phone": "+33 12341234" },
|
|
||||||
{ "name": "이름2", "age": 42, "phone": "++44 12341234" }
|
|
||||||
]),
|
|
||||||
json!([
|
|
||||||
{ "name" : "이름2", "age" : 42, "phone" : "++44 12341234" }
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$..[?(@.age >= 30)]",
|
|
||||||
json!({
|
|
||||||
"school": {
|
|
||||||
"friends": [
|
|
||||||
{"name": "친구1", "age": 20},
|
|
||||||
{"name": "친구2", "age": 20}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"friends": [
|
|
||||||
{"name": "친구3", "age": 30},
|
|
||||||
{"name": "친구4"}
|
|
||||||
]}),
|
|
||||||
json!([
|
|
||||||
{ "name" : "친구3", "age" : 30 }
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn op_number() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare("$.[?(@.a == 1)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
|
||||||
select_and_then_compare("$.[?(@.a != 2)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
|
||||||
select_and_then_compare("$.[?(@.a < 2)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
|
||||||
select_and_then_compare("$.[?(@.a <= 1)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
|
||||||
select_and_then_compare("$.[?(@.a > 0)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
|
||||||
select_and_then_compare("$.[?(@.a >= 0)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn op_string() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a == "b")]"#,
|
|
||||||
json!({ "a": "b" }),
|
|
||||||
json!([{ "a": "b" }]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a != "c")]"#,
|
|
||||||
json!({ "a": "b" }),
|
|
||||||
json!([{ "a": "b" }]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a < "b")]"#,
|
|
||||||
json!({ "a": "b" }),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a <= "b")]"#,
|
|
||||||
json!({ "a": "b" }),
|
|
||||||
json!([{ "a": "b" }]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a > "b")]"#,
|
|
||||||
json!({ "a": "b" }),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a >= "b")]"#,
|
|
||||||
json!({ "a": "b" }),
|
|
||||||
json!([{ "a": "b" }]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn op_object() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a == @.c)]"#,
|
|
||||||
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
|
||||||
json!([{"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a != @.c)]"#,
|
|
||||||
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a < @.c)]"#,
|
|
||||||
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a <= @.c)]"#,
|
|
||||||
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a > @.c)]"#,
|
|
||||||
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a >= @.c)]"#,
|
|
||||||
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn op_complex() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(1 == @.a)]"#,
|
|
||||||
json!({ "a": { "b": 1 } }),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?("1" != @.a)]"#,
|
|
||||||
json!({ "a": { "b": 1 } }),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a <= 1)]"#,
|
|
||||||
json!({ "a": { "b": 1 } }),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.[?(@.a > "1")]"#,
|
|
||||||
json!({ "a": { "b": 1 } }),
|
|
||||||
json!([Value::Null]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[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]
|
|
||||||
fn example() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.store.book[*].author"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
"Nigel Rees",
|
|
||||||
"Evelyn Waugh",
|
|
||||||
"Herman Melville",
|
|
||||||
"J. R. R. Tolkien"
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..author"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
"Nigel Rees",
|
|
||||||
"Evelyn Waugh",
|
|
||||||
"Herman Melville",
|
|
||||||
"J. R. R. Tolkien"
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.store.*"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
[
|
|
||||||
{"category" : "reference", "author" : "Nigel Rees","title" : "Sayings of the Century", "price" : 8.95},
|
|
||||||
{"category" : "fiction", "author" : "Evelyn Waugh","title" : "Sword of Honour","price" : 12.99},
|
|
||||||
{"category" : "fiction", "author" : "Herman Melville","title" : "Moby Dick","isbn" : "0-553-21311-3","price" : 8.99},
|
|
||||||
{"category" : "fiction", "author" : "J. R. R. Tolkien","title" : "The Lord of the Rings","isbn" : "0-395-19395-8","price" : 22.99}
|
|
||||||
],
|
|
||||||
{"color" : "red","price" : 19.95},
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.store..price"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([8.95, 12.99, 8.99, 22.99, 19.95]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..book[2]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Herman Melville",
|
|
||||||
"title" : "Moby Dick",
|
|
||||||
"isbn" : "0-553-21311-3",
|
|
||||||
"price" : 8.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..book[-2]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Herman Melville",
|
|
||||||
"title" : "Moby Dick",
|
|
||||||
"isbn" : "0-553-21311-3",
|
|
||||||
"price" : 8.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..book[0, 1]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "reference",
|
|
||||||
"author" : "Nigel Rees",
|
|
||||||
"title" : "Sayings of the Century",
|
|
||||||
"price" : 8.95
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Evelyn Waugh",
|
|
||||||
"title" : "Sword of Honour",
|
|
||||||
"price" : 12.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..book[:2]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "reference",
|
|
||||||
"author" : "Nigel Rees",
|
|
||||||
"title" : "Sayings of the Century",
|
|
||||||
"price" : 8.95
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Evelyn Waugh",
|
|
||||||
"title" : "Sword of Honour",
|
|
||||||
"price" : 12.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..book[2:]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Herman Melville",
|
|
||||||
"title" : "Moby Dick",
|
|
||||||
"isbn" : "0-553-21311-3",
|
|
||||||
"price" : 8.99
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "J. R. R. Tolkien",
|
|
||||||
"title" : "The Lord of the Rings",
|
|
||||||
"isbn" : "0-395-19395-8",
|
|
||||||
"price" : 22.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..book[?(@.isbn)]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Herman Melville",
|
|
||||||
"title" : "Moby Dick",
|
|
||||||
"isbn" : "0-553-21311-3",
|
|
||||||
"price" : 8.99
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "J. R. R. Tolkien",
|
|
||||||
"title" : "The Lord of the Rings",
|
|
||||||
"isbn" : "0-395-19395-8",
|
|
||||||
"price" : 22.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$.store.book[?(@.price < 10)]"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
json!([
|
|
||||||
{
|
|
||||||
"category" : "reference",
|
|
||||||
"author" : "Nigel Rees",
|
|
||||||
"title" : "Sayings of the Century",
|
|
||||||
"price" : 8.95
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"category" : "fiction",
|
|
||||||
"author" : "Herman Melville",
|
|
||||||
"title" : "Moby Dick",
|
|
||||||
"isbn" : "0-553-21311-3",
|
|
||||||
"price" : 8.99
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..*"#,
|
|
||||||
read_json("./benchmark/example.json"),
|
|
||||||
read_json("./benchmark/giveme_every_thing_result.json"),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn filer_same_obj() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
r#"$..[?(@.a == 1)]"#,
|
|
||||||
json!({
|
|
||||||
"a": 1,
|
|
||||||
"b" : {"a": 1},
|
|
||||||
"c" : {"a": 1}
|
|
||||||
}),
|
|
||||||
json!([
|
|
||||||
{"a": 1},
|
|
||||||
{"a": 1}
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn range() {
|
|
||||||
setup();
|
|
||||||
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[ : ]",
|
|
||||||
json!(["first", "second"]),
|
|
||||||
json!(["first", "second"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[::]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[::2]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["first", "third", "fifth"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[1::]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["second", "third", "forth", "fifth"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[1:2:]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["second"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[1::2]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["second", "forth"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[0:3:1]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["first", "second", "third"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[0:3:2]",
|
|
||||||
json!(["first", "second", "third", "forth", "fifth"]),
|
|
||||||
json!(["first", "third"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[-4:]",
|
|
||||||
json!(["first", "second", "third"]),
|
|
||||||
json!(["first", "second", "third"]),
|
|
||||||
);
|
|
||||||
select_and_then_compare(
|
|
||||||
"$[:4]",
|
|
||||||
json!(["first", "second", "third"]),
|
|
||||||
json!(["first", "second", "third"]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn quote() {
|
fn quote() {
|
||||||
setup();
|
setup();
|
||||||
@ -631,7 +22,7 @@ fn quote() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn all_filter() {
|
fn filter_next_all() {
|
||||||
setup();
|
setup();
|
||||||
|
|
||||||
for path in &[r#"$.*"#, r#"$[*]"#] {
|
for path in &[r#"$.*"#, r#"$[*]"#] {
|
||||||
@ -641,6 +32,11 @@ fn all_filter() {
|
|||||||
json!(["string", 42, { "key": "value" }, [0, 1]]),
|
json!(["string", 42, { "key": "value" }, [0, 1]]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn filter_all() {
|
||||||
|
setup();
|
||||||
|
|
||||||
for path in &[r#"$..*"#, r#"$..[*]"#] {
|
for path in &[r#"$..*"#, r#"$..[*]"#] {
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
@ -649,6 +45,11 @@ fn all_filter() {
|
|||||||
json!([ "string", 42, { "key" : "value" }, [ 0, 1 ], "value", 0, 1 ]),
|
json!([ "string", 42, { "key" : "value" }, [ 0, 1 ], "value", 0, 1 ]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn filter_array_next_all() {
|
||||||
|
setup();
|
||||||
|
|
||||||
for path in &[r#"$.*.*"#, r#"$[*].*"#, r#"$.*[*]"#, r#"$[*][*]"#] {
|
for path in &[r#"$.*.*"#, r#"$[*].*"#, r#"$.*[*]"#, r#"$[*][*]"#] {
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
@ -657,6 +58,11 @@ fn all_filter() {
|
|||||||
json!(["value", 0, 1]),
|
json!(["value", 0, 1]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn filter_all_complex() {
|
||||||
|
setup();
|
||||||
|
|
||||||
for path in &[r#"$..friends.*"#, r#"$[*].friends.*"#] {
|
for path in &[r#"$..friends.*"#, r#"$[*].friends.*"#] {
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
@ -675,8 +81,9 @@ fn all_filter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn current_path() {
|
fn filter_parent_with_matched_child() {
|
||||||
setup();
|
setup();
|
||||||
|
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
"$.a[?(@.b.c == 1)]",
|
"$.a[?(@.b.c == 1)]",
|
||||||
json!({
|
json!({
|
||||||
@ -694,6 +101,11 @@ fn current_path() {
|
|||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn filter_parent_exist_child() {
|
||||||
|
setup();
|
||||||
|
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
"$.a[?(@.b.c)]",
|
"$.a[?(@.b.c)]",
|
||||||
@ -715,7 +127,7 @@ fn current_path() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn bugs33() {
|
fn bugs33_exist_in_all() {
|
||||||
setup();
|
setup();
|
||||||
|
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
@ -738,6 +150,11 @@ fn bugs33() {
|
|||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bugs33_exist_left_in_all_with_and_condition() {
|
||||||
|
setup();
|
||||||
|
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
"$..[?(@.first && @.first.second)]",
|
"$..[?(@.first && @.first.second)]",
|
||||||
@ -759,6 +176,11 @@ fn bugs33() {
|
|||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bugs33_exist_right_in_all_with_and_condition() {
|
||||||
|
setup();
|
||||||
|
|
||||||
select_and_then_compare(
|
select_and_then_compare(
|
||||||
"$..[?(@.b.c.d && @.b)]",
|
"$..[?(@.b.c.d && @.b)]",
|
||||||
|
242
tests/jsonpath_examples.rs
Normal file
242
tests/jsonpath_examples.rs
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate serde_json;
|
||||||
|
|
||||||
|
use common::{read_json, select_and_then_compare, setup};
|
||||||
|
|
||||||
|
mod common;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn example_authros_of_all_books() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.store.book[*].author"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
"Nigel Rees",
|
||||||
|
"Evelyn Waugh",
|
||||||
|
"Herman Melville",
|
||||||
|
"J. R. R. Tolkien"
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_authors() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..author"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
"Nigel Rees",
|
||||||
|
"Evelyn Waugh",
|
||||||
|
"Herman Melville",
|
||||||
|
"J. R. R. Tolkien"
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_things_both_books_and_bicycles() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.store.*"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
[
|
||||||
|
{"category" : "reference", "author" : "Nigel Rees","title" : "Sayings of the Century", "price" : 8.95},
|
||||||
|
{"category" : "fiction", "author" : "Evelyn Waugh","title" : "Sword of Honour","price" : 12.99},
|
||||||
|
{"category" : "fiction", "author" : "Herman Melville","title" : "Moby Dick","isbn" : "0-553-21311-3","price" : 8.99},
|
||||||
|
{"category" : "fiction", "author" : "J. R. R. Tolkien","title" : "The Lord of the Rings","isbn" : "0-395-19395-8","price" : 22.99}
|
||||||
|
],
|
||||||
|
{"color" : "red","price" : 19.95},
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn the_price_of_everything() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.store..price"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([8.95, 12.99, 8.99, 22.99, 19.95]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn the_third_book() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..book[2]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Herman Melville",
|
||||||
|
"title" : "Moby Dick",
|
||||||
|
"isbn" : "0-553-21311-3",
|
||||||
|
"price" : 8.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn the_second_to_last_book() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..book[-2]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Herman Melville",
|
||||||
|
"title" : "Moby Dick",
|
||||||
|
"isbn" : "0-553-21311-3",
|
||||||
|
"price" : 8.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn the_first_two_books() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..book[0, 1]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "reference",
|
||||||
|
"author" : "Nigel Rees",
|
||||||
|
"title" : "Sayings of the Century",
|
||||||
|
"price" : 8.95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Evelyn Waugh",
|
||||||
|
"title" : "Sword of Honour",
|
||||||
|
"price" : 12.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_books_from_index_0_inclusive_until_index_2_exclusive() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..book[:2]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "reference",
|
||||||
|
"author" : "Nigel Rees",
|
||||||
|
"title" : "Sayings of the Century",
|
||||||
|
"price" : 8.95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Evelyn Waugh",
|
||||||
|
"title" : "Sword of Honour",
|
||||||
|
"price" : 12.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_books_from_index_1_inclusive_until_index_2_exclusive() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..book[2:]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Herman Melville",
|
||||||
|
"title" : "Moby Dick",
|
||||||
|
"isbn" : "0-553-21311-3",
|
||||||
|
"price" : 8.99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "J. R. R. Tolkien",
|
||||||
|
"title" : "The Lord of the Rings",
|
||||||
|
"isbn" : "0-395-19395-8",
|
||||||
|
"price" : 22.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_books_with_an_isbn_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..book[?(@.isbn)]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Herman Melville",
|
||||||
|
"title" : "Moby Dick",
|
||||||
|
"isbn" : "0-553-21311-3",
|
||||||
|
"price" : 8.99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "J. R. R. Tolkien",
|
||||||
|
"title" : "The Lord of the Rings",
|
||||||
|
"isbn" : "0-395-19395-8",
|
||||||
|
"price" : 22.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_books_in_store_cheaper_than_10() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.store.book[?(@.price < 10)]"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([
|
||||||
|
{
|
||||||
|
"category" : "reference",
|
||||||
|
"author" : "Nigel Rees",
|
||||||
|
"title" : "Sayings of the Century",
|
||||||
|
"price" : 8.95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category" : "fiction",
|
||||||
|
"author" : "Herman Melville",
|
||||||
|
"title" : "Moby Dick",
|
||||||
|
"isbn" : "0-553-21311-3",
|
||||||
|
"price" : 8.99
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn give_me_every_thing() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..*"#,
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
read_json("./benchmark/giveme_every_thing_result.json"),
|
||||||
|
);
|
||||||
|
}
|
378
tests/op.rs
Normal file
378
tests/op.rs
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate serde_json;
|
||||||
|
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
|
use common::{read_json, select_and_then_compare, setup};
|
||||||
|
|
||||||
|
mod common;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_object_eq() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school[?(@.friends == @.friends)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([{
|
||||||
|
"friends": [
|
||||||
|
{"id": 0, "name": "Millicent Norman"},
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]
|
||||||
|
}]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_object_ge() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.friends[?(@.id >= 2)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
{ "id" : 2, "name" : "Gray Berry" }
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_object_or_default() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.friends[?(@.id >= 2 || @.id == 1)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
{ "id" : 2, "name" : "Gray Berry" },
|
||||||
|
{ "id" : 1, "name" : "Vincent Cannon" }
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_object_and_or() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.friends[?( (@.id >= 2 || @.id == 1) && @.id == 0)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_result_type() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..friends[?(@.id == $.index)].id",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([0, 0]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_absolute_path_result_type() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..book[?($.store.bicycle.price < @.price)].price",
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([22.99]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_complicated() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..book[?( (@.price == 12.99 || @.category == 'reference') && @.price > 10)].price",
|
||||||
|
read_json("./benchmark/example.json"),
|
||||||
|
json!([12.99]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_gt() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..[?(@.age > 40)]",
|
||||||
|
json!([
|
||||||
|
{ "name": "이름1", "age": 40, "phone": "+33 12341234" },
|
||||||
|
{ "name": "이름2", "age": 42, "phone": "++44 12341234" }
|
||||||
|
]),
|
||||||
|
json!([
|
||||||
|
{ "name" : "이름2", "age" : 42, "phone" : "++44 12341234" }
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ge() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$..[?(@.age >= 30)]",
|
||||||
|
json!({
|
||||||
|
"school": {
|
||||||
|
"friends": [
|
||||||
|
{"name": "친구1", "age": 20},
|
||||||
|
{"name": "친구2", "age": 20}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"friends": [
|
||||||
|
{"name": "친구3", "age": 30},
|
||||||
|
{"name": "친구4"}
|
||||||
|
]}),
|
||||||
|
json!([
|
||||||
|
{ "name" : "친구3", "age" : 30 }
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_eq_for_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare("$.[?(@.a == 1)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ne_for_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare("$.[?(@.a != 2)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_lt_for_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare("$.[?(@.a < 2)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_le_for_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare("$.[?(@.a <= 1)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_gt_for_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare("$.[?(@.a > 0)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ge_for_number() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare("$.[?(@.a >= 0)]", json!({ "a": 1 }), json!([{ "a": 1 }]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_eq_for_string_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a == "b")]"#, json!({ "a": "b" }), json!([{ "a": "b" }]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ne_for_string_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a != "c")]"#, json!({ "a": "b" }), json!([{ "a": "b" }]),
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_lt_for_string_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a < "b")]"#, json!({ "a": "b" }), json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_le_for_string_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a <= "b")]"#, json!({ "a": "b" }), json!([{ "a": "b" }]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_gt_for_string_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a > "b")]"#, json!({ "a": "b" }), json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ge_for_string_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a >= "b")]"#, json!({ "a": "b" }), json!([{ "a": "b" }]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_eq_for_object_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a == @.c)]"#,
|
||||||
|
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
||||||
|
json!([{"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ne_for_object_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a != @.c)]"#,
|
||||||
|
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_lt_for_object_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a < @.c)]"#,
|
||||||
|
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_le_for_object_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a <= @.c)]"#,
|
||||||
|
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_gt_for_object_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a > @.c)]"#,
|
||||||
|
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ge_for_object_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a >= @.c)]"#,
|
||||||
|
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_eq_for_complex_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(1 == @.a)]"#,
|
||||||
|
json!({ "a": { "b": 1 } }),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_ne_for_complex_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?("1" != @.a)]"#,
|
||||||
|
json!({ "a": { "b": 1 } }),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_le_for_complex_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a <= 1)]"#,
|
||||||
|
json!({ "a": { "b": 1 } }),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_gt_for_complex_value() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$.[?(@.a > "1")]"#,
|
||||||
|
json!({ "a": { "b": 1 } }),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn op_compare_different_types() {
|
||||||
|
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]
|
||||||
|
fn op_for_same_type() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
r#"$..[?(@.a == 1)]"#,
|
||||||
|
json!({
|
||||||
|
"a": 1,
|
||||||
|
"b" : {"a": 1},
|
||||||
|
"c" : {"a": 1}
|
||||||
|
}),
|
||||||
|
json!([
|
||||||
|
{"a": 1},
|
||||||
|
{"a": 1}
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
99
tests/return_type.rs
Normal file
99
tests/return_type.rs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate serde_json;
|
||||||
|
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
|
use common::{read_json, select_and_then_compare, setup};
|
||||||
|
|
||||||
|
mod common;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_type_for_single_object() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([{
|
||||||
|
"friends": [
|
||||||
|
{"id": 0, "name": "Millicent Norman"},
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]
|
||||||
|
}]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_type_for_single_object_key_matched() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.friends[?(@.name)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([
|
||||||
|
{ "id" : 1, "name" : "Vincent Cannon" },
|
||||||
|
{ "id" : 2, "name" : "Gray Berry" }
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_type_for_child_object_matched() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school[?(@.friends[0])]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([{
|
||||||
|
"friends": [
|
||||||
|
{"id": 0, "name": "Millicent Norman"},
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]
|
||||||
|
}]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_type_for_child_object_not_matched() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school[?(@.friends[10])]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([Value::Null]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_type_for_object_filter_true() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school[?(1==1)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([{
|
||||||
|
"friends": [
|
||||||
|
{"id": 0, "name": "Millicent Norman"},
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]
|
||||||
|
}]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_type_for_array_filter_true() {
|
||||||
|
setup();
|
||||||
|
|
||||||
|
select_and_then_compare(
|
||||||
|
"$.school.friends[?(1==1)]",
|
||||||
|
read_json("./benchmark/data_obj.json"),
|
||||||
|
json!([[
|
||||||
|
{"id": 0, "name": "Millicent Norman"},
|
||||||
|
{"id": 1, "name": "Vincent Cannon" },
|
||||||
|
{"id": 2, "name": "Gray Berry"}
|
||||||
|
]]),
|
||||||
|
);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user