-
Notifications
You must be signed in to change notification settings - Fork 0
/
ImmutableStackTest.java
146 lines (123 loc) · 3.88 KB
/
ImmutableStackTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import org.junit.Test;
import org.junit.Assert;
import java.util.*;
public class ImmutableStackTest {
private static class A {}
private static class B extends A {}
static final A[] arrA = new A[] {
new A(), new A(), new A(), new A(), new A(),
new A(), new A(), new A(), new A(), new A()};
static final A dasA = new A();
static final ImmutableStack<A> Empty = new ImmutableStack<A>();
static final ImmutableStack<A> OneStack = new ImmutableStack<A>(dasA);
static ImmutableStack<A> dasStack;
@Test
public void EmptyStackIsSizeZero () {
Assert.assertEquals(0, Empty.size());
}
@Test(expected = EmptyStackException.class)
public void EmptyStackCannotPeek () {
Empty.peek();
}
@Test(expected = EmptyStackException.class)
public void EmptyStackCannotPop () {
Empty.pop();
}
@Test
public void EmptyStackIsEmpty () {
Assert.assertTrue(Empty.isEmpty());
}
@Test
public void OneStackIsSizeOne () {
Assert.assertEquals(1, OneStack.size());
}
@Test
public void OneStackCanPeek () {
Assert.assertSame(dasA, OneStack.peek());
}
@Test
public void OneStackPopsToEmptyStack () {
dasStack = OneStack.pop();
Assert.assertTrue(dasStack.isEmpty());
}
@Test
public void OneStackStackIsNotEmpty () {
Assert.assertTrue(!OneStack.isEmpty());
}
@Test
public void PushDoesNotChangeBaseStack () {
dasStack = Empty;
dasStack = dasStack.push(new A());
Assert.assertNotSame(dasStack, Empty);
}
@Test
public void PushIncrementsSize () {
dasStack = Empty;
dasStack = dasStack.push(new A());
Assert.assertEquals(1, dasStack.size());
}
@Test
public void PushMakesNotEmptyStack () {
dasStack = Empty;
dasStack = dasStack.push(new A());
Assert.assertTrue(!dasStack.isEmpty());
}
@Test
public void ConstructorIsCovariant () {
B dasB = new B();
dasStack = new ImmutableStack<A>(dasB);
Assert.assertSame(dasB, dasStack.peek());
}
@Test
public void IteratorNotHasNextOnEmpty () {
Iterator<A> itr = Empty.iterator();
Assert.assertTrue(!itr.hasNext());
}
@Test(expected = EmptyStackException.class)
public void IteratorNextThrowsErrorOnEmpty () {
Iterator<A> itr = Empty.iterator();
itr.next();
}
@Test(expected = UnsupportedOperationException.class)
public void IteratorThrowsErrorForRemove() {
Iterator<A> itr = OneStack.iterator();
itr.remove();
}
@Test
public void IteratorHasNextForOneStack() {
Iterator<A> itr = OneStack.iterator();
Assert.assertTrue(itr.hasNext());
}
@Test
public void IteratorNextWorksForOneStack() {
Iterator<A> itr = OneStack.iterator();
Assert.assertSame(dasA, itr.next());
}
@Test(expected = UnsupportedOperationException.class)
public void IteratorRemoveFailsForOneStack() {
Iterator<A> itr = OneStack.iterator();
itr.remove();
}
@Test
public void IterableConstructorCreatesCorrectLength () {
dasStack = new ImmutableStack<A>(Arrays.asList(arrA));
Assert.assertEquals(arrA.length, dasStack.size());
}
@Test
public void IterableConstructorCreatesCorrectorder () {
dasStack = new ImmutableStack<A>(Arrays.asList(arrA));
int i = arrA.length - 1;
for (A a: dasStack) {
Assert.assertSame(arrA[i], a);
i -= 1;
}
}
@Test
public void ToArrayObjectWorksMakesInputReversedArray(){
dasStack = new ImmutableStack<A>(Arrays.asList(arrA));
Object[] dasArr = dasStack.toArray();
for(int i = arrA.length - 1, j = 0; i >= 0; i -= 1, j += 1) {
Assert.assertSame(arrA[i], dasArr[j]);
}
}
}