Source code for grader.stdio

from threading import Condition
from queue import Queue
from time import sleep


[docs]class SyncCondition(Condition): def __init__(self): self.finished = False self.release_count = 0 Condition.__init__(self)
[docs] def notify_release(self): if self.finished: return self.release_count += 1 self.notify() self.release()
[docs] def wait_next_release(self): if self.finished: return target_release_count = self.release_count while self.release_count <= target_release_count: sleep(0.00001)
[docs] def finish(self): # called by program container, to mark that everything is finished self.finished = True
[docs]class SpoofedStdin: def __init__(self, condition): self.out = Queue() self.condition = condition
[docs] def put(self, line): # cond should be acquired by tester self.out.put(str(line)) #print("put", line, self.out) self.condition.notify_release() # users program does their thing #print("released by put, waiting until next release") self.condition.wait_next_release() # let me do my thing now! self.condition.acquire() #print("acquired by put")
[docs] def write(self, line): self.put(line)
[docs] def readline(self): self.condition.notify_release() #print("released by read, waiting until next release") self.condition.wait_next_release() # tester does its thing self.condition.acquire() #print("acquired by put") return self.out.get()#timeout=1)
[docs]class SpoofedStdout: def __init__(self): self.reset()
[docs] def flush(self): pass
[docs] def write(self, msg): self.output.append(msg)
[docs] def reset(self): self.output = [] self.lastread = 0
[docs] def read(self): self.lastread = len(self.output) result = "".join(self.output) return result
[docs] def new(self): " Utility method, returns new things written to stdout since last .new() call. " result = "".join(self.output[self.lastread:]) self.lastread = len(self.output) return result