use super::*;
use crate::fs::{FsOpenOptions, MemFs, StdFs};
use std::io::{Read, Write};
#[test]
fn cross_fs_link_or_copy_streams_through_trait() {
let dir = tempfile::tempdir().unwrap();
let src = dir.path().join("payload.bin");
std::fs::write(&src, b"cross-fs-payload").unwrap();
let std_fs: Arc<dyn Fs> = Arc::new(StdFs);
let mem_fs: Arc<dyn Fs> = Arc::new(MemFs::new());
mem_fs.create_dir_all(Path::new("/dst")).unwrap();
let dst = Path::new("/dst/payload.bin");
let bytes = link_or_copy_cross_fs(&std_fs, &src, &mem_fs, dst, SyncMode::Normal, true).unwrap();
assert_eq!(bytes, b"cross-fs-payload".len() as u64);
let mut buf = String::new();
mem_fs
.open(dst, &FsOpenOptions::new().read(true))
.unwrap()
.read_to_string(&mut buf)
.unwrap();
assert_eq!(buf, "cross-fs-payload");
let mut writer = mem_fs
.open(dst, &FsOpenOptions::new().write(true).truncate(true))
.unwrap();
writer.write_all(b"mutated-via-mem-fs").unwrap();
drop(writer);
assert_eq!(std::fs::read(&src).unwrap(), b"cross-fs-payload");
let mut after = String::new();
mem_fs
.open(dst, &FsOpenOptions::new().read(true))
.unwrap()
.read_to_string(&mut after)
.unwrap();
assert_eq!(after, "mutated-via-mem-fs");
}