Skip to content

Commit 8c1beaa

Browse files
Merge branch 'master' into my_algorithm
2 parents 5328d9a + 2722b0e commit 8c1beaa

File tree

3 files changed

+120
-64
lines changed

3 files changed

+120
-64
lines changed
Lines changed: 62 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,115 @@
11
package com.thealgorithms.datastructures.lists;
22

3-
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
43
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
55
import static org.junit.jupiter.api.Assertions.assertTrue;
66

77
import java.util.Arrays;
88
import java.util.stream.IntStream;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.DisplayName;
911
import org.junit.jupiter.api.Test;
1012

1113
class SkipListTest {
1214

15+
private SkipList<String> skipList;
16+
17+
@BeforeEach
18+
void setUp() {
19+
skipList = new SkipList<>();
20+
}
21+
1322
@Test
14-
void add() {
15-
SkipList<String> skipList = new SkipList<>();
23+
@DisplayName("Add element and verify size and retrieval")
24+
void testAdd() {
1625
assertEquals(0, skipList.size());
1726

1827
skipList.add("value");
1928

20-
print(skipList);
2129
assertEquals(1, skipList.size());
30+
assertEquals("value", skipList.get(0));
2231
}
2332

2433
@Test
25-
void get() {
26-
SkipList<String> skipList = new SkipList<>();
34+
@DisplayName("Get retrieves correct element by index")
35+
void testGet() {
2736
skipList.add("value");
28-
29-
String actualValue = skipList.get(0);
30-
31-
print(skipList);
32-
assertEquals("value", actualValue);
37+
assertEquals("value", skipList.get(0));
3338
}
3439

3540
@Test
36-
void contains() {
37-
SkipList<String> skipList = createSkipList();
38-
print(skipList);
39-
40-
boolean contains = skipList.contains("b");
41-
42-
assertTrue(contains);
41+
@DisplayName("Contains returns true if element exists")
42+
void testContains() {
43+
skipList = createSkipList();
44+
assertTrue(skipList.contains("b"));
45+
assertTrue(skipList.contains("a"));
46+
assertFalse(skipList.contains("z")); // negative test
4347
}
4448

4549
@Test
46-
void removeFromHead() {
47-
SkipList<String> skipList = createSkipList();
48-
String mostLeftElement = skipList.get(0);
50+
@DisplayName("Remove element from head and check size and order")
51+
void testRemoveFromHead() {
52+
skipList = createSkipList();
53+
String first = skipList.get(0);
4954
int initialSize = skipList.size();
50-
print(skipList);
5155

52-
skipList.remove(mostLeftElement);
56+
skipList.remove(first);
5357

54-
print(skipList);
5558
assertEquals(initialSize - 1, skipList.size());
59+
assertFalse(skipList.contains(first));
5660
}
5761

5862
@Test
59-
void removeFromTail() {
60-
SkipList<String> skipList = createSkipList();
61-
String mostRightValue = skipList.get(skipList.size() - 1);
63+
@DisplayName("Remove element from tail and check size and order")
64+
void testRemoveFromTail() {
65+
skipList = createSkipList();
66+
String last = skipList.get(skipList.size() - 1);
6267
int initialSize = skipList.size();
63-
print(skipList);
6468

65-
skipList.remove(mostRightValue);
69+
skipList.remove(last);
6670

67-
print(skipList);
6871
assertEquals(initialSize - 1, skipList.size());
72+
assertFalse(skipList.contains(last));
6973
}
7074

7175
@Test
72-
void checkSortedOnLowestLayer() {
73-
SkipList<String> skipList = new SkipList<>();
76+
@DisplayName("Elements should be sorted at base level")
77+
void testSortedOrderOnBaseLevel() {
7478
String[] values = {"d", "b", "a", "c"};
7579
Arrays.stream(values).forEach(skipList::add);
76-
print(skipList);
7780

7881
String[] actualOrder = IntStream.range(0, values.length).mapToObj(skipList::get).toArray(String[] ::new);
7982

80-
assertArrayEquals(new String[] {"a", "b", "c", "d"}, actualOrder);
83+
org.junit.jupiter.api.Assertions.assertArrayEquals(new String[] {"a", "b", "c", "d"}, actualOrder);
8184
}
8285

83-
private SkipList<String> createSkipList() {
84-
SkipList<String> skipList = new SkipList<>();
85-
String[] values = {
86-
"a",
87-
"b",
88-
"c",
89-
"d",
90-
"e",
91-
"f",
92-
"g",
93-
"h",
94-
"i",
95-
"j",
96-
"k",
97-
};
86+
@Test
87+
@DisplayName("Duplicate elements can be added and count correctly")
88+
void testAddDuplicates() {
89+
skipList.add("x");
90+
skipList.add("x");
91+
assertEquals(2, skipList.size());
92+
assertEquals("x", skipList.get(0));
93+
assertEquals("x", skipList.get(1));
94+
}
95+
96+
@Test
97+
@DisplayName("Add multiple and remove all")
98+
void testClearViaRemovals() {
99+
String[] values = {"a", "b", "c"};
98100
Arrays.stream(values).forEach(skipList::add);
99-
return skipList;
101+
102+
for (String v : values) {
103+
skipList.remove(v);
104+
}
105+
106+
assertEquals(0, skipList.size());
100107
}
101108

102-
/**
103-
* Print Skip List representation to console.
104-
* Optional method not involved in testing process. Used only for visualisation purposes.
105-
* @param skipList to print
106-
*/
107-
private void print(SkipList<?> skipList) {
108-
System.out.println(skipList);
109+
private SkipList<String> createSkipList() {
110+
SkipList<String> s = new SkipList<>();
111+
String[] values = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"};
112+
Arrays.stream(values).forEach(s::add);
113+
return s;
109114
}
110115
}

src/test/java/com/thealgorithms/datastructures/queues/DequeTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,38 @@ void testToString() {
8787
deque.addFirst(5);
8888
assertEquals("Head -> 5 <-> 10 <-> 20 <- Tail", deque.toString());
8989
}
90+
91+
@Test
92+
void testAlternatingAddRemove() {
93+
Deque<Integer> deque = new Deque<>();
94+
deque.addFirst(1);
95+
deque.addLast(2);
96+
deque.addFirst(0);
97+
assertEquals(0, deque.pollFirst());
98+
assertEquals(2, deque.pollLast());
99+
assertEquals(1, deque.pollFirst());
100+
org.junit.jupiter.api.Assertions.assertTrue(deque.isEmpty());
101+
}
102+
103+
@Test
104+
void testSizeAfterOperations() {
105+
Deque<Integer> deque = new Deque<>();
106+
assertEquals(0, deque.size());
107+
deque.addFirst(1);
108+
deque.addLast(2);
109+
deque.addFirst(3);
110+
assertEquals(3, deque.size());
111+
deque.pollFirst();
112+
deque.pollLast();
113+
assertEquals(1, deque.size());
114+
}
115+
116+
@Test
117+
void testNullValues() {
118+
Deque<String> deque = new Deque<>();
119+
deque.addFirst(null);
120+
assertNull(deque.peekFirst());
121+
assertNull(deque.pollFirst());
122+
org.junit.jupiter.api.Assertions.assertTrue(deque.isEmpty());
123+
}
90124
}

src/test/java/com/thealgorithms/stacks/PostfixEvaluatorTest.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,41 @@
44
import static org.junit.jupiter.api.Assertions.assertThrows;
55

66
import java.util.EmptyStackException;
7+
import org.junit.jupiter.api.DisplayName;
78
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.params.ParameterizedTest;
10+
import org.junit.jupiter.params.provider.CsvSource;
811

912
public class PostfixEvaluatorTest {
1013

11-
@Test
12-
public void testValidExpressions() {
13-
assertEquals(22, PostfixEvaluator.evaluatePostfix("5 6 + 2 *"));
14-
assertEquals(27, PostfixEvaluator.evaluatePostfix("7 2 + 3 *"));
15-
assertEquals(3, PostfixEvaluator.evaluatePostfix("10 5 / 1 +"));
14+
@ParameterizedTest(name = "Expression: \"{0}\" → Result: {1}")
15+
@CsvSource({"'5 6 + 2 *', 22", "'7 2 + 3 *', 27", "'10 5 / 1 +', 3", "'8', 8", "'3 4 +', 7"})
16+
@DisplayName("Valid postfix expressions")
17+
void testValidExpressions(String expression, int expected) {
18+
assertEquals(expected, PostfixEvaluator.evaluatePostfix(expression));
1619
}
1720

1821
@Test
19-
public void testInvalidExpression() {
22+
@DisplayName("Should throw EmptyStackException for incomplete expression")
23+
void testInvalidExpression() {
2024
assertThrows(EmptyStackException.class, () -> PostfixEvaluator.evaluatePostfix("5 +"));
2125
}
2226

2327
@Test
24-
public void testMoreThanOneStackSizeAfterEvaluation() {
28+
@DisplayName("Should throw IllegalArgumentException for extra operands")
29+
void testExtraOperands() {
2530
assertThrows(IllegalArgumentException.class, () -> PostfixEvaluator.evaluatePostfix("5 6 + 2 * 3"));
2631
}
32+
33+
@Test
34+
@DisplayName("Should throw ArithmeticException for division by zero")
35+
void testDivisionByZero() {
36+
assertThrows(ArithmeticException.class, () -> PostfixEvaluator.evaluatePostfix("1 0 /"));
37+
}
38+
39+
@Test
40+
@DisplayName("Should throw IllegalArgumentException for invalid characters")
41+
void testInvalidToken() {
42+
assertThrows(IllegalArgumentException.class, () -> PostfixEvaluator.evaluatePostfix("1 a +"));
43+
}
2744
}

0 commit comments

Comments
 (0)