1 """LacOperon symbolic simulation using [Python] --[yong27], 2005-03-27
   2 """
   3 import unittest, sys
   4 
   5 class LacOperon:
   6     ID = 0
   7     isBindOperator = True
   8     isBindCap = False
   9     def __init__(self, feed):
  10         self.feed = feed
  11         self.check()
  12         self.ID = LacOperon.ID
  13         LacOperon.ID+=1
  14 
  15     def check(self):
  16         if self.feed.lactose > 0:
  17             self.isBindOperator = False
  18         if self.feed.glucose == 0:
  19             self.isBindCap = True
  20 
  21     def update(self):
  22         if self.feed.isBottom():
  23             raise AssertionError, "Die"
  24         if self.feed.glucose > 0:
  25             self.feed.glucose -=1
  26         elif self.getProtein() =='lactase':
  27             self.feed.lactose -=1
  28         self.check()
  29 
  30     def getProtein(self):
  31         if not self.isBindOperator and self.isBindCap:
  32             return "lactase"
  33 
  34     def __repr__(self):
  35         return '%i : glucose %i,  lactose %i,  proteins %s'%(
  36                 self.ID, self.feed.glucose, self.feed.lactose, 
  37                 self.getProtein())
  38 
  39 class Feed:
  40     def __init__(self, **substrates):
  41         self.glucose = substrates['glucose']
  42         self.lactose = substrates['lactose']
  43     def isBottom(self):
  44         return self.glucose == 0 and self.lactose == 0
  45 
  46 class Simulator:
  47     def __init__(self):
  48         self.players = list()
  49     def addPlayer(self, player):
  50         self.players.append(player)
  51 
  52     def iterate(self, n):
  53         for each in range(n):
  54             for player in self.players:
  55                 print player
  56                 player.update()
  57 
  58 
  59 class FeedTest(unittest.TestCase):
  60     def testGetGlucose(self):
  61         f = Feed(glucose=10,lactose=10)
  62         self.assertEquals(10 , f.glucose)
  63 
  64 class LacOperonTest(unittest.TestCase):
  65     def testOnlyGlucose(self):
  66         lo = LacOperon(Feed(glucose=10, lactose=0))
  67         self.assertEquals(None, lo.getProtein())
  68 
  69     def testOnlyLactose(self):
  70         lo = LacOperon(Feed(glucose=0, lactose=10))
  71         self.assertEquals('lactase', lo.getProtein())
  72 
  73     def testGlucoseLactose(self):
  74         lo = LacOperon(Feed(glucose=10, lactose=10))
  75         self.assertEquals(None, lo.getProtein())
  76 
  77     def testUpdate(self):
  78         lo = LacOperon(Feed(glucose=2, lactose=2))
  79         lo.update()
  80         self.assertEquals(1, lo.feed.glucose)
  81         self.assertEquals(2, lo.feed.lactose)
  82         lo.update()
  83         self.assertEquals(0, lo.feed.glucose)
  84         self.assertEquals(2, lo.feed.lactose)
  85         lo.update()
  86         self.assertEquals(0, lo.feed.glucose)
  87         self.assertEquals(1, lo.feed.lactose)
  88         lo.update()
  89         self.assertEquals(0, lo.feed.glucose)
  90         self.assertEquals(0, lo.feed.lactose)
  91         self.assertRaises(AssertionError, lo.update)
  92 
  93 
  94 def simulate():
  95     s = Simulator()
  96     l1 = LacOperon(Feed(glucose=10, lactose=10))
  97     l2 = LacOperon(Feed(glucose=15, lactose=5))
  98     s.addPlayer(l1)
  99     s.addPlayer(l2)
 100     try:
 101         s.iterate(30)
 102     except AssertionError:
 103         print 'die.'
 104         sys.exit()
 105 
 106 if __name__=='__main__':
 107     #unittest.main(argv=('','-v'))
 108     simulate()