RustForge

foundry

Foundry OS: the operating system built on the Rustbelt kernel

foundry / rust / rbsh / host-tests / parse_test.rs
2015 bytes ยท raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//! 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<String> {
    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");
}