use crate::instructions::utils::NumericTrait; use crate::push::state::{Gene, PushState}; use rust_decimal::Decimal; use std::collections::{HashMap, HashSet}; use std::hash::Hash; /// Generates an index between 0 and length. Takes abs(num) and then mods it by length. fn bounded_idx(num: i128, length: usize) -> usize { (num.unsigned_abs() as usize) % length } /// Concats two vectors together. fn _concat(a: Vec, b: Vec) -> Option> where T: Clone, { let mut concat_vec = a; concat_vec.extend(b.into_iter()); Some(concat_vec) } /// Prepends a primitive value to a vector. fn _conj(vect: Vec, prim: T) -> Option> { let mut t_vec = vect; t_vec.insert(0, prim); Some(t_vec) } /// Appends a primitive value to a vector. fn _conj_end(mut vals: Vec, prim: T) -> Option> { vals.push(prim); Some(vals) } /// Takes the first N items from a vector. N based on an int. fn _take_n(vals: Vec, amt: i128) -> Option> where T: Clone, { if vals.is_empty() { return None; } Some(vals[0..bounded_idx(amt, vals.len())].to_vec()) } /// Takes the first N items from a vector. N based on an int. fn _take_last_n(vals: Vec, amt: i128) -> Option> where T: Clone, { if vals.is_empty() { return None; } let vals_len = vals.len(); Some(vals[vals_len - bounded_idx(amt, vals_len)..vals_len].to_vec()) } /// Takes a sublist of a vector based on two ints. fn _sub(vals: Vec, idx0: i128, idx1: i128) -> Option> where T: Clone, { if vals.is_empty() { return None; } let (mut start, mut end): (usize, usize) = (idx0.unsigned_abs() as usize, idx1.unsigned_abs() as usize); if start > end { (start, end) = (end, start) } let fin_start = start.min(vals.len()); let fin_end = end.min(vals.len()); Some(vals[fin_start..fin_end].to_vec()) } /// Takes the first item from a vector. fn _first(vals: Vec) -> Option where T: Clone, { if vals.is_empty() { return None; } Some(vals[0].clone()) } /// Takes the first item from a vector, wraps it into a vector, and pushes it back /// to the same stack. fn _from_first_prim(vals: Vec) -> Option> where T: Clone, { if vals.is_empty() { return None; } Some(vec![vals[0].clone()]) } /// Places the top of a primitive type into a vector fn _from_prim(prim: T) -> Option> { Some(vec![prim]) } /// Takes the last item from a vector. fn _last(vals: Vec) -> Option where T: Clone, { if vals.is_empty() { return None; } Some(vals[vals.len() - 1].clone()) } /// Takes the last item from a vector, wraps it into a vector, and pushes it back /// to the same stack. fn _from_last_prim(vals: Vec) -> Option> where T: Clone, { if vals.is_empty() { return None; } Some(vec![vals[vals.len() - 1].clone()]) } /// Takes the nth item from a vector. N from int stack. fn _nth(vals: Vec, idx: i128) -> Option where T: Clone, { if vals.is_empty() { return None; } Some(vals[bounded_idx(idx, vals.len())].clone()) } /// Takes the nth item from a vector, wraps it into a vector, and pushes it back /// to the same stack. N from int stack fn _from_nth_prim(vals: Vec, idx: i128) -> Option> where T: Clone, { if vals.is_empty() { return None; } Some(vec![vals[bounded_idx(idx, vals.len())].clone()]) } /// Takes a vector and removes the first element. fn _rest(vals: Vec) -> Option> where T: Clone, { if vals.is_empty() { return None; } Some(vals[1..].to_vec()) } /// Takes a vector and removes the last element. fn _but_last(vals: Vec) -> Option> where T: Clone, { if vals.is_empty() { return None; } Some(vals[0..vals.len() - 1].to_vec()) } /// Removes the first n items from a vector. n from the int stack. fn _drop(mut vals: Vec, idx: i128) -> Option> where T: Clone, { if vals.is_empty() { return None; } vals.drain(0..idx.abs().min(vals.len() as i128) as usize); Some(vals) } fn _drop_last(mut vals: Vec, idx: i128) -> Option> where T: Clone, { let valslen = vals.len(); //Ret_Vec Len if vals.is_empty() { return None; } vals.drain((valslen - (idx.abs().min(valslen as i128) as usize))..valslen); Some(vals) } /// Takes the length of a vector. fn _length(vals: Vec) -> Option { Some(vals.len() as i128) } /// Reverses a vector fn _reverse(mut vals: Vec) -> Option> where T: Clone, { vals.reverse(); Some(vals) } /// Pushes all values of a vector into a primitive stack fn _push_all(vals: Vec) -> Option> { Some(vals) } /// Creates an empty vector fn _make_empty() -> Option> { let empty_vec: Vec = Vec::new(); Some(empty_vec) } /// Checks if a vector is empty. Pushes true if is, false otherwise fn _is_vector_empty(vals: Vec) -> Option { Some(vals.is_empty()) } /// Checks if a vector contains a primitive. True if does, false otherwise fn _contains(vals: Vec, prim: T) -> Option where T: Eq, { Some(vals.contains(&prim)) } /// Checks if a vector contains another vector in no order. True if does, false otherwise fn _contains_vector_non_contiguous(vec0: Vec, vec1: Vec) -> Option where T: Eq + Hash, { let hashset: HashSet<&T> = vec1.iter().collect(); Some(vec0.iter().all(|x| hashset.contains(x))) } /// Checks if a vector contains another contiguous vector. True if does, false otherwise fn _contains_vector_contiguous(vec0: Vec, vec1: Vec) -> Option where T: Eq, { if vec0.is_empty() { return Some(true); // would argue the empty set is in everything } Some(vec1.windows(vec0.len()).any(|x| x == vec0)) } /// Returns the index of a primitive in a vector, pushes result to int stack fn _index_of(vals: Vec, prim: T) -> Option where T: Clone + Eq, { let temp_vec = &vals; let temp_aux = &prim; if let Some(idx) = temp_vec.iter().position(|r| r == temp_aux) { return Some(idx as i128); } Some(-1) } /// Finds the index of the start of one vector in another. Searches in contiguous space. fn _index_of_vector(vec0: Vec, vec1: Vec) -> Option where T: Eq, { if vec0.is_empty() { return Some(0); } if let Some(val) = vec1.windows(vec0.len()).position(|x| x == vec0) { return Some(val as i128); } Some(-1) } /// Counts the amount of a primitive in a vector fn _occurrences_of(vals: Vec, prim: T) -> Option where T: Clone + Eq, { Some(vals.into_iter().filter(|r| r == &prim).count() as i128) } /// Counts the amount of continuous occurrences one vector appears in another. fn _occurrences_of_vector(vec0: Vec, vec1: Vec) -> Option where T: Eq, { if vec0.is_empty() { return Some(0); } Some(vec1.windows(vec0.len()).filter(|x| x == &vec0).count() as i128) } /// Pushes the values inside a vector separated into individual vectors back to /// the stack. fn _parse_to_prim(vals: Vec) -> Option>> where T: Clone, Vec: FromIterator, { Some(vals.clone().into_iter().map(|x| vec![x]).collect()) } /// Sets the nth index in a vector. N from the int stack. fn _set_nth(vals: Vec, idx: i128, prim: T) -> Option> where T: Clone, { let mut temp_vec = vals.clone(); let idx = bounded_idx(idx, temp_vec.len()); temp_vec.insert(idx, prim); Some(temp_vec) } /// Splits a vector based on the first occurence of a primitive fn _split_on(vals: Vec, prim: T) -> Option>> where T: Clone + Eq, Vec: FromIterator, { let mut final_vec = vec![]; let mut temp_vec = vec![]; for val in vals.iter() { if &prim == val { final_vec.push(temp_vec.clone()); temp_vec.clear(); continue; } temp_vec.push(val.clone()); } if !temp_vec.is_empty() { final_vec.push(temp_vec); } Some(final_vec) } /*/// Splits a vector based the first occurrence of a primitive fn _split_on_vector(vals: Vec>) -> Option>> where T: Clone + Eq, { if vals[0].is_empty() { return Some(vec![vals[1]]); } let mut final_vec = vec![]; let mut temp_vec = vec![]; for val in vals[1].windows(vals[0].len()) { if &auxs[0] == val { final_vec.push(temp_vec.clone()); temp_vec.clear(); continue; } temp_vec.push(val.clone()); } if !temp_vec.is_empty() { final_vec.push(temp_vec); } Some(final_vec) }*/ /// Replaces all values in a vector with respect to two primitives. The first primitive is /// the search value and the second value is the one to replace. fn _replace(mut vals: Vec, from: T, to: T) -> Option> where T: Clone, for<'a> &'a T: Eq, Vec: FromIterator, { let temp_vec = &mut vals; let ret_vec: Vec = temp_vec .iter() .map(|x| if x == &from { to.clone() } else { x.clone() }) .collect(); Some(ret_vec) } /// Removes all values in a vector with respect to a primitive. If is equal, remove it. fn _remove(vals: Vec, prim: T) -> Option> where T: Clone, for<'a> &'a T: Eq, Vec: FromIterator, { let temp_vec = &vals; let ret_vec = temp_vec.iter().filter(|&x| x != &prim).cloned().collect(); Some(ret_vec) } /// Iterates over a vector using an instruction from the exec stack. macro_rules! make_iterate { ($vec_stack:ident, $prim_stack:ident, $vec_gene:ident) => { paste::item! { pub fn [< $vec_stack _iterate >] (state: &mut PushState) { if state.$vec_stack.is_empty() || state.exec.is_empty() { return; } let first_vec = state.$vec_stack.pop().unwrap(); if first_vec.is_empty() { state.exec.pop(); return; } else if first_vec.len() == 1 { state.$prim_stack.push(first_vec[0].clone()); return; } else { let top_exec = state.exec[state.exec.len() - 1].clone(); let first_prim = first_vec[0].clone(); state.exec.push(Gene::StateFunc([< $vec_stack _iterate >])); state.exec.push(Gene::$vec_gene(first_vec[1..].to_vec())); state.exec.push(top_exec); state.$prim_stack.push(first_prim); } } } }; } make_iterate!(vector_int, int, GeneVectorInt); make_iterate!(vector_float, float, GeneVectorFloat); make_iterate!(vector_string, string, GeneVectorString); make_iterate!(vector_boolean, boolean, GeneVectorBoolean); make_iterate!(vector_char, char, GeneVectorChar); make_iterate!(string, char, GeneString); /// Sorts a vector fn _sort(mut vals: Vec) -> Option> where T: NumericTrait, { vals.sort(); Some(vals) } /// Sorts a vector and reverses it fn _sort_reverse(mut vals: Vec) -> Option> where T: NumericTrait, { vals.sort(); vals.reverse(); Some(vals) } /// Inserts a primitive into a vector at a given point from the int stack fn _insert(mut vals: Vec, idx: i128, prim: T) -> Option> { let vec_len = vals.len(); vals.insert(bounded_idx(idx, vec_len), prim); Some(vals) } /// Inserts one vector into another based on an index. fn _insert_vector(vec0: Vec, mut vec1: Vec, idx: i128) -> Option> where T: Clone, { let bound_idx = bounded_idx(idx, vec0.len()); vec1.splice(bound_idx..bound_idx, vec0); Some(vec1) } /// Takes the mean of a vector fn _mean(vals: Vec) -> Option { if vals.is_empty() { return Some(T::zero()); } let mut fin_num = T::zero(); for num in vals.clone().into_iter() { fin_num = fin_num + num; } Some(fin_num.div(T::from_usize(vals.len()))) } /// Takes the max of a vector fn _maximum(vals: Vec) -> Option { if vals.is_empty() { return Some(T::zero()); } vals.into_iter().max() } /// Takes the min of a vector fn _minimum(vals: Vec) -> Option { if vals.is_empty() { return Some(T::zero()); } vals.into_iter().min() } /// Takes the sum of a vector fn _sum(vals: Vec) -> Option { if vals.is_empty() { return Some(T::zero()); } let mut fin_num = T::zero(); for num in vals.clone().into_iter() { fin_num = fin_num + num; } Some(fin_num) } /// Takes the mode of a vector fn _mode(vals: Vec) -> Option { if vals.is_empty() { return Some(T::zero()); } let mut counts = HashMap::new(); vals.iter() .max_by_key(|&x| { let count = counts.entry(x).or_insert(0); *count += 1; *count }) .copied() } /// Adds the squares of all values in a vector and then takes the square root fn _two_norm(vals: Vec) -> Option { if vals.is_empty() { return Some(T::zero()); } let mut fin_num = T::zero(); for num in vals.clone().into_iter() { fin_num = fin_num + (num.clone() * num); } fin_num.safe_sqrt() } /// Takes the cumulative sum of a vector fn _cumulative_sum(vals: Vec) -> Option> { if vals.is_empty() { return Some(vec![]); } let mut fin_num = T::zero(); let mut ret_vec = vec![]; for num in vals.clone().into_iter() { fin_num = fin_num + num; ret_vec.push(fin_num.clone()); } Some(ret_vec) } /* /// Takes the cumulative mean of a vector fn _cumulative_mean(vals: Vec>) -> Option> { if vals[0].is_empty() { return Some(vec![]); } // This is not an efficient implementation let mut ret_vec = vec![]; let mut cum_vec = vec![]; for (idx, val) in vals[0].iter().enumerate() { cum_vec.push(val.clone()); let mut temp_sum = T::zero(); for num in &cum_vec { temp_sum = temp_sum + num.clone(); } temp_sum } Some(ret_vec) } make_instruction_clone!(vector_int, vector_int, _cumulative_mean, Vec, 1); make_instruction_clone!( vector_float, vector_float, _cumulative_mean, Vec, 1 );*/ macro_rules! make_vector_instructions { ($stack:ident, $prim_stack:ident) => { make_instruction_new!(_concat, $stack, $stack, $stack, $stack); make_instruction_new!(_conj, $stack, $stack, $stack, $prim_stack); make_instruction_new!(_conj_end, $stack, $stack, $stack, $prim_stack); make_instruction_new!(_take_n, $stack, $stack, $stack, int); make_instruction_new!(_take_last_n, $stack, $stack, $stack, int); make_instruction_new!(_sub, $stack, $stack, $stack, int, int); make_instruction_new!(_first, $stack, $prim_stack, $stack); make_instruction_new!(_from_first_prim, $stack, $stack, $stack); make_instruction_new!(_from_prim, $stack, $stack, $prim_stack); make_instruction_new!(_last, $stack, $prim_stack, $stack); make_instruction_new!(_from_last_prim, $stack, $stack, $stack); make_instruction_new!(_nth, $stack, $prim_stack, $stack, int); make_instruction_new!(_from_nth_prim, $stack, $stack, $stack, int); make_instruction_new!(_rest, $stack, $stack, $stack); make_instruction_new!(_but_last, $stack, $stack, $stack); make_instruction_new!(_drop, $stack, $stack, $stack, int); make_instruction_new!(_drop_last, $stack, $stack, $stack, int); make_instruction_new!(_length, $stack, int, $stack); make_instruction_new!(_reverse, $stack, $stack, $stack); make_instruction_new_aux!(_push_all, $stack, $prim_stack, $stack); // _make_empty would go here make_instruction_new!(_is_vector_empty, $stack, boolean, $stack); make_instruction_new!(_contains, $stack, boolean, $stack, $prim_stack); make_instruction_new!( _contains_vector_non_contiguous, $stack, boolean, $stack, $stack ); make_instruction_new!(_contains_vector_contiguous, $stack, boolean, $stack, $stack); make_instruction_new!(_index_of, $stack, int, $stack, $prim_stack); make_instruction_new!(_index_of_vector, $stack, int, $stack, $stack); make_instruction_new!(_occurrences_of, $stack, int, $stack, $prim_stack); make_instruction_new!(_occurrences_of_vector, $stack, int, $stack, $stack); make_instruction_new_aux!(_parse_to_prim, $stack, $stack, $stack); make_instruction_new!(_set_nth, $stack, $stack, $stack, int, $prim_stack); make_instruction_new_aux!(_split_on, $stack, $stack, $stack, $prim_stack); make_instruction_new!(_replace, $stack, $stack, $stack, $prim_stack, $prim_stack); make_instruction_new!(_remove, $stack, $stack, $stack, $prim_stack); make_instruction_new!(_insert, $stack, $stack, $stack, int, $prim_stack); make_instruction_new!(_insert_vector, $stack, $stack, $stack, $stack, int); }; } macro_rules! make_numeric_vector_instructions { ($stack:ident, $prim_stack:ident) => { make_instruction_new!(_sort, $stack, $stack, $stack); make_instruction_new!(_sort_reverse, $stack, $stack, $stack); make_instruction_new!(_mean, $stack, $prim_stack, $stack); make_instruction_new!(_maximum, $stack, $prim_stack, $stack); make_instruction_new!(_minimum, $stack, $prim_stack, $stack); make_instruction_new!(_sum, $stack, $prim_stack, $stack); make_instruction_new!(_mode, $stack, $prim_stack, $stack); make_instruction_new!(_two_norm, $stack, $prim_stack, $stack); make_instruction_new!(_cumulative_sum, $stack, $stack, $stack); }; } macro_rules! all_vector_instructions { () => { make_vector_instructions!(vector_int, int); make_vector_instructions!(vector_float, float); make_vector_instructions!(vector_string, string); make_vector_instructions!(vector_boolean, boolean); make_vector_instructions!(vector_char, char); make_vector_instructions!(string, char); // Need to pass a stack type to the empty! macro, // wont work in the make_vector_instructions macro without // bloating it a bit more make_instruction_empty!(_make_empty, vector_int, vector_int, i128); make_instruction_empty!(_make_empty, vector_float, vector_float, Decimal); make_instruction_empty!(_make_empty, vector_string, vector_string, Vec); make_instruction_empty!(_make_empty, vector_boolean, vector_boolean, bool); make_instruction_empty!(_make_empty, vector_char, vector_char, char); make_instruction_empty!(_make_empty, string, string, char); // Numeric only vector instructions make_numeric_vector_instructions!(vector_int, int); make_numeric_vector_instructions!(vector_float, float); }; } all_vector_instructions!(); #[cfg(test)] mod tests { use super::*; use crate::instructions::numeric::int_inc; use crate::push::interpreter::interpret_program; use crate::push::state::EMPTY_STATE; use rust_decimal::dec; #[test] fn vector_concat_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![4, 5, 6], vec![1, 2, 3]]; vector_int_concat(&mut test_state); assert_eq!(vec![vec![1, 2, 3, 4, 5, 6]], test_state.vector_int); test_state.string = vec![vec!['s', 't'], vec!['t', 'e']]; string_concat(&mut test_state); assert_eq!(vec![vec!['t', 'e', 's', 't']], test_state.string); test_state.vector_int = vec![empty_vec.clone(), empty_vec.clone()]; vector_int_concat(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_conj_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![0]; vector_int_conj(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 3]], test_state.vector_int); test_state.vector_int = vec![empty_vec]; test_state.int = vec![0]; vector_int_conj(&mut test_state); assert_eq!(vec![vec![0]], test_state.vector_int); } #[test] fn vector_conj_end_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![0]; vector_int_conj_end(&mut test_state); assert_eq!(vec![vec![1, 2, 3, 0]], test_state.vector_int); test_state.vector_int = vec![empty_vec]; test_state.int = vec![0]; vector_int_conj_end(&mut test_state); assert_eq!(vec![vec![0]], test_state.vector_int); } /// Tests take_n and take_last_n #[test] fn vector_takes_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; // n test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![2]; vector_int_take_n(&mut test_state); assert_eq!(vec![vec![1, 2]], test_state.vector_int); test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![0]; vector_int_take_n(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![-5]; vector_int_take_n(&mut test_state); assert_eq!(vec![vec![1, 2]], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![2]; vector_int_take_n(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); // last n test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![2]; vector_int_take_last_n(&mut test_state); assert_eq!(vec![vec![2, 3]], test_state.vector_int); test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![0]; vector_int_take_last_n(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![vec![1, 2, 3]]; test_state.int = vec![-5]; vector_int_take_last_n(&mut test_state); assert_eq!(vec![vec![2, 3]], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![2]; vector_int_take_last_n(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); } #[test] fn vector_sub_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![1, 4]; vector_int_sub(&mut test_state); assert_eq!(vec![vec![1, 2, 3]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![1, 10]; vector_int_sub(&mut test_state); assert_eq!(vec![vec![1, 2, 3, 4, 5]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![-1, 4]; vector_int_sub(&mut test_state); assert_eq!(vec![vec![1, 2, 3]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![-4, -1]; vector_int_sub(&mut test_state); assert_eq!(vec![vec![1, 2, 3]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![0, 0]; vector_int_sub(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![2, 6]; vector_int_sub(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![vec![0]]; test_state.int = vec![2, 10]; vector_int_sub(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_first_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_first(&mut test_state); assert_eq!(vec![0], test_state.int); test_state.string = vec![vec!['t', 'e', 's', 't']]; string_first(&mut test_state); assert_eq!(vec!['t'], test_state.char); let empty_vec: Vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; vector_int_first(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_from_first_prim_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_from_first_prim(&mut test_state); assert_eq!(vec![vec![0]], test_state.vector_int); let empty_vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; vector_int_from_first_prim(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_from_prim_test() { let mut test_state = EMPTY_STATE; test_state.int = vec![1, 2]; vector_int_from_prim(&mut test_state); assert_eq!(vec![vec![2]], test_state.vector_int); } #[test] fn vector_last_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_last(&mut test_state); assert_eq!(vec![5], test_state.int); test_state.string = vec![vec!['t', 'e', 's', 't', 's']]; string_last(&mut test_state); assert_eq!(vec!['s'], test_state.char); let empty_vec: Vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; vector_int_last(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_from_last_prim_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_from_last_prim(&mut test_state); assert_eq!(vec![vec![5]], test_state.vector_int); let empty_vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; vector_int_from_last_prim(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_nth_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![2]; vector_int_nth(&mut test_state); assert_eq!(vec![2], test_state.int); test_state.string = vec![vec!['t', 'e', 's', 't', 's']]; test_state.int = vec![3]; string_nth(&mut test_state); assert_eq!(vec!['t'], test_state.char); let empty_vec: Vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![10]; vector_int_nth(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_from_nth_prim_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![2]; vector_int_from_nth_prim(&mut test_state); assert_eq!(vec![vec![2]], test_state.vector_int); let empty_vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![20]; vector_int_from_nth_prim(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_rest_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_rest(&mut test_state); assert_eq!(vec![vec![1, 2, 3, 4, 5]], test_state.vector_int); test_state.vector_int = vec![vec![0]]; vector_int_rest(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; vector_int_rest(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_but_last_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_but_last(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 3, 4]], test_state.vector_int); test_state.vector_int = vec![vec![0]]; vector_int_but_last(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; vector_int_but_last(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_drop_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![2]; vector_int_drop(&mut test_state); assert_eq!(vec![vec![2, 3, 4, 5]], test_state.vector_int); test_state.vector_int = vec![vec![0]]; test_state.int = vec![2]; vector_int_drop(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![vec![1, 2, 3, 4]]; test_state.int = vec![4]; vector_int_drop(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![30]; vector_int_drop(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_drop_last_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![2]; vector_int_drop_last(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 3]], test_state.vector_int); test_state.vector_int = vec![vec![0]]; test_state.int = vec![2]; vector_int_drop_last(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![vec![1, 2, 3, 4]]; test_state.int = vec![4]; vector_int_drop_last(&mut test_state); assert_eq!(vec![empty_vec.clone()], test_state.vector_int); test_state.vector_int = vec![empty_vec.clone()]; test_state.int = vec![30]; vector_int_drop_last(&mut test_state); assert_eq!(vec![empty_vec], test_state.vector_int); } #[test] fn vector_length_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_length(&mut test_state); assert_eq!(vec![6], test_state.int); test_state.int.clear(); test_state.vector_int = vec![empty_vec.clone()]; vector_int_length(&mut test_state); assert_eq!(vec![0], test_state.int); test_state.int.clear(); test_state.string = vec![vec!['t', 'e', 's']]; string_length(&mut test_state); assert_eq!(vec![3], test_state.int); } #[test] fn vector_reverse() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; vector_int_reverse(&mut test_state); assert_eq!(vec![vec![5, 4, 3, 2, 1, 0]], test_state.vector_int); } #[test] fn push_all_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![1, 2, 3]]; vector_int_push_all(&mut test_state); assert_eq!(vec![1, 2, 3], test_state.int); } #[test] fn make_empty_vec_test() { let mut test_state = EMPTY_STATE; vector_int_make_empty(&mut test_state); vector_float_make_empty(&mut test_state); string_make_empty(&mut test_state); assert_eq!(vec![Vec::::new()], test_state.vector_int); assert_eq!(vec![Vec::::new()], test_state.vector_float); assert_eq!(vec![Vec::::new()], test_state.string); } #[test] fn is_empty_vec_test() { let mut test_state = EMPTY_STATE; let empty_vec: Vec = vec![]; test_state.vector_int = vec![empty_vec.clone()]; vector_int_is_vector_empty(&mut test_state); assert_eq!(vec![true], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![1, 2]]; vector_int_is_vector_empty(&mut test_state); assert_eq!(vec![false], test_state.boolean); } #[test] fn contains_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![2]; vector_int_contains(&mut test_state); assert_eq!(vec![true], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![]]; test_state.int = vec![2]; vector_int_contains(&mut test_state); assert_eq!(vec![false], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![9]; vector_int_contains(&mut test_state); assert_eq!(vec![false], test_state.boolean); } #[test] fn contains_vector_non_contiguous_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 6, 7, 8], vec![0, 2, 3, 4, 5, 1]]; vector_int_contains_vector_non_contiguous(&mut test_state); assert_eq!(vec![true], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![], vec![]]; vector_int_contains_vector_non_contiguous(&mut test_state); assert_eq!(vec![true], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![1, 2, 3], vec![0, 1, 2, 3, 4, 5]]; vector_int_contains_vector_non_contiguous(&mut test_state); assert_eq!(vec![false], test_state.boolean); } #[test] fn contains_vector_contiguous() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 6, 7, 8], vec![0, 1, 2, 3, 4, 5]]; vector_int_contains_vector_contiguous(&mut test_state); assert_eq!(vec![true], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 6, 7, 8], vec![0, 2, 3, 4, 5, 1]]; vector_int_contains_vector_contiguous(&mut test_state); assert_eq!(vec![false], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![], vec![]]; vector_int_contains_vector_contiguous(&mut test_state); assert_eq!(vec![true], test_state.boolean); test_state.boolean.clear(); test_state.vector_int = vec![vec![1, 2, 3], vec![0, 1, 2, 3, 4, 5]]; vector_int_contains_vector_contiguous(&mut test_state); assert_eq!(vec![false], test_state.boolean); } #[test] fn index_of_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![2]; vector_int_index_of(&mut test_state); assert_eq!(vec![2], test_state.int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![10]; vector_int_index_of(&mut test_state); assert_eq!(vec![-1], test_state.int); test_state.vector_int = vec![vec![]]; test_state.int = vec![10]; vector_int_index_of(&mut test_state); assert_eq!(vec![-1], test_state.int); } #[test] fn index_of_vector_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5], vec![1, 2, 3]]; vector_int_index_of_vector(&mut test_state); assert_eq!(vec![1], test_state.int); test_state.int.clear(); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5], vec![10]]; vector_int_index_of_vector(&mut test_state); assert_eq!(vec![-1], test_state.int); test_state.int.clear(); test_state.vector_int = vec![vec![], vec![]]; vector_int_index_of_vector(&mut test_state); assert_eq!(vec![0], test_state.int); } #[test] fn occurrences_of_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![1]; vector_int_occurrences_of(&mut test_state); assert_eq!(vec![1], test_state.int); test_state.vector_int = vec![vec![1], vec![1, 2, 3, 2, 2, 5]]; test_state.int = vec![2]; vector_int_occurrences_of(&mut test_state); assert_eq!(vec![3], test_state.int); test_state.vector_int = vec![vec![]]; test_state.int = vec![1]; vector_int_occurrences_of(&mut test_state); assert_eq!(vec![0], test_state.int); } #[test] fn occurrences_of_vector_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 1, 2], vec![1, 2]]; vector_int_occurrences_of_vector(&mut test_state); assert_eq!(vec![2], test_state.int); test_state.int.clear(); test_state.vector_int = vec![vec![1], vec![1, 2, 3, 2, 2, 5], vec![2, 2]]; vector_int_occurrences_of_vector(&mut test_state); assert_eq!(vec![1], test_state.int); test_state.int.clear(); test_state.vector_int = vec![vec![], vec![]]; vector_int_occurrences_of_vector(&mut test_state); assert_eq!(vec![0], test_state.int); } #[test] fn parse_to_prim_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2]]; vector_int_parse_to_prim(&mut test_state); assert_eq!(vec![vec![0], vec![1], vec![2]], test_state.vector_int); } #[test] fn set_nth_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5]]; test_state.int = vec![99, 1]; vector_int_set_nth(&mut test_state); assert_eq!(vec![vec![0, 99, 1, 2, 3, 4, 5]], test_state.vector_int); test_state.string = vec![vec!['t', 'e', 's', 't']]; test_state.int = vec![2]; test_state.char = vec!['z']; string_set_nth(&mut test_state); assert_eq!(vec![vec!['t', 'e', 'z', 's', 't']], test_state.string); test_state.vector_boolean = vec![vec![true, false, true]]; test_state.int = vec![]; test_state.boolean = vec![true]; vector_boolean_set_nth(&mut test_state); assert_eq!(vec![vec![true, false, true]], test_state.vector_boolean); } #[test] fn split_on_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2]]; test_state.int = vec![1]; vector_int_split_on(&mut test_state); assert_eq!(vec![vec![0], vec![2]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 1, 5]]; test_state.int = vec![1]; vector_int_split_on(&mut test_state); assert_eq!(vec![vec![0], vec![2], vec![5]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 1]]; test_state.int = vec![1]; vector_int_split_on(&mut test_state); assert_eq!(vec![vec![0], vec![2]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 1]]; test_state.int = vec![9]; vector_int_split_on(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 1]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3]]; test_state.int = vec![3]; vector_int_split_on(&mut test_state); assert_eq!(vec![vec![0, 1, 2]], test_state.vector_int); } #[test] fn replace_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; test_state.int = vec![3, 2]; vector_int_replace(&mut test_state); assert_eq!(vec![vec![0, 1, 3, 3, 4, 5, 3]], test_state.vector_int); } #[test] fn remove_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; test_state.int = vec![3]; vector_int_remove(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 4, 5, 2]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; test_state.int = vec![2]; vector_int_remove(&mut test_state); assert_eq!(vec![vec![0, 1, 3, 4, 5]], test_state.vector_int); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; test_state.int = vec![9]; vector_int_remove(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 3, 4, 5, 2]], test_state.vector_int); } #[test] fn iterate_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; test_state.exec = vec![ Gene::StateFunc(int_inc), Gene::StateFunc(vector_int_iterate), ]; interpret_program(&mut test_state, 1000, 1000); assert_eq!(vec![1, 2, 3, 4, 5, 6, 3], test_state.int); } #[test] fn sort_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_sort(&mut test_state); assert_eq!(vec![vec![0, 1, 2, 2, 3, 4, 5]], test_state.vector_int); test_state.vector_float = vec![vec![dec!(0.0), dec!(1.2), dec!(-3.4)]]; vector_float_sort(&mut test_state); assert_eq!( vec![vec![dec!(-3.4), dec!(0.0), dec!(1.2)]], test_state.vector_float ); test_state.vector_int = vec![vec![]]; vector_int_sort(&mut test_state); assert_eq!(vec![Vec::::new()], test_state.vector_int); } #[test] fn sort_reverse_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_sort_reverse(&mut test_state); assert_eq!(vec![vec![5, 4, 3, 2, 2, 1, 0]], test_state.vector_int); test_state.vector_float = vec![vec![dec!(0.0), dec!(1.2), dec!(-3.4)]]; vector_float_sort_reverse(&mut test_state); assert_eq!( vec![vec![dec!(1.2), dec!(0.0), dec!(-3.4)]], test_state.vector_float ); test_state.vector_int = vec![vec![]]; vector_int_sort_reverse(&mut test_state); assert_eq!(vec![Vec::::new()], test_state.vector_int); } #[test] fn insert_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3]]; test_state.int = vec![9, 1]; vector_int_insert(&mut test_state); assert_eq!(vec![vec![0, 9, 1, 2, 3]], test_state.vector_int); test_state.vector_boolean = vec![vec![false, true, false]]; test_state.int = vec![0]; test_state.boolean = vec![false]; vector_boolean_insert(&mut test_state); assert_eq!( vec![vec![false, false, true, false]], test_state.vector_boolean ); test_state.vector_int = vec![vec![0, 1, 2, 3]]; test_state.int = vec![9, 5]; vector_int_insert(&mut test_state); assert_eq!(vec![vec![0, 9, 1, 2, 3]], test_state.vector_int); } #[test] fn insert_vector_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3], vec![69, 69]]; test_state.int = vec![1]; vector_int_insert_vector(&mut test_state); assert_eq!(vec![vec![0, 69, 69, 1, 2, 3]], test_state.vector_int); test_state.vector_boolean = vec![vec![false, true, false], vec![false, true]]; test_state.int = vec![0]; vector_boolean_insert_vector(&mut test_state); assert_eq!( vec![vec![false, true, false, true, false]], test_state.vector_boolean ); test_state.vector_int = vec![vec![0, 1, 2, 3], vec![69, 69]]; test_state.int = vec![5]; vector_int_insert_vector(&mut test_state); assert_eq!(vec![vec![0, 69, 69, 1, 2, 3]], test_state.vector_int); } #[test] fn mean_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![6, 5, 4]]; vector_int_mean(&mut test_state); assert_eq!(vec![5], test_state.int); test_state.vector_float = vec![vec![dec!(6.0), dec!(5.0), dec!(4.0)]]; vector_float_mean(&mut test_state); assert_eq!(vec![dec!(5.0)], test_state.float); } #[test] fn minimum_maximum_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_maximum(&mut test_state); assert_eq!(vec![5], test_state.int); test_state.int.clear(); test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_minimum(&mut test_state); assert_eq!(vec![0], test_state.int); } #[test] fn sum_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_sum(&mut test_state); assert_eq!(vec![17], test_state.int); } #[test] fn mode_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_mode(&mut test_state); assert_eq!(vec![2], test_state.int); test_state.int.clear(); // returns the last mode to be calculated test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2, 4, 3]]; vector_int_mode(&mut test_state); assert_eq!(vec![3], test_state.int); } #[test] fn two_norm_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![5, 5, 5, 5]]; vector_int_two_norm(&mut test_state); assert_eq!(vec![10], test_state.int); test_state.vector_float = vec![vec![dec!(5.0), dec!(5.0), dec!(5.0), dec!(5.0)]]; vector_float_two_norm(&mut test_state); assert_eq!(vec!(dec!(10.0)), test_state.float); } #[test] fn cumulative_sum_test() { let mut test_state = EMPTY_STATE; test_state.vector_int = vec![vec![0, 1, 2, 3, 4, 5, 2]]; vector_int_cumulative_sum(&mut test_state); assert_eq!(vec![vec![0, 1, 3, 6, 10, 15, 17]], test_state.vector_int); } }