XML_to_JSON_Parser 0.1.0

Parser that converts simple XML language text to a string in JSON format written on Rust.
Documentation
use anyhow::anyhow;
use XML_to_JSON_Parser::*;
use serde_json::json;

#[test]
fn basic_parser_test() -> anyhow::Result<()> {
    let test_text = r#"
     <parser>
        <title>XML_to_JSON</title>
        <author>Artur Nozhenko</author>
    </parser>
    "#;

    let parsed = start_parser(test_text)?;
    let expected = json!({
        "parser": {
            "title": "XML_to_JSON",
            "author": "Artur Nozhenko"
        }
    });

    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn without_nested_elements_test() -> anyhow::Result<()> {
    let test_text = r#"<parser>XML_to_JSON</parser>"#;
    let parsed = start_parser(test_text)?;
    let expected = json!({ "parser": "XML_to_JSON" });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn different_tags_test() {
    let test_text = r#"
     <parser>
        <title>XML_to_JSON</title>
        <author>Artur Nozhenko</author>
    </qwertyr>
    "#;

    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn different_nested_tags_test() {
    let test_text = r#"
     <parser>
        <title>XML_to_JSON</qwerty>
        <author>Artur Nozhenko</author>
    </parser>
    "#;

    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn empty_text_test() {
    let test_text = "";

    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn tags_without_text_test() -> anyhow::Result<()> {
    let test_text = r#"
     <parser></parser>
    "#;

    let parsed = start_parser(test_text)?;
    let expected = json!({ "parser": {} });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn underline_attributes_test() -> anyhow::Result<()> {
    let test_text = r#"<parser id = "1" author = "Artur Nozhenko"></parser>"#;
    let parsed = start_parser(test_text)?;
    let expected = json!({ 
        "parser": {
            "_id": "1",
            "_author": "Artur Nozhenko"
        } 
    });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn underline_attributes_and_text_test() -> anyhow::Result<()> {
    let test_text = r#"<parser id = "1" author = "Artur Nozhenko">XML_to_JSON</parser>"#;
    let parsed = start_parser(test_text)?;
    let expected = json!({ 
        "parser": {
            "_id": "1",
            "_author": "Artur Nozhenko",
            "_text": "XML_to_JSON"
        } 
    });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn without_open_tag_test() {
    let test_text = r#"XML_to_JSON</parser>"#;
    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn without_close_tag_test() {
    let test_text = r#"<parser>XML_to_JSON"#;
    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn bad_tag_name_test() {
    let test_text = r#"<parser<vfvew>XML_to_JSON</parser<vfvew>"#;
    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn big_nested_json_test() -> anyhow::Result<()> {
    let test_text = r#"<parser><parser1><parser2><parser3>XML_to_JSON</parser3></parser2></parser1></parser>"#;
    let parsed = start_parser(test_text)?;
    let expected = json!({ 
        "parser": {
            "parser1": {
                "parser2": {
                    "parser3": "XML_to_JSON"
                }
            }
        } 
    });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn empty_attributes_value_test() -> anyhow::Result<()> {
    let test_text = r#"<parser id = "" author = "">XML_to_JSON</parser>"#;
    let parsed = start_parser(test_text)?;
    let expected = json!({ 
        "parser": {
            "_id": "",
            "_author": "",
            "_text": "XML_to_JSON"
        } 
    });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn attributes_value_without_quotes_test() {
    let test_text = r#"<parser id = 1>XML_to_JSON</parser>"#;
    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}

#[test]
fn tag_with_numbers_name_test() -> anyhow::Result<()> {
    let test_text = r#"<parser111>XML_to_JSON</parser111>"#;

    let parsed = start_parser(test_text)?;
    let expected = json!({ "parser111": "XML_to_JSON" });
    assert_eq!(parsed, expected);
    Ok(())
}

#[test]
fn tag_name_starts_with_number_test() {
    let test_text = r#"<1parser>XML_to_JSON</1parser>"#;
    let parsed = start_parser(test_text);
    assert!(parsed.is_err())
}