kitab

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | LICENSE

commit e97cf6c27689ae457e28527b9df0cbe4d4ad52e1
parent 6db9b48a418302ee4a70aa107dca9ca97a82f52b
Author: lash <dev@holbrook.no>
Date:   Sun, 25 Sep 2022 13:08:05 +0000

Add multi digest test for biblatex

Diffstat:
Msrc/biblatex.rs | 38+++++++++++++++++++++++++++++++++++++-
Msrc/digest.rs | 23+++++++++++++++++++++++
Msrc/meta.rs | 23++++++++++++++++-------
Msrc/rdf.rs | 4+++-
Msrc/store.rs | 4+++-
Mtests/rdf_test.rs | 5++++-
6 files changed, 86 insertions(+), 11 deletions(-)

diff --git a/src/biblatex.rs b/src/biblatex.rs @@ -19,7 +19,14 @@ use crate::digest::RecordDigest; use crate::digest::from_urn; fn parse_digest(entry: &Entry) -> RecordDigest { - let note = entry.get("note").unwrap(); + let note = match entry.get("note") { + Some(v) => { + v + }, + None => { + return RecordDigest::Empty; + }, + }; let note_s = String::from_chunks(note).unwrap(); let mut digest_val = note_s.split(":"); @@ -115,6 +122,9 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met // }, } + for v in digests { + use_digests.push(v.clone()); + } let title = e.title().unwrap(); let title_s = String::from_chunks(title).unwrap(); @@ -142,3 +152,29 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met } Ok(rr) } + +#[cfg(test)] +mod tests { + use super::read_all; + use crate::digest; + use env_logger; + + #[test] + fn test_multi_digest() { + let d_hex = "acbd18db4cc2f85cedef654fccc4a4d8"; + let d = digest::RecordDigest::MD5(hex::decode(d_hex).unwrap()); + let d_sha_hex = "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7"; + let d_sha = digest::from_vec(hex::decode(d_sha_hex).unwrap()).unwrap(); + + let biblatex_src = "@article{ + foo, + title={bar}, + author={Guybrush Threepwood}, +} +"; + let digests = vec!(d, d_sha); + let r = read_all(biblatex_src.as_bytes(), &digests).unwrap(); + + assert_eq!(r.len(), 2); + } +} diff --git a/src/digest.rs b/src/digest.rs @@ -1,3 +1,5 @@ +use std::marker::Copy; + use crate::error::ParseError; use sha2::{ @@ -17,6 +19,27 @@ pub enum RecordDigest { Empty, } +impl Clone for RecordDigest { + fn clone(&self) -> RecordDigest { + match self { + RecordDigest::Empty => { + RecordDigest::Empty + }, + RecordDigest::Sha512(v) => { + RecordDigest::Sha512(v.to_vec()) + }, + RecordDigest::Sha256(v) => { + RecordDigest::Sha256(v.to_vec()) + }, + RecordDigest::MD5(v) => { + RecordDigest::MD5(v.to_vec()) + }, + RecordDigest::SwarmHash(v) => { + RecordDigest::SwarmHash(v.to_vec()) + }, + } + } +} /// Create a [RecordDigest::Sha512](RecordDigest::Sha512) instance from the raw digest data. diff --git a/src/meta.rs b/src/meta.rs @@ -216,13 +216,13 @@ impl MetaData { return String::new(); }, digest::RecordDigest::Sha512(v) => { - return hex::encode(&v); + return String::from("sha512:") + hex::encode(&v).as_str(); }, digest::RecordDigest::Sha256(v) => { - return hex::encode(&v); + return String::from("sha256:") + hex::encode(&v).as_str(); }, digest::RecordDigest::MD5(v) => { - return hex::encode(&v); + return String::from("md5:") + hex::encode(&v).as_str(); }, digest::RecordDigest::SwarmHash(v) => { return hex::encode(&v); @@ -500,6 +500,7 @@ mod tests { File, write }; + use crate::digest; use env_logger; #[test] @@ -508,7 +509,7 @@ mod tests { let meta = MetaData::from_xattr(s).unwrap(); assert_eq!(meta.dc.title, "Bitcoin: A Peer-to-Peer Electronic Cash System"); assert_eq!(meta.dc.author, "Satoshi Nakamoto"); - assert_eq!(meta.fingerprint(), String::from("2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e")); + assert_eq!(meta.fingerprint(), String::from("sha512:2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e")); } #[test] @@ -520,7 +521,8 @@ mod tests { let fp = f.path(); let fps = String::from(fp.to_str().unwrap()); - let mut m = MetaData::new("foo", "bar", EntryType::Article, digest, Some(fps)); + let digest_sha = digest::from_vec(digest).unwrap(); + let mut m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, Some(fps)); m.set_subject("baz"); m.set_mime_str("foo/bar"); m.set_language("nb-NO"); @@ -529,7 +531,7 @@ mod tests { let m_check = MetaData::from_xattr(fp).unwrap(); assert_eq!(m_check.title(), "foo"); assert_eq!(m_check.author(), "bar"); - assert_eq!(m_check.fingerprint(), digest_hex); + assert_eq!(m_check.fingerprint(), String::from("sha512:") + digest_hex); assert_eq!(m_check.typ(), EntryType::Article); assert_eq!(m_check.subject().unwrap(), "baz"); assert_eq!(m_check.mime().unwrap(), "foo/bar"); @@ -559,7 +561,14 @@ mod tests { let f = NamedTempFile::new_in(".").unwrap(); let fp = f.path(); write(&f, &[0, 1, 2, 3]); - let meta_empty = MetaData::from_xattr(fp).unwrap(); + let meta_empty = match MetaData::from_xattr(fp) { + Ok(v) => { + v + }, + Err(e) => { + panic!("{:?}", e); + }, + }; assert_eq!(meta_empty.mime().unwrap(), "application/octet-stream"); } } diff --git a/src/rdf.rs b/src/rdf.rs @@ -272,6 +272,7 @@ mod tests { read, }; use super::MetaData; + use crate::digest; use std::io::stdout; use std::fs::File; use std::default::Default; @@ -282,7 +283,8 @@ mod tests { fn test_turtle_write() { let mut digest = Vec::with_capacity(64); digest.resize(64, 0x2a); - let mut m = MetaData::new("foo", "bar", EntryType::Article, Vec::from(digest), None); + let digest_sha = digest::from_vec(Vec::from(digest)).unwrap(); + let mut m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, None); m.set_subject("baz"); m.set_mime_str("foo/bar"); m.set_language("nb-NO"); diff --git a/src/store.rs b/src/store.rs @@ -35,13 +35,15 @@ mod tests { FileStore, MetaData, }; + use crate::digest; use std::io::Write; #[test] fn test_writer() { let mut digest = Vec::with_capacity(64); digest.resize(64, 0x2a); - let m = MetaData::new("foo", "bar", EntryType::Article, Vec::from(digest), None); + let digest_sha = digest::from_vec(Vec::from(digest)).unwrap(); + let m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, None); let dir = tempdir().unwrap(); let fp = dir.path(); let fs = FileStore::new(&fp); diff --git a/tests/rdf_test.rs b/tests/rdf_test.rs @@ -8,6 +8,8 @@ use biblatex::EntryType; use kitab::rdf::write as rdf_write; use kitab::meta::MetaData; +use kitab::digest; + #[test] fn test_rdf_dump() { @@ -15,6 +17,7 @@ fn test_rdf_dump() { let w = BufWriter::new(v); let mut digest: Vec<u8> = Vec::new(); digest.resize(64, 0); - let metadata = MetaData::new("foo", "Bar Baz", EntryType::Article, digest, None); + let digest_sha = digest::from_vec(Vec::from(digest)).unwrap(); + let metadata = MetaData::new("foo", "Bar Baz", EntryType::Article, digest_sha, None); let r = rdf_write(&metadata, w); }