Advertisement
Guest User

The Ordered Jobs Kata

a guest
Sep 30th, 2011
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.52 KB | None | 0 0
  1. """
  2. The Ordered Jobs Kata
  3.  
  4. Python solution by Mark Frimston (@Frimkron)
  5.  
  6. Kata by Martin Rue (@MartinRue)
  7. http://invalidcast.com/2011/09/the-ordered-jobs-kata#more-513
  8. """
  9.  
  10.  
  11. def walk_deps(deps,job,result,path):
  12.  
  13.     for d in deps[job]:
  14.         if d in path:
  15.             raise ValueError("Jobs cannot have circular dependencies")
  16.            
  17.         walk_deps(deps,d,result,path+[job])
  18.        
  19.     if not job in result:
  20.         result.append(job)
  21.        
  22.  
  23. def order_jobs(jobs):
  24.  
  25.     if len(jobs) == 0:
  26.         return ""
  27.        
  28.     deps = {}  
  29.     for line in jobs.split("\n"):
  30.         j,d = map(str.strip, line.split("=>"))
  31.         if j == d:
  32.             raise ValueError("Jobs cannot depend on themselves")
  33.         if not j in deps:
  34.             deps[j] = []
  35.         if len(d)>0:
  36.             deps[j].append(d)
  37.    
  38.     result = []
  39.     for j in deps:
  40.         walk_deps(deps,j,result,[])
  41.  
  42.     return "".join(result)
  43.        
  44.  
  45. if __name__ == "__main__":
  46.     import unittest
  47.    
  48.     class TestOrderJobs(unittest.TestCase):
  49.    
  50.         def test_empty_string(self):
  51.             self.assertEquals("",order_jobs(""))
  52.  
  53.         def test_single_job(self):
  54.             self.assertEquals("a", order_jobs("a =>"))
  55.  
  56.         def test_multiple_jobs(self):
  57.             result = order_jobs(
  58.                 "a =>\n"
  59.                 +"b =>\n"
  60.                 +"c =>"
  61.             )
  62.             self.assertTrue(all([j in result for j in "abc"]))
  63.            
  64.         def test_single_dependency(self):
  65.             result = order_jobs(
  66.                 "a =>\n"
  67.                 +"b => c\n"
  68.                 +"c =>"
  69.             )
  70.             self.assertTrue(all([j in result for j in "abc"]))
  71.             self.assertTrue(result.index("c") < result.index("b"))
  72.  
  73.         def test_multiple_dependencies(self):
  74.             result = order_jobs(
  75.                 "a =>\n"
  76.                 +"b => c\n"
  77.                 +"c => f\n"
  78.                 +"d => a\n"
  79.                 +"e => b\n"
  80.                 +"f =>"
  81.             )
  82.             self.assertTrue(all([j in result for j in "abcdef"]))
  83.             self.assertTrue(result.index("c") < result.index("b"))
  84.             self.assertTrue(result.index("f") < result.index("c"))
  85.             self.assertTrue(result.index("a") < result.index("d"))
  86.             self.assertTrue(result.index("b") < result.index("e"))
  87.  
  88.         def test_self_referencing(self):
  89.             try:
  90.                 order_jobs(
  91.                     "a =>\n"
  92.                     +"b =>\n"
  93.                     +"c => c"
  94.                 )
  95.                 self.assertTrue(False)
  96.             except Exception as e:
  97.                 self.assertEquals(ValueError, type(e))
  98.                 self.assertEquals("Jobs cannot depend on themselves",str(e))
  99.  
  100.         def test_circular_dependency(self):
  101.             try:
  102.                 order_jobs(
  103.                     "a =>\n"
  104.                     +"b => c\n"
  105.                     +"c => f\n"
  106.                     +"d => a\n"
  107.                     +"e =>\n"
  108.                     +"f => b"
  109.                 )
  110.                 self.assertTrue(false)
  111.             except Exception as e:
  112.                 self.assertEquals(ValueError, type(e))
  113.                 self.assertEquals("Jobs cannot have circular dependencies",str(e))
  114.                
  115.  
  116.     unittest.main()
  117.  
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement