ryot 0.2.2

MMORPG library based on the concepts of open tibia written in rust and bevy.
Documentation
use super::*;
use rstest::{fixture, rstest};
use serde_json::{from_str, to_string};

#[rstest]
fn test_has_sprite(#[from(sprite_sheet_fixture)] sprite_sheet: SpriteSheetData) {
    assert!(sprite_sheet.has_sprite(100));
    assert!(sprite_sheet.has_sprite(200));
    assert!(!sprite_sheet.has_sprite(99));
    assert!(!sprite_sheet.has_sprite(201));
}

#[rstest]
fn test_get_sprite_index(#[from(sprite_sheet_fixture)] sprite_sheet: SpriteSheetData) {
    assert_eq!(Some(0), sprite_sheet.get_sprite_index(100));
    assert_eq!(Some(99), sprite_sheet.get_sprite_index(199));
    assert_eq!(Some(100), sprite_sheet.get_sprite_index(200));
    assert_eq!(None, sprite_sheet.get_sprite_index(99));
    assert_eq!(None, sprite_sheet.get_sprite_index(201));
}

#[rstest]
#[case(SpriteLayout::OneByOne, UVec2::new(32, 32))]
#[case(SpriteLayout::OneByTwo, UVec2::new(32, 64))]
#[case(SpriteLayout::TwoByOne, UVec2::new(64, 32))]
#[case(SpriteLayout::TwoByTwo, UVec2::new(64, 64))]
fn test_get_tile_size(#[case] layout: SpriteLayout, #[case] expected: UVec2) {
    let sprite_sheet = SpriteSheetData {
        file: "spritesheet.png".to_string(),
        layout,
        first_sprite_id: 100,
        last_sprite_id: 200,
        area: 64,
    };

    assert_eq!(expected, sprite_sheet.get_tile_size(&UVec2::new(32, 32)));
}

#[fixture]
fn sprite_sheet_fixture() -> SpriteSheetData {
    SpriteSheetData {
        file: "spritesheet.png".to_string(),
        layout: SpriteLayout::OneByOne,
        first_sprite_id: 100,
        last_sprite_id: 200,
        area: 64,
    }
}

#[rstest]
fn test_from_content(#[from(sprite_sheet_set_fixture)] sprite_sheet_set: SpriteSheetDataSet) {
    assert_eq!(2, sprite_sheet_set.len());
    assert_eq!(100, sprite_sheet_set[0].first_sprite_id);
    assert_eq!(200, sprite_sheet_set[0].last_sprite_id);
    assert_eq!(300, sprite_sheet_set[1].first_sprite_id);
    assert_eq!(400, sprite_sheet_set[1].last_sprite_id);
}

#[rstest]
fn test_set_get_by_sprite_id(
    #[from(sprite_sheet_set_fixture)] sprite_sheet_set: SpriteSheetDataSet,
) {
    assert_eq!(
        100,
        sprite_sheet_set
            .get_by_sprite_id(100)
            .unwrap()
            .first_sprite_id
    );
    assert_eq!(
        200,
        sprite_sheet_set
            .get_by_sprite_id(200)
            .unwrap()
            .last_sprite_id
    );
    assert_eq!(
        300,
        sprite_sheet_set
            .get_by_sprite_id(300)
            .unwrap()
            .first_sprite_id
    );
    assert_eq!(
        400,
        sprite_sheet_set
            .get_by_sprite_id(400)
            .unwrap()
            .last_sprite_id
    );
    assert_eq!(None, sprite_sheet_set.get_by_sprite_id(99));
    assert_eq!(None, sprite_sheet_set.get_by_sprite_id(201));
    assert_eq!(None, sprite_sheet_set.get_by_sprite_id(299));
    assert_eq!(None, sprite_sheet_set.get_by_sprite_id(401));
}

#[fixture]
fn sprite_sheet_set_fixture() -> SpriteSheetDataSet {
    let vec = vec![
        ContentType::Sprite(SpriteSheetData {
            file: "spritesheet.png".to_string(),
            layout: SpriteLayout::default(),
            first_sprite_id: 100,
            last_sprite_id: 200,
            area: 64,
        }),
        ContentType::Sprite(SpriteSheetData {
            file: "spritesheet2.png".to_string(),
            layout: SpriteLayout::default(),
            first_sprite_id: 300,
            last_sprite_id: 400,
            area: 64,
        }),
    ];

    SpriteSheetDataSet::from_content(&vec)
}

#[rstest]
#[case(
        ContentType::Appearances { file: "appearances.dat".to_string() },
        r#"{"type":"appearances","file":"appearances.dat"}"#
    )]
#[case(
        ContentType::StaticData { file: "staticdata.dat".to_string() },
        r#"{"type":"staticdata","file":"staticdata.dat"}"#
    )]
#[case(
        ContentType::StaticMapData { file: "staticmapdata.dat".to_string() },
        r#"{"type":"staticmapdata","file":"staticmapdata.dat"}"#
    )]
#[case(
        ContentType::Map { file: "map.otbm".to_string() },
        r#"{"type":"map","file":"map.otbm"}"#
    )]
#[case(
        ContentType::Sprite(SpriteSheetData {
            file: "spritesheet.png".to_string(),
            layout: SpriteLayout::OneByOne,
            first_sprite_id: 100,
            last_sprite_id: 200,
            area: 64,
        }),
        r#"{"type":"sprite","file":"spritesheet.png","spritetype":0,"firstspriteid":100,"lastspriteid":200,"area":64}"#
    )]
fn test_serialize_content_type(#[case] content: ContentType, #[case] expected_json: &str) {
    assert_eq!(to_string(&content).unwrap(), expected_json);
}

#[rstest]
#[case(
        r#"{"type":"appearances","file":"appearances.dat"}"#,
        ContentType::Appearances { file: "appearances.dat".to_string() }
    )]
#[case(
        r#"{"type":"staticdata","file":"staticdata.dat"}"#,
        ContentType::StaticData { file: "staticdata.dat".to_string() }
    )]
#[case(
        r#"{"type":"staticmapdata","file":"staticmapdata.dat"}"#,
        ContentType::StaticMapData { file: "staticmapdata.dat".to_string() }
    )]
#[case(
        r#"{"type":"map","file":"map.otbm"}"#,
        ContentType::Map { file: "map.otbm".to_string() }
    )]
#[case(
        r#"{"type":"sprite","file":"spritesheet.png","spritetype":0,"firstspriteid":100,"lastspriteid":200,"area":64}"#,
        ContentType::Sprite(SpriteSheetData {
            file: "spritesheet.png".to_string(),
            layout: SpriteLayout::OneByOne,
            first_sprite_id: 100,
            last_sprite_id: 200,
            area: 64,
        })
    )]
fn test_deserialize_content_type(#[case] json: &str, #[case] expected_content: ContentType) {
    assert_eq!(from_str::<ContentType>(json).unwrap(), expected_content);
}