import time

class Test:
    rounds = None
    is_a_test = 1
    verbose = 0
    requireCowlibrationRounds = 10
    def cowlibrate(self):
        self.rounds = 100
        successfulRounds = 0
        while 1:
            time.sleep(self.passSleepTime)
            start = self.timer()
            self.test()
            elapsed = self.timer() - start
            if self.verbose > 3: print elapsed, self.rounds, successfulRounds
            if (elapsed >= self.runtimeTarget - self.runtimeAccuracyTarget
                    and elapsed <= self.runtimeTarget
                        + self.runtimeAccuracyTarget):
                successfulRounds = successfulRounds + 1
                if successfulRounds > self.requireCowlibrationRounds: break
            else:
                successfulRounds = 0
                self.rounds = int(self.rounds *
                        (self.runtimeTarget / elapsed) *
                        (1 + (self.runtimeAccuracyTarget * 2)))

    def run(self):
        fastestTime = None
        sinceFastest = 0
        lap = 0
        while sinceFastest < self.requiredStablePasses:
            lap = lap + 1
            time.sleep(self.passSleepTime)
            start = self.timer()
            self.test()
            elapsed = self.timer() - start
            if self.verbose > 3: print lap, elapsed, fastestTime
            if fastestTime == None or elapsed < fastestTime:
                fastestTime = elapsed
                sinceFastest = 0
            sinceFastest = sinceFastest + 1

        return(fastestTime)
