]> git.seodisparate.com - LudumDare45_StartWithNothing/commitdiff
save/restore: Impl. tests for de/serialize
authorStephen Seo <seo.disparate@gmail.com>
Thu, 15 Feb 2024 06:11:59 +0000 (15:11 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 15 Feb 2024 06:11:59 +0000 (15:11 +0900)
Added impl. of Default trait for Planet.

Added some derive traits (Debug and PartialEq) to some structs so that
they can be checked in the unit tests.

TODO:
    Actual saving/loading behavior.

src/faux_quicksilver.rs
src/original_impl.rs

index beffb5acfb2ccac5eba0f9bce32422a354337d84..6dd8a42c60ccb9f040bdab6ce74d75979079e63f 100644 (file)
@@ -536,3 +536,48 @@ impl Window {
         Ok(())
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_de_serialize_color() {
+        let color = Color::from_rgba(1, 2, 3, 4);
+        let bytes = color.serialize();
+        let (des_color, size) =
+            Color::deserialize(&bytes, 0).expect("Should be able to deserialize Color!");
+        assert_eq!(color, des_color);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_rectangle() {
+        let rect = Rectangle::new(1.0, 2.0, 3.0, 4.0);
+        let bytes = rect.serialize();
+        let (des_rect, size) =
+            Rectangle::deserialize(&bytes, 0).expect("Should be able to deserialize Rectangle!");
+        assert_eq!(rect, des_rect);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_circle() {
+        let circle = Circle::new(1.0, 2.0, 3.0);
+        let bytes = circle.serialize();
+        let (des_circle, size) =
+            Circle::deserialize(&bytes, 0).expect("Should be able to deserialize Circle!");
+        assert_eq!(circle, des_circle);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_vector() {
+        let vect = Vector::new(1.0, 2.0);
+        let bytes = vect.serialize();
+        let (des_vect, size) =
+            Vector::deserialize(&bytes, 0).expect("Should be able to deserialize Vector!");
+        assert_eq!(vect, des_vect);
+        assert_eq!(bytes.len(), size);
+    }
+}
index d72d5f7bcc7194d08c25444986a6229c3cdd4dbc..6c1b32c30a507fe242622975f1656af36849dc6c 100644 (file)
@@ -522,7 +522,7 @@ impl Menu {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct Particle {
     rect: Rectangle,
     circle: Circle,
@@ -650,7 +650,7 @@ impl Particle {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct ParticleSystem {
     particles: Vec<Particle>,
     spawn_timer: f32,
@@ -946,7 +946,7 @@ impl ParticleSystem {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct RotatingParticleSystem {
     particle_system: ParticleSystem,
     r: f32,
@@ -1208,7 +1208,7 @@ impl ExplConvParticleSystem {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct Planet {
     circle: Circle,
     color: Color,
@@ -1216,6 +1216,17 @@ struct Planet {
     moons: Vec<RotatingParticleSystem>,
 }
 
+impl Default for Planet {
+    fn default() -> Self {
+        Self {
+            circle: Circle::default(),
+            color: Color::default(),
+            particle_system: ParticleSystem::default(),
+            moons: Vec::new(),
+        }
+    }
+}
+
 impl Planet {
     fn new(circle: Circle, color: Color) -> Self {
         let mut smaller_circle = circle;
@@ -1295,7 +1306,7 @@ impl Planet {
 
     pub fn deserialize(data: &[u8], offset: usize) -> Result<(Planet, usize), ()> {
         let mut idx: usize = 0;
-        let mut planet = Planet::new(Circle::new(0.0, 0.0, 1.0), Color::WHITE);
+        let mut planet = Planet::default();
 
         let (circle, circle_size) = Circle::deserialize(data, offset + idx)?;
         planet.circle = circle;
@@ -1344,7 +1355,7 @@ impl Planet {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct Star {
     color: Color,
     particle_system: ParticleSystem,
@@ -1470,7 +1481,7 @@ impl Star {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct Fish {
     pos: Vector,
     r: f32,
@@ -1722,7 +1733,7 @@ impl Fish {
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug, PartialEq)]
 struct SaveData {
     planets: Vec<Planet>,
     stars: Vec<Star>,
@@ -1746,7 +1757,7 @@ impl Default for SaveData {
 }
 
 impl SaveData {
-    pub fn deserialize(data: &[u8]) -> Result<SaveData, ()> {
+    pub fn deserialize(data: &[u8]) -> Result<(SaveData, usize), ()> {
         let mut idx: usize = 0;
         let mut save_data = SaveData::default();
 
@@ -1816,7 +1827,7 @@ impl SaveData {
         save_data.joining_particles = jp;
         idx += jp_size;
 
-        Ok(save_data)
+        Ok((save_data, idx))
     }
 
     pub fn serialize(&self) -> Vec<u8> {
@@ -2656,3 +2667,720 @@ impl GameState {
         Ok(())
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_de_serialize_particle() {
+        let mut particle = Particle::default();
+        particle.rect.x = 1.0;
+        particle.rect.y = 2.0;
+        particle.rect.w = 3.0;
+        particle.rect.h = 4.0;
+        particle.circle.x = 5.0;
+        particle.circle.y = 6.0;
+        particle.circle.r = 7.0;
+        particle.is_rect = true;
+        particle.velx = 8.0;
+        particle.vely = 9.0;
+        particle.velr = 10.0;
+        particle.r = 11.0;
+        particle.lifetime = 12.0;
+        particle.life_timer = 13.0;
+        let bytes = particle.serialize();
+        let (des_particle, size) =
+            Particle::deserialize(&bytes, 0).expect("Should be able to deserialize Particle!");
+        assert_eq!(particle, des_particle);
+        assert_eq!(bytes.len(), size);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 14.0;
+        particle.rect.y = 15.0;
+        particle.rect.w = 16.0;
+        particle.rect.h = 17.0;
+        particle.circle.x = 18.0;
+        particle.circle.y = 19.0;
+        particle.circle.r = 20.0;
+        particle.is_rect = false;
+        particle.velx = 21.0;
+        particle.vely = 22.0;
+        particle.velr = 23.0;
+        particle.r = 24.0;
+        particle.lifetime = 25.0;
+        particle.life_timer = 26.0;
+        let bytes = particle.serialize();
+        let (des_particle, size) =
+            Particle::deserialize(&bytes, 0).expect("Should be able to deserialize Particle!");
+        assert_eq!(particle, des_particle);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_particle_system() {
+        let mut ps = ParticleSystem::default();
+        let mut particle = Particle::default();
+        particle.rect.x = 1.0;
+        particle.rect.y = 2.0;
+        particle.rect.w = 3.0;
+        particle.rect.h = 4.0;
+        particle.circle.x = 5.0;
+        particle.circle.y = 6.0;
+        particle.circle.r = 7.0;
+        particle.is_rect = true;
+        particle.velx = 8.0;
+        particle.vely = 9.0;
+        particle.velr = 10.0;
+        particle.r = 11.0;
+        particle.lifetime = 12.0;
+        particle.life_timer = 13.0;
+        ps.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 14.0;
+        particle.rect.y = 15.0;
+        particle.rect.w = 16.0;
+        particle.rect.h = 17.0;
+        particle.circle.x = 18.0;
+        particle.circle.y = 19.0;
+        particle.circle.r = 20.0;
+        particle.is_rect = false;
+        particle.velx = 21.0;
+        particle.vely = 22.0;
+        particle.velr = 23.0;
+        particle.r = 24.0;
+        particle.lifetime = 25.0;
+        particle.life_timer = 26.0;
+        ps.particles.push(particle);
+
+        ps.spawn_timer = 27.0;
+        ps.spawn_time = 28.0;
+        ps.lifetime = 29.0;
+        ps.host_rect.x = 30.0;
+        ps.host_rect.y = 31.0;
+        ps.host_rect.w = 32.0;
+        ps.host_rect.h = 33.0;
+        ps.host_circle.x = 34.0;
+        ps.host_circle.y = 35.0;
+        ps.host_circle.r = 36.0;
+        ps.is_rect = true;
+        ps.direction.x = 37.0;
+        ps.direction.y = 38.0;
+        ps.color.r = 39;
+        ps.color.g = 40;
+        ps.color.b = 41;
+        ps.color.a = 42;
+        ps.opacity = 43.0;
+        ps.vel_multiplier = 44.0;
+
+        let bytes = ps.serialize();
+        let (des_ps, size) = ParticleSystem::deserialize(&bytes, 0)
+            .expect("Should be able to deserialize ParticleSystem!");
+        assert_eq!(ps, des_ps);
+        assert_eq!(bytes.len(), size);
+
+        let mut ps = ParticleSystem::default();
+        let mut particle = Particle::default();
+        particle.rect.x = 45.0;
+        particle.rect.y = 46.0;
+        particle.rect.w = 47.0;
+        particle.rect.h = 48.0;
+        particle.circle.x = 49.0;
+        particle.circle.y = 50.0;
+        particle.circle.r = 51.0;
+        particle.is_rect = true;
+        particle.velx = 52.0;
+        particle.vely = 53.0;
+        particle.velr = 54.0;
+        particle.r = 55.0;
+        particle.lifetime = 56.0;
+        particle.life_timer = 57.0;
+        ps.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 58.0;
+        particle.rect.y = 59.0;
+        particle.rect.w = 60.0;
+        particle.rect.h = 61.0;
+        particle.circle.x = 62.0;
+        particle.circle.y = 63.0;
+        particle.circle.r = 64.0;
+        particle.is_rect = false;
+        particle.velx = 65.0;
+        particle.vely = 66.0;
+        particle.velr = 67.0;
+        particle.r = 68.0;
+        particle.lifetime = 69.0;
+        particle.life_timer = 70.0;
+        ps.particles.push(particle);
+
+        ps.spawn_timer = 71.0;
+        ps.spawn_time = 72.0;
+        ps.lifetime = 73.0;
+        ps.host_rect.x = 74.0;
+        ps.host_rect.y = 75.0;
+        ps.host_rect.w = 76.0;
+        ps.host_rect.h = 77.0;
+        ps.host_circle.x = 78.0;
+        ps.host_circle.y = 79.0;
+        ps.host_circle.r = 80.0;
+        ps.is_rect = false;
+        ps.direction.x = 81.0;
+        ps.direction.y = 82.0;
+        ps.color.r = 83;
+        ps.color.g = 84;
+        ps.color.b = 85;
+        ps.color.a = 86;
+        ps.opacity = 87.0;
+        ps.vel_multiplier = 88.0;
+
+        let bytes = ps.serialize();
+        let (des_ps, size) = ParticleSystem::deserialize(&bytes, 0)
+            .expect("Should be able to deserialize ParticleSystem!");
+        assert_eq!(ps, des_ps);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_rotating_particle_system() {
+        let mut ps = ParticleSystem::default();
+        let mut particle = Particle::default();
+        particle.rect.x = 1.0;
+        particle.rect.y = 2.0;
+        particle.rect.w = 3.0;
+        particle.rect.h = 4.0;
+        particle.circle.x = 5.0;
+        particle.circle.y = 6.0;
+        particle.circle.r = 7.0;
+        particle.is_rect = true;
+        particle.velx = 8.0;
+        particle.vely = 9.0;
+        particle.velr = 10.0;
+        particle.r = 11.0;
+        particle.lifetime = 12.0;
+        particle.life_timer = 13.0;
+        ps.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 14.0;
+        particle.rect.y = 15.0;
+        particle.rect.w = 16.0;
+        particle.rect.h = 17.0;
+        particle.circle.x = 18.0;
+        particle.circle.y = 19.0;
+        particle.circle.r = 20.0;
+        particle.is_rect = false;
+        particle.velx = 21.0;
+        particle.vely = 22.0;
+        particle.velr = 23.0;
+        particle.r = 24.0;
+        particle.lifetime = 25.0;
+        particle.life_timer = 26.0;
+        ps.particles.push(particle);
+
+        ps.spawn_timer = 27.0;
+        ps.spawn_time = 28.0;
+        ps.lifetime = 29.0;
+        ps.host_rect.x = 30.0;
+        ps.host_rect.y = 31.0;
+        ps.host_rect.w = 32.0;
+        ps.host_rect.h = 33.0;
+        ps.host_circle.x = 34.0;
+        ps.host_circle.y = 35.0;
+        ps.host_circle.r = 36.0;
+        ps.is_rect = true;
+        ps.direction.x = 37.0;
+        ps.direction.y = 38.0;
+        ps.color.r = 39;
+        ps.color.g = 40;
+        ps.color.b = 41;
+        ps.color.a = 42;
+        ps.opacity = 43.0;
+        ps.vel_multiplier = 44.0;
+
+        let mut rps = RotatingParticleSystem::default();
+        rps.particle_system = ps;
+        rps.r = 45.0;
+        rps.velr = 46.0;
+        rps.offset = 47.0;
+
+        let bytes = rps.serialize();
+        let (des_rps, size) = RotatingParticleSystem::deserialize(&bytes, 0)
+            .expect("Should be able to deserialize RotatingParticleSystem!");
+        assert_eq!(rps, des_rps);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_planet() {
+        let mut planet = Planet::default();
+        planet.circle.x = 1.0;
+        planet.circle.y = 2.0;
+        planet.circle.r = 3.0;
+        planet.color.r = 4;
+        planet.color.g = 5;
+        planet.color.b = 6;
+        planet.color.a = 7;
+
+        let mut particle = Particle::default();
+        particle.rect.x = 8.0;
+        particle.rect.y = 9.0;
+        particle.rect.w = 10.0;
+        particle.rect.h = 11.0;
+        particle.circle.x = 12.0;
+        particle.circle.y = 13.0;
+        particle.circle.r = 14.0;
+        particle.is_rect = true;
+        particle.velx = 15.0;
+        particle.vely = 16.0;
+        particle.velr = 17.0;
+        particle.r = 18.0;
+        particle.lifetime = 19.0;
+        particle.life_timer = 20.0;
+        planet.particle_system.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 21.0;
+        particle.rect.y = 22.0;
+        particle.rect.w = 23.0;
+        particle.rect.h = 24.0;
+        particle.circle.x = 25.0;
+        particle.circle.y = 26.0;
+        particle.circle.r = 27.0;
+        particle.is_rect = false;
+        particle.velx = 28.0;
+        particle.vely = 29.0;
+        particle.velr = 30.0;
+        particle.r = 31.0;
+        particle.lifetime = 32.0;
+        particle.life_timer = 33.0;
+        planet.particle_system.particles.push(particle);
+
+        planet.particle_system.spawn_timer = 34.0;
+        planet.particle_system.spawn_time = 35.0;
+        planet.particle_system.lifetime = 36.0;
+        planet.particle_system.host_rect.x = 37.0;
+        planet.particle_system.host_rect.y = 38.0;
+        planet.particle_system.host_rect.w = 39.0;
+        planet.particle_system.host_rect.h = 40.0;
+        planet.particle_system.host_circle.x = 41.0;
+        planet.particle_system.host_circle.y = 42.0;
+        planet.particle_system.host_circle.r = 43.0;
+        planet.particle_system.is_rect = true;
+        planet.particle_system.direction.x = 44.0;
+        planet.particle_system.direction.y = 45.0;
+        planet.particle_system.color.r = 46;
+        planet.particle_system.color.g = 47;
+        planet.particle_system.color.b = 48;
+        planet.particle_system.color.a = 49;
+        planet.particle_system.opacity = 50.0;
+        planet.particle_system.vel_multiplier = 51.0;
+
+        let mut rps = RotatingParticleSystem::default();
+        rps.particle_system = planet.particle_system.clone();
+        rps.r = 52.0;
+        rps.velr = 53.0;
+        rps.offset = 54.0;
+        planet.moons.push(rps);
+
+        let mut rps = RotatingParticleSystem::default();
+        rps.particle_system = ParticleSystem::default();
+        rps.r = 55.0;
+        rps.velr = 56.0;
+        rps.offset = 57.0;
+        planet.moons.push(rps);
+
+        let bytes = planet.serialize();
+        let (des_planet, size) =
+            Planet::deserialize(&bytes, 0).expect("Should be able to deserialize Planet!");
+        assert_eq!(planet, des_planet);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_star() {
+        let mut star = Star::default();
+        star.color.r = 1;
+        star.color.g = 2;
+        star.color.b = 3;
+        star.color.a = 4;
+
+        let mut particle = Particle::default();
+        particle.rect.x = 5.0;
+        particle.rect.y = 6.0;
+        particle.rect.w = 7.0;
+        particle.rect.h = 8.0;
+        particle.circle.x = 9.0;
+        particle.circle.y = 10.0;
+        particle.circle.r = 11.0;
+        particle.is_rect = true;
+        particle.velx = 12.0;
+        particle.vely = 13.0;
+        particle.velr = 14.0;
+        particle.r = 15.0;
+        particle.lifetime = 16.0;
+        particle.life_timer = 17.0;
+        star.particle_system.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 18.0;
+        particle.rect.y = 19.0;
+        particle.rect.w = 20.0;
+        particle.rect.h = 21.0;
+        particle.circle.x = 22.0;
+        particle.circle.y = 23.0;
+        particle.circle.r = 24.0;
+        particle.is_rect = false;
+        particle.velx = 25.0;
+        particle.vely = 26.0;
+        particle.velr = 27.0;
+        particle.r = 28.0;
+        particle.lifetime = 29.0;
+        particle.life_timer = 30.0;
+        star.particle_system.particles.push(particle);
+
+        star.particle_system.spawn_timer = 31.0;
+        star.particle_system.spawn_time = 32.0;
+        star.particle_system.lifetime = 33.0;
+        star.particle_system.host_rect.x = 34.0;
+        star.particle_system.host_rect.y = 35.0;
+        star.particle_system.host_rect.w = 36.0;
+        star.particle_system.host_rect.h = 37.0;
+        star.particle_system.host_circle.x = 38.0;
+        star.particle_system.host_circle.y = 39.0;
+        star.particle_system.host_circle.r = 40.0;
+        star.particle_system.is_rect = true;
+        star.particle_system.direction.x = 41.0;
+        star.particle_system.direction.y = 42.0;
+        star.particle_system.color.r = 43;
+        star.particle_system.color.g = 44;
+        star.particle_system.color.b = 45;
+        star.particle_system.color.a = 46;
+        star.particle_system.opacity = 47.0;
+        star.particle_system.vel_multiplier = 48.0;
+
+        star.velr = 49.0;
+        star.r = 50.0;
+
+        let bytes = star.serialize();
+        let (des_star, size) =
+            Star::deserialize(&bytes, 0).expect("Should be able to deserialize Star!");
+        assert_eq!(star, des_star);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_fish() {
+        let mut fish = Fish::default();
+        fish.pos.x = 1.0;
+        fish.pos.y = 2.0;
+        fish.r = 3.0;
+        fish.swim_time = 4.0;
+        fish.swim_timer = 5.0;
+        fish.swim_v = 6.0;
+        fish.anim_timer = 7.0;
+        fish.anim_time = 8.0;
+        fish.color.r = 9;
+        fish.color.g = 10;
+        fish.color.b = 11;
+        fish.color.a = 12;
+        fish.body_rect.x = 13.0;
+        fish.body_rect.y = 14.0;
+        fish.body_rect.w = 15.0;
+        fish.body_rect.h = 16.0;
+        fish.tail_rect.x = 17.0;
+        fish.tail_rect.y = 18.0;
+        fish.tail_rect.w = 19.0;
+        fish.tail_rect.h = 20.0;
+
+        let bytes = fish.serialize();
+        let (des_fish, size) =
+            Fish::deserialize(&bytes, 0).expect("Should be able to deserialize Fish!");
+        assert_eq!(fish, des_fish);
+        assert_eq!(bytes.len(), size);
+    }
+
+    #[test]
+    fn test_de_serialize_save_data() {
+        let mut save_data = SaveData::default();
+        let mut planet = Planet::default();
+        planet.circle.x = 1.0;
+        planet.circle.y = 2.0;
+        planet.circle.r = 3.0;
+        planet.color.r = 4;
+        planet.color.g = 5;
+        planet.color.b = 6;
+        planet.color.a = 7;
+
+        let mut particle = Particle::default();
+        particle.rect.x = 8.0;
+        particle.rect.y = 9.0;
+        particle.rect.w = 10.0;
+        particle.rect.h = 11.0;
+        particle.circle.x = 12.0;
+        particle.circle.y = 13.0;
+        particle.circle.r = 14.0;
+        particle.is_rect = true;
+        particle.velx = 15.0;
+        particle.vely = 16.0;
+        particle.velr = 17.0;
+        particle.r = 18.0;
+        particle.lifetime = 19.0;
+        particle.life_timer = 20.0;
+        planet.particle_system.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 21.0;
+        particle.rect.y = 22.0;
+        particle.rect.w = 23.0;
+        particle.rect.h = 24.0;
+        particle.circle.x = 25.0;
+        particle.circle.y = 26.0;
+        particle.circle.r = 27.0;
+        particle.is_rect = false;
+        particle.velx = 28.0;
+        particle.vely = 29.0;
+        particle.velr = 30.0;
+        particle.r = 31.0;
+        particle.lifetime = 32.0;
+        particle.life_timer = 33.0;
+        planet.particle_system.particles.push(particle);
+
+        planet.particle_system.spawn_timer = 34.0;
+        planet.particle_system.spawn_time = 35.0;
+        planet.particle_system.lifetime = 36.0;
+        planet.particle_system.host_rect.x = 37.0;
+        planet.particle_system.host_rect.y = 38.0;
+        planet.particle_system.host_rect.w = 39.0;
+        planet.particle_system.host_rect.h = 40.0;
+        planet.particle_system.host_circle.x = 41.0;
+        planet.particle_system.host_circle.y = 42.0;
+        planet.particle_system.host_circle.r = 43.0;
+        planet.particle_system.is_rect = true;
+        planet.particle_system.direction.x = 44.0;
+        planet.particle_system.direction.y = 45.0;
+        planet.particle_system.color.r = 46;
+        planet.particle_system.color.g = 47;
+        planet.particle_system.color.b = 48;
+        planet.particle_system.color.a = 49;
+        planet.particle_system.opacity = 50.0;
+        planet.particle_system.vel_multiplier = 51.0;
+
+        let mut rps = RotatingParticleSystem::default();
+        rps.particle_system = planet.particle_system.clone();
+        rps.r = 52.0;
+        rps.velr = 53.0;
+        rps.offset = 54.0;
+        planet.moons.push(rps);
+
+        let mut rps = RotatingParticleSystem::default();
+        rps.particle_system = ParticleSystem::default();
+        rps.r = 55.0;
+        rps.velr = 56.0;
+        rps.offset = 57.0;
+        planet.moons.push(rps);
+
+        save_data.planets.push(planet.clone());
+
+        planet.color.r = 58;
+        planet.color.g = 59;
+        planet.color.b = 60;
+        planet.color.a = 61;
+
+        save_data.planets.push(planet.clone());
+
+        planet.color.r = 62;
+        planet.color.g = 63;
+        planet.color.b = 64;
+        planet.color.a = 65;
+
+        save_data.planets.push(planet);
+
+        let mut star = Star::default();
+        star.color.r = 1;
+        star.color.g = 2;
+        star.color.b = 3;
+        star.color.a = 4;
+
+        let mut particle = Particle::default();
+        particle.rect.x = 5.0;
+        particle.rect.y = 6.0;
+        particle.rect.w = 7.0;
+        particle.rect.h = 8.0;
+        particle.circle.x = 9.0;
+        particle.circle.y = 10.0;
+        particle.circle.r = 11.0;
+        particle.is_rect = true;
+        particle.velx = 12.0;
+        particle.vely = 13.0;
+        particle.velr = 14.0;
+        particle.r = 15.0;
+        particle.lifetime = 16.0;
+        particle.life_timer = 17.0;
+        star.particle_system.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 18.0;
+        particle.rect.y = 19.0;
+        particle.rect.w = 20.0;
+        particle.rect.h = 21.0;
+        particle.circle.x = 22.0;
+        particle.circle.y = 23.0;
+        particle.circle.r = 24.0;
+        particle.is_rect = false;
+        particle.velx = 25.0;
+        particle.vely = 26.0;
+        particle.velr = 27.0;
+        particle.r = 28.0;
+        particle.lifetime = 29.0;
+        particle.life_timer = 30.0;
+        star.particle_system.particles.push(particle);
+
+        star.particle_system.spawn_timer = 31.0;
+        star.particle_system.spawn_time = 32.0;
+        star.particle_system.lifetime = 33.0;
+        star.particle_system.host_rect.x = 34.0;
+        star.particle_system.host_rect.y = 35.0;
+        star.particle_system.host_rect.w = 36.0;
+        star.particle_system.host_rect.h = 37.0;
+        star.particle_system.host_circle.x = 38.0;
+        star.particle_system.host_circle.y = 39.0;
+        star.particle_system.host_circle.r = 40.0;
+        star.particle_system.is_rect = true;
+        star.particle_system.direction.x = 41.0;
+        star.particle_system.direction.y = 42.0;
+        star.particle_system.color.r = 43;
+        star.particle_system.color.g = 44;
+        star.particle_system.color.b = 45;
+        star.particle_system.color.a = 46;
+        star.particle_system.opacity = 47.0;
+        star.particle_system.vel_multiplier = 48.0;
+
+        star.velr = 49.0;
+        star.r = 50.0;
+
+        save_data.stars.push(star.clone());
+
+        star.color.r = 51;
+        star.color.g = 52;
+        star.color.b = 53;
+        star.color.a = 54;
+
+        save_data.stars.push(star.clone());
+
+        star.color.r = 55;
+        star.color.g = 56;
+        star.color.b = 57;
+        star.color.a = 58;
+
+        save_data.stars.push(star);
+
+        let mut fish = Fish::default();
+        fish.pos.x = 1.0;
+        fish.pos.y = 2.0;
+        fish.r = 3.0;
+        fish.swim_time = 4.0;
+        fish.swim_timer = 5.0;
+        fish.swim_v = 6.0;
+        fish.anim_timer = 7.0;
+        fish.anim_time = 8.0;
+        fish.color.r = 9;
+        fish.color.g = 10;
+        fish.color.b = 11;
+        fish.color.a = 12;
+        fish.body_rect.x = 13.0;
+        fish.body_rect.y = 14.0;
+        fish.body_rect.w = 15.0;
+        fish.body_rect.h = 16.0;
+        fish.tail_rect.x = 17.0;
+        fish.tail_rect.y = 18.0;
+        fish.tail_rect.w = 19.0;
+        fish.tail_rect.h = 20.0;
+
+        save_data.fishes.push(fish.clone());
+
+        fish.pos.x = 21.0;
+        fish.pos.y = 22.0;
+        fish.r = 23.0;
+
+        save_data.fishes.push(fish.clone());
+
+        fish.pos.x = 24.0;
+        fish.pos.y = 25.0;
+        fish.r = 26.0;
+
+        save_data.fishes.push(fish);
+
+        save_data.player.x = 100.0;
+        save_data.player.y = 101.0;
+        save_data.player.w = 102.0;
+        save_data.player.h = 103.0;
+
+        let mut ps = ParticleSystem::default();
+        let mut particle = Particle::default();
+        particle.rect.x = 1.0;
+        particle.rect.y = 2.0;
+        particle.rect.w = 3.0;
+        particle.rect.h = 4.0;
+        particle.circle.x = 5.0;
+        particle.circle.y = 6.0;
+        particle.circle.r = 7.0;
+        particle.is_rect = true;
+        particle.velx = 8.0;
+        particle.vely = 9.0;
+        particle.velr = 10.0;
+        particle.r = 11.0;
+        particle.lifetime = 12.0;
+        particle.life_timer = 13.0;
+        ps.particles.push(particle);
+
+        let mut particle = Particle::default();
+        particle.rect.x = 14.0;
+        particle.rect.y = 15.0;
+        particle.rect.w = 16.0;
+        particle.rect.h = 17.0;
+        particle.circle.x = 18.0;
+        particle.circle.y = 19.0;
+        particle.circle.r = 20.0;
+        particle.is_rect = false;
+        particle.velx = 21.0;
+        particle.vely = 22.0;
+        particle.velr = 23.0;
+        particle.r = 24.0;
+        particle.lifetime = 25.0;
+        particle.life_timer = 26.0;
+        ps.particles.push(particle);
+
+        ps.spawn_timer = 27.0;
+        ps.spawn_time = 28.0;
+        ps.lifetime = 29.0;
+        ps.host_rect.x = 30.0;
+        ps.host_rect.y = 31.0;
+        ps.host_rect.w = 32.0;
+        ps.host_rect.h = 33.0;
+        ps.host_circle.x = 34.0;
+        ps.host_circle.y = 35.0;
+        ps.host_circle.r = 36.0;
+        ps.is_rect = true;
+        ps.direction.x = 37.0;
+        ps.direction.y = 38.0;
+        ps.color.r = 39;
+        ps.color.g = 40;
+        ps.color.b = 41;
+        ps.color.a = 42;
+        ps.opacity = 43.0;
+        ps.vel_multiplier = 44.0;
+
+        save_data.joining_particles.particle_system = ps;
+        save_data.joining_particles.r = 45.0;
+        save_data.joining_particles.velr = 46.0;
+        save_data.joining_particles.offset = 47.0;
+
+        let bytes = save_data.serialize();
+        let (des_save_data, size) =
+            SaveData::deserialize(&bytes).expect("Should be able to deserialize SaveData!");
+        assert_eq!(save_data, des_save_data);
+        assert_eq!(bytes.len(), size);
+    }
+}