test_names.py 9.2 KB

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