nv_card/deck/
duplicates_deck.rs

1use collection::{Collection, MutableCollection, Sliceable};
2use card::{StandardCard};
3use deck::deck_creator;
4
5///A Deck that can contain duplicate cards. For games such as canasta or black jack that use multiple decks
6#[derive(Debug)]
7pub struct DuplicatesAllowedDeck<T> {
8    _cards: Vec<T>
9}
10
11impl<T> DuplicatesAllowedDeck<T>
12{
13	pub fn new() -> DuplicatesAllowedDeck<T>
14	{
15		DuplicatesAllowedDeck{_cards:Vec::new()}
16	}
17
18	pub fn new_standard_deck() -> DuplicatesAllowedDeck<StandardCard>
19	{
20		DuplicatesAllowedDeck{_cards:  deck_creator::create_standard_deck()}
21	}
22}
23
24impl<T> Collection for DuplicatesAllowedDeck<T>
25{
26	type Item=T;
27	fn size(&self) -> usize
28	{
29		self._cards.size()
30	}
31}
32
33impl<T> MutableCollection for DuplicatesAllowedDeck<T>
34{
35	fn push(&mut self, item: Self::Item) -> ()
36	{
37		self._cards.push(item)
38	}
39
40	fn pop(&mut self) -> Option<Self::Item>
41	{
42		self._cards.pop()
43	}
44
45	fn insert_at(&mut self, index: usize, item: Self::Item) -> ()
46	{
47		self._cards.insert_at(index, item)
48	}
49
50	fn remove_at(&mut self, index:usize) -> Option<Self::Item>
51	{
52		self._cards.remove_at(index)
53	}
54}
55
56impl<T> Sliceable for DuplicatesAllowedDeck<T>
57{
58	type Item = T;
59	fn as_mut_slice(&mut self) -> &mut [T]
60	{
61		self._cards.as_mut_slice()
62	}
63}
64
65
66#[cfg(test)]
67mod deck_tests
68{
69	use super::{DuplicatesAllowedDeck};
70	use deck::{Deck};
71
72	use card::{StandardCard, Suit};
73
74	#[test]
75	fn ctor_test()
76	{
77		assert_eq!(DuplicatesAllowedDeck::<StandardCard>::new_standard_deck().size(), 52);
78	}
79
80	#[test]
81	fn add_test()
82	{
83		let mut deck = DuplicatesAllowedDeck::<StandardCard>::new_standard_deck();
84		deck.add_card_to_bottom(StandardCard::new(1, Suit::Hearts));
85		assert_eq!(deck.size(), 53);
86	}
87
88	#[test]
89	fn remove_card_from_bottom_test()
90	{
91		let mut deck = DuplicatesAllowedDeck::<StandardCard>::new_standard_deck();
92		let _ = deck.remove_card_from_bottom();
93		assert_eq!(deck.size(), 51);
94	}
95
96	#[test]
97	fn empty_pop_test()
98	{
99		let mut deck = DuplicatesAllowedDeck::<u8>::new();
100		assert!(deck.remove_card_from_bottom().is_none());
101	}
102}