def setUp(self):
     self.history = []
     self.historyStr = []
     self.notifier = SecondNotifier(0.000001)
     self.notifier.register(self)
     self.countDown = CountDown(0, self.notifier)
     self.notifier.register(self.countDown)
class TestCountDown(unittest.TestCase):    
    def setUp(self):
        self.history = []
        self.historyStr = []
        self.notifier = SecondNotifier(0.000001)
        self.notifier.register(self)
        self.countDown = CountDown(0, self.notifier)
        self.notifier.register(self.countDown)

    def testGiven0SecondsCountDownLaunchedThenOnlyDisplay0(self):
        self.countDown.count = 0
        
        self.notifier.start()
        time.sleep(0.01)
        self.notifier.start()
        time.sleep(0.01)
        self.notifier.stop()
        expected = [0]
        self.assertEquals(expected, self.history)
      
    def testGiven10SecondscountDownLaunchedThencountDownFrom10To0(self):
        self.countDown.count = 10
        
        self.notifier.start()
        time.sleep(0.1)
        self.notifier.stop()
        expected = range(11)
        expected.reverse()
        self.assertEquals(expected, self.history)
      
    def testGiven1h10m0scountDownLaunchedThencountDownFrom1h10m00sTo0m00s(self):
        self.countDown.count = 1 * 3600 + 10 * 60 + 0
        
        self.notifier.start()
        time.sleep(0.1)
        self.notifier.stop()
        expected1 = '1:10:00'
        expected2 = '1:09:02'
        expected3 = '1:00:00'
        expected4 = '0:59:59'
        expected5 = '0:00:00'

        self.assertIn(expected1, self.historyStr)
        self.assertIn(expected2, self.historyStr)
        self.assertIn(expected3, self.historyStr)
        self.assertIn(expected4, self.historyStr)
        self.assertIn(expected5, self.historyStr)
    
    def testGivenSecondThenReturnHourMinuteSecond(self):
        self.countDown.count = 1 * 3600 + 10 * 60 + 21

        self.assertEquals(1, self.countDown.getCountHour())
        self.assertEquals(10, self.countDown.getCountMinute())
        self.assertEquals(21, self.countDown.getCountSecond())
 
    def testGivenRestartedThenSameBehaviour(self):
        self.countDown.count = 1 * 3600 + 10 * 60 + 0
        self.notifier.start()
        time.sleep(0.1)
        self.notifier.stop()
        self.reset()
        self.countDown.count = 10
        self.notifier.start()
        time.sleep(0.1)
        self.notifier.stop()
        expected = range(11)
        expected.reverse()
        self.assertEquals(expected, self.history)
        
    def testGivenEnterDigitsThenDisplayCorrectTime(self):
        self.countDown.count = 0
        self.countDown.enter(3)
        self.assertEquals('0:00:03', self.countDown.getCountStr())
        self.countDown.enter(2)
        self.assertEquals('0:00:32', self.countDown.getCountStr())
        self.countDown.enter(3)
        self.assertEquals('0:03:23', self.countDown.getCountStr())
        self.countDown.enter(4)
        self.assertEquals('0:32:34', self.countDown.getCountStr())
        self.countDown.enter(5)
        self.assertEquals('3:23:45', self.countDown.getCountStr())
        self.countDown.enter(6)
        self.assertEquals('32:34:56', self.countDown.getCountStr())
        self.countDown.enter(2)
        self.assertEquals('0:00:02', self.countDown.getCountStr())
    
    def testGivenEnterDigitsAndDeleteThenDisplayCorrectTime(self):
        self.countDown.count = 0
        self.countDown.enter(3)
        self.countDown.enter(2)
        self.countDown.enter(3)
        self.countDown.enter(4)
        self.countDown.deleteLastEntered()
        self.assertEquals('0:03:23', self.countDown.getCountStr())
    
    def testGivenEnterDigitsAndDeleteMoreThenDisplay0(self):
        self.countDown.count = 0
        self.countDown.enter(3)
        self.countDown.deleteLastEntered()
        self.countDown.deleteLastEntered()
        self.assertEquals('0:00:00', self.countDown.getCountStr())
    
    def testGivenCountThenDisplayCorrectTime(self):
        self.countDown.count = 23*3600+45*60+24
        self.assertEquals('23:45:24', self.countDown.getCountStr())
        
    def reset(self):
        self.history = []
        self.historyStr = []
    
    def update(self):
        if self.countDown.count > 0 or self.history.count(0) == 0 :
            self.history.append(self.countDown.count)
            self.historyStr.append(self.countDown.getCountStr())