df_ls_structure 0.3.0-rc.1

A language server for Dwarf Fortress RAW files
Documentation
use df_ls_core::{
    AllowEmpty, Any, BangArgN, BangArgNOrValue, BangArgNSequence, Reference, ReferenceTo,
};
use df_ls_lexical_analysis::test_utils::LexerTestBuilder;
use df_ls_structure::*;
use df_ls_syntax_analysis::test_utils::SyntaxTestBuilder;

#[test]
fn test_creature_variation() {
    SyntaxTestBuilder::from_lexer_test_builder(
        LexerTestBuilder::test_source(
            "creature_variation_header

            [OBJECT:CREATURE_VARIATION]

            [CREATURE_VARIATION:ANIMAL_PERSON]
                [CV_REMOVE_TAG:NAME]
                [CV_CONVERT_TAG]
                    [CVCT_MASTER:BODY]
                    [CVCT_TARGET:SPIDER]
                    [CVCT_REPLACEMENT:HUMANOID_6ARMS:3FINGERS]
                [CV_NEW_TAG:LARGE_ROAMING]

            [CREATURE_VARIATION:ANIMAL_PERSON_OTHER]
                [CV_REMOVE_CTAG:1:YES:NAME]
                [CV_CONVERT_CTAG:4:AFFIRMATIVE]
                    [CVCT_MASTER:BODY]
                    [CVCT_TARGET:SPIDER]
                    [CVCT_REPLACEMENT:HUMANOID_6ARMS:3FINGERS]
                [CV_NEW_CTAG:3:YEP:LARGE_ROAMING]

            [CREATURE_VARIATION:STANDARD_BIPED_GAITS]
                [CV_NEW_TAG:GAIT:WALK:Sprint:!ARG4:10:3:!ARG2:50:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:50]
                [CV_NEW_TAG:GAIT:WALK:Run:!ARG3:5:3:!ARG2:10:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:20]

            ",
        )
        .add_test_lexer_diagnostics_codes(vec![])
        .add_test_lexer_diagnostics_ranges(vec![]),
    )
    .add_test_structure(DFRaw {
        header: "creature_variation_header".to_owned(),
        token_structure: vec![ObjectToken {
            creature_variation_tokens: vec![
                CreatureVariationToken {
                    reference: Some(ReferenceTo::new("ANIMAL_PERSON".to_owned())),
                    cv_new_tag: vec![(Reference("LARGE_ROAMING".to_owned()), None)],
                    cv_remove_tag: vec![(Reference("NAME".to_owned()), None)],
                    cv_convert_tag: vec![CvConvertTag {
                        cv_convert_tag: Some(()),
                        cvct_master: Some(AllowEmpty::Some((
                            Reference("BODY".to_owned()),
                            None
                        ))),
                        cvct_target: Some((vec![Any::Reference(Reference(
                            "SPIDER".to_owned()
                        ))],)),
                        cvct_replacement: Some((vec![
                            Any::Reference(Reference("HUMANOID_6ARMS".to_owned())),
                            Any::Reference(Reference("3FINGERS".to_owned())),
                        ],)),
                    }],
                    ..Default::default()
                },
                CreatureVariationToken {
                    reference: Some(ReferenceTo::new("ANIMAL_PERSON_OTHER".to_owned())),
                    cv_new_ctag: vec![(
                        3,
                        Reference("YEP".to_owned()),
                        Some((vec![Any::Reference(Reference("LARGE_ROAMING".to_owned()))],)),
                    )],
                    cv_remove_ctag: vec![(
                        1,
                        Reference("YES".to_owned()),
                        Some((vec![Any::Reference(Reference("NAME".to_owned()))],)),
                    )],
                    cv_convert_ctag: vec![CvConvertCTag {
                        cv_convert_ctag: Some((
                            4,
                            Any::Reference(Reference("AFFIRMATIVE".to_owned()))
                        ),),
                        cvct_master: Some(AllowEmpty::Some((
                            Reference("BODY".to_owned()),
                            None
                        ))),
                        cvct_target: Some((vec![Any::Reference(Reference(
                            "SPIDER".to_owned()
                        ))],)),
                        cvct_replacement: Some((vec![
                            Any::Reference(Reference("HUMANOID_6ARMS".to_owned())),
                            Any::Reference(Reference("3FINGERS".to_owned())),
                        ],)),
                    }],
                    ..Default::default()
                },
                CreatureVariationToken {
                    reference: Some(ReferenceTo::new("STANDARD_BIPED_GAITS".to_owned())),
                    cv_new_tag: vec![
                        (
                            Reference("GAIT".to_owned()),
                            Some((vec![
                                Any::Reference(Reference("WALK".to_owned())),
                                Any::String("Sprint".to_owned()),
                                Any::BangArgNSequence(BangArgNSequence(vec![
                                    BangArgNOrValue::BangArgN(BangArgN(4))
                                ])),
                                Any::Integer(10),
                                Any::Integer(3),
                                Any::BangArgNSequence(BangArgNSequence(vec![
                                    BangArgNOrValue::BangArgN(BangArgN(2))
                                ])),
                                Any::Integer(50),
                                Any::Reference(Reference("LAYERS_SLOW".to_owned())),
                                Any::Reference(Reference("STRENGTH".to_owned())),
                                Any::Reference(Reference("AGILITY".to_owned())),
                                Any::Reference(Reference("STEALTH_SLOWS".to_owned())),
                                Any::Integer(50),
                            ],)),
                        ),
                        (
                            Reference("GAIT".to_owned()),
                            Some((vec![
                                Any::Reference(Reference("WALK".to_owned())),
                                Any::String("Run".to_owned()),
                                Any::BangArgNSequence(BangArgNSequence(vec![
                                    BangArgNOrValue::BangArgN(BangArgN(3))
                                ])),
                                Any::Integer(5),
                                Any::Integer(3),
                                Any::BangArgNSequence(BangArgNSequence(vec![
                                    BangArgNOrValue::BangArgN(BangArgN(2))
                                ])),
                                Any::Integer(10),
                                Any::Reference(Reference("LAYERS_SLOW".to_owned())),
                                Any::Reference(Reference("STRENGTH".to_owned())),
                                Any::Reference(Reference("AGILITY".to_owned())),
                                Any::Reference(Reference("STEALTH_SLOWS".to_owned())),
                                Any::Integer(20),
                            ],)),
                        ),
                    ],
                    ..Default::default()
                },
            ],
            ..Default::default()
        }],
    })
    .add_test_syntax_diagnostics_codes(vec![])
    .add_test_syntax_diagnostics_ranges(vec![])
    .run_test();
}