nv_card/deck/
duplicates_deck.rs1use collection::{Collection, MutableCollection, Sliceable};
2use card::{StandardCard};
3use deck::deck_creator;
4
5#[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}