pub mod prelude;
pub mod seed;
pub mod errors;
pub mod utils;
pub mod registry;
pub mod fuzzy;
#[cfg(test)]
mod tests {
use super::*;
use serde::{Serialize};
use serde_value;
use std::collections::BTreeMap;
use std::fmt;
use tantivy::schema::{Schema, IntOptions, TEXT, STORED};
use std::ops::{Deref, DerefMut};
use std::fmt::Debug;
#[derive(Serialize, Clone, PartialEq)]
struct SchemaTest(Schema);
impl Deref for SchemaTest {
type Target = Schema;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for SchemaTest {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl Debug for SchemaTest {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let schema = &self.0;
let x = schema.fields();
let mut fields = Vec::new();
for (field, _) in x {
fields.push(field);
}
f.write_str(format!("{:?}", fields).as_str())
}
}
impl SchemaTest {
fn new(schema: Schema) -> Self {
Self(schema)
}
}
#[derive(Serialize)]
struct Dummy {
x: String,
y: String,
z: u64,
}
#[derive(Serialize)]
struct Giant {
a: String,
b: bool,
c: u64,
d: u32,
e: u16,
f: u8,
g: i64,
h: i32,
i: i16,
j: i8,
k: f64,
l: f32,
m: Vec<u8>,
}
#[test]
fn validate_field_names() {
let data = Dummy {
x: "A".to_owned(),
y: "B".to_owned(),
z: 100,
};
let value = utils::as_value(&data).unwrap();
let computed = utils::field_names(&value).unwrap();
let expected = vec!["x", "y", "z"];
assert_eq!(expected, computed);
}
#[test]
fn validate_as_value() {
let data = Dummy {
x: "X".to_owned(),
y: "Y".to_owned(),
z: 100,
};
let mut bmap = BTreeMap::new();
bmap.insert(serde_value::Value::String("x".to_owned()), serde_value::Value::String("X".to_owned()));
bmap.insert(serde_value::Value::String("y".to_owned()), serde_value::Value::String("Y".to_owned()));
bmap.insert(serde_value::Value::String("z".to_owned()), serde_value::Value::U64(100));
let expected = serde_value::Value::Map(bmap);
let computed = utils::as_value(&data).unwrap();
assert_eq!(expected, computed);
}
#[test]
fn validate_basic_schema() {
let data = Dummy {
x: "X".to_owned(),
y: "Y".to_owned(),
z: 100u64,
};
let data = utils::as_value(&data).unwrap();
let (computed, _) = utils::to_schema(&data, None).unwrap();
let computed = SchemaTest::new(computed);
let mut expected = Schema::builder();
expected.add_text_field("x", TEXT | STORED);
expected.add_text_field("y", TEXT | STORED);
let options = IntOptions::default();
let options = options.set_stored();
let options = options.set_indexed();
expected.add_u64_field("z", options);
let expected = expected.build();
let expected = SchemaTest::new(expected);
assert_eq!(expected, computed);
}
#[test]
fn validate_full_schema() {
let a: String = "Empire Of The Clouds".to_string();
let b: bool = true;
let c: u64 = 1;
let d: u32 = 1;
let e: u16 = 1;
let f: u8 = 1;
let g: i64 = 1;
let h: i32 = 1;
let i: i16 = 1;
let j: i8 = 1;
let k: f64 = 1.0;
let l: f32 = 1.0;
let m: Vec<u8> = "The book of souls".as_bytes().to_vec();
let data = Giant {
a,
b,
c,
d,
e,
f,
g,
h,
i,
j,
k,
l,
m,
};
let data = utils::as_value(&data).unwrap();
let (computed, _) = utils::to_schema(&data, None).unwrap();
let computed = SchemaTest::new(computed);
let mut expected = Schema::builder();
expected.add_text_field("a", TEXT | STORED);
expected.add_text_field("b", TEXT | STORED);
let options = IntOptions::default();
let options = options.set_stored();
let options = options.set_indexed();
expected.add_u64_field("c", options.clone());
expected.add_u64_field("d", options.clone());
expected.add_u64_field("e", options.clone());
expected.add_u64_field("f", options.clone());
expected.add_i64_field("g", options.clone());
expected.add_i64_field("h", options.clone());
expected.add_i64_field("i", options.clone());
expected.add_i64_field("j", options.clone());
expected.add_f64_field("k", options.clone());
expected.add_f64_field("l", options.clone());
expected.add_bytes_field("m");
let expected = expected.build();
let expected = SchemaTest::new(expected);
assert_eq!(format!("{:?}", expected), format!("{:?}", computed));
assert_eq!(expected, computed);
}
}