//! Host unit tests for rbsh's parser (rbsh/src/parse.rs is pure: no //! syscalls). Run with `make rbsh-test` (plain `rustc --test`, no Cargo //! target needed). extern crate alloc; #[path = "../src/parse.rs"] mod parse; use parse::*; fn letters(table: &str) -> Vec { assign_drives(table).iter().map(|d| format!("{}:{}", d.letter, d.path)).collect() } #[test] fn contract_v1_drives() { // Ramfs root, our FAT32 disk and the kernel's three test disks. let t = "/ ramfs\n/tmp ramfs\n/mnt/disk0 fat32\n/mnt/disk1 ext2\n/mnt/disk2 exfat\n/mnt/disk3 btrfs\n"; assert_eq!(letters(t), ["A:/", "B:/mnt/disk0", "C:/mnt/disk1", "D:/mnt/disk2", "E:/mnt/disk3"]); } #[test] fn contract_v2_drives() { // ext2 root, FAT32 data disk, exFAT share (mounted last by the kernel). let t = "/ ext2\n/tmp ramfs\n/dev devfs\n/proc procfs\n/mnt/disk0 fat32\n/mnt/share exfat\n"; assert_eq!(letters(t), ["A:/", "B:/mnt/disk0", "C:/mnt/share"]); let d = assign_drives(t); assert_eq!(d[0].fs, "ext2"); assert_eq!(d[2].fs, "exfat"); } #[test] fn share_skips_c_for_more_disks() { let t = "/ ext2\n/mnt/disk0 fat32\n/mnt/disk1 ext2\n/mnt/disk2 btrfs\n/mnt/share exfat\n"; assert_eq!(letters(t), ["A:/", "B:/mnt/disk0", "C:/mnt/share", "D:/mnt/disk1", "E:/mnt/disk2"]); } #[test] fn share_without_disks_is_still_c() { assert_eq!(letters("/ ext2\n/mnt/share exfat\n"), ["A:/", "C:/mnt/share"]); } #[test] fn translate_and_display_with_share() { let d = assign_drives("/ ext2\n/mnt/disk0 fat32\n/mnt/share exfat\n"); assert_eq!(translate("C:/notes.txt", &d).as_deref(), Some("/mnt/share/notes.txt")); assert_eq!(translate("c:", &d).as_deref(), Some("/mnt/share")); assert_eq!(translate("B:bin", &d).as_deref(), Some("/mnt/disk0/bin")); assert_eq!(translate("A:/etc/motd", &d).as_deref(), Some("/etc/motd")); assert_eq!(display("/mnt/share/x", &d), "C:/x"); assert_eq!(display("/mnt/disk0", &d), "B:/"); assert_eq!(display("/etc", &d), "A:/etc"); }