use strs_tools ::string ::split :: *;
#[ test ]
fn test_quoting_disabled_preserving_quotes_true()
{
let src = "a 'b' c";
let iter = split()
.src(src)
.delimeter(" ")
.quoting(false)
.preserving_delimeters(false)
.preserving_empty(false)
.preserving_quoting(true)
.stripping(true)
.perform();
assert_eq!(
iter.map(|e| String ::from(e.string)).collect :: < Vec<_ >>(),
vec!["a", "'b'", "c"]
);
}
#[ test ]
fn test_quoting_disabled_preserving_quotes_false()
{
let src = "a 'b' c";
let iter = split()
.src(src)
.delimeter(" ")
.quoting(false)
.preserving_delimeters(false)
.preserving_empty(false)
.preserving_quoting(false)
.stripping(true)
.perform();
assert_eq!(
iter.map(|e| String ::from(e.string)).collect :: < Vec<_ >>(),
vec!["a", "'b'", "c"]
);
}
#[ test ]
fn test_quoting_enabled_preserving_quotes_true()
{
let src = "a 'b' c";
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_delimeters(false)
.preserving_empty(false)
.preserving_quoting(true)
.stripping(true)
.perform();
assert_eq!(
iter.map(|e| String ::from(e.string)).collect :: < Vec<_ >>(),
vec!["a", "'b'", "c"]
);
}
#[ test ]
fn test_quoting_enabled_preserving_quotes_false()
{
let src = "a 'b' c";
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_delimeters(false)
.preserving_empty(false)
.preserving_quoting(false)
.stripping(true)
.perform();
assert_eq!(iter.map(|e| String ::from(e.string)).collect :: < Vec<_ >>(), vec!["a", "b", "c"]);
}
#[ test ]
fn test_m_t3_11_quoting_preserve_all_no_strip()
{
let src = "a 'b c' d";
let iter = split()
.src( src )
.delimeter( " " )
.preserving_empty( true )
.preserving_delimeters( true )
.stripping( false )
.quoting( true )
.preserving_quoting( true ) .perform();
let expected = vec![
("a", SplitType ::Delimited, 0, 1),
(" ", SplitType ::Delimiter, 1, 2),
("", SplitType ::Delimited, 2, 2), ("'b c'", SplitType ::Delimited, 2, 7), (" ", SplitType ::Delimiter, 7, 8),
("d", SplitType ::Delimited, 8, 9),
];
let results: Vec< _ > = iter.collect();
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_m_t3_12_quoting_no_preserve_strip()
{
let src = "a 'b c' d";
let iter = split()
.src( src )
.delimeter( " " )
.preserving_empty( false )
.preserving_delimeters( false )
.stripping( true )
.quoting( true )
.perform();
let expected = [
("a", SplitType ::Delimited, 0, 1),
("b c", SplitType ::Delimited, 3, 6), ("d", SplitType ::Delimited, 8, 9),
];
for (i, split) in iter.enumerate()
{
assert_eq!(split.string, expected[i].0);
assert_eq!(split.typ, expected[i].1);
assert_eq!(split.start, expected[i].2);
assert_eq!(split.end, expected[i].3);
}
}
#[ test ]
fn test_m_t3_13_quoting_preserve_all_strip()
{
let src = "a 'b c' d";
let iter = split()
.src( src )
.delimeter( " " )
.preserving_empty( true )
.preserving_delimeters( true )
.stripping( true ) .quoting( true )
.preserving_quoting( true )
.perform();
let expected = vec![
("a", SplitType ::Delimited, 0, 1), (" ", SplitType ::Delimiter, 1, 2), ("", SplitType ::Delimited, 2, 2), ("'b c'", SplitType ::Delimited, 2, 7), (" ", SplitType ::Delimiter, 7, 8), ("d", SplitType ::Delimited, 8, 9), ];
let results: Vec< _ > = iter.collect();
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_m_t3_14_quoting_no_preserve_no_strip()
{
let src = "a 'b c' d";
let iter = split()
.src( src )
.delimeter( " " )
.preserving_empty( false ) .preserving_delimeters( false ) .stripping( false )
.quoting( true )
.preserving_quoting( true ) .perform();
let expected = vec![
("a", SplitType ::Delimited, 0, 1),
("'b c'", SplitType ::Delimited, 2, 7), ("d", SplitType ::Delimited, 8, 9),
];
let results: Vec< _ > = iter.collect();
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_m_t3_15_no_quoting_preserve_all_no_strip()
{
let src = "a 'b c' d";
let iter = split()
.src( src )
.delimeter( " " )
.preserving_empty( true )
.preserving_delimeters( true )
.stripping( false )
.quoting( false ) .perform();
let expected = [
("a", SplitType ::Delimited, 0, 1),
(" ", SplitType ::Delimiter, 1, 2),
("'b", SplitType ::Delimited, 2, 4), (" ", SplitType ::Delimiter, 4, 5),
("c'", SplitType ::Delimited, 5, 7), (" ", SplitType ::Delimiter, 7, 8),
("d", SplitType ::Delimited, 8, 9),
];
for (i, split) in iter.enumerate()
{
assert_eq!(split.string, expected[i].0);
assert_eq!(split.typ, expected[i].1);
assert_eq!(split.start, expected[i].2);
assert_eq!(split.end, expected[i].3);
}
}
#[ test ]
fn test_span_content_basic_no_preserve()
{
let src = r#"cmd arg1 "hello world" arg2"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false) .perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
("arg1", SplitType ::Delimited, 4, 8),
("hello world", SplitType ::Delimited, 10, 21), ("arg2", SplitType ::Delimited, 23, 27),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_basic_preserve()
{
let src = r#"cmd arg1 "hello world" arg2"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(true)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
("arg1", SplitType ::Delimited, 4, 8),
(r#""hello world""#, SplitType ::Delimited, 9, 22), ("arg2", SplitType ::Delimited, 23, 27),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_internal_delimiters_no_preserve()
{
let src = r#"cmd "val: ue" arg2"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
("val: ue", SplitType ::Delimited, 5, 12), ("arg2", SplitType ::Delimited, 14, 18),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_escaped_quotes_no_preserve()
{
let src = r#"cmd "hello \"world\"" arg2"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
(r#"hello "world""#, SplitType ::Delimited, 5, 18),
("arg2", SplitType ::Delimited, 22, 26), ];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_empty_quote_no_preserve()
{
let src = r#"cmd "" arg2"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
("arg2", SplitType ::Delimited, 7, 11),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_empty_quote_preserve()
{
let src = r#"cmd "" arg2"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(true)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
(r#""""#, SplitType ::Delimited, 4, 6), ("arg2", SplitType ::Delimited, 7, 11),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_quote_at_start_no_preserve()
{
let src = r#""hello world" cmd"#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("hello world", SplitType ::Delimited, 1, 12),
("cmd", SplitType ::Delimited, 14, 17),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_quote_at_end_no_preserve()
{
let src = r#"cmd "hello world""#;
let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
("hello world", SplitType ::Delimited, 5, 16),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_unclosed_quote_no_preserve()
{
let src = r#"cmd "hello world"#; let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(false)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
("hello world", SplitType ::Delimited, 5, 16),
];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}
#[ test ]
fn test_span_content_unclosed_quote_preserve()
{
let src = r#"cmd "hello world"#; let iter = split()
.src(src)
.delimeter(" ")
.quoting(true)
.preserving_quoting(true)
.preserving_delimeters(false)
.stripping(false)
.perform();
let results: Vec< _ > = iter.collect();
let expected = vec![
("cmd", SplitType ::Delimited, 0, 3),
(r#""hello world"#, SplitType ::Delimited, 4, 16), ];
assert_eq!(
results.len(),
expected.len(),
"Number of segments mismatch. Actual: {results:?}, Expected: {expected:?}"
);
for (i, split_item) in results.iter().enumerate()
{
assert_eq!(split_item.string, expected[i].0, "String mismatch at index {i}");
assert_eq!(split_item.typ, expected[i].1, "Type mismatch at index {i}");
assert_eq!(split_item.start, expected[i].2, "Start index mismatch at index {i}");
assert_eq!(split_item.end, expected[i].3, "End index mismatch at index {i}");
}
}