xmlgenerator 0.2.4

Generate XML instances from an XML Schema (XSD)
#[cfg(test)]
mod tests {
    use std::collections::HashSet;
    use std::path::PathBuf;
    use workspace_root::get_workspace_root;

    use rstest::*;
    use std::panic;
    use xmlgenerator::{XMLGenerator, XMLGeneratorError};
    use xsdtestdata::XSDTestData;

    fn check_error(error: &XMLGeneratorError) -> String {
        match error {
            XMLGeneratorError::InvalidPathError(e) => panic!("Invalid path: {}", e),
            XMLGeneratorError::XSDValidatorError(e) => panic!("XSD validator error: {}", e),
            XMLGeneratorError::DataTypeInformationError(e) => {
                panic!("Data type information error: {}", e)
            }
            XMLGeneratorError::DataTypeNotFoundError(e) => panic!("DataType not found: {}", e),
            XMLGeneratorError::XSDParserError(e) => {
                format!("XSD Parser Error: {}", e)
            }
            XMLGeneratorError::DataTypesFormatError(e) => {
                format!("Data Types Format Error: {}", e)
            }
            XMLGeneratorError::XMLBuilderError(e) => panic!("XML builder error: {}", e),
            XMLGeneratorError::InvalidXSDVersionError(e) => {
                format!("Invalid XSD Version: {}", e)
            }
            XMLGeneratorError::InfiniteRecursionError => "Infinite Recursion detected".to_string(),
            XMLGeneratorError::NoElementsError => "No Elements in XSD".to_string(),
            XMLGeneratorError::InvalidXSDError(e) => panic!("Invalid XSD error: {}", e),
            XMLGeneratorError::InvalidXSDNameError(e) => {
                format!("Invalid XSD element name: {}", e)
            }
            XMLGeneratorError::NoIndependentElementsError => {
                "No Independent Elements found in XSD".to_string()
            }
            XMLGeneratorError::MultipleRootsError => "Multiple Roots found in XSD".to_string(),
            XMLGeneratorError::TypeGenerationError(e) => panic!("Type generation error: {}", e),
            XMLGeneratorError::RegexError(e) => panic!("Regex error: {}", e),
            XMLGeneratorError::RegexMismatchError(p1, p2) => {
                format!("Regex mismatch error: {} <-> {}", p1, p2)
            }
            XMLGeneratorError::EncodingError => "Encoding error".to_string(),
            XMLGeneratorError::LineEndingsError(e) => {
                format!("Invalid line ending error: {}", e)
            }
            XMLGeneratorError::UnimplementedFeature(e) => {
                format!("Unimplemented feature: {}", e)
            }
        }
    }

    fn check_result_str(str: &str) -> String {
        if str.is_empty() {
            panic!("Empty string is not allowed");
        }

        str.to_string()
    }

    fn test_file(generator: &XMLGenerator, test_data: &XSDTestData, key: &str) -> String {
        let file = match test_data.get(key) {
            Some(data) => data,
            None => {
                return "".to_string();
            }
        };

        let path = file.get_path();
        match generator.generate(path, Some(57)) {
            Ok(out) => check_result_str(&out),
            Err(err) => check_error(&err),
        }
    }

    fn validate_file(generator: &XMLGenerator, filepath: &PathBuf, valid: bool) -> bool {
        if !valid {
            return false;
        }

        generator.validate(filepath).is_ok()
    }

    fn get_valid_files<'a>(
        generator: &XMLGenerator,
        test_data: &'a XSDTestData,
    ) -> HashSet<&'a str> {
        let mut valid_files = HashSet::new();

        test_data.iter().for_each(|data| {
            let valid = data.is_valid();
            if valid && validate_file(generator, data.get_path(), valid) {
                valid_files.insert(data.get_key());
            }
        });

        valid_files
    }

    #[fixture]
    #[once]
    fn generator() -> XMLGenerator {
        XMLGenerator::new()
    }

    #[fixture]
    #[once]
    fn test_data() -> XSDTestData {
        let root = get_workspace_root();
        let db_root = root.join("xsdtests-master");
        let archive = root.join("xsdtests.zip");

        XSDTestData::new(&db_root, &archive)
    }

    #[rstest]
    fn test_xsd_database(
        generator: &XMLGenerator,
        test_data: &XSDTestData,
    ) {
        // TODO Split into cases
        get_valid_files(generator, test_data).into_iter().for_each(|k| {
            test_file(generator, test_data, k);
        });
    }

    // #[rstest]
    // fn test_single_file(generator: &XMLGenerator, test_data: &XSDTestData) {
    //     let file = "saxonData/XmlVersions/xv008.xsd";
    //     println!("{}", file);
    //
    //     let output = test_file(generator, test_data, file);
    //     println!("{}", output);
    // }
}