rush/src/instructions/vector.rs
Rowan Torbitzky-Lane 925b539223
Some checks failed
/ Test-Suite (push) Has been cancelled
instruction list done
2025-04-21 19:52:50 -05:00

1478 lines
47 KiB
Rust

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<T>(a: Vec<T>, b: Vec<T>) -> Option<Vec<T>>
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<T>(vect: Vec<T>, prim: T) -> Option<Vec<T>> {
let mut t_vec = vect;
t_vec.insert(0, prim);
Some(t_vec)
}
/// Appends a primitive value to a vector.
fn _conj_end<T>(mut vals: Vec<T>, prim: T) -> Option<Vec<T>> {
vals.push(prim);
Some(vals)
}
/// Takes the first N items from a vector. N based on an int.
fn _take_n<T>(vals: Vec<T>, amt: i128) -> Option<Vec<T>>
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<T>(vals: Vec<T>, amt: i128) -> Option<Vec<T>>
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<T>(vals: Vec<T>, idx0: i128, idx1: i128) -> Option<Vec<T>>
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<T>(vals: Vec<T>) -> Option<T>
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<T>(vals: Vec<T>) -> Option<Vec<T>>
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<T>(prim: T) -> Option<Vec<T>> {
Some(vec![prim])
}
/// Takes the last item from a vector.
fn _last<T>(vals: Vec<T>) -> Option<T>
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<T>(vals: Vec<T>) -> Option<Vec<T>>
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<T>(vals: Vec<T>, idx: i128) -> Option<T>
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<T>(vals: Vec<T>, idx: i128) -> Option<Vec<T>>
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<T>(vals: Vec<T>) -> Option<Vec<T>>
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<T>(vals: Vec<T>) -> Option<Vec<T>>
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<T>(mut vals: Vec<T>, idx: i128) -> Option<Vec<T>>
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<T>(mut vals: Vec<T>, idx: i128) -> Option<Vec<T>>
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<T>(vals: Vec<T>) -> Option<i128> {
Some(vals.len() as i128)
}
/// Reverses a vector
fn _reverse<T>(mut vals: Vec<T>) -> Option<Vec<T>>
where
T: Clone,
{
vals.reverse();
Some(vals)
}
/// Pushes all values of a vector into a primitive stack
fn _push_all<T>(vals: Vec<T>) -> Option<Vec<T>> {
Some(vals)
}
/// Creates an empty vector
fn _make_empty<T>() -> Option<Vec<T>> {
let empty_vec: Vec<T> = Vec::new();
Some(empty_vec)
}
/// Checks if a vector is empty. Pushes true if is, false otherwise
fn _is_vector_empty<T>(vals: Vec<T>) -> Option<bool> {
Some(vals.is_empty())
}
/// Checks if a vector contains a primitive. True if does, false otherwise
fn _contains<T>(vals: Vec<T>, prim: T) -> Option<bool>
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<T>(vec0: Vec<T>, vec1: Vec<T>) -> Option<bool>
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<T>(vec0: Vec<T>, vec1: Vec<T>) -> Option<bool>
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<T>(vals: Vec<T>, prim: T) -> Option<i128>
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<T>(vec0: Vec<T>, vec1: Vec<T>) -> Option<i128>
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<T>(vals: Vec<T>, prim: T) -> Option<i128>
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<T>(vec0: Vec<T>, vec1: Vec<T>) -> Option<i128>
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<T>(vals: Vec<T>) -> Option<Vec<Vec<T>>>
where
T: Clone,
Vec<T>: FromIterator<T>,
{
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<T>(vals: Vec<T>, idx: i128, prim: T) -> Option<Vec<T>>
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<T>(vals: Vec<T>, prim: T) -> Option<Vec<Vec<T>>>
where
T: Clone + Eq,
Vec<T>: FromIterator<T>,
{
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<T>(vals: Vec<Vec<T>>) -> Option<Vec<Vec<T>>>
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<T>(mut vals: Vec<T>, from: T, to: T) -> Option<Vec<T>>
where
T: Clone,
for<'a> &'a T: Eq,
Vec<T>: FromIterator<T>,
{
let temp_vec = &mut vals;
let ret_vec: Vec<T> = 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<T>(vals: Vec<T>, prim: T) -> Option<Vec<T>>
where
T: Clone,
for<'a> &'a T: Eq,
Vec<T>: FromIterator<T>,
{
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<T>(mut vals: Vec<T>) -> Option<Vec<T>>
where
T: NumericTrait,
{
vals.sort();
Some(vals)
}
/// Sorts a vector and reverses it
fn _sort_reverse<T>(mut vals: Vec<T>) -> Option<Vec<T>>
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<T>(mut vals: Vec<T>, idx: i128, prim: T) -> Option<Vec<T>> {
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<T>(vec0: Vec<T>, mut vec1: Vec<T>, idx: i128) -> Option<Vec<T>>
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<T: NumericTrait + Clone>(vals: Vec<T>) -> Option<T> {
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<T: NumericTrait>(vals: Vec<T>) -> Option<T> {
if vals.is_empty() {
return Some(T::zero());
}
vals.into_iter().max()
}
/// Takes the min of a vector
fn _minimum<T: NumericTrait>(vals: Vec<T>) -> Option<T> {
if vals.is_empty() {
return Some(T::zero());
}
vals.into_iter().min()
}
/// Takes the sum of a vector
fn _sum<T: NumericTrait + Clone>(vals: Vec<T>) -> Option<T> {
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<T: NumericTrait + Clone + Hash + Copy>(vals: Vec<T>) -> Option<T> {
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<T: NumericTrait + Clone>(vals: Vec<T>) -> Option<T> {
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<T: NumericTrait + Clone>(vals: Vec<T>) -> Option<Vec<T>> {
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<T: NumericTrait + Clone>(vals: Vec<Vec<T>>) -> Option<Vec<T>> {
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<i128>, 1);
make_instruction_clone!(
vector_float,
vector_float,
_cumulative_mean,
Vec<Decimal>,
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<char>);
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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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<i128> = 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::<i128>::new()], test_state.vector_int);
assert_eq!(vec![Vec::<Decimal>::new()], test_state.vector_float);
assert_eq!(vec![Vec::<char>::new()], test_state.string);
}
#[test]
fn is_empty_vec_test() {
let mut test_state = EMPTY_STATE;
let empty_vec: Vec<i128> = 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::<i128>::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::<i128>::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);
}
}