test_converter.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import unittest
  2. from unittest.mock import Mock, patch, MagicMock
  3. from pdfminer.layout import LTPage, LTChar, LTLine
  4. from pdfminer.pdfinterp import PDFResourceManager
  5. from pdf2zh.converter import PDFConverterEx, TranslateConverter
  6. class TestPDFConverterEx(unittest.TestCase):
  7. def setUp(self):
  8. self.rsrcmgr = PDFResourceManager()
  9. self.converter = PDFConverterEx(self.rsrcmgr)
  10. def test_begin_page(self):
  11. mock_page = Mock()
  12. mock_page.pageno = 1
  13. mock_page.cropbox = (0, 0, 100, 200)
  14. mock_ctm = [1, 0, 0, 1, 0, 0]
  15. self.converter.begin_page(mock_page, mock_ctm)
  16. self.assertIsNotNone(self.converter.cur_item)
  17. self.assertEqual(self.converter.cur_item.pageid, 1)
  18. def test_render_char(self):
  19. mock_matrix = (1, 2, 3, 4, 5, 6)
  20. mock_font = Mock()
  21. mock_font.to_unichr.return_value = "A"
  22. mock_font.char_width.return_value = 10
  23. mock_font.char_disp.return_value = (0, 0)
  24. graphic_state = Mock()
  25. self.converter.cur_item = Mock()
  26. result = self.converter.render_char(
  27. mock_matrix,
  28. mock_font,
  29. fontsize=12,
  30. scaling=1.0,
  31. rise=0,
  32. cid=65,
  33. ncs=None,
  34. graphicstate=graphic_state,
  35. )
  36. self.assertEqual(result, 120.0) # Expected text width
  37. class TestTranslateConverter(unittest.TestCase):
  38. def setUp(self):
  39. self.rsrcmgr = PDFResourceManager()
  40. self.layout = {1: Mock()}
  41. self.translator_class = Mock()
  42. self.converter = TranslateConverter(
  43. self.rsrcmgr,
  44. layout=self.layout,
  45. lang_in="en",
  46. lang_out="zh",
  47. service="google",
  48. )
  49. def test_translator_initialization(self):
  50. self.assertIsNotNone(self.converter.translator)
  51. self.assertEqual(self.converter.translator.lang_in, "en")
  52. self.assertEqual(self.converter.translator.lang_out, "zh-CN")
  53. @patch("pdf2zh.converter.TranslateConverter.receive_layout")
  54. def test_receive_layout(self, mock_receive_layout):
  55. mock_page = LTPage(1, (0, 0, 100, 200))
  56. mock_font = Mock()
  57. mock_font.fontname.return_value = "mock_font"
  58. mock_page.add(
  59. LTChar(
  60. matrix=(1, 2, 3, 4, 5, 6),
  61. font=mock_font,
  62. fontsize=12,
  63. scaling=1.0,
  64. rise=0,
  65. text="A",
  66. textwidth=10,
  67. textdisp=(1.0, 1.0),
  68. ncs=Mock(),
  69. graphicstate=Mock(),
  70. )
  71. )
  72. self.converter.receive_layout(mock_page)
  73. mock_receive_layout.assert_called_once_with(mock_page)
  74. def test_receive_layout_with_complex_formula(self):
  75. ltpage = LTPage(1, (0, 0, 500, 500))
  76. ltchar = Mock()
  77. ltchar.fontname.return_value = "mock_font"
  78. ltline = LTLine(0.1, (0, 0), (10, 20))
  79. ltpage.add(ltchar)
  80. ltpage.add(ltline)
  81. mock_layout = MagicMock()
  82. mock_layout.shape = (100, 100)
  83. mock_layout.__getitem__.return_value = -1
  84. self.converter.layout = [None, mock_layout]
  85. self.converter.thread = 1
  86. result = self.converter.receive_layout(ltpage)
  87. self.assertIsNotNone(result)
  88. def test_invalid_translation_service(self):
  89. with self.assertRaises(ValueError):
  90. TranslateConverter(
  91. self.rsrcmgr,
  92. layout=self.layout,
  93. lang_in="en",
  94. lang_out="zh",
  95. service="InvalidService",
  96. )
  97. if __name__ == "__main__":
  98. unittest.main()