scarlet_queen_core/
each_crate_individual.rs1use std::rc::Rc;
4use crate::individual::Individual;
5
6pub trait EachCrateIndividual {
39 type Item;
40
41 fn new(individual: &Rc<Individual<Self::Item>>) -> Self;
44
45 fn get_individual(&self) -> &Individual<Self::Item>;
47
48 fn get_id(&self) -> usize {
50 self.get_individual().get_id()
51 }
52
53 fn get_value(&self) -> &Self::Item {
55 self.get_individual().get_value()
56 }
57}
58
59#[cfg(test)]
60mod tests {
61 use std::rc::Rc;
62
63 use super::EachCrateIndividual;
64 use crate::individual::Individual;
65
66 #[derive(PartialEq, Eq, Debug)]
67 struct SampleIndividual(Rc<Individual<u8>>);
68 impl EachCrateIndividual for SampleIndividual {
69 type Item = u8;
70 fn new(individual: &Rc<Individual<Self::Item>>) -> Self {
71 SampleIndividual(Rc::clone(individual))
72 }
73 fn get_individual(&self) -> &Individual<Self::Item> {
74 &self.0
75 }
76 }
77
78 #[test]
79 fn test_eachcrateindividual_getid() {
80 let base: Vec<Rc<Individual<u8>>> = vec![
81 Rc::new(Individual::new(5u8)),
82 Rc::new(Individual::new(0u8)),
83 Rc::new(Individual::new_with_id(5usize, 13u8)),
84 ];
85 let testcases: Vec<(SampleIndividual, usize)> = vec![
86 (SampleIndividual::new(&base[0]), 0usize),
87 (SampleIndividual::new(&base[1]), 0usize),
88 (SampleIndividual::new(&base[2]), 5usize),
89 ];
90 for (arg, result) in testcases.into_iter() {
91 assert_eq!(
92 <SampleIndividual as EachCrateIndividual>::get_id(&arg),
93 result
94 );
95 }
96 }
97
98 #[test]
99 fn test_eachcrateindividual_getvalue() {
100 let base: Vec<Rc<Individual<u8>>> = vec![
101 Rc::new(Individual::new(5u8)),
102 Rc::new(Individual::new(0u8)),
103 Rc::new(Individual::new_with_id(5usize, 13u8)),
104 ];
105 let testcases: Vec<(SampleIndividual, &u8)> = vec![
106 (SampleIndividual::new(&base[0]), &5u8),
107 (SampleIndividual::new(&base[1]), &0u8),
108 (SampleIndividual::new(&base[2]), &13u8),
109 ];
110 for (arg, result) in testcases.into_iter() {
111 assert_eq!(
112 <SampleIndividual as EachCrateIndividual>::get_value(&arg),
113 result
114 );
115 }
116 }
117}