@@ -106,7 +106,15 @@ def _simulate_sjf_np(self) -> Generator[tuple[int, str | None, list[str]]]:
106106
107107 # shortest job first preemptive
108108 def _simulate_sjf_p (self ) -> Generator [tuple [int , str | None , list [str ]]]:
109- """Simulates SJF Preemptive scheduling."""
109+ """
110+ Simulates SJF Preemptive scheduling.
111+
112+ >>> processes = [{"pid": "P1", "arrival": 0, "burst": 3}]
113+ >>> engine = SchedulerEngine(processes, "SJF (Preemptive)")
114+ >>> gen = engine._simulate_sjf_p()
115+ >>> isinstance(gen, Generator)
116+ True
117+ """
110118 t = 0
111119 processes = sorted (self .processes , key = lambda process : process ["arrival" ])
112120 done = 0
@@ -131,7 +139,15 @@ def _simulate_sjf_p(self) -> Generator[tuple[int, str | None, list[str]]]:
131139
132140 # priority non preemptive
133141 def _simulate_priority_np (self ) -> Generator [tuple [int , str | None , list [str ]]]:
134- """Simulates Priority (Non-Preemptive) scheduling."""
142+ """
143+ Simulates Priority (Non-Preemptive) scheduling.
144+
145+ >>> processes = [{"pid": "P1", "arrival": 0, "burst": 2, "priority": 1}]
146+ >>> engine = SchedulerEngine(processes, "Priority (Non-Preemptive)")
147+ >>> gen = engine._simulate_priority_np()
148+ >>> next(gen)
149+ (0, 'P1', [])
150+ """
135151 t = 0
136152 done = 0
137153 while done < len (self .processes ):
@@ -154,7 +170,14 @@ def _simulate_priority_np(self) -> Generator[tuple[int, str | None, list[str]]]:
154170
155171 # priority preemptive
156172 def _simulate_priority_p (self ) -> Generator [tuple [int , str | None , list [str ]]]:
157- """Simulates Priority (Preemptive) scheduling."""
173+ """
174+ Simulates Priority (Preemptive) scheduling.
175+
176+ >>> processes = [{"pid": "P1", "arrival": 0, "burst": 2, "priority": 1}]
177+ >>> engine = SchedulerEngine(processes, "Priority (Preemptive)")
178+ >>> isinstance(engine._simulate_priority_p(), Generator)
179+ True
180+ """
158181 t = 0
159182 done = 0
160183 while done < len (self .processes ):
@@ -318,7 +341,21 @@ def setup_ui(self) -> None:
318341 self .avg_label .pack ()
319342
320343 def add_process (self ) -> None :
321- """Adds a new process entry to the table."""
344+ """
345+ Adds a new process entry to the table.
346+
347+ >>> import tkinter as tk
348+ >>> root = tk.Tk()
349+ >>> gui = CPUSchedulerGUI(root)
350+ >>> gui.pid_e.insert(0, 'P1')
351+ >>> gui.arrival_e.insert(0, '0')
352+ >>> gui.burst_e.insert(0, '3')
353+ >>> gui.priority_e.insert(0, '1')
354+ >>> gui.add_process()
355+ >>> len(gui.processes) > 0
356+ True
357+ >>> root.destroy()
358+ """
322359 try :
323360 pid = self .pid_e .get ()
324361 arrival = int (self .arrival_e .get ())
@@ -332,14 +369,40 @@ def add_process(self) -> None:
332369 messagebox .showerror ("Error" , "Invalid input" )
333370
334371 def delete_process (self ) -> None :
335- """Deletes a selected process."""
372+ """
373+ Deletes a selected process.
374+
375+ >>> import tkinter as tk
376+ >>> root = tk.Tk()
377+ >>> gui = CPUSchedulerGUI(root)
378+ >>> gui.processes = [{"pid": "P1", "arrival": 0, "burst": 2, "priority": 1}]
379+ >>> gui.tree.insert("", "end", values=("P1", 0, 2, 1))
380+ >>> sel = gui.tree.get_children()[0]
381+ >>> gui.tree.selection_set(sel)
382+ >>> gui.delete_process()
383+ >>> gui.processes
384+ []
385+ >>> root.destroy()
386+ """
336387 if sel := self .tree .selection ():
337388 pid = self .tree .item (sel [0 ])["values" ][0 ]
338389 self .processes = [p for p in self .processes if p ["pid" ] != pid ]
339390 self .tree .delete (sel [0 ])
340391
341392 def run_scheduling (self ) -> None :
342- """Runs the selected scheduling algorithm."""
393+ """
394+ Runs the selected scheduling algorithm.
395+
396+ >>> import tkinter as tk
397+ >>> root = tk.Tk()
398+ >>> gui = CPUSchedulerGUI(root)
399+ >>> gui.processes = [{"pid": "P1", "arrival": 0, "burst": 2, "priority": 1}]
400+ >>> gui.algo_cb.set("FCFS")
401+ >>> gui.run_scheduling()
402+ >>> hasattr(gui, "engine")
403+ True
404+ >>> root.destroy()
405+ """
343406 algo = self .algo_cb .get ()
344407 quantum = int (self .quantum_e .get () or 2 )
345408 if algo .lower () == "round robin" :
@@ -353,7 +416,18 @@ def run_scheduling(self) -> None:
353416 threading .Thread (target = self .animate , daemon = True ).start ()
354417
355418 def animate (self ) -> None :
356- """Animates the scheduling visualization."""
419+ """
420+ Animates the scheduling visualization.
421+
422+ >>> import tkinter as tk
423+ >>> root = tk.Tk()
424+ >>> gui = CPUSchedulerGUI(root)
425+ >>> gui.processes = [{"pid": "P1", "arrival": 0, "burst": 1, "priority": 1}]
426+ >>> gui.engine = SchedulerEngine(gui.processes, "FCFS")
427+ >>> hasattr(gui, "animate")
428+ True
429+ >>> root.destroy()
430+ """
357431 self .ax .clear ()
358432 x : int = 0
359433 colors : dict [str , any ] = {}
@@ -388,7 +462,19 @@ def animate(self) -> None:
388462 self .show_results ()
389463
390464 def show_results (self ) -> None :
391- """Displays scheduling results."""
465+ """
466+ Displays scheduling results.
467+
468+ >>> import tkinter as tk
469+ >>> root = tk.Tk()
470+ >>> gui = CPUSchedulerGUI(root)
471+ >>> gui.engine = SchedulerEngine([{"pid": "P1", "arrival": 0, "burst": 1, "priority": 1}], "FCFS")
472+ >>> gui.engine.stats = [("P1", 0, 1, 1, 1, 0, 0)]
473+ >>> gui.show_results()
474+ >>> "AVG" in gui.avg_label.cget("text")
475+ True
476+ >>> root.destroy()
477+ """
392478 for item in self .result_box .get_children ():
393479 self .result_box .delete (item )
394480 total_wt = total_tat = total_rt = 0
0 commit comments