gdlib/
lib.rs

1#![doc = include_str!("../README.md")]
2
3pub mod deserialiser;
4pub mod serialiser;
5pub mod gdlevel;
6pub mod gdobj;
7pub mod utils;
8
9#[cfg(test)]
10mod tests {
11    use crate::{
12        deserialiser::decode_levels_to_string, 
13        gdlevel::{Level, Levels},
14        gdobj::{misc::{self, default_block}, triggers::{self, move_trigger, DefaultMove, MoveEasing}, GDObjConfig}, utils::{b64_decode, vec_as_str}
15    };
16
17    #[test]
18    fn decode_savefile_test() {
19        // 1,500ms on average for 30mb savefile
20        assert!(decode_levels_to_string().is_ok())
21    }
22
23    #[test]
24    fn parse_to_levels_obj() { 
25        let raw_levels_savefile = decode_levels_to_string().unwrap();
26        // 400ms on average for 30mb savefile
27        Levels::from_decrypted(raw_levels_savefile).unwrap();
28    }
29
30    #[test]
31    fn add_level_and_export() {
32        let mut levels = Levels::from_local().unwrap();
33        let mut new_level = Level::new("rust websocket tutorial 2", "arrowslasharrow", Some("dont use rust"), Some(857925));
34        
35        new_level.add_object(triggers::move_trigger(
36            GDObjConfig::default().pos(45.0, 45.0).groups([1234]), 
37            triggers::MoveMode::Default(triggers::DefaultMove {
38                dx: 45.0,
39                dy: 54.0,
40                x_lock: None,
41                y_lock: None
42            }), 
43            0.50, 1, false, true, Some((MoveEasing::ElasticInOut, 1.50))
44        ));
45
46        new_level.add_object(misc::default_block(GDObjConfig::default().x(15.0).y(15.0)));
47        
48        levels.add_level(new_level);
49        levels.export_to_savefile_with_backup().unwrap();
50    }
51
52    #[test]
53    fn read_objs() {
54        let mut levels = Levels::from_local().unwrap();
55        let first_level = levels.levels.first_mut().unwrap();
56        let data = first_level.get_decrypted_data().unwrap();
57
58        for (idx, obj) in data.objects.iter().enumerate() {
59            println!("{idx}: {obj:?}");
60        }   
61    }
62
63    #[test]
64    fn gmd_conversion() {
65        let level = Level::from_gmd("GMDS/level.gmd").unwrap();
66        level.export_to_gmd("GMDS/level_export.gmd").unwrap();
67    }
68
69    #[test]
70    fn trigger() {
71        let mut level = Level::from_gmd("GMDS/Unnamed 25.gmd").unwrap();
72        let objects = &level.get_decrypted_data().unwrap().objects;
73        for obj in objects {
74            println!("{obj:?}");
75        }
76
77        // level.add_object(triggers::item_edit(GDObjConfig::new().pos(45.0, 45.0), 
78        //     Some((1, ItemType::Counter)), Some((2, ItemType::Counter)), 3, ItemType::Counter,
79        //     0.5, triggers::Op::Set, Some(triggers::Op::Add), Some(triggers::Op::Sub), triggers::RoundMode::Nearest,
80        //     triggers::RoundMode::Nearest, triggers::SignMode::Absolute, triggers::SignMode::Negative
81        // ));
82
83        // levels.export_to_savefile().unwrap();
84    }
85
86    #[test]
87    fn move_constructor_test() {
88        let mut level = Level::new("move trigger t3st", "arrowslasharrow", None, None);
89        level.add_object(move_trigger(
90            GDObjConfig::default().pos(45.0, 45.0), 
91            triggers::MoveMode::Default(DefaultMove {
92                dx: 45.0,
93                dy: 54.0,
94                x_lock: None,
95                y_lock: None
96            }), 
97            17.38, 
98            679, 
99            false, 
100            true, 
101            Some((MoveEasing::ElasticInOut, 1.50))
102        ));
103
104        level.export_to_gmd("GMD_tests/move_trigger.gmd").unwrap();
105    }
106
107    #[test]
108    fn level_display_test() {
109        let mut levels = Levels::from_local().unwrap();
110        let level = levels.levels.get_mut(0).unwrap();
111        println!("Level info: {level}");
112        println!("Unused groups: {:?}", level.get_decrypted_data().unwrap().get_unused_groups());
113        println!("Used groups: {:?}", level.get_decrypted_data().unwrap().get_used_groups());
114    }
115
116}