#![cfg_attr(not(feature = "std"), no_std)]
#![cfg(any(feature = "alloc", feature = "std"))]
extern crate alloc;
use alloc::{vec, vec::Vec};
use miniarg::{ParseError, parse};
#[test]
fn basic() {
let cmdline = "executable";
assert_eq!(
parse::<&str>(&cmdline, &[])
.collect::<Result<Vec<(_, _)>, _>>()
.unwrap(),
Vec::new()
);
}
#[test]
fn key_value() {
let cmdline = "executable -key value";
assert_eq!(
parse(&cmdline, &["key"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"key", "value")]
);
}
#[test]
fn two_key_value() {
let cmdline = "executable -key1 value1 -key2 value2";
assert_eq!(
parse(&cmdline, &["key1", "key2"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"key1", "value1"), (&"key2", "value2")]
);
}
#[test]
fn key_two_value() {
let cmdline = "executable -key value1 -key value2";
assert_eq!(
parse(&cmdline, &["key", "key"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"key", "value1"), (&"key", "value2")]
);
}
#[test]
fn just_key() {
let cmdline = "executable -key";
assert_eq!(
parse(&cmdline, &["key"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"key", "")]
);
}
#[test]
fn invalid_key() {
let cmdline = "executable -invalid";
assert_eq!(
parse(&cmdline, &["key"])
.collect::<Result<Vec<_>, _>>()
.unwrap_err(),
ParseError::UnknownKey("invalid")
);
}
#[test]
fn missing_key() {
let cmdline = "executable value";
assert_eq!(
parse(&cmdline, &["key"])
.collect::<Result<Vec<_>, _>>()
.unwrap_err(),
ParseError::NotAKey("value")
);
}
#[test]
fn non_ascii_basic() {
let cmdline = "€x€cütäbl€";
assert_eq!(
parse::<&str>(&cmdline, &[])
.collect::<Result<Vec<(_, _)>, _>>()
.unwrap(),
Vec::new()
);
}
#[test]
fn non_ascii_key() {
let cmdline = "executable -😀 value";
assert_eq!(
parse(&cmdline, &["😀"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"😀", "value")]
);
}
#[test]
fn non_ascii_value() {
let cmdline = "executable -value 🦀🎉";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "🦀🎉")]
);
}
#[test]
fn other_whitespace() {
let cmdline = "executable -value\targ";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "arg")]
);
}
#[test]
fn single_quotes() {
let cmdline = "executable -value 'test value'";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "test value")]
);
}
#[test]
fn double_quotes() {
let cmdline = "executable -value \"test value\"";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "test value")]
);
}
#[test]
fn nested_single_quotes() {
let cmdline = "executable -value \"te'st' value\"";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "te'st' value")]
);
}
#[test]
fn nested_double_quotes() {
let cmdline = "executable -value 'te\"st\" value'";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "te\"st\" value")]
);
}
#[test]
fn nested_single_quote() {
let cmdline = "executable -value \"te'st value\"";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "te'st value")]
);
}
#[test]
fn nested_double_quote() {
let cmdline = "executable -value 'te\"st value'";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "te\"st value")]
);
}
#[test]
fn ends_inside_single_quotes() {
let cmdline = "executable -value 'test value";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "test value")]
);
}
#[test]
fn ends_inside_double_quotes() {
let cmdline = "executable -value \"test value";
assert_eq!(
parse(&cmdline, &["value"])
.collect::<Result<Vec<_>, _>>()
.unwrap(),
vec![(&"value", "test value")]
);
}