duckscript 0.10.0

Simple, extendable and embeddable scripting language.
Documentation
use super::*;

fn get_single_value(output: ExpandedValue) -> String {
    match output {
        ExpandedValue::Single(value) => value,
        _ => panic!("Invalid type."),
    }
}

fn get_multi_value(output: ExpandedValue) -> Vec<String> {
    match output {
        ExpandedValue::Multi(value) => value,
        _ => panic!("Invalid type."),
    }
}

#[test]
fn expand_by_wrapper_control_chars() {
    let mut variables = HashMap::new();
    variables.insert("FOUND".to_string(), r#"abc/123\\123"#.to_string());

    let output = expand_by_wrapper("${FOUND}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!(r#"abc/123\\123"#, value);
}

#[test]
fn expand_by_wrapper_only_control_chars() {
    let mut variables = HashMap::new();
    variables.insert("FOUND".to_string(), r#"\\"#.to_string());

    let output = expand_by_wrapper("${FOUND}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!(r#"\\"#, value);
}

#[test]
fn expand_by_wrapper_only_control_chars2() {
    let mut variables = HashMap::new();
    variables.insert("FOUND".to_string(), r#"\\\\"#.to_string());

    let output = expand_by_wrapper("${FOUND}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!(r#"\\\\"#, value);
}

#[test]
fn expand_by_wrapper_found_fully() {
    let mut variables = HashMap::new();
    variables.insert("FOUND1".to_string(), "test1".to_string());
    variables.insert("FOUND2".to_string(), "test2".to_string());
    variables.insert("FOUND3".to_string(), "test3".to_string());
    variables.insert("FOUND4".to_string(), "test4".to_string());

    let output = expand_by_wrapper("${FOUND1}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!("test1", value);
}

#[test]
fn expand_by_wrapper_found() {
    let mut variables = HashMap::new();
    variables.insert("FOUND1".to_string(), "test1".to_string());
    variables.insert("FOUND2".to_string(), "test2".to_string());
    variables.insert("FOUND3".to_string(), "test3".to_string());
    variables.insert("FOUND4".to_string(), "test4".to_string());

    let output = expand_by_wrapper(
        r#"
value1:${FOUND1}
value2:${FOUND2}
value3:${FOUND3}
value4:${FOUND4}

value1:${FOUND1}
value2:${FOUND2}
value3:${FOUND3}
value4:${FOUND4}
    "#,
        &InstructionMetaInfo::new(),
        &mut variables,
    );

    let value = get_single_value(output);

    assert_eq!(
        r#"
value1:test1
value2:test2
value3:test3
value4:test4

value1:test1
value2:test2
value3:test3
value4:test4
    "#,
        value
    );
}

#[test]
fn expand_by_wrapper_partial_found() {
    let mut variables = HashMap::new();
    variables.insert("PARTIAL_FOUND1".to_string(), "test1".to_string());
    variables.insert("PARTIAL_FOUND2".to_string(), "test2".to_string());
    variables.insert("PARTIAL_FOUND3".to_string(), "test3".to_string());

    let output = expand_by_wrapper(
        r#"
value1:${PARTIAL_FOUND1}
value2:${PARTIAL_FOUND2}
value3:${PARTIAL_FOUND3}
value4:${PARTIAL_FOUND4}

value1:${PARTIAL_FOUND1}
value2:${PARTIAL_FOUND2}
value3:${PARTIAL_FOUND3}
value4:${PARTIAL_FOUND4}
    "#,
        &InstructionMetaInfo::new(),
        &mut variables,
    );

    let value = get_single_value(output);

    assert_eq!(
        r#"
value1:test1
value2:test2
value3:test3
value4:

value1:test1
value2:test2
value3:test3
value4:
    "#,
        value
    );
}

#[test]
fn expand_by_wrapper_no_suffix() {
    let mut variables = HashMap::new();
    variables.insert("NO_SUFFIX1".to_string(), "test1".to_string());
    variables.insert("NO_SUFFIX2".to_string(), "test2".to_string());

    let output = expand_by_wrapper(
        r#"
value1:${NO_SUFFIX1}
value2:${NO_SUFFIX2}
value3:${NO_SUFFIX3

value1:${NO_SUFFIX1}
value2:${NO_SUFFIX2}
value3:${NO_SUFFIX3
    "#,
        &InstructionMetaInfo::new(),
        &mut variables,
    );

    let value = get_single_value(output);

    assert_eq!(
        r#"
value1:test1
value2:test2
value3:${NO_SUFFIX3

value1:test1
value2:test2
value3:${NO_SUFFIX3
    "#,
        value
    );
}

#[test]
fn expand_by_wrapper_no_suffix_single() {
    let mut variables = HashMap::new();
    let output = expand_by_wrapper(
        "${NO_SUFFIX_SINGLE",
        &InstructionMetaInfo::new(),
        &mut variables,
    );

    let value = get_single_value(output);

    assert_eq!("${NO_SUFFIX_SINGLE", value);
}

#[test]
fn expand_by_wrapper_with_escape() {
    let mut variables = HashMap::new();
    variables.insert("FOUND1".to_string(), "test1".to_string());
    variables.insert("FOUND2".to_string(), "test2".to_string());
    variables.insert("FOUND3".to_string(), "test3".to_string());
    variables.insert("FOUND4".to_string(), "test4".to_string());

    let output = expand_by_wrapper(
        r#"
value1:\${FOUND1}
value2:\${FOUND2}
value3:\${FOUND3}
value4:\${FOUND4}

value1:${FOUND1}
value2:${FOUND2}
value3:${FOUND3}
value4:${FOUND4}
    "#,
        &InstructionMetaInfo::new(),
        &mut variables,
    );

    let value = get_single_value(output);

    assert_eq!(
        r#"
value1:${FOUND1}
value2:${FOUND2}
value3:${FOUND3}
value4:${FOUND4}

value1:test1
value2:test2
value3:test3
value4:test4
    "#,
        value
    );
}

#[test]
fn expand_by_wrapper_multi_with_escape() {
    let mut variables = HashMap::new();
    variables.insert("FOUND1".to_string(), "test1".to_string());
    variables.insert("FOUND2".to_string(), "test2".to_string());
    variables.insert("FOUND3".to_string(), "test3".to_string());
    variables.insert("FOUND4".to_string(), "test4".to_string());

    let output = expand_by_wrapper(
        r#"
value1:\${FOUND1}
value2:\${FOUND2}
value3:\%{FOUND3}
value4:\%{FOUND4}

value1:${FOUND1}
value2:${FOUND2}
value3:${FOUND3}
value4:${FOUND4}
    "#,
        &InstructionMetaInfo::new(),
        &mut variables,
    );

    let value = get_single_value(output);

    assert_eq!(
        r#"
value1:${FOUND1}
value2:${FOUND2}
value3:%{FOUND3}
value4:%{FOUND4}

value1:test1
value2:test2
value3:test3
value4:test4
    "#,
        value
    );
}

#[test]
fn expand_by_wrapper_control_chars_multi() {
    let mut variables = HashMap::new();
    variables.insert("FOUND".to_string(), r#"abc/123\\123"#.to_string());

    let output = expand_by_wrapper("%{FOUND}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_multi_value(output);

    assert_eq!(value.len(), 1);
    assert_eq!(r#"abc/123\\123"#, value[0]);
}

#[test]
fn expand_by_wrapper_split_multi() {
    let mut variables = HashMap::new();
    variables.insert("FOUND".to_string(), r#"abc 123"#.to_string());

    let output = expand_by_wrapper("%{FOUND}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_multi_value(output);

    assert_eq!(value.len(), 2);
    assert_eq!("abc", value[0]);
    assert_eq!("123", value[1]);
}

#[test]
fn expand_by_wrapper_split_complex_multi() {
    let mut variables = HashMap::new();
    variables.insert(
        "FOUND".to_string(),
        r#"abc 123 "in quotes" 2
lines"#
            .to_string(),
    );

    let output = expand_by_wrapper("%{FOUND}", &InstructionMetaInfo::new(), &mut variables);

    let value = get_multi_value(output);

    assert_eq!(value.len(), 4);
    assert_eq!("abc", value[0]);
    assert_eq!("123", value[1]);
    assert_eq!("in quotes", value[2]);
    assert_eq!("2\nlines", value[3]);
}

#[test]
fn expand_by_wrapper_dollar_sign() {
    let mut variables = HashMap::new();
    let output = expand_by_wrapper("$", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!("$", value);
}

#[test]
fn expand_by_wrapper_dollar_sign_with_escape() {
    let mut variables = HashMap::new();
    let output = expand_by_wrapper("\\$", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!("$", value);
}

#[test]
fn expand_by_wrapper_percentage_sign() {
    let mut variables = HashMap::new();
    let output = expand_by_wrapper("%", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!("%", value);
}

#[test]
fn expand_by_wrapper_percentage_sign_with_escape() {
    let mut variables = HashMap::new();
    let output = expand_by_wrapper("\\%", &InstructionMetaInfo::new(), &mut variables);

    let value = get_single_value(output);

    assert_eq!("%", value);
}