use facet::Facet;
use figue as args;

#[test]
fn test_eq_long_solo() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named)]
        hello: String,
    }
    let args: Args = figue::from_slice(&["--hello=world"]).unwrap();
    assert_eq!(args.hello, "world".to_string());
}

#[test]
fn test_eq_short_solo() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::short)]
        k: i64,
    }
    let args: Args = figue::from_slice(&["-k=3"]).unwrap();
    assert_eq!(args.k, 3);
}

#[facet_testhelpers::test]
fn test_eq_long_rename_solo() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named, rename = "cores")]
        concurrency: i64,
    }
    let args: Args = figue::from_slice(&["--cores=4"]).unwrap();
    assert_eq!(args.concurrency, 4);
}

#[test]
fn test_eq_short_rename_solo() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::short, rename = "j")]
        concurrency: i64,
    }
    let args: Args = figue::from_slice(&["-j=4"]).unwrap();
    assert_eq!(args.concurrency, 4);
}

#[test]
fn test_eq_long_followed() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named)]
        hello: String,
        #[facet(args::named)]
        two: i64,
    }
    let args: Args = figue::from_slice(&["--hello=world", "--two", "2"]).unwrap();
    assert_eq!(args.hello, "world".to_string());
    assert_eq!(args.two, 2);
}

#[test]
fn test_eq_short_followed() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::short)]
        y: String,
        #[facet(args::named)]
        two: i64,
    }
    let args: Args = figue::from_slice(&["-y=yes", "--two", "2"]).unwrap();
    assert_eq!(args.y, "yes".to_string());
    assert_eq!(args.two, 2);
}

#[test]
fn test_eq_long_preceded() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named)]
        one: i64,
        #[facet(args::named)]
        hello: String,
    }
    let args: Args = figue::from_slice(&["--one", "1", "--hello=world"]).unwrap();
    assert_eq!(args.one, 1);
    assert_eq!(args.hello, "world".to_string());
}

#[test]
fn test_eq_short_preceded() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named)]
        one: i64,
        #[facet(args::short)]
        y: String,
    }
    let args: Args = figue::from_slice(&["--one", "1", "-y=yes"]).unwrap();
    assert_eq!(args.one, 1);
    assert_eq!(args.y, "yes".to_string());
}

#[test]
fn test_eq_long_in_the_middle() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named)]
        one: i64,
        #[facet(args::named)]
        hello: String,
        #[facet(args::named)]
        two: i64,
    }
    let args: Args = figue::from_slice(&["--one", "1", "--hello=world", "--two", "2"]).unwrap();
    assert_eq!(args.one, 1);
    assert_eq!(args.hello, "world".to_string());
    assert_eq!(args.two, 2);
}

#[test]
fn test_eq_short_in_the_middle() {
    #[derive(Facet, Debug)]
    struct Args {
        #[facet(args::named)]
        one: i64,
        #[facet(args::short)]
        y: String,
        #[facet(args::named)]
        two: i64,
    }
    let args: Args = figue::from_slice(&["--one", "1", "-y=yes", "--two", "2"]).unwrap();
    assert_eq!(args.one, 1);
    assert_eq!(args.y, "yes".to_string());
    assert_eq!(args.two, 2);
}
