Corrected Record::new().
Some checks failed
MoreThanText/morethantext/pipeline/head There was a failure building this commit
Some checks failed
MoreThanText/morethantext/pipeline/head There was a failure building this commit
This commit is contained in:
parent
a26471088d
commit
a86cbacf7b
@ -25,8 +25,18 @@ pub struct Record {
|
||||
}
|
||||
|
||||
impl Record {
|
||||
pub fn new(data: HashMap<String, Field>) -> Self {
|
||||
Self { data: data }
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
data: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add<S, D>(&mut self, name: S, data: D) -> Option<Field>
|
||||
where
|
||||
String: From<S>,
|
||||
Field: From<D>,
|
||||
{
|
||||
self.data.insert(name.into(), data.into())
|
||||
}
|
||||
}
|
||||
|
||||
@ -56,21 +66,49 @@ mod records {
|
||||
|
||||
#[test]
|
||||
fn new_record() {
|
||||
let data: HashMap<String, Field> = HashMap::new();
|
||||
let rec = Record::new(data);
|
||||
let rec = Record::new();
|
||||
assert_eq!(rec.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_field() {
|
||||
let mut rec = Record::new();
|
||||
let name = "field_name";
|
||||
let data = ID::random();
|
||||
rec.add(name.to_string(), data);
|
||||
match rec.get(name) {
|
||||
Some(data) => match data {
|
||||
Field::ID(result) => assert_eq!(result.to_string(), data.to_string()),
|
||||
},
|
||||
None => unreachable!("Should get data back"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_alternate_field() {
|
||||
let mut rec = Record::new();
|
||||
let name = "alternate";
|
||||
let data = ID::random();
|
||||
rec.add(name, data.clone());
|
||||
match rec.get(name) {
|
||||
Some(data) => match data {
|
||||
Field::ID(result) => assert_eq!(result.to_string(), data.to_string()),
|
||||
},
|
||||
None => unreachable!("Should get data back"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn record_iter() {
|
||||
let a = Field::from(ID::random());
|
||||
let b = Field::from(ID::random());
|
||||
let c = Field::from(ID::random());
|
||||
let mut data: HashMap<String, Field> = HashMap::new();
|
||||
data.insert("a".to_string(), a.clone());
|
||||
data.insert("b".to_string(), b.clone());
|
||||
data.insert("c".to_string(), c.clone());
|
||||
let rec = Record::new(data.clone());
|
||||
let mut data: HashMap<String, ID> = HashMap::new();
|
||||
data.insert("a".to_string(), ID::random());
|
||||
data.insert("b".to_string(), ID::random());
|
||||
data.insert("c".to_string(), ID::random());
|
||||
let mut rec = Record::new();
|
||||
for (key, value) in data.iter() {
|
||||
rec.add(key, value.clone());
|
||||
}
|
||||
assert_eq!(rec.len(), data.len());
|
||||
for (key, value) in rec.iter() {
|
||||
assert_eq!(value.to_string(), data.get(key).unwrap().to_string());
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ use std::{collections::HashMap, fmt};
|
||||
pub enum TBLError {
|
||||
DuplicateField(String),
|
||||
InvalidField(String),
|
||||
MissingField(String),
|
||||
}
|
||||
|
||||
impl fmt::Display for TBLError {
|
||||
@ -18,6 +19,7 @@ impl fmt::Display for TBLError {
|
||||
match self {
|
||||
TBLError::DuplicateField(data) => write!(f, "'{}' already exists", data),
|
||||
TBLError::InvalidField(data) => write!(f, "'{}' invalid field name", data),
|
||||
TBLError::MissingField(data) => write!(f, "'{}' field is missing", data),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -39,6 +41,13 @@ mod errors {
|
||||
let err = TBLError::InvalidField(data.to_string());
|
||||
assert_eq!(err.to_string(), format!("'{}' invalid field name", data));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn missing_field() {
|
||||
let data = "something";
|
||||
let err = TBLError::MissingField(data.to_string());
|
||||
assert_eq!(err.to_string(), format!("'{}' field is missing", data));
|
||||
}
|
||||
}
|
||||
|
||||
enum FieldType {
|
||||
@ -86,15 +95,22 @@ impl Table {
|
||||
}
|
||||
|
||||
fn add_record(&mut self, rec: Record) -> Result<Record, MTTError> {
|
||||
for (key, _) in rec.iter() {
|
||||
match self.fields.get(key) {
|
||||
let mut holder = rec.clone();
|
||||
for (key, _) in self.fields.iter() {
|
||||
match holder.remove(key.into()) {
|
||||
Some(_) => {}
|
||||
None => {
|
||||
let err = TBLError::InvalidField(key.to_string());
|
||||
let err = TBLError::MissingField(key.to_string());
|
||||
return Err(err.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
if holder.len() > 0 {
|
||||
for (key, _) in holder.iter() {
|
||||
let err = TBLError::InvalidField(key.to_string());
|
||||
return Err(err.into());
|
||||
}
|
||||
}
|
||||
Ok(rec)
|
||||
}
|
||||
}
|
||||
@ -134,10 +150,10 @@ mod table {
|
||||
match tbl.add_field(name, FieldType::ID) {
|
||||
Ok(_) => unreachable!(" Should not duplicates."),
|
||||
Err(err) => match err.get_code() {
|
||||
ErrorType::TBLErr(data) => {match data {
|
||||
ErrorType::TBLErr(data) => match data {
|
||||
TBLError::DuplicateField(fname) => assert_eq!(fname, name),
|
||||
_ => unreachable!("Should have been a dupluicate field error"),
|
||||
}}
|
||||
},
|
||||
_ => unreachable!("should produce a duplicate name error"),
|
||||
},
|
||||
}
|
||||
@ -149,9 +165,8 @@ mod table {
|
||||
let name = "id";
|
||||
let field_data = ID::random();
|
||||
tbl.add_field(name, FieldType::ID).unwrap();
|
||||
let mut data: HashMap<String, Field> = HashMap::new();
|
||||
data.insert(name.to_string(), field_data.clone().into());
|
||||
let rec = Record::new(data);
|
||||
let mut rec = Record::new();
|
||||
rec.add(name, field_data.clone());
|
||||
let result = tbl.add_record(rec).unwrap();
|
||||
assert_eq!(
|
||||
result.get(name).unwrap().to_string(),
|
||||
@ -164,9 +179,8 @@ mod table {
|
||||
let mut tbl = Table::new();
|
||||
let name = "id";
|
||||
let field_data = ID::random();
|
||||
let mut data: HashMap<String, Field> = HashMap::new();
|
||||
data.insert(name.to_string(), field_data.clone().into());
|
||||
let rec = Record::new(data);
|
||||
let mut rec = Record::new();
|
||||
rec.add(name, field_data.clone());
|
||||
match tbl.add_record(rec) {
|
||||
Ok(_) => unreachable!("should have produced an error"),
|
||||
Err(err) => match err.get_code() {
|
||||
@ -175,7 +189,28 @@ mod table {
|
||||
_ => unreachable!("should have been invalid field name"),
|
||||
},
|
||||
_ => unreachable!("should have been a table error"),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_record_missing_field() {
|
||||
let mut tbl = Table::new();
|
||||
let present = "here";
|
||||
let missing = "not";
|
||||
tbl.add_field(present, FieldType::ID);
|
||||
tbl.add_field(missing, FieldType::ID);
|
||||
let mut rec = Record::new();
|
||||
rec.add(present, ID::random());
|
||||
match tbl.add_record(rec) {
|
||||
Ok(_) => unreachable!("should have produced an error"),
|
||||
Err(err) => match err.get_code() {
|
||||
ErrorType::TBLErr(error) => match error {
|
||||
TBLError::MissingField(result) => assert_eq!(result, missing),
|
||||
_ => unreachable!("should have been missing field"),
|
||||
},
|
||||
_ => unreachable!("should have been a table error"),
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::data::{id::IDError, DBError, table::TBLError};
|
||||
use crate::data::{id::IDError, table::TBLError, DBError};
|
||||
use std::{error::Error, fmt};
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -109,7 +109,6 @@ impl From<TBLError> for MTTError {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod errors {
|
||||
use super::*;
|
||||
|
Loading…
Reference in New Issue
Block a user