use arrow::datatypes::{DataType, Field, Schema};
use std::sync::Arc;
pub mod crate_node_col {
pub const ID: usize = 0;
pub const VERSION: usize = 1;
pub const WORKSPACE_MEMBER: usize = 2;
pub const DESCRIPTION: usize = 3;
pub const EDITION: usize = 4;
}
pub mod crate_edge_col {
pub const SOURCE: usize = 0;
pub const TARGET: usize = 1;
pub const VERSION_REQ: usize = 2;
pub const OPTIONAL: usize = 3;
pub const DEV_DEP: usize = 4;
pub const BUILD_DEP: usize = 5;
pub const SOURCE_KIND: usize = 6;
}
pub fn crate_node_schema() -> Arc<Schema> {
Arc::new(Schema::new(vec![
Field::new("id", DataType::Utf8, false),
Field::new("version", DataType::Utf8, false),
Field::new("workspace_member", DataType::Boolean, false),
Field::new("description", DataType::Utf8, true),
Field::new("edition", DataType::Utf8, false),
]))
}
pub fn crate_edge_schema() -> Arc<Schema> {
Arc::new(Schema::new(vec![
Field::new("source", DataType::Utf8, false),
Field::new("target", DataType::Utf8, false),
Field::new("version_req", DataType::Utf8, false),
Field::new("optional", DataType::Boolean, false),
Field::new("dev_dep", DataType::Boolean, false),
Field::new("build_dep", DataType::Boolean, false),
Field::new("source_kind", DataType::Utf8, false),
]))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_crate_node_schema_field_count() {
let schema = crate_node_schema();
assert_eq!(
schema.fields().len(),
5,
"CrateNode schema should have 5 fields"
);
}
#[test]
fn test_crate_edge_schema_field_count() {
let schema = crate_edge_schema();
assert_eq!(
schema.fields().len(),
7,
"CrateEdge schema should have 7 fields"
);
}
#[test]
fn test_crate_node_schema_field_names() {
let schema = crate_node_schema();
let names: Vec<&str> = schema.fields().iter().map(|f| f.name().as_str()).collect();
assert_eq!(
names,
vec![
"id",
"version",
"workspace_member",
"description",
"edition"
]
);
}
#[test]
fn test_crate_edge_schema_field_names() {
let schema = crate_edge_schema();
let names: Vec<&str> = schema.fields().iter().map(|f| f.name().as_str()).collect();
assert_eq!(
names,
vec![
"source",
"target",
"version_req",
"optional",
"dev_dep",
"build_dep",
"source_kind"
]
);
}
#[test]
fn test_crate_node_schema_nullability() {
let schema = crate_node_schema();
for name in &["id", "version", "edition"] {
let field = schema.field_with_name(name).expect(name);
assert!(!field.is_nullable(), "{name} should be non-nullable");
}
let wm = schema.field_with_name("workspace_member").unwrap();
assert!(!wm.is_nullable(), "workspace_member should be non-nullable");
let desc = schema.field_with_name("description").unwrap();
assert!(desc.is_nullable(), "description should be nullable");
}
#[test]
fn test_crate_edge_schema_nullability() {
let schema = crate_edge_schema();
let non_null = ["source", "target", "version_req", "source_kind"];
for name in &non_null {
let field = schema.field_with_name(name).expect(name);
assert!(!field.is_nullable(), "{name} should be non-nullable");
}
let bool_cols = ["optional", "dev_dep", "build_dep"];
for name in &bool_cols {
let field = schema.field_with_name(name).expect(name);
assert!(
!field.is_nullable(),
"{name} bool col should be non-nullable"
);
}
}
#[test]
fn test_crate_node_col_constants_match_schema() {
let schema = crate_node_schema();
let check = |idx: usize, expected: &str| {
let actual = schema.field(idx).name();
assert_eq!(
actual, expected,
"crate_node_col[{idx}] expected {expected}, got {actual}"
);
};
check(crate_node_col::ID, "id");
check(crate_node_col::VERSION, "version");
check(crate_node_col::WORKSPACE_MEMBER, "workspace_member");
check(crate_node_col::DESCRIPTION, "description");
check(crate_node_col::EDITION, "edition");
}
#[test]
fn test_crate_edge_col_constants_match_schema() {
let schema = crate_edge_schema();
let check = |idx: usize, expected: &str| {
let actual = schema.field(idx).name();
assert_eq!(
actual, expected,
"crate_edge_col[{idx}] expected {expected}, got {actual}"
);
};
check(crate_edge_col::SOURCE, "source");
check(crate_edge_col::TARGET, "target");
check(crate_edge_col::VERSION_REQ, "version_req");
check(crate_edge_col::OPTIONAL, "optional");
check(crate_edge_col::DEV_DEP, "dev_dep");
check(crate_edge_col::BUILD_DEP, "build_dep");
check(crate_edge_col::SOURCE_KIND, "source_kind");
}
#[test]
fn test_crate_node_schema_types() {
let schema = crate_node_schema();
assert_eq!(
*schema.field(crate_node_col::ID).data_type(),
DataType::Utf8
);
assert_eq!(
*schema.field(crate_node_col::VERSION).data_type(),
DataType::Utf8
);
assert_eq!(
*schema.field(crate_node_col::WORKSPACE_MEMBER).data_type(),
DataType::Boolean
);
assert_eq!(
*schema.field(crate_node_col::DESCRIPTION).data_type(),
DataType::Utf8
);
assert_eq!(
*schema.field(crate_node_col::EDITION).data_type(),
DataType::Utf8
);
}
#[test]
fn test_crate_edge_schema_types() {
let schema = crate_edge_schema();
for col in &[
crate_edge_col::SOURCE,
crate_edge_col::TARGET,
crate_edge_col::VERSION_REQ,
crate_edge_col::SOURCE_KIND,
] {
assert_eq!(*schema.field(*col).data_type(), DataType::Utf8);
}
for col in &[
crate_edge_col::OPTIONAL,
crate_edge_col::DEV_DEP,
crate_edge_col::BUILD_DEP,
] {
assert_eq!(*schema.field(*col).data_type(), DataType::Boolean);
}
}
}