// run-pass
// ignore-cloudabi no processes
// ignore-emscripten no processes
// ignore-sgx no processes

use std::env::args;
use std::process::Command;

fn assert_reverse_iterator_for_program_arguments(program_name: &str) {
    let args: Vec<_> = args().rev().collect();

    assert!(args.len() == 4);
    assert_eq!(args[0], "c");
    assert_eq!(args[1], "b");
    assert_eq!(args[2], "a");
    assert_eq!(args[3], program_name);

    println!("passed");
}

fn main() {
    let mut args = args();
    let me = args.next().unwrap();

    if let Some(_) = args.next() {
        assert_reverse_iterator_for_program_arguments(&me);
        return
    }

    let output = Command::new(&me)
        .arg("a")
        .arg("b")
        .arg("c")
        .output()
        .unwrap();
    assert!(output.status.success());
    assert!(output.stderr.is_empty());
    assert_eq!(output.stdout, b"passed\n");
}
