use crate::funcmap::{T1, T2};
use functor_derive::Functor;
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque};
use std::vec;
#[test]
fn field_of_binary_heap_type_is_mapped() {
#[derive(Functor, Debug)]
struct Test<T: Ord>(BinaryHeap<T>);
let src = Test([T1].into());
let dst = src.fmap(|_| T2);
assert_eq!(dst.0.into_vec(), [T2]);
}
#[test]
fn field_of_box_type_is_mapped() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T>(Box<T>);
let src = Test(Box::new(T1));
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test(Box::new(T2)));
}
#[test]
fn field_of_btree_map_type_is_mapped_over_key() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T: Ord>(BTreeMap<T, ()>);
let src = Test([(T1, ())].into());
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test([(T2, ())].into()));
}
#[test]
fn field_of_btree_map_type_is_mapped_over_value() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T>(BTreeMap<(), T>);
let src = Test([((), T1)].into());
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test([((), T2)].into()));
}
#[test]
fn field_of_btree_set_type_is_mapped() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T: Ord>(BTreeSet<T>);
let src = Test([T1].into());
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test([T2].into()));
}
#[test]
fn field_of_linked_list_type_is_mapped() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T>(LinkedList<T>);
let src = Test([T1].into());
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test([T2].into()));
}
#[test]
fn field_of_vec_type_is_mapped() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T>(Vec<T>);
let src = Test(vec![T1, T1]);
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test(vec![T2, T2]));
}
#[test]
fn field_of_vec_deque_type_is_mapped() {
#[derive(Functor, Debug, PartialEq)]
struct Test<T>(VecDeque<T>);
let src = Test([T1, T1].into());
let dst = src.fmap(|_| T2);
assert_eq!(dst, Test([T2, T2].into()));
}