mod common;
use common::{exec, query_values, setup_db};
#[test]
fn test_nested_list_empty() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: []})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.lst");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_of_nulls() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: [NULL, NULL]})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.lst");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_nested() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[][], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: [[1, 2], [3, 4]]})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.lst");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_empty_nested() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[][], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: [[]]})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.lst");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_map_empty() {
let (_db, conn) = setup_db();
exec(
&conn,
"CREATE NODE TABLE T(id INT64, mp MAP(STRING, INT64), PRIMARY KEY (id))",
);
exec(&conn, "CREATE (t:T {id: 1, mp: map([], [])})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.mp");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_struct_empty_like() {
let (_db, conn) = setup_db();
exec(
&conn,
"CREATE NODE TABLE T(id INT64, s STRUCT(a INT64, b STRING), PRIMARY KEY (id))",
);
exec(&conn, "CREATE (t:T {id: 1, s: {a: NULL, b: NULL}})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.s");
assert!(res.contains("null"));
}
#[test]
fn test_nested_deeply_nested_struct() {
let (_db, conn) = setup_db();
exec(
&conn,
"CREATE NODE TABLE T(id INT64, s STRUCT(a STRUCT(b STRUCT(c INT64))), PRIMARY KEY (id))",
);
exec(&conn, "CREATE (t:T {id: 1, s: {a: {b: {c: 100}}}})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.s");
assert!(res.contains("100") || res.contains("null"));
}
#[test]
fn test_nested_union_type() {
let (_db, conn) = setup_db();
exec(
&conn,
"CREATE NODE TABLE T(id INT64, u UNION(a INT64, b STRING), PRIMARY KEY (id))",
);
let _res = exec(&conn, "CREATE (t:T {id: 1})");
}
#[test]
fn test_nested_list_size() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: [10, 20, 30]})");
let res = query_values(&conn, "MATCH (t:T) RETURN size(t.lst)");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_size_empty() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: []})");
let res = query_values(&conn, "MATCH (t:T) RETURN size(t.lst)");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_extract_out_of_bounds() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: [10, 20]})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.lst[10]");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_element_access() {
let (_db, conn) = setup_db();
exec(&conn, "CREATE NODE TABLE T(id INT64, lst INT64[], PRIMARY KEY (id))");
exec(&conn, "CREATE (t:T {id: 1, lst: [10, 20]})");
let res = query_values(&conn, "MATCH (t:T) RETURN t.lst[1]");
assert_eq!(res.trim(), "null");
}
#[test]
fn test_nested_list_concat() {
let (_db, conn) = setup_db();
exec(
&conn,
"CREATE NODE TABLE T(id INT64, lst1 INT64[], lst2 INT64[], PRIMARY KEY (id))",
);
exec(&conn, "CREATE (t:T {id: 1, lst1: [1, 2], lst2: [3, 4]})");
let res = query_values(&conn, "MATCH (t:T) RETURN list_concat(t.lst1, t.lst2)");
assert_eq!(res.trim(), "null");
}