#[cfg(test)]
mod tests {
use std::cell::RefCell;
use std::ffi::OsStr;
use std::path::{Path, PathBuf};
use git2::build::{CheckoutBuilder, RepoBuilder};
use git2::{FetchOptions, RemoteCallbacks};
use indicatif::{ProgressBar, ProgressStyle};
use pddl_parser::domain::domain::Domain;
use pddl_parser::error::ParserError;
use url::Url;
fn clone(repo: &Url, path: &Path) {
let pb = RefCell::new(
ProgressBar::new(0).with_style(
ProgressStyle::default_bar()
.template(
"{spinner:.green} [{elapsed_precise}] {msg} [{wide_bar:.cyan/blue}] {pos}/{total} ({eta})",
)
.unwrap()
.progress_chars("=> "),
),
);
let mut cb = RemoteCallbacks::new();
cb.transfer_progress(|stats| {
let pb = pb.borrow_mut();
pb.set_message("Fetching...");
pb.set_length(stats.total_objects() as u64);
pb.set_position(stats.received_objects() as u64);
true
});
let mut co = CheckoutBuilder::new();
co.progress(|path, cur, total| {
let pb = pb.borrow_mut();
pb.set_message(
path.map(std::path::Path::to_string_lossy)
.unwrap_or_default()
.to_string(),
);
pb.set_length(total as u64);
pb.set_position(cur as u64);
});
let mut fo = FetchOptions::new();
fo.remote_callbacks(cb);
RepoBuilder::new()
.fetch_options(fo)
.with_checkout(co)
.clone(repo.as_str(), Path::new(path))
.unwrap();
}
fn get_domain_files(folder: &Path) -> Vec<PathBuf> {
let domain_file = folder.join("domain.pddl");
if domain_file.exists() {
vec![domain_file]
}
else {
let folder = folder.join("domains");
folder
.read_dir()
.unwrap()
.filter_map(Result::ok)
.filter(|e| e.file_type().unwrap().is_file())
.map(|e| e.path())
.filter(|p| p.extension().map_or(false, |e| e == "pddl") && p.starts_with("domain"))
.collect()
}
}
fn is_hidden(path: &Path) -> bool {
path.file_name()
.and_then(OsStr::to_str)
.map_or(false, |s| s.starts_with('.'))
}
#[test]
#[ignore]
fn generate_files() {
let tempdir = tempfile::tempdir().unwrap();
let repo = Url::parse("https://github.com/potassco/pddl-instances").unwrap();
clone(&repo, tempdir.path());
let files = tempdir
.path()
.read_dir()
.unwrap()
.map(|ipc_year| ipc_year.unwrap().path())
.filter(|ipc_year_folder| ipc_year_folder.is_dir() && !is_hidden(ipc_year_folder))
.map(|ipc_year_folder| ipc_year_folder.join("domains"))
.flat_map(|domains_folder| {
domains_folder
.read_dir()
.unwrap_or_else(|_| panic!("No domains folder named {domains_folder:?}"))
.flat_map(|domains| get_domain_files(&domains.unwrap().path()).into_iter())
});
let pb = ProgressBar::new(1825).with_style(
ProgressStyle::default_bar()
.template("{spinner:.green} [{elapsed_precise}] {msg} [{wide_bar:.cyan/blue}] {pos}/{total} ({eta})")
.unwrap()
.progress_chars("=> "),
);
for path in files {
pb.inc(1);
let domain = std::fs::read_to_string(&path).unwrap();
pb.println(format!("Parsing {path:?}..."));
let res = Domain::parse(domain.as_str().into());
match res {
Ok(_) => (),
Err(e) => match e {
ParserError::UnsupportedRequirement(_) => {},
_ => panic!("Error with error: {e:?}"),
},
}
}
}
}