use std::fs::File;
use citeworks_csl::{
dates::{Circa, Date, DateMeta, DateParts, Season},
items::{ItemType, ItemValue},
names::Name,
ordinaries::OrdinaryValue,
to_vec, Item,
};
use pretty_assertions::assert_eq;
fn json_file(name: &str) -> serde_json::Value {
let file = File::open(format!("tests/csl-json/{name}.json")).unwrap();
serde_json::from_reader(file).unwrap()
}
fn json_item(item: Item) -> serde_json::Value {
let json = to_vec(&[item]).unwrap();
serde_json::from_slice(&json).unwrap()
}
#[test]
fn author2() {
assert_eq!(
json_file("author2"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
author: vec![
Name {
given: Some("Jane".into()),
family: Some("Roe".into()),
..Default::default()
},
Name {
literal: Some("John Doe".into()),
..Default::default()
}
],
..Default::default()
})
);
}
#[test]
fn single_date() {
assert_eq!(
json_file("single-date"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
issued: Some(Date::Single {
date: DateParts {
year: 2000,
month: Some(1),
day: Some(1)
},
meta: Default::default(),
}),
..Default::default()
})
);
}
#[test]
fn date_range() {
assert_eq!(
json_file("date-range"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
issued: Some(Date::Range {
start: DateParts {
year: 2000,
month: Some(1),
day: Some(1)
},
end: DateParts {
year: 2010,
month: Some(10),
day: Some(10)
},
meta: Default::default(),
}),
..Default::default()
})
);
}
#[test]
fn raw_date() {
assert_eq!(
json_file("raw-date"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
issued: Some(Date::Raw {
date: "1st January 2000".into(),
meta: Default::default(),
}),
..Default::default()
})
);
}
#[test]
fn edtf() {
assert_eq!(
json_file("edtf"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
issued: Some(Date::Edtf {
date: "2000-01-01/2010-10-10".into(),
meta: Default::default(),
}),
..Default::default()
})
);
}
#[test]
fn complex_date() {
assert_eq!(
json_file("complex-date"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
issued: Some(Date::Single {
date: DateParts {
year: 2000,
month: Some(1),
day: Some(1)
},
meta: DateMeta {
season: Some(Season::Winter),
circa: Some(Circa::Year(2001)),
..Default::default()
}
}),
..Default::default()
})
);
}
#[test]
fn extra() {
assert_eq!(
json_file("extra"),
json_item(Item {
id: "example-id".into(),
item_type: ItemType::Report,
fields: [
(
String::from("not-a-csl-key"),
ItemValue::Ordinary(OrdinaryValue::String("extra".into()))
),
(
String::from("not-a-csl-date"),
ItemValue::Date(Date::Raw {
date: "1/2/3456".into(),
meta: Default::default(),
})
),
(
String::from("not-a-csl-name"),
ItemValue::Names(vec![Name {
literal: Some("surplus".into()),
..Default::default()
}])
),
]
.into_iter()
.collect(),
..Default::default()
})
);
}