test_names.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import os
  2. import platform
  3. from grass.gunittest.case import TestCase
  4. from grass.gunittest.main import test
  5. import grass.script as gs
  6. from grass.script import legal_name
  7. from grass.script import utils
  8. class TestUnique(TestCase):
  9. """Tests functions generating unique names and suffixes"""
  10. def test_append_node_pid(self):
  11. base_name = "tmp_abc"
  12. full_name = utils.append_node_pid(base_name)
  13. self.assertIn(base_name, full_name)
  14. self.assertGreater(len(full_name), len(base_name))
  15. self.assertIn(str(os.getpid()), full_name)
  16. self.assertIn(utils.legalize_vector_name(platform.node()), full_name)
  17. self.assertTrue(legal_name(full_name))
  18. # TODO: It should be also a valid vector name
  19. # but we don't have a function for that (same for all)
  20. full_name2 = utils.append_node_pid(base_name)
  21. self.assertEqual(
  22. full_name, full_name2, msg="There should be no randomness or change."
  23. )
  24. def test_append_uuid(self):
  25. base_name = "tmp_abc"
  26. full_name = utils.append_uuid(base_name)
  27. self.assertIn(base_name, full_name)
  28. self.assertGreater(len(full_name), len(base_name))
  29. self.assertTrue(legal_name(full_name))
  30. full_name2 = utils.append_uuid(base_name)
  31. # There is a low chance of collision.
  32. self.assertNotEqual(full_name, full_name2)
  33. def test_append_random_suffix(self):
  34. base_name = "tmp_abc"
  35. size = 10
  36. full_name = utils.append_random(base_name, suffix_length=size)
  37. self.assertIn(base_name, full_name)
  38. self.assertGreater(len(full_name), len(base_name))
  39. self.assertGreaterEqual(len(full_name), len(base_name) + size)
  40. self.assertTrue(legal_name(full_name))
  41. full_name2 = utils.append_random(base_name, suffix_length=size)
  42. # There is a low chance of collision.
  43. self.assertNotEqual(full_name, full_name2)
  44. def test_append_random_total(self):
  45. base_name = "tmp_abc"
  46. size = 10
  47. full_name = utils.append_random(base_name, total_length=size)
  48. self.assertIn(base_name, full_name)
  49. self.assertGreater(len(full_name), len(base_name))
  50. self.assertEqual(len(full_name), size)
  51. self.assertTrue(legal_name(full_name))
  52. full_name2 = utils.append_random(base_name, total_length=size)
  53. self.assertNotEqual(full_name, full_name2)
  54. def test_append_random_one_arg(self):
  55. base_name = "tmp_abc"
  56. size = 10
  57. full_name = utils.append_random(base_name, size)
  58. self.assertIn(base_name, full_name)
  59. self.assertGreater(len(full_name), len(base_name))
  60. self.assertGreaterEqual(len(full_name), len(base_name) + size)
  61. self.assertTrue(legal_name(full_name))
  62. full_name2 = utils.append_random(base_name, size)
  63. self.assertNotEqual(full_name, full_name2)
  64. def test_append_random_two_args(self):
  65. base_name = "tmp_abc"
  66. size = 10
  67. self.assertRaises(ValueError, utils.append_random, base_name, size, size)
  68. def test_append_random_total_name_too_long(self):
  69. base_name = "tmp_abc"
  70. size = 4
  71. self.assertRaises(ValueError, utils.append_random, base_name, total_length=size)
  72. class TestLegalizeVectorName(TestCase):
  73. """Tests legalize_vector_name() function"""
  74. # Names for general tests (input, output)
  75. # Not ideal as the only tests don't show which one failed for errors which
  76. # are not assert failures.
  77. # Good for adding new combinations.
  78. names = [
  79. ("a", "a"),
  80. ("__abc__", "x__abc__"),
  81. ("125", "x125"),
  82. ("1a25g78g", "x1a25g78g"),
  83. ("_X1", "x_X1"),
  84. ("øaøbøcø", "x_a_b_c_"),
  85. ]
  86. def works_for_vector_table_column(self, name):
  87. """Try to create vector, with attribute table and a column with name
  88. Returns false when that fails. Does not report further errors.
  89. Use together with other tests.
  90. """
  91. try:
  92. gs.run_command("v.edit", map=name, tool="create")
  93. gs.run_command("v.db.addtable", map=name)
  94. gs.run_command("v.db.addcolumn", map=name, columns=name)
  95. works = True
  96. except gs.CalledModuleError:
  97. works = False
  98. finally:
  99. gs.run_command("g.remove", name=name, type="vector", flags="f")
  100. return works
  101. def test_is_legal_name(self):
  102. """Check that it is a G_legal_name()"""
  103. for name, reference in self.names:
  104. legalized = utils.legalize_vector_name(name)
  105. self.assertTrue(legal_name(legalized))
  106. self.assertEqual(legalized, reference)
  107. def test_is_working_in_vector_table_column(self):
  108. """Check that a vector and column can be created
  109. This indirectly tests that it is Vect_legal_name().
  110. """
  111. for name, reference in self.names:
  112. legalized = utils.legalize_vector_name(name)
  113. self.assertTrue(self.works_for_vector_table_column(legalized))
  114. self.assertEqual(legalized, reference)
  115. def test_no_change(self):
  116. """There should be no change if the name is valid already"""
  117. name = "perfectly_valid_name"
  118. legalized = utils.legalize_vector_name(name)
  119. self.assertEqual(legalized, name)
  120. self.assertTrue(legal_name(legalized))
  121. self.assertTrue(self.works_for_vector_table_column(legalized))
  122. def test_has_dashes(self):
  123. """Check behavior with dash (a typical and important case)"""
  124. name = "abc-def-1"
  125. legalized = utils.legalize_vector_name(name)
  126. self.assertEqual(legalized, "abc_def_1")
  127. self.assertTrue(legal_name(legalized))
  128. self.assertTrue(self.works_for_vector_table_column(legalized))
  129. def test_has_spaces(self):
  130. """Check behavior with a space"""
  131. name = "abc def 1"
  132. legalized = utils.legalize_vector_name(name)
  133. self.assertEqual(legalized, "abc_def_1")
  134. self.assertTrue(legal_name(legalized))
  135. self.assertTrue(self.works_for_vector_table_column(legalized))
  136. def test_has_at_sign(self):
  137. """Check behavior with @
  138. This can happen, e.g., when a full map name is used, so testing
  139. explicitly.
  140. """
  141. name = "abc@def"
  142. legalized = utils.legalize_vector_name(name)
  143. self.assertEqual(legalized, "abc_def")
  144. self.assertTrue(legal_name(legalized))
  145. self.assertTrue(self.works_for_vector_table_column(legalized))
  146. def test_has_dollar(self):
  147. """Check with one invalid character"""
  148. name = "abc_$def"
  149. legalized = utils.legalize_vector_name(name)
  150. self.assertEqual(legalized, "abc__def")
  151. self.assertTrue(legal_name(legalized))
  152. self.assertTrue(self.works_for_vector_table_column(legalized))
  153. def test_with_ascii_art(self):
  154. """Check with a lot of invalid characters"""
  155. name = "abc_>>>def<<<_!"
  156. legalized = utils.legalize_vector_name(name)
  157. self.assertEqual(legalized, "abc____def_____")
  158. self.assertTrue(legal_name(legalized))
  159. self.assertTrue(self.works_for_vector_table_column(legalized))
  160. def test_starts_with_digit(self):
  161. """Check string starting with digit"""
  162. name = "123456"
  163. legalized = utils.legalize_vector_name(name)
  164. self.assertEqual(legalized, "x123456")
  165. self.assertTrue(legal_name(legalized))
  166. self.assertTrue(self.works_for_vector_table_column(legalized))
  167. def test_starts_with_underscore(self):
  168. """Check string starting with underscore"""
  169. name = "_123456"
  170. legalized = utils.legalize_vector_name(name)
  171. self.assertEqual(legalized, "x_123456")
  172. self.assertTrue(legal_name(legalized))
  173. self.assertTrue(self.works_for_vector_table_column(legalized))
  174. def test_has_unicode(self):
  175. """Check string with unicode"""
  176. name = "abøc"
  177. legalized = utils.legalize_vector_name(name)
  178. self.assertEqual(legalized, "ab_c")
  179. self.assertTrue(legal_name(legalized))
  180. self.assertTrue(self.works_for_vector_table_column(legalized))
  181. def test_starts_with_unicode(self):
  182. """Check string starting with unicode"""
  183. name = "øabc"
  184. legalized = utils.legalize_vector_name(name)
  185. self.assertEqual(legalized, "x_abc")
  186. self.assertTrue(legal_name(legalized))
  187. self.assertTrue(self.works_for_vector_table_column(legalized))
  188. def test_diff_only_first_character(self):
  189. """Check two string with only the first character being different"""
  190. name1 = "1800"
  191. name2 = "2800"
  192. legalized1 = utils.legalize_vector_name(name1)
  193. legalized2 = utils.legalize_vector_name(name2)
  194. self.assertNotEqual(legalized1, legalized2)
  195. def test_custom_prefix(self):
  196. """Check providing custom prefix"""
  197. name = "1800"
  198. prefix = "prefix_a1_"
  199. legalized = utils.legalize_vector_name(name, fallback_prefix=prefix)
  200. self.assertEqual(len(prefix) + len(name), len(legalized))
  201. self.assertIn(prefix, legalized)
  202. def test_no_prefix(self):
  203. """Check providing custom prefix"""
  204. name = "1800"
  205. legalized = utils.legalize_vector_name(name, fallback_prefix="")
  206. self.assertEqual(len(name), len(legalized))
  207. if __name__ == "__main__":
  208. test()