clex_gen 0.3.6

A generator for clex language
Documentation
use clex_gen::clex_language::ast::{
    CharacterSet, DataType, PositiveReferenceType, ReferenceType, UnitExpression,
};
use clex_gen::{clex_language, get_ast};

#[test]
fn test_get_ast_with_complex_pattern() {
    let language = "(N[5,7]) (?: (N[1,5]) N[-10000,10000]{\\2}){\\1}";
    let ast = get_ast(language.to_string()).unwrap();

    assert_eq!(
        ast.expression,
        vec![
            UnitExpression::CapturingGroup {
                group_number: 1,
                range: (
                    PositiveReferenceType::ByLiteral(5),
                    PositiveReferenceType::ByLiteral(7)
                ),
            },
            UnitExpression::NonCapturingGroup {
                nest_exp: vec![
                    UnitExpression::CapturingGroup {
                        group_number: 2,
                        range: (
                            PositiveReferenceType::ByLiteral(1),
                            PositiveReferenceType::ByLiteral(5)
                        ),
                    },
                    UnitExpression::Primitives {
                        data_type: DataType::Integer(
                            ReferenceType::ByLiteral(-10000),
                            ReferenceType::ByLiteral(10000)
                        ),
                        repetition: PositiveReferenceType::ByGroup { group_number: 2 },
                    },
                ],
                repetition: PositiveReferenceType::ByGroup { group_number: 1 },
            },
            UnitExpression::Eof,
        ]
    );
}

#[test]
fn test_get_ast_with_backreference() {
    let language = "S {\\1}";
    let ast = get_ast(language.to_string()).unwrap();

    assert_eq!(
        ast.expression,
        vec![
            UnitExpression::Primitives {
                data_type: DataType::String(
                    PositiveReferenceType::ByLiteral(
                        clex_language::ast::DEFAULT_MIN_STRING_SIZE as u64
                    ),
                    PositiveReferenceType::ByLiteral(
                        clex_language::ast::DEFAULT_MAX_STRING_SIZE as u64
                    ),
                    CharacterSet::get_default_charset()
                ),
                repetition: PositiveReferenceType::ByGroup { group_number: 1 },
            },
            UnitExpression::Eof
        ]
    );
}

#[test]
fn test_custom_charset_with_string() {
    let language = "S[1, 10, 'asghdgad']";
    let ast = get_ast(language.to_string()).unwrap();

    assert_eq!(
        ast.expression,
        vec![
            UnitExpression::Primitives {
                data_type: DataType::String(
                    PositiveReferenceType::ByLiteral(1),
                    PositiveReferenceType::ByLiteral(10),
                    CharacterSet::Custom("asghdgad".to_string())
                ),
                repetition: PositiveReferenceType::ByLiteral(1),
            },
            UnitExpression::Eof
        ]
    );
}

#[test]
fn test_charset_with_string() {
    let language = "S[10, 10, @CH_ALL@]";
    let ast = get_ast(language.to_string()).unwrap();

    assert_eq!(
        ast.expression,
        vec![
            UnitExpression::Primitives {
                data_type: DataType::String(
                    PositiveReferenceType::ByLiteral(10),
                    PositiveReferenceType::ByLiteral(10),
                    CharacterSet::All
                ),
                repetition: PositiveReferenceType::ByLiteral(1),
            },
            UnitExpression::Eof
        ]
    );
}