use super::framework::*;
use super::helpers::*;
fn runner() -> ConformanceTestRunner {
ConformanceTestRunner::new()
}
#[test]
fn test_optional_01_basic() {
let ds = optional_dataset();
let algebra = project(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
vec![variable("s"), variable("name"), variable("mbox")],
);
let test = ConformanceTest::new(
"optional-01",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::ResultCount(3), );
runner().run_test(&test).expect("optional-01 failed");
}
#[test]
fn test_optional_02_all_have() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), foaf("name"), str_lit("A"));
ds.add_triple(ex("a"), foaf("mbox"), str_lit("a@ex.org"));
ds.add_triple(ex("b"), foaf("name"), str_lit("B"));
ds.add_triple(ex("b"), foaf("mbox"), str_lit("b@ex.org"));
let algebra = project(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
vec![variable("s"), variable("name"), variable("mbox")],
);
let test = ConformanceTest::new(
"optional-02",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::ResultCount(2),
);
runner().run_test(&test).expect("optional-02 failed");
}
#[test]
fn test_optional_03_none_have() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), foaf("name"), str_lit("A"));
ds.add_triple(ex("b"), foaf("name"), str_lit("B"));
let algebra = project(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
vec![variable("s"), variable("name")],
);
let test = ConformanceTest::new(
"optional-03",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::ResultCount(2), );
runner().run_test(&test).expect("optional-03 failed");
}
#[test]
fn test_optional_04_empty_left() {
let ds = InMemoryDataset::new();
let algebra = left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
);
let test = ConformanceTest::new(
"optional-04",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::ResultCount(0),
);
runner().run_test(&test).expect("optional-04 failed");
}
#[test]
fn test_optional_05_multiple_optional() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), foaf("name"), str_lit("Alice"));
ds.add_triple(ex("a"), foaf("mbox"), str_lit("a@ex"));
ds.add_triple(ex("a"), iri(&format!("{FOAF}age")), int_lit(30));
ds.add_triple(ex("b"), foaf("name"), str_lit("Bob"));
let algebra = project(
left_join(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
bgp(vec![triple(
var("s"),
iri(&format!("{FOAF}age")),
var("age"),
)]),
None,
),
vec![
variable("s"),
variable("name"),
variable("mbox"),
variable("age"),
],
);
let test = ConformanceTest::new(
"optional-05",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::ResultCount(2), );
runner().run_test(&test).expect("optional-05 failed");
}
#[test]
fn test_optional_06_specific_people() {
let ds = optional_dataset();
let algebra = project(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"optional-06",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::SelectResults(vec![
row(&[("name", "Alice")]),
row(&[("name", "Bob")]),
row(&[("name", "Charlie")]),
]),
);
runner().run_test(&test).expect("optional-06 failed");
}
#[test]
fn test_union_01_basic() {
let ds = union_dataset();
let algebra = project(
union(
bgp(vec![triple(
var("s"),
rdf_type(),
iri(&format!("{FOAF}Person")),
)]),
bgp(vec![triple(var("s"), ex("orgName"), var("n"))]),
),
vec![variable("s")],
);
let test = ConformanceTest::new(
"union-01",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(3), );
runner().run_test(&test).expect("union-01 failed");
}
#[test]
fn test_union_02_same_variable() {
let ds = union_dataset();
let algebra = project(
union(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), ex("orgName"), var("name"))]),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"union-02",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(3), );
runner().run_test(&test).expect("union-02 failed");
}
#[test]
fn test_union_03_left_only() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), ex("p1"), str_lit("v1"));
let algebra = union(
bgp(vec![triple(var("s"), ex("p1"), var("o"))]),
bgp(vec![triple(var("s"), ex("p2"), var("o"))]),
);
let test = ConformanceTest::new(
"union-03",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(1),
);
runner().run_test(&test).expect("union-03 failed");
}
#[test]
fn test_union_04_right_only() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), ex("p2"), str_lit("v2"));
let algebra = union(
bgp(vec![triple(var("s"), ex("p1"), var("o"))]),
bgp(vec![triple(var("s"), ex("p2"), var("o"))]),
);
let test = ConformanceTest::new(
"union-04",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(1),
);
runner().run_test(&test).expect("union-04 failed");
}
#[test]
fn test_union_05_empty_both() {
let ds = InMemoryDataset::new();
let algebra = union(
bgp(vec![triple(var("s"), ex("p1"), var("o"))]),
bgp(vec![triple(var("s"), ex("p2"), var("o"))]),
);
let test = ConformanceTest::new(
"union-05",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(0),
);
runner().run_test(&test).expect("union-05 failed");
}
#[test]
fn test_union_06_nested() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), ex("p1"), str_lit("v1"));
ds.add_triple(ex("b"), ex("p2"), str_lit("v2"));
ds.add_triple(ex("c"), ex("p3"), str_lit("v3"));
let algebra = union(
bgp(vec![triple(var("s"), ex("p1"), var("o"))]),
union(
bgp(vec![triple(var("s"), ex("p2"), var("o"))]),
bgp(vec![triple(var("s"), ex("p3"), var("o"))]),
),
);
let test = ConformanceTest::new(
"union-06",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(3),
);
runner().run_test(&test).expect("union-06 failed");
}
#[test]
fn test_union_07_distinct_after() {
let ds = union_dataset();
let algebra = distinct(project(
union(
bgp(vec![triple(var("s"), foaf("name"), var("n"))]),
bgp(vec![triple(var("s"), rdf_type(), var("t"))]),
),
vec![variable("s")],
));
let test = ConformanceTest::new(
"union-07",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(3), );
runner().run_test(&test).expect("union-07 failed");
}
#[test]
fn test_union_08_with_filter() {
let ds = union_dataset();
let algebra = project(
filter(
union(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), ex("orgName"), var("name"))]),
),
expr_gt(
expr_fn("str", vec![expr_var("name")]),
expr_lit(lit_str("")),
),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"union-08",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(3),
);
runner().run_test(&test).expect("union-08 failed");
}
#[test]
fn test_optional_union_01() {
let mut ds = InMemoryDataset::new();
ds.add_triple(ex("a"), foaf("name"), str_lit("Alice"));
ds.add_triple(ex("b"), ex("code"), str_lit("B001"));
let algebra = project(
union(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), ex("code"), var("code"))]),
None,
),
bgp(vec![triple(var("s"), ex("code"), var("code"))]),
),
vec![variable("s")],
);
let test = ConformanceTest::new(
"optional-union-01",
ConformanceGroup::Union,
algebra,
ds,
ConformanceResult::ResultCount(2), );
runner().run_test(&test).expect("optional-union-01 failed");
}
#[test]
fn test_optional_filter_01() {
let ds = optional_dataset();
let algebra = project(
filter(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
expr_eq(expr_var("name"), expr_lit(lit_str("Alice"))),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"optional-filter-01",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::SelectResults(vec![row(&[("name", "Alice")])]),
);
runner().run_test(&test).expect("optional-filter-01 failed");
}
#[test]
fn test_optional_filter_02_no_result() {
let ds = optional_dataset();
let algebra = project(
filter(
left_join(
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
bgp(vec![triple(var("s"), foaf("mbox"), var("mbox"))]),
None,
),
expr_eq(expr_var("name"), expr_lit(lit_str("NonExistent"))),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"optional-filter-02",
ConformanceGroup::Optional,
algebra,
ds,
ConformanceResult::ResultCount(0),
);
runner().run_test(&test).expect("optional-filter-02 failed");
}