Skip to content

Commit f43ecd5

Browse files
yashsaha555alxkm
andauthored
feat: add comprehensive test coverage for ProcessDetails entity class (#6590)
* feat: add comprehensive test coverage for ProcessDetails entity class (#6588) - Add ProcessDetailsTest.java with 20 comprehensive test methods - Cover all constructors, getters, and setters - Include edge cases: null values, negatives, zeros, max values - Add real-world scheduling scenario tests - Ensure 100% line coverage for ProcessDetails class - Follow project checkstyle rules and conventions Fixes #6588 * fix: resolve SpotBugs UC_USELESS_OBJECT warning in ProcessDetailsTest - Add assertions for process1 in testMultipleProcessesIndependence method - Verify both processes are properly tested for independence - Ensure all created objects are meaningfully used in tests Fixes SpotBugs warning: UC_USELESS_OBJECT at line 224 --------- Co-authored-by: Oleksandr Klymenko <alexanderklmn@gmail.com>
1 parent 2be984f commit f43ecd5

File tree

1 file changed

+288
-0
lines changed

1 file changed

+288
-0
lines changed
Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
package com.thealgorithms.devutils.entities;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
/**
10+
* Test class for ProcessDetails
11+
* Tests the ProcessDetails entity used in scheduling algorithms
12+
*
13+
* @author Sourav Saha (yashsaha555)
14+
*/
15+
class ProcessDetailsTest {
16+
17+
private ProcessDetails processWithPriority;
18+
private ProcessDetails processWithoutPriority;
19+
20+
@BeforeEach
21+
void setUp() {
22+
// Initialize test objects before each test
23+
processWithPriority = new ProcessDetails("P1", 0, 10, 5);
24+
processWithoutPriority = new ProcessDetails("P2", 2, 8);
25+
}
26+
27+
@Test
28+
void testConstructorWithPriority() {
29+
// Test constructor with priority parameter
30+
ProcessDetails process = new ProcessDetails("P3", 1, 15, 3);
31+
32+
assertEquals("P3", process.getProcessId());
33+
assertEquals(1, process.getArrivalTime());
34+
assertEquals(15, process.getBurstTime());
35+
assertEquals(3, process.getPriority());
36+
assertEquals(0, process.getWaitingTime()); // Default value
37+
assertEquals(0, process.getTurnAroundTimeTime()); // Default value
38+
}
39+
40+
@Test
41+
void testConstructorWithoutPriority() {
42+
// Test constructor without priority parameter
43+
ProcessDetails process = new ProcessDetails("P4", 3, 12);
44+
45+
assertEquals("P4", process.getProcessId());
46+
assertEquals(3, process.getArrivalTime());
47+
assertEquals(12, process.getBurstTime());
48+
assertEquals(0, process.getPriority()); // Default value
49+
assertEquals(0, process.getWaitingTime()); // Default value
50+
assertEquals(0, process.getTurnAroundTimeTime()); // Default value
51+
}
52+
53+
@Test
54+
void testGetProcessId() {
55+
assertEquals("P1", processWithPriority.getProcessId());
56+
assertEquals("P2", processWithoutPriority.getProcessId());
57+
}
58+
59+
@Test
60+
void testGetArrivalTime() {
61+
assertEquals(0, processWithPriority.getArrivalTime());
62+
assertEquals(2, processWithoutPriority.getArrivalTime());
63+
}
64+
65+
@Test
66+
void testGetBurstTime() {
67+
assertEquals(10, processWithPriority.getBurstTime());
68+
assertEquals(8, processWithoutPriority.getBurstTime());
69+
}
70+
71+
@Test
72+
void testGetWaitingTime() {
73+
// Initial waiting time should be 0
74+
assertEquals(0, processWithPriority.getWaitingTime());
75+
assertEquals(0, processWithoutPriority.getWaitingTime());
76+
}
77+
78+
@Test
79+
void testGetTurnAroundTimeTime() {
80+
// Initial turnaround time should be 0
81+
assertEquals(0, processWithPriority.getTurnAroundTimeTime());
82+
assertEquals(0, processWithoutPriority.getTurnAroundTimeTime());
83+
}
84+
85+
@Test
86+
void testGetPriority() {
87+
assertEquals(5, processWithPriority.getPriority());
88+
assertEquals(0, processWithoutPriority.getPriority()); // Default for constructor without priority
89+
}
90+
91+
@Test
92+
void testSetProcessId() {
93+
processWithPriority.setProcessId("NewP1");
94+
assertEquals("NewP1", processWithPriority.getProcessId());
95+
96+
// Test setting null process ID
97+
processWithPriority.setProcessId(null);
98+
assertNull(processWithPriority.getProcessId());
99+
100+
// Test setting empty process ID
101+
processWithPriority.setProcessId("");
102+
assertEquals("", processWithPriority.getProcessId());
103+
}
104+
105+
@Test
106+
void testSetArrivalTime() {
107+
processWithPriority.setArrivalTime(5);
108+
assertEquals(5, processWithPriority.getArrivalTime());
109+
110+
// Test setting negative arrival time
111+
processWithPriority.setArrivalTime(-1);
112+
assertEquals(-1, processWithPriority.getArrivalTime());
113+
114+
// Test setting zero arrival time
115+
processWithPriority.setArrivalTime(0);
116+
assertEquals(0, processWithPriority.getArrivalTime());
117+
}
118+
119+
@Test
120+
void testSetBurstTime() {
121+
processWithPriority.setBurstTime(20);
122+
assertEquals(20, processWithPriority.getBurstTime());
123+
124+
// Test setting zero burst time
125+
processWithPriority.setBurstTime(0);
126+
assertEquals(0, processWithPriority.getBurstTime());
127+
128+
// Test setting very large burst time
129+
processWithPriority.setBurstTime(Integer.MAX_VALUE);
130+
assertEquals(Integer.MAX_VALUE, processWithPriority.getBurstTime());
131+
}
132+
133+
@Test
134+
void testSetWaitingTime() {
135+
processWithPriority.setWaitingTime(15);
136+
assertEquals(15, processWithPriority.getWaitingTime());
137+
138+
// Test setting negative waiting time
139+
processWithPriority.setWaitingTime(-5);
140+
assertEquals(-5, processWithPriority.getWaitingTime());
141+
142+
// Test setting zero waiting time
143+
processWithPriority.setWaitingTime(0);
144+
assertEquals(0, processWithPriority.getWaitingTime());
145+
}
146+
147+
@Test
148+
void testSetTurnAroundTimeTime() {
149+
processWithPriority.setTurnAroundTimeTime(25);
150+
assertEquals(25, processWithPriority.getTurnAroundTimeTime());
151+
152+
// Test setting negative turnaround time
153+
processWithPriority.setTurnAroundTimeTime(-10);
154+
assertEquals(-10, processWithPriority.getTurnAroundTimeTime());
155+
156+
// Test setting zero turnaround time
157+
processWithPriority.setTurnAroundTimeTime(0);
158+
assertEquals(0, processWithPriority.getTurnAroundTimeTime());
159+
}
160+
161+
@Test
162+
void testCompleteProcessLifecycle() {
163+
// Test a complete process lifecycle with realistic scheduling values
164+
ProcessDetails process = new ProcessDetails("P5", 0, 10, 2);
165+
166+
// Simulate process execution
167+
process.setWaitingTime(5); // Process waited 5 time units
168+
process.setTurnAroundTimeTime(15); // Total time from arrival to completion
169+
170+
assertEquals("P5", process.getProcessId());
171+
assertEquals(0, process.getArrivalTime());
172+
assertEquals(10, process.getBurstTime());
173+
assertEquals(5, process.getWaitingTime());
174+
assertEquals(15, process.getTurnAroundTimeTime());
175+
assertEquals(2, process.getPriority());
176+
}
177+
178+
@Test
179+
void testProcessWithMinimumValues() {
180+
// Test process with minimum possible values
181+
ProcessDetails process = new ProcessDetails("", 0, 1, 0);
182+
183+
assertEquals("", process.getProcessId());
184+
assertEquals(0, process.getArrivalTime());
185+
assertEquals(1, process.getBurstTime());
186+
assertEquals(0, process.getPriority());
187+
}
188+
189+
@Test
190+
void testProcessWithMaximumValues() {
191+
// Test process with large values
192+
ProcessDetails process = new ProcessDetails("LongProcessName", Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
193+
194+
assertEquals("LongProcessName", process.getProcessId());
195+
assertEquals(Integer.MAX_VALUE, process.getArrivalTime());
196+
assertEquals(Integer.MAX_VALUE, process.getBurstTime());
197+
assertEquals(Integer.MAX_VALUE, process.getPriority());
198+
}
199+
200+
@Test
201+
void testProcessModificationAfterCreation() {
202+
// Test that all fields can be modified after object creation
203+
ProcessDetails process = new ProcessDetails("Original", 1, 5, 3);
204+
205+
// Modify all fields
206+
process.setProcessId("Modified");
207+
process.setArrivalTime(10);
208+
process.setBurstTime(20);
209+
process.setWaitingTime(8);
210+
process.setTurnAroundTimeTime(28);
211+
212+
// Verify all modifications
213+
assertEquals("Modified", process.getProcessId());
214+
assertEquals(10, process.getArrivalTime());
215+
assertEquals(20, process.getBurstTime());
216+
assertEquals(8, process.getWaitingTime());
217+
assertEquals(28, process.getTurnAroundTimeTime());
218+
assertEquals(3, process.getPriority()); // Priority has no setter, should remain unchanged
219+
}
220+
221+
@Test
222+
void testMultipleProcessesIndependence() {
223+
// Test that multiple ProcessDetails objects are independent
224+
ProcessDetails process1 = new ProcessDetails("P1", 0, 5, 1);
225+
ProcessDetails process2 = new ProcessDetails("P2", 2, 8, 2);
226+
227+
// Modify first process
228+
process1.setWaitingTime(10);
229+
process1.setTurnAroundTimeTime(15);
230+
231+
// Verify first process was modified correctly
232+
assertEquals("P1", process1.getProcessId());
233+
assertEquals(0, process1.getArrivalTime());
234+
assertEquals(5, process1.getBurstTime());
235+
assertEquals(1, process1.getPriority());
236+
assertEquals(10, process1.getWaitingTime());
237+
assertEquals(15, process1.getTurnAroundTimeTime());
238+
239+
// Verify second process is unchanged
240+
assertEquals("P2", process2.getProcessId());
241+
assertEquals(2, process2.getArrivalTime());
242+
assertEquals(8, process2.getBurstTime());
243+
assertEquals(2, process2.getPriority());
244+
assertEquals(0, process2.getWaitingTime());
245+
assertEquals(0, process2.getTurnAroundTimeTime());
246+
}
247+
248+
@Test
249+
void testConstructorParameterOrder() {
250+
// Test that constructor parameters are assigned to correct fields
251+
ProcessDetails process = new ProcessDetails("TestProcess", 123, 456, 789);
252+
253+
assertEquals("TestProcess", process.getProcessId());
254+
assertEquals(123, process.getArrivalTime());
255+
assertEquals(456, process.getBurstTime());
256+
assertEquals(789, process.getPriority());
257+
}
258+
259+
@Test
260+
void testTypicalSchedulingScenario() {
261+
// Test a typical scheduling scenario with multiple processes
262+
ProcessDetails[] processes = {new ProcessDetails("P1", 0, 8, 3), new ProcessDetails("P2", 1, 4, 1), new ProcessDetails("P3", 2, 9, 4), new ProcessDetails("P4", 3, 5, 2)};
263+
264+
// Simulate FCFS scheduling calculations
265+
int currentTime = 0;
266+
for (ProcessDetails process : processes) {
267+
if (currentTime < process.getArrivalTime()) {
268+
currentTime = process.getArrivalTime();
269+
}
270+
process.setWaitingTime(currentTime - process.getArrivalTime());
271+
currentTime += process.getBurstTime();
272+
process.setTurnAroundTimeTime(process.getWaitingTime() + process.getBurstTime());
273+
}
274+
275+
// Verify calculations
276+
assertEquals(0, processes[0].getWaitingTime()); // P1: arrives at 0, starts immediately
277+
assertEquals(8, processes[0].getTurnAroundTimeTime()); // P1: 0 + 8
278+
279+
assertEquals(7, processes[1].getWaitingTime()); // P2: arrives at 1, starts at 8
280+
assertEquals(11, processes[1].getTurnAroundTimeTime()); // P2: 7 + 4
281+
282+
assertEquals(10, processes[2].getWaitingTime()); // P3: arrives at 2, starts at 12
283+
assertEquals(19, processes[2].getTurnAroundTimeTime()); // P3: 10 + 9
284+
285+
assertEquals(18, processes[3].getWaitingTime()); // P4: arrives at 3, starts at 21
286+
assertEquals(23, processes[3].getTurnAroundTimeTime()); // P4: 18 + 5
287+
}
288+
}

0 commit comments

Comments
 (0)