#[macro_use]
extern crate lazy_static;
extern crate tectonic;
use std::collections::HashMap;
use std::ffi::{OsStr, OsString};
use std::fs::File;
use std::io::{Read, Write};
use std::path::PathBuf;
use std::sync::Mutex;
use tectonic::io::{IoProvider, IoStack, MemoryIo};
use tectonic::io::testing::SingleInputFileIo;
use tectonic::status::NoopStatusBackend;
use tectonic::TexEngine;
const TOP: &'static str = env!("CARGO_MANIFEST_DIR");
lazy_static! {
static ref LOCK: Mutex<u8> = Mutex::new(0u8);
}
struct ExpectedInfo {
name: OsString,
contents: Vec<u8>
}
impl ExpectedInfo {
pub fn read(pbase: &mut PathBuf, extension: &str) -> ExpectedInfo {
pbase.set_extension(extension);
let name = pbase.file_name().unwrap().to_owned();
let mut f = File::open(pbase).unwrap();
let mut contents = Vec::new();
f.read_to_end(&mut contents).unwrap();
ExpectedInfo { name: name, contents: contents }
}
pub fn test_data(&self, observed: &Vec<u8>) {
if &self.contents == observed {
return;
}
{
let mut n = self.name.clone();
n.push(".expected");
let mut f = File::create(n).unwrap();
f.write_all(&self.contents).unwrap();
}
{
let mut n = self.name.clone();
n.push(".observed");
let mut f = File::create(n).unwrap();
f.write_all(observed).unwrap();
}
panic!("difference in {}; contents saved to disk", self.name.to_string_lossy());
}
pub fn test(&self, files: &HashMap<OsString, Vec<u8>>) {
self.test_data(files.get(&self.name).unwrap());
}
}
#[test]
fn trip_test() {
let _guard = LOCK.lock().unwrap();
let mut p = PathBuf::from(TOP);
p.push("tests");
p.push("trip");
let mut fmt_path = p.clone();
fmt_path.push("trip.fmt");
let mut fmt = SingleInputFileIo::new(&fmt_path);
p.push("trip");
p.set_extension("tex");
let mut tex = SingleInputFileIo::new(&p);
p.set_extension("tfm");
let mut tfm = SingleInputFileIo::new(&p);
let expected_log = ExpectedInfo::read(&mut p, "log");
let expected_xdv = ExpectedInfo::read(&mut p, "xdv");
let expected_fot = ExpectedInfo::read(&mut p, "fot");
p.set_file_name("tripos");
let expected_os = ExpectedInfo::read(&mut p, "tex");
let mut mem = MemoryIo::new(true);
{
let mut io = IoStack::new(vec![
&mut mem as &mut IoProvider,
&mut tex,
&mut fmt,
&mut tfm,
]);
let mut e = TexEngine::new ();
e.set_halt_on_error_mode (false);
e.process(&mut io, None, &mut NoopStatusBackend::new(), "trip.fmt", "trip").unwrap();
}
let files = &*mem.files.borrow();
expected_log.test(files);
expected_xdv.test(files);
expected_os.test(files);
expected_fot.test_data(files.get(OsStr::new("")).unwrap());
}
#[test]
fn etrip_test() {
let _guard = LOCK.lock().unwrap();
let mut p = PathBuf::from(TOP);
p.push("tests");
p.push("trip");
let mut fmt_path = p.clone();
fmt_path.push("etrip.fmt");
let mut fmt = SingleInputFileIo::new(&fmt_path);
p.push("etrip");
p.set_extension("tex");
let mut tex = SingleInputFileIo::new(&p);
p.set_extension("tfm");
let mut tfm = SingleInputFileIo::new(&p);
let expected_log = ExpectedInfo::read(&mut p, "log");
let expected_xdv = ExpectedInfo::read(&mut p, "xdv");
let expected_fot = ExpectedInfo::read(&mut p, "fot");
let expected_out = ExpectedInfo::read(&mut p, "out");
let mut mem = MemoryIo::new(true);
let files = mem.files.clone();
{
let mut io = IoStack::new(vec![
&mut mem,
&mut tex,
&mut fmt,
&mut tfm,
]);
let mut e = TexEngine::new ();
e.set_halt_on_error_mode (false);
e.process(&mut io, None, &mut NoopStatusBackend::new(), "etrip.fmt", "etrip").unwrap();
}
let files = &*files.borrow();
expected_log.test(files);
expected_xdv.test(files);
expected_out.test(files);
expected_fot.test_data(files.get(OsStr::new("")).unwrap());
}