1import base64
2from pathlib import Path
3import re
4import runpy
5import shutil
6from tempfile import TemporaryDirectory
7import unittest
8import xml.etree.ElementTree as ET
9
10from native_xml import ns
11
12ROOT = Path(__file__).resolve().parent.parent
13FIXTURE = ROOT / 'corpus/picture-edit'
14compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare']
15
16
17def native_page(notebook, cold):
18 with TemporaryDirectory() as temporary:
19 read = Path(temporary) / 'read'
20 shutil.copytree(cold / 'read', read)
21 compare(notebook, read)
22 page, = (ET.parse(path).getroot() for path in sorted((cold / 'read').glob('page-*.xml')))
23 return page
24
25
26def texts(page):
27 return [re.sub(r'<[^>]*>', '', t.text or '') for t in page.findall('.//one:OE/one:T', ns)]
28
29
30class PictureEditTest(unittest.TestCase):
31 def test_a_rust_inserted_picture_renders_natively_with_its_payload(self):
32 page = native_page(FIXTURE / 'inserted/candidate', FIXTURE / 'inserted/cold')
33 image, = page.iter('{%s}Image' % ns['one'])
34 self.assertEqual(image.get('format'), 'png')
35 payload = base64.b64decode(image.find('one:Data', ns).text)
36 self.assertEqual(payload[:8], b'\x89PNG\r\n\x1a\n')
37 self.assertEqual(len(payload), 69)
38 self.assertIsNone(image.find('one:Size', ns))
39 self.assertEqual(texts(page), ['Before the picture', 'After the picture'])
40
41 def test_onenote_resizes_a_rust_inserted_picture_through_its_layout(self):
42 page = native_page(FIXTURE / 'native-resize/notebook', FIXTURE / 'native-resize')
43 image, = page.iter('{%s}Image' % ns['one'])
44 size = image.find('one:Size', ns)
45 self.assertEqual((size.get('width'), size.get('height'), size.get('isSetByUser')), ('144.0', '108.0', 'true'))
46 self.assertEqual(image.get('alt'), 'Resized by OneNote')
47 self.assertEqual(len(base64.b64decode(image.find('one:Data', ns).text)), 69)
48
49 def test_a_rust_resized_native_picture_renders_with_its_size_and_description(self):
50 page = native_page(FIXTURE / 'resized/candidate', FIXTURE / 'resized/cold')
51 image, = page.iter('{%s}Image' % ns['one'])
52 size = image.find('one:Size', ns)
53 self.assertEqual((size.get('width'), size.get('height'), size.get('isSetByUser')), ('144.0', '108.0', 'true'))
54 self.assertEqual(image.get('alt'), 'Resized in Rust')
55
56 def test_onenote_places_a_picture_directly_on_a_page_with_a_rust_picture(self):
57 page = native_page(FIXTURE / 'native-page-level/notebook', FIXTURE / 'native-page-level')
58 images = list(page.iter('{%s}Image' % ns['one']))
59 self.assertEqual(len(images), 2)
60 placed = page.find('one:Image', ns)
61 self.assertEqual(placed.get('alt'), 'Page-level picture')
62 position = placed.find('one:Position', ns)
63 self.assertEqual((position.get('x'), position.get('y')), ('360.0', '240.0'))
64
65 def test_a_rust_page_level_picture_renders_with_its_position_size_and_description(self):
66 page = native_page(FIXTURE / 'page-level/candidate', FIXTURE / 'page-level/cold')
67 placed = page.find('one:Image', ns)
68 self.assertIsNotNone(placed)
69 position = placed.find('one:Position', ns)
70 self.assertEqual((position.get('x'), position.get('y')), ('360.0', '240.0'))
71 size = placed.find('one:Size', ns)
72 self.assertEqual((size.get('width'), size.get('height'), size.get('isSetByUser')), ('96.00000762939453', '71.99998474121093', 'true'))
73 self.assertEqual(placed.get('alt'), 'Placed in Rust')
74 self.assertEqual(texts(page), ['Beside the picture'])
75
76
77if __name__ == '__main__':
78 unittest.main()