use quarb::{QueryResult, Value};
fn doc() -> quarb_json::JsonAdapter {
quarb_json::JsonAdapter::parse(
r#"{"scenes":[{"who":["levin","kitty","anna","kitty"]},
{"who":["anna","vronsky"]},
{"who":["kitty","levin"]},
{"who":["dolly"]},
{"who":[]}]}"#,
)
.unwrap()
}
fn values(q: &str) -> Vec<String> {
match quarb::run(q, &doc()).unwrap() {
QueryResult::Values(vs) => vs.iter().map(Value::to_string).collect(),
_ => panic!("expected values"),
}
}
#[test]
fn pairs_are_unordered_and_each_once() {
assert_eq!(
values("/scenes/0/who/* | :: @| pairs"),
["anna, kitty", "anna, levin", "kitty, levin"]
);
assert_eq!(
values("/scenes/0/who/* | :: @| triples"),
["anna, kitty, levin"]
);
assert_eq!(
values("/scenes/0/who/* | :: @| combinations(1) @| count"),
["3"]
);
assert_eq!(values("/scenes/3/who/* | :: @| pairs @| count"), ["0"]);
}
#[test]
fn a_pair_counts_the_same_from_either_order() {
assert_eq!(
values(
"/scenes/* | (/who/*:: @| pairs) | [$_] @| group(p = $_) | count \
| \"${$.p}: ${$_}\" @| sort"
),
[
"anna, kitty: 1",
"anna, levin: 1",
"anna, vronsky: 1",
"kitty, levin: 2"
]
);
}
#[test]
fn an_operand_stage_yields_every_value() {
assert_eq!(values("/scenes/1 | (/who/*::)"), ["anna", "vronsky"]);
assert_eq!(values("/scenes/3 | (/who/*::)"), ["dolly"]);
assert_eq!(values("/scenes/4 | (/who/*::) @| count"), ["1"]);
}
#[test]
fn the_sizes_are_validated() {
assert!(quarb::run("/scenes/0/who/* | :: @| combinations", &doc()).is_err());
assert!(quarb::run("/scenes/0/who/* | :: @| combinations(0)", &doc()).is_err());
assert!(quarb::run("/scenes/0/who/* | :: @| pairs(2)", &doc()).is_err());
}
#[test]
fn unique_compares_nodes_by_identity() {
assert_eq!(values("/scenes/* @| unique @| count"), ["5"]);
assert_eq!(values("/scenes/0 | (/who/* @| unique @| count)"), ["4"]);
assert_eq!(values("/scenes/0 | (/who/*:: @| unique @| count)"), ["3"]);
}