qml_formatter 0.2.0

QML formatter
#[cfg(test)]
mod tests {
    use crate::convert_file;
    use crate::rules::*;
    use std::fs;

    #[test]
    fn test_space_before_bracket() {
        let input = r#"Text{"#;
        let expected_output = r#"Text {"#;
        assert_eq!(space_before_bracket(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }
    #[test]
    fn test_if_movement() {
        let input = r#"
    if(abc)
    bcd
"#;
        let expected_output = r#"
    if (abc)
        bcd
"#;
        assert_eq!(if_movement(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }
    #[test]
    fn test_remove_empty_line_before_close_bracket() {
        let input = r#"Text {
text: "TODO"

}"#;
        let expected_output = r#"Text {
text: "TODO"
}"#;
        assert_eq!(remove_empty_line_before_close_bracket(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_connect_multiple_empty_lines_into_one() {
        let input = r#"
Text {}






Text {}
"#;
        let expected_output = r#"
Text {}

Text {}
"#;
        assert_eq!(connect_multiple_empty_lines_into_one(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_move_single_open_bracket() {
        let input = r#"Text
{
}"#;
        let expected_output = r#"Text {
}"#;
        assert_eq!(move_single_open_bracket(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"Text

{
}"#;
        let expected_output = r#"Text {
}"#;
        assert_eq!(move_single_open_bracket(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_remove_useless_spaces_around_colon() {
        let input = r#"property var roman   :    ABCD"#;
        let expected_output = r#"property var roman: ABCD"#;
        assert_eq!(remove_useless_spaces_around_colon(split_text_to_vector(input)), split_text_to_vector(expected_output));

        let input = r#"property var roman   :    "ABCD    :    ABCD""#;
        let expected_output = r#"property var roman: "ABCD    :    ABCD""#;
        assert_eq!(remove_useless_spaces_around_colon(split_text_to_vector(input)), split_text_to_vector(expected_output));

        let input = r#"text: "ABCD \" \" \", \":   \" \" \" \" \" \"""#;
        let expected_output = r#"text: "ABCD \" \" \", \":   \" \" \" \" \" \"""#;
        assert_eq!(remove_useless_spaces_around_colon(split_text_to_vector(input)), split_text_to_vector(expected_output));

        let input = r#"property var roman:ABCD"#;
        let expected_output = r#"property var roman:ABCD"#;
        assert_eq!(remove_useless_spaces_around_colon(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_move_elements_inside() {
        let input = r#"
Text {
Label {
Text {}
}
}
"#;
        let expected_output = r#"
Text {
    Label {
        Text {}
    }
}
"#;
        assert_eq!(move_elements_inside(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
Service(
Ser(
Serr()
)
)
"#;
        let expected_output = r#"
Service(
    Ser(
        Serr()
    )
)
"#;
        assert_eq!(move_elements_inside(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
Service(
)
"#;
        let expected_output = r#"
Service(
)
"#;
        assert_eq!(move_elements_inside(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
Service[
]
"#;
        let expected_output = r#"
Service[
]
"#;
        assert_eq!(move_elements_inside(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
Service[([{[
]}])]
"#;
        let expected_output = r#"
Service[([{[
]}])]
"#;
        assert_eq!(move_elements_inside(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
Service[([{[
]}])])]}]]}}]}
"#;
        let expected_output = r#"
Service[([{[
]}])])]}]]}}]}
"#;
        assert_eq!(move_elements_inside(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_remove_empty_space_on_end_of_line() {
        let input = r#"
        
Text {}         
                 
"#;
        let expected_output = r#"

Text {}

"#;
        assert_eq!(remove_empty_space_on_end_of_line(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_skip_start_end_empty_lines() {
        let input = r#"

Text {}

"#;
        let expected_output = r#"Text {}"#;
        assert_eq!(skip_start_end_empty_lines(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_reorganize_space_in_models() {
        let input = r#"
model: [{ "name": qsTr("Keksz"), "data": "Keksz" },
    { "name": qsTr("Static"), "data": "Static" },
    { "name": qsTr("Bs"), "data": "Bs" }]
abc
"#;
        let expected_output = r#"
model: [{ "name": qsTr("Keksz"), "data": "Keksz" },
        { "name": qsTr("Static"), "data": "Static" },
        { "name": qsTr("Bs"), "data": "Bs" }]
abc
"#;
        assert_eq!(reorganize_space_in_models(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
model: [modelData, BaseData[a] + " " + BaseData[b]] //TODO
Text {
}
"#;
        let expected_output = r#"
model: [modelData, BaseData[a] + " " + BaseData[b]] //TODO
Text {
}
"#;
        assert_eq!(reorganize_space_in_models(split_text_to_vector(input)), split_text_to_vector(expected_output));
        let input = r#"
states: [
    State {
    name:readyS
    }
]
"#;
        let expected_output = r#"
states: [
    State {
    name:readyS
    }
]
"#;
        assert_eq!(reorganize_space_in_models(split_text_to_vector(input)), split_text_to_vector(expected_output));
    }

    #[test]
    fn test_conversion() {
        let test_dir = "src/test_data/";
        let tests = [
            "1_empty_space_at_the_end",
            "2_empty_lines_at_start_end",
            "3_mismatched_space",
            "4_not_mismatched_space",
            "5_not_mismatched_space_inside",
            "6_space_after_colon",
            "7_space_after_colon_in_string",
            "8_space_after_colon_in_string_with_slash",
            "9_single_open_bracket",
            "10_multiple_empty_lines",
            "11_empty_line_before_ending",
            "12_if_else_mismatch",
            "13_if_oneliner",
            "14_different_quotes",
            "15_square_bracket",
            "16_space_after_colon_ternary",
            "17_no_space_when_between_brackets",
            "18_valid_state_brackets",
            "19_multiple_closing_brackets",
            "20_multi_line_models",
            "21_switch_case",
            "22_regular_expression",
            "23_connect_at_end_line",
            "24_ignore_comments",
            "25_multiple_question_mark",
            "26_bracket_in_comment",
            "example",
        ];
        for test_name in tests {
            println!("Testing {}", test_name);
            let input_name = format!("{}{}_INPUT.qml", test_dir, test_name);
            let output_name = format!("{}{}_OUTPUT.qml", test_dir, test_name);

            let input_content = fs::read_to_string(input_name).unwrap();
            let output_content = fs::read_to_string(output_name).unwrap();

            assert_eq!(convert_file(input_content), output_content);
        }
    }
}