use assert_cmd::Command;
use assert_fs::{
assert::PathAssert,
fixture::{FileTouch, FileWriteBin, FileWriteStr, PathChild},
};
use hex_literal::hex;
#[test]
pub fn pack_not_exists_file() {
let dir = assert_fs::TempDir::new().unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("pack")
.arg(dir.path().join("not_exists_file"))
.assert()
.failure()
.code(1);
assert!(!dir.child("not_exists_file").exists());
}
#[test]
pub fn pack_not_dir() {
let dir = assert_fs::TempDir::new().unwrap();
dir.child("not_dir").touch().unwrap();
iroga_cmd()
.arg("pack")
.arg(dir.path().join("not_dir"))
.assert()
.failure()
.code(1)
.stderr(predicates::str::contains("not a directory"));
}
#[test]
pub fn pack_output_file_already_exists() {
let dir = assert_fs::TempDir::new().unwrap();
dir.child("dir/file.txt").touch().unwrap();
dir.child("dir.iro").touch().unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("pack")
.arg("dir")
.assert()
.failure()
.code(1)
.stderr(predicates::str::contains("output path already exists"));
}
#[test]
pub fn pack_single_file() {
const EXPECTED_BYTES: &[u8] = &hex!(
"49 52 4f 53 02 00 01 00 00 00 00 00 10 00 00 00"
"01 00 00 00 24 00 10 00 66 00 69 00 6c 00 65 00"
"2e 00 74 00 78 00 74 00 00 00 00 00 38 00 00 00"
"00 00 00 00 17 00 00 00 48 65 6c 6c 6f 20 57 6f"
"72 6c 64 21 0d 0a 0d 0a 48 69 21 0d 0a 0d 0a "
);
let dir = assert_fs::TempDir::new().unwrap();
dir.child("single/file.txt")
.write_str("Hello World!\r\n\r\nHi!\r\n\r\n")
.unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("pack")
.arg(dir.path().join("single"))
.assert()
.success()
.code(0);
assert!(dir.child("single.iro").exists());
dir.child("single.iro").assert(EXPECTED_BYTES);
dir.close().unwrap();
}
#[test]
pub fn pack_multiple_files() {
const EXPECTED_BYTES: &[u8] = &hex!(
"49 52 4f 53 02 00 01 00 00 00 00 00 10 00 00 00"
"03 00 00 00 1e 00 0a 00 61 00 2e 00 74 00 78 00"
"74 00 00 00 00 00 76 00 00 00 00 00 00 00 01 00"
"00 00 1e 00 0a 00 62 00 2e 00 74 00 78 00 74 00"
"00 00 00 00 77 00 00 00 00 00 00 00 01 00 00 00"
"26 00 12 00 64 00 69 00 72 00 5c 00 63 00 2e 00"
"74 00 78 00 74 00 00 00 00 00 78 00 00 00 00 00"
"00 00 01 00 00 00 41 42 43 "
);
let dir = assert_fs::TempDir::new().unwrap();
dir.child("multiple/a.txt").write_str("A").unwrap();
dir.child("multiple/b.txt").write_str("B").unwrap();
dir.child("multiple/dir/c.txt").write_str("C").unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("pack")
.arg(dir.path().join("multiple"))
.assert()
.success()
.code(0);
assert!(dir.child("multiple.iro").exists());
dir.child("multiple.iro").assert(EXPECTED_BYTES);
dir.close().unwrap();
}
#[test]
pub fn unpack_not_exists_file() {
let dir = assert_fs::TempDir::new().unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("unpack")
.arg(dir.path().join("not_exists_file.iro"))
.assert()
.failure()
.code(1);
assert!(!dir.child("not_exists_file.iro").exists());
}
#[test]
pub fn unpack_not_file() {
let dir = assert_fs::TempDir::new().unwrap();
dir.child("not_file/is_file").touch().unwrap();
iroga_cmd()
.arg("unpack")
.arg(dir.path().join("not_file"))
.assert()
.failure()
.code(1);
assert!(dir.child("not_file").is_dir());
}
#[test]
pub fn unpack_output_path_already_exists() {
let dir = assert_fs::TempDir::new().unwrap();
dir.child("dir/file.txt").touch().unwrap();
dir.child("dir.iro").touch().unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("unpack")
.arg("dir.iro")
.assert()
.failure()
.code(1)
.stderr(predicates::str::contains("output path already exists"));
}
#[test]
pub fn unpack_single_file() {
let iro_bytes: &[u8] = &hex!(
"49 52 4f 53 02 00 01 00 00 00 00 00 10 00 00 00"
"01 00 00 00 24 00 10 00 66 00 69 00 6c 00 65 00"
"2e 00 74 00 78 00 74 00 00 00 00 00 38 00 00 00"
"00 00 00 00 17 00 00 00 48 65 6c 6c 6f 20 57 6f"
"72 6c 64 21 0d 0a 0d 0a 48 69 21 0d 0a 0d 0a "
);
let dir = assert_fs::TempDir::new().unwrap();
dir.child("single.iro")
.write_binary(iro_bytes)
.unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("unpack")
.arg(dir.path().join("single.iro"))
.assert()
.success()
.code(0);
assert!(dir.child("single/file.txt").exists());
dir.child("single/file.txt").assert("Hello World!\r\n\r\nHi!\r\n\r\n");
dir.close().unwrap();
}
#[test]
pub fn unpack_multiple_files() {
let iro_bytes: &[u8] = &hex!(
"49 52 4f 53 02 00 01 00 00 00 00 00 10 00 00 00"
"03 00 00 00 1e 00 0a 00 61 00 2e 00 74 00 78 00"
"74 00 00 00 00 00 76 00 00 00 00 00 00 00 01 00"
"00 00 1e 00 0a 00 62 00 2e 00 74 00 78 00 74 00"
"00 00 00 00 77 00 00 00 00 00 00 00 01 00 00 00"
"26 00 12 00 64 00 69 00 72 00 5c 00 63 00 2e 00"
"74 00 78 00 74 00 00 00 00 00 78 00 00 00 00 00"
"00 00 01 00 00 00 41 42 43 "
);
let dir = assert_fs::TempDir::new().unwrap();
dir.child("multiple.iro")
.write_binary(iro_bytes)
.unwrap();
iroga_cmd()
.current_dir(dir.path())
.arg("unpack")
.arg(dir.path().join("multiple.iro"))
.assert()
.success()
.code(0);
dir.child("multiple/a.txt").assert("A");
dir.child("multiple/b.txt").assert("B");
dir.child("multiple/dir/c.txt").assert("C");
dir.close().unwrap();
}
fn iroga_cmd() -> Command {
Command::cargo_bin("iroga").unwrap()
}