mirror of
https://github.com/uutils/coreutils
synced 2024-12-24 12:03:24 +00:00
174 lines
5.1 KiB
Rust
174 lines
5.1 KiB
Rust
use common::util::*;
|
|
use std::path::Path;
|
|
use std::env;
|
|
use std::io::Write;
|
|
use std::fs::File;
|
|
use std::fs::remove_file;
|
|
|
|
static UTIL_NAME: &'static str = "od";
|
|
|
|
// octal dump of 'abcdefghijklmnopqrstuvwxyz\n'
|
|
static ALPHA_OUT: &'static str = "0000000 061141 062143 063145 064147 065151 066153 067155 070157\n0000020 071161 072163 073165 074167 075171 000012 \n0000033\n";
|
|
|
|
// XXX We could do a better job of ensuring that we have a fresh temp dir to ourself,
|
|
// not a general one ful of other proc's leftovers.
|
|
|
|
// Test that od can read one file and dump with default format
|
|
#[test]
|
|
fn test_file() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
use std::env;
|
|
let temp = env::temp_dir();
|
|
let tmpdir = Path::new(&temp);
|
|
let file = tmpdir.join("test");
|
|
|
|
{
|
|
let mut f = File::create(&file).unwrap();
|
|
match f.write_all(b"abcdefghijklmnopqrstuvwxyz\n") {
|
|
Err(_) => panic!("Test setup failed - could not write file"),
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
let result = ucmd.arg(file.as_os_str()).run();
|
|
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout, ALPHA_OUT);
|
|
|
|
let _ = remove_file(file);
|
|
}
|
|
|
|
// Test that od can read 2 files and concatenate the contents
|
|
#[test]
|
|
fn test_2files() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
let temp = env::temp_dir();
|
|
let tmpdir = Path::new(&temp);
|
|
let file1 = tmpdir.join("test1");
|
|
let file2 = tmpdir.join("test2");
|
|
|
|
for &(n,a) in [(1,"a"), (2,"b")].iter() {
|
|
println!("number: {} letter:{}", n, a);
|
|
}
|
|
|
|
for &(path,data)in &[(&file1, "abcdefghijklmnop"),(&file2, "qrstuvwxyz\n")] {
|
|
let mut f = File::create(&path).unwrap();
|
|
match f.write_all(data.as_bytes()) {
|
|
Err(_) => panic!("Test setup failed - could not write file"),
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
let result = ucmd.arg(file1.as_os_str()).arg(file2.as_os_str()).run();
|
|
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout, ALPHA_OUT);
|
|
|
|
let _ = remove_file(file1);
|
|
let _ = remove_file(file2);
|
|
}
|
|
|
|
// Test that od gives non-0 exit val for filename that dosen't exist.
|
|
#[test]
|
|
fn test_no_file() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
let temp = env::temp_dir();
|
|
let tmpdir = Path::new(&temp);
|
|
let file = tmpdir.join("}surely'none'would'thus'a'file'name");
|
|
|
|
let result = ucmd.arg(file.as_os_str()).run();
|
|
|
|
assert!(!result.success);
|
|
}
|
|
|
|
// Test that od reads from stdin instead of a file
|
|
#[test]
|
|
fn test_from_stdin() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
|
|
let input = "abcdefghijklmnopqrstuvwxyz\n";
|
|
let result = ucmd.run_piped_stdin(input.as_bytes());
|
|
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout, ALPHA_OUT);
|
|
|
|
}
|
|
|
|
// Test that od reads from stdin and also from files
|
|
#[test]
|
|
fn test_from_mixed() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
|
|
let temp = env::temp_dir();
|
|
let tmpdir = Path::new(&temp);
|
|
let file1 = tmpdir.join("test-1");
|
|
let file3 = tmpdir.join("test-3");
|
|
|
|
let (data1, data2, data3) = ("abcdefg","hijklmnop","qrstuvwxyz\n");
|
|
for &(path,data)in &[(&file1, data1),(&file3, data3)] {
|
|
let mut f = File::create(&path).unwrap();
|
|
match f.write_all(data.as_bytes()) {
|
|
Err(_) => panic!("Test setup failed - could not write file"),
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
let result = ucmd.arg(file1.as_os_str()).arg("--").arg(file3.as_os_str()).run_piped_stdin(data2.as_bytes());
|
|
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout, ALPHA_OUT);
|
|
|
|
}
|
|
|
|
#[test]
|
|
fn test_multiple_formats() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
|
|
let input = "abcdefghijklmnopqrstuvwxyz\n";
|
|
let result = ucmd.arg("-c").arg("-b").run_piped_stdin(input.as_bytes());
|
|
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout, "0000000 a b c d e f g h i j k l m n o p\n 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160\n0000020 q r s t u v w x y z \\n \n 161 162 163 164 165 166 167 170 171 172 012 \n0000033\n");
|
|
|
|
}
|
|
|
|
#[test]
|
|
fn test_dec() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
|
|
|
|
let input = [
|
|
0u8, 0u8,
|
|
1u8, 0u8,
|
|
2u8, 0u8,
|
|
3u8, 0u8,
|
|
0xffu8,0x7fu8,
|
|
0x00u8,0x80u8,
|
|
0x01u8,0x80u8,];
|
|
let expected_output = "0000000 0 1 2 3 32767 -32768 -32767 \n0000016\n";
|
|
let result = ucmd.arg("-i").run_piped_stdin(&input[..]);
|
|
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout, expected_output);
|
|
|
|
}
|
|
|
|
|
|
// We don't support multibyte chars, so big NEIN to this
|
|
/*
|
|
#[test]
|
|
fn mit_die_umlauten_getesten() {
|
|
let (_, mut ucmd) = testing(UTIL_NAME);
|
|
let result = ucmd.run_piped_stdin("Universität Tübingen".as_bytes());
|
|
assert_empty_stderr!(result);
|
|
assert!(result.success);
|
|
assert_eq!(result.stdout,
|
|
"0000000 U n i v e r s i t ä ** t T ü **\n0000020 b i n g e n\n0000026")
|
|
}
|
|
*/
|