test_font.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import unittest
  2. import tkinter
  3. from tkinter import font
  4. from test.support import requires, run_unittest, gc_collect
  5. from tkinter.test.support import AbstractTkTest
  6. requires('gui')
  7. fontname = "TkDefaultFont"
  8. class FontTest(AbstractTkTest, unittest.TestCase):
  9. @classmethod
  10. def setUpClass(cls):
  11. AbstractTkTest.setUpClass.__func__(cls)
  12. try:
  13. cls.font = font.Font(root=cls.root, name=fontname, exists=True)
  14. except tkinter.TclError:
  15. cls.font = font.Font(root=cls.root, name=fontname, exists=False)
  16. def test_configure(self):
  17. options = self.font.configure()
  18. self.assertGreaterEqual(set(options),
  19. {'family', 'size', 'weight', 'slant', 'underline', 'overstrike'})
  20. for key in options:
  21. self.assertEqual(self.font.cget(key), options[key])
  22. self.assertEqual(self.font[key], options[key])
  23. for key in 'family', 'weight', 'slant':
  24. self.assertIsInstance(options[key], str)
  25. self.assertIsInstance(self.font.cget(key), str)
  26. self.assertIsInstance(self.font[key], str)
  27. sizetype = int if self.wantobjects else str
  28. for key in 'size', 'underline', 'overstrike':
  29. self.assertIsInstance(options[key], sizetype)
  30. self.assertIsInstance(self.font.cget(key), sizetype)
  31. self.assertIsInstance(self.font[key], sizetype)
  32. def test_unicode_family(self):
  33. family = 'MS \u30b4\u30b7\u30c3\u30af'
  34. try:
  35. f = font.Font(root=self.root, family=family, exists=True)
  36. except tkinter.TclError:
  37. f = font.Font(root=self.root, family=family, exists=False)
  38. self.assertEqual(f.cget('family'), family)
  39. del f
  40. gc_collect()
  41. def test_actual(self):
  42. options = self.font.actual()
  43. self.assertGreaterEqual(set(options),
  44. {'family', 'size', 'weight', 'slant', 'underline', 'overstrike'})
  45. for key in options:
  46. self.assertEqual(self.font.actual(key), options[key])
  47. for key in 'family', 'weight', 'slant':
  48. self.assertIsInstance(options[key], str)
  49. self.assertIsInstance(self.font.actual(key), str)
  50. sizetype = int if self.wantobjects else str
  51. for key in 'size', 'underline', 'overstrike':
  52. self.assertIsInstance(options[key], sizetype)
  53. self.assertIsInstance(self.font.actual(key), sizetype)
  54. def test_name(self):
  55. self.assertEqual(self.font.name, fontname)
  56. self.assertEqual(str(self.font), fontname)
  57. def test_eq(self):
  58. font1 = font.Font(root=self.root, name=fontname, exists=True)
  59. font2 = font.Font(root=self.root, name=fontname, exists=True)
  60. self.assertIsNot(font1, font2)
  61. self.assertEqual(font1, font2)
  62. self.assertNotEqual(font1, font1.copy())
  63. self.assertNotEqual(font1, 0)
  64. def test_measure(self):
  65. self.assertIsInstance(self.font.measure('abc'), int)
  66. def test_metrics(self):
  67. metrics = self.font.metrics()
  68. self.assertGreaterEqual(set(metrics),
  69. {'ascent', 'descent', 'linespace', 'fixed'})
  70. for key in metrics:
  71. self.assertEqual(self.font.metrics(key), metrics[key])
  72. self.assertIsInstance(metrics[key], int)
  73. self.assertIsInstance(self.font.metrics(key), int)
  74. def test_families(self):
  75. families = font.families(self.root)
  76. self.assertIsInstance(families, tuple)
  77. self.assertTrue(families)
  78. for family in families:
  79. self.assertIsInstance(family, str)
  80. self.assertTrue(family)
  81. def test_names(self):
  82. names = font.names(self.root)
  83. self.assertIsInstance(names, tuple)
  84. self.assertTrue(names)
  85. for name in names:
  86. self.assertIsInstance(name, str)
  87. self.assertTrue(name)
  88. self.assertIn(fontname, names)
  89. tests_gui = (FontTest, )
  90. if __name__ == "__main__":
  91. run_unittest(*tests_gui)