extern crate sheesy_tools;

use sheesy_tools::substitute::Spec;
use sheesy_tools::substitute::StreamOrPath::*;
use std::path::PathBuf;

#[cfg(test)]
mod parse {
    use super::*;

    #[test]
    fn empty() {
        let actual = Spec::from("");
        assert_eq!(
            actual,
            Spec {
                src: Stream,
                dst: Stream,
            }
        );

        assert_eq!(format!("{}", actual), ":")
    }

    #[test]
    fn colon() {
        let actual = Spec::from(":");
        assert_eq!(
            actual,
            Spec {
                src: Stream,
                dst: Stream,
            }
        );

        assert_eq!(format!("{}", actual), ":")
    }

    #[test]
    fn stream_path() {
        let actual = Spec::from(":foo");
        assert_eq!(
            actual,
            Spec {
                src: Stream,
                dst: Path(PathBuf::from("foo")),
            }
        );

        assert_eq!(format!("{}", actual), ":foo")
    }

    #[test]
    fn path_stream() {
        let actual = Spec::from("foo:");
        assert_eq!(
            actual,
            Spec {
                src: Path(PathBuf::from("foo")),
                dst: Stream,
            }
        );

        assert_eq!(format!("{}", actual), "foo")
    }

    #[test]
    fn path_path() {
        let actual = Spec::from("foo:bar");
        assert_eq!(
            actual,
            Spec {
                src: Path(PathBuf::from("foo")),
                dst: Path(PathBuf::from("bar")),
            }
        );

        assert_eq!(format!("{}", actual), "foo:bar")
    }

    #[test]
    fn absolute_path_absolute_path() {
        let actual = Spec::from("/foo/sub:/bar/sub");
        assert_eq!(
            actual,
            Spec {
                src: Path(PathBuf::from("/foo/sub")),
                dst: Path(PathBuf::from("/bar/sub")),
            }
        );

        assert_eq!(format!("{}", actual), "/foo/sub:/bar/sub")
    }
}
