input_test.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env python3
  2. # Copyright 2013 Google Inc. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. """Unit tests for the input.py file."""
  6. import unittest
  7. import gyp.input
  8. class TestFindCycles(unittest.TestCase):
  9. def setUp(self):
  10. self.nodes = {}
  11. for x in ("a", "b", "c", "d", "e"):
  12. self.nodes[x] = gyp.input.DependencyGraphNode(x)
  13. def _create_dependency(self, dependent, dependency):
  14. dependent.dependencies.append(dependency)
  15. dependency.dependents.append(dependent)
  16. def test_no_cycle_empty_graph(self):
  17. for label, node in self.nodes.items():
  18. self.assertEqual([], node.FindCycles())
  19. def test_no_cycle_line(self):
  20. self._create_dependency(self.nodes["a"], self.nodes["b"])
  21. self._create_dependency(self.nodes["b"], self.nodes["c"])
  22. self._create_dependency(self.nodes["c"], self.nodes["d"])
  23. for label, node in self.nodes.items():
  24. self.assertEqual([], node.FindCycles())
  25. def test_no_cycle_dag(self):
  26. self._create_dependency(self.nodes["a"], self.nodes["b"])
  27. self._create_dependency(self.nodes["a"], self.nodes["c"])
  28. self._create_dependency(self.nodes["b"], self.nodes["c"])
  29. for label, node in self.nodes.items():
  30. self.assertEqual([], node.FindCycles())
  31. def test_cycle_self_reference(self):
  32. self._create_dependency(self.nodes["a"], self.nodes["a"])
  33. self.assertEqual(
  34. [[self.nodes["a"], self.nodes["a"]]], self.nodes["a"].FindCycles()
  35. )
  36. def test_cycle_two_nodes(self):
  37. self._create_dependency(self.nodes["a"], self.nodes["b"])
  38. self._create_dependency(self.nodes["b"], self.nodes["a"])
  39. self.assertEqual(
  40. [[self.nodes["a"], self.nodes["b"], self.nodes["a"]]],
  41. self.nodes["a"].FindCycles(),
  42. )
  43. self.assertEqual(
  44. [[self.nodes["b"], self.nodes["a"], self.nodes["b"]]],
  45. self.nodes["b"].FindCycles(),
  46. )
  47. def test_two_cycles(self):
  48. self._create_dependency(self.nodes["a"], self.nodes["b"])
  49. self._create_dependency(self.nodes["b"], self.nodes["a"])
  50. self._create_dependency(self.nodes["b"], self.nodes["c"])
  51. self._create_dependency(self.nodes["c"], self.nodes["b"])
  52. cycles = self.nodes["a"].FindCycles()
  53. self.assertTrue([self.nodes["a"], self.nodes["b"], self.nodes["a"]] in cycles)
  54. self.assertTrue([self.nodes["b"], self.nodes["c"], self.nodes["b"]] in cycles)
  55. self.assertEqual(2, len(cycles))
  56. def test_big_cycle(self):
  57. self._create_dependency(self.nodes["a"], self.nodes["b"])
  58. self._create_dependency(self.nodes["b"], self.nodes["c"])
  59. self._create_dependency(self.nodes["c"], self.nodes["d"])
  60. self._create_dependency(self.nodes["d"], self.nodes["e"])
  61. self._create_dependency(self.nodes["e"], self.nodes["a"])
  62. self.assertEqual(
  63. [
  64. [
  65. self.nodes["a"],
  66. self.nodes["b"],
  67. self.nodes["c"],
  68. self.nodes["d"],
  69. self.nodes["e"],
  70. self.nodes["a"],
  71. ]
  72. ],
  73. self.nodes["a"].FindCycles(),
  74. )
  75. if __name__ == "__main__":
  76. unittest.main()