From 25c04be661609e0f3a60531c9a5f5b0dc72d4572 Mon Sep 17 00:00:00 2001 From: rendo Date: Mon, 30 Mar 2026 12:57:25 +0500 Subject: [PATCH] Tests --- rust-pvz-genetics/Cargo.toml | 4 +-- rust-pvz-genetics/src/genetics/genome.rs | 1 + .../src/genetics/manipulations.rs | 31 ++++++++++++----- rust-pvz-genetics/src/genetics/tests.rs | 34 +++++++++++++++++++ rust-pvz-genetics/src/main.rs | 5 --- 5 files changed, 59 insertions(+), 16 deletions(-) delete mode 100644 rust-pvz-genetics/src/main.rs diff --git a/rust-pvz-genetics/Cargo.toml b/rust-pvz-genetics/Cargo.toml index a3dcad9..0462e89 100644 --- a/rust-pvz-genetics/Cargo.toml +++ b/rust-pvz-genetics/Cargo.toml @@ -7,6 +7,6 @@ edition = "2024" godot = "0.4.5" rand = "0.10.0" -#[lib] -#crate-type = ["cdylib"] +[lib] +crate-type = ["cdylib"] diff --git a/rust-pvz-genetics/src/genetics/genome.rs b/rust-pvz-genetics/src/genetics/genome.rs index 5f72b05..2bc63a8 100644 --- a/rust-pvz-genetics/src/genetics/genome.rs +++ b/rust-pvz-genetics/src/genetics/genome.rs @@ -2,6 +2,7 @@ use std::{collections::VecDeque, fmt::Display}; use crate::genetics::gene::Gene; +#[derive(PartialEq,Eq)] pub struct PlantGenome { pub(crate) graph: Vec<(Gene,Vec)>, } diff --git a/rust-pvz-genetics/src/genetics/manipulations.rs b/rust-pvz-genetics/src/genetics/manipulations.rs index e7ab30a..e140ab7 100644 --- a/rust-pvz-genetics/src/genetics/manipulations.rs +++ b/rust-pvz-genetics/src/genetics/manipulations.rs @@ -1,27 +1,40 @@ use std::mem::swap; -use rand::RngExt; +use rand::{RngExt, SeedableRng, rngs::StdRng}; use crate::genetics::genome::*; -pub struct GenomeModificator<'a>(&'a mut PlantGenome, &'a mut PlantGenome); - +pub struct GenomeModificator<'a> { + genome_a: &'a mut PlantGenome, + genome_b: &'a mut PlantGenome, + generator: StdRng +} impl<'a> GenomeModificator<'a> { pub fn new(genome_a: &'a mut PlantGenome,genome_b: &'a mut PlantGenome) -> Self { - return Self(genome_a,genome_b); + return Self { + genome_a, + genome_b, + generator: rand::make_rng(), + }; + } + pub fn with_seed(genome_a: &'a mut PlantGenome, genome_b: &'a mut PlantGenome, seed: u64) -> Self { + return Self { + genome_a, + genome_b, + generator: StdRng::seed_from_u64(seed) + }; } pub fn allelic_crossingover(&mut self,chance: Option) { - let mut generator = rand::rng(); - let amount: usize = *[self.0.graph.len(),self.1.graph.len()].iter().min().unwrap_or(&0); + let amount: usize = *[self.genome_a.graph.len(),self.genome_b.graph.len()].iter().min().unwrap_or(&0); for i in 0..amount { - let computed = generator.random_range(0..chance.unwrap_or(2).max(2)); + let computed = self.generator.random_range(0..chance.unwrap_or(2).max(2)); if computed != 0 {continue;} - swap(&mut self.0.graph[i].0, &mut self.1.graph[i].0); + swap(&mut self.genome_a.graph[i].0, &mut self.genome_b.graph[i].0); } } /*pub fn categoric_crossingover(&mut self,chance: Option) { - helper(self.0.graph.iter().map(|mut gene|(gene.place.clone(),&mut gene)).collect::>().append(&mut self.1.graph.iter().map(|mut gene|(gene.place.clone(),&mut gene)).collect::>()),chance); + helper(self.genome_a.graph.iter().map(|mut gene|(gene.place.clone(),&mut gene)).collect::>().append(&mut self.genome_b.graph.iter().map(|mut gene|(gene.place.clone(),&mut gene)).collect::>()),chance); } fn helper(test: HashMap>,chance: Option) { }*/ diff --git a/rust-pvz-genetics/src/genetics/tests.rs b/rust-pvz-genetics/src/genetics/tests.rs index 8b13789..58dbe04 100644 --- a/rust-pvz-genetics/src/genetics/tests.rs +++ b/rust-pvz-genetics/src/genetics/tests.rs @@ -1 +1,35 @@ +use crate::genetics::{flow::Flow, gene::{Gene, GeneType}, genome::PlantGenome, manipulations::GenomeModificator, plant_templates::{peashooter_template, sunflower_template}}; +#[test] +fn test_display() { + assert!(peashooter_template().to_string() == "(Peashooter) root\n\t(Peashooter) stem\n\t\t(Peashooter) head\n\t\t\t(Peashooter) leaf\n\t\t\t(Peashooter) face\n"); +} + +#[test] +fn test_allelic_crossingover() { + let mut peashooter = peashooter_template(); + let mut sunflower = sunflower_template(); + GenomeModificator::with_seed(&mut peashooter, &mut sunflower,3996684975687038250u64).allelic_crossingover(None); + assert!(peashooter == PlantGenome::from_edges(vec![ + Gene::new("Sunflower","root", GeneType::Dummy), + Gene::new("Peashooter","stem", GeneType::fill_all()), + Gene::new("Peashooter","head",GeneType::random_distribution()), + Gene::new("Sunflower","face", GeneType::consumer(|_|{})), + Gene::new("Peashooter","face",GeneType::consumer(|_|{})) + ],vec![ + (0,1), + (1,2), + (2,3), + (2,4) + ]).unwrap()); + assert!(sunflower == PlantGenome::from_edges(vec![ + Gene::new("Peashooter","root", GeneType::pure_producer(|_|{Flow::empty()})), + Gene::new("Sunflower","stem", GeneType::Dummy), + Gene::new("Sunflower","head", GeneType::modifier(|_|{None})), + Gene::new("Peashooter","leaf",GeneType::modifier(|_|{None})), + ], vec![ + (0,1), + (1,2), + (2,3), + ]).unwrap()); +} diff --git a/rust-pvz-genetics/src/main.rs b/rust-pvz-genetics/src/main.rs deleted file mode 100644 index 747e2cd..0000000 --- a/rust-pvz-genetics/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -use rust_pvz_genetics::genetics::plant_templates::peashooter_template; -fn main() { - let peashooter = peashooter_template(); - println!("{}",peashooter); -}