use crate::domain::Domain;
use crate::entry::Entry;
pub trait KnowledgeProvider {
fn source_name(&self) -> &str;
fn domain(&self) -> Domain;
fn entries(&self) -> Vec<Entry>;
}
#[cfg(test)]
mod tests {
use super::*;
use crate::entry::{Constant, EntryKind};
struct TestProvider;
impl KnowledgeProvider for TestProvider {
fn source_name(&self) -> &str {
"test"
}
fn domain(&self) -> Domain {
Domain::Mathematics
}
fn entries(&self) -> Vec<Entry> {
vec![Entry::new(
"test_pi",
"Pi",
Domain::Mathematics,
"The ratio of circumference to diameter.",
EntryKind::Constant(Constant {
symbol: "\u{03c0}".into(),
value: "3.14159265358979".into(),
unit: "".into(),
numeric: std::f64::consts::PI,
uncertainty: None,
authority: "exact".into(),
}),
"test",
vec!["circle".into(), "geometry".into()],
)]
}
}
#[test]
fn provider_trait_basics() {
let p = TestProvider;
assert_eq!(p.source_name(), "test");
assert_eq!(p.domain(), Domain::Mathematics);
let entries = p.entries();
assert_eq!(entries.len(), 1);
assert_eq!(entries[0].id, "test_pi");
}
#[test]
fn provider_is_object_safe() {
let p: Box<dyn KnowledgeProvider> = Box::new(TestProvider);
assert_eq!(p.source_name(), "test");
assert_eq!(p.entries().len(), 1);
}
}