PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
"""Test sidebar, coverage 93%""" import idlelib.sidebar from itertools import chain import unittest import unittest.mock from test.support import requires import tkinter as tk from idlelib.delegator import Delegator from idlelib.percolator import Percolator class Dummy_editwin: def __init__(self, text): self.text = text self.text_frame = self.text.master self.per = Percolator(text) self.undo = Delegator() self.per.insertfilter(self.undo) def setvar(self, name, value): pass def getlineno(self, index): return int(float(self.text.index(index))) class LineNumbersTest(unittest.TestCase): @classmethod def setUpClass(cls): requires('gui') cls.root = tk.Tk() cls.text_frame = tk.Frame(cls.root) cls.text_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) cls.text_frame.rowconfigure(1, weight=1) cls.text_frame.columnconfigure(1, weight=1) cls.text = tk.Text(cls.text_frame, width=80, height=24, wrap=tk.NONE) cls.text.grid(row=1, column=1, sticky=tk.NSEW) cls.editwin = Dummy_editwin(cls.text) cls.editwin.vbar = tk.Scrollbar(cls.text_frame) @classmethod def tearDownClass(cls): cls.editwin.per.close() cls.root.update() cls.root.destroy() del cls.text, cls.text_frame, cls.editwin, cls.root def setUp(self): self.linenumber = idlelib.sidebar.LineNumbers(self.editwin) self.highlight_cfg = {"background": '#abcdef', "foreground": '#123456'} orig_idleConf_GetHighlight = idlelib.sidebar.idleConf.GetHighlight def mock_idleconf_GetHighlight(theme, element): if element == 'linenumber': return self.highlight_cfg return orig_idleConf_GetHighlight(theme, element) GetHighlight_patcher = unittest.mock.patch.object( idlelib.sidebar.idleConf, 'GetHighlight', mock_idleconf_GetHighlight) GetHighlight_patcher.start() self.addCleanup(GetHighlight_patcher.stop) self.font_override = 'TkFixedFont' def mock_idleconf_GetFont(root, configType, section): return self.font_override GetFont_patcher = unittest.mock.patch.object( idlelib.sidebar.idleConf, 'GetFont', mock_idleconf_GetFont) GetFont_patcher.start() self.addCleanup(GetFont_patcher.stop) def tearDown(self): self.text.delete('1.0', 'end') def get_selection(self): return tuple(map(str, self.text.tag_ranges('sel'))) def get_line_screen_position(self, line): bbox = self.linenumber.sidebar_text.bbox(f'{line}.end -1c') x = bbox[0] + 2 y = bbox[1] + 2 return x, y def assert_state_disabled(self): state = self.linenumber.sidebar_text.config()['state'] self.assertEqual(state[-1], tk.DISABLED) def get_sidebar_text_contents(self): return self.linenumber.sidebar_text.get('1.0', tk.END) def assert_sidebar_n_lines(self, n_lines): expected = '\n'.join(chain(map(str, range(1, n_lines + 1)), [''])) self.assertEqual(self.get_sidebar_text_contents(), expected) def assert_text_equals(self, expected): return self.assertEqual(self.text.get('1.0', 'end'), expected) def test_init_empty(self): self.assert_sidebar_n_lines(1) def test_init_not_empty(self): self.text.insert('insert', 'foo bar\n'*3) self.assert_text_equals('foo bar\n'*3 + '\n') self.assert_sidebar_n_lines(4) def test_toggle_linenumbering(self): self.assertEqual(self.linenumber.is_shown, False) self.linenumber.show_sidebar() self.assertEqual(self.linenumber.is_shown, True) self.linenumber.hide_sidebar() self.assertEqual(self.linenumber.is_shown, False) self.linenumber.hide_sidebar() self.assertEqual(self.linenumber.is_shown, False) self.linenumber.show_sidebar() self.assertEqual(self.linenumber.is_shown, True) self.linenumber.show_sidebar() self.assertEqual(self.linenumber.is_shown, True) def test_insert(self): self.text.insert('insert', 'foobar') self.assert_text_equals('foobar\n') self.assert_sidebar_n_lines(1) self.assert_state_disabled() self.text.insert('insert', '\nfoo') self.assert_text_equals('foobar\nfoo\n') self.assert_sidebar_n_lines(2) self.assert_state_disabled() self.text.insert('insert', 'hello\n'*2) self.assert_text_equals('foobar\nfoohello\nhello\n\n') self.assert_sidebar_n_lines(4) self.assert_state_disabled() self.text.insert('insert', '\nworld') self.assert_text_equals('foobar\nfoohello\nhello\n\nworld\n') self.assert_sidebar_n_lines(5) self.assert_state_disabled() def test_delete(self): self.text.insert('insert', 'foobar') self.assert_text_equals('foobar\n') self.text.delete('1.1', '1.3') self.assert_text_equals('fbar\n') self.assert_sidebar_n_lines(1) self.assert_state_disabled() self.text.insert('insert', 'foo\n'*2) self.assert_text_equals('fbarfoo\nfoo\n\n') self.assert_sidebar_n_lines(3) self.assert_state_disabled() # Note: deleting up to "2.end" doesn't delete the final newline. self.text.delete('2.0', '2.end') self.assert_text_equals('fbarfoo\n\n\n') self.assert_sidebar_n_lines(3) self.assert_state_disabled() self.text.delete('1.3', 'end') self.assert_text_equals('fba\n') self.assert_sidebar_n_lines(1) self.assert_state_disabled() # Note: Text widgets always keep a single '\n' character at the end. self.text.delete('1.0', 'end') self.assert_text_equals('\n') self.assert_sidebar_n_lines(1) self.assert_state_disabled() def test_sidebar_text_width(self): """ Test that linenumber text widget is always at the minimum width """ def get_width(): return self.linenumber.sidebar_text.config()['width'][-1] self.assert_sidebar_n_lines(1) self.assertEqual(get_width(), 1) self.text.insert('insert', 'foo') self.assert_sidebar_n_lines(1) self.assertEqual(get_width(), 1) self.text.insert('insert', 'foo\n'*8) self.assert_sidebar_n_lines(9) self.assertEqual(get_width(), 1) self.text.insert('insert', 'foo\n') self.assert_sidebar_n_lines(10) self.assertEqual(get_width(), 2) self.text.insert('insert', 'foo\n') self.assert_sidebar_n_lines(11) self.assertEqual(get_width(), 2) self.text.delete('insert -1l linestart', 'insert linestart') self.assert_sidebar_n_lines(10) self.assertEqual(get_width(), 2) self.text.delete('insert -1l linestart', 'insert linestart') self.assert_sidebar_n_lines(9) self.assertEqual(get_width(), 1) self.text.insert('insert', 'foo\n'*90) self.assert_sidebar_n_lines(99) self.assertEqual(get_width(), 2) self.text.insert('insert', 'foo\n') self.assert_sidebar_n_lines(100) self.assertEqual(get_width(), 3) self.text.insert('insert', 'foo\n') self.assert_sidebar_n_lines(101) self.assertEqual(get_width(), 3) self.text.delete('insert -1l linestart', 'insert linestart') self.assert_sidebar_n_lines(100) self.assertEqual(get_width(), 3) self.text.delete('insert -1l linestart', 'insert linestart') self.assert_sidebar_n_lines(99) self.assertEqual(get_width(), 2) self.text.delete('50.0 -1c', 'end -1c') self.assert_sidebar_n_lines(49) self.assertEqual(get_width(), 2) self.text.delete('5.0 -1c', 'end -1c') self.assert_sidebar_n_lines(4) self.assertEqual(get_width(), 1) # Note: Text widgets always keep a single '\n' character at the end. self.text.delete('1.0', 'end -1c') self.assert_sidebar_n_lines(1) self.assertEqual(get_width(), 1) def test_click_selection(self): self.linenumber.show_sidebar() self.text.insert('1.0', 'one\ntwo\nthree\nfour\n') self.root.update() # Click on the second line. x, y = self.get_line_screen_position(2) self.linenumber.sidebar_text.event_generate('', x=x, y=y) self.linenumber.sidebar_text.update() self.root.update() self.assertEqual(self.get_selection(), ('2.0', '3.0')) def simulate_drag(self, start_line, end_line): start_x, start_y = self.get_line_screen_position(start_line) end_x, end_y = self.get_line_screen_position(end_line) self.linenumber.sidebar_text.event_generate('', x=start_x, y=start_y) self.root.update() def lerp(a, b, steps): """linearly interpolate from a to b (inclusive) in equal steps""" last_step = steps - 1 for i in range(steps): yield ((last_step - i) / last_step) * a + (i / last_step) * b for x, y in zip( map(int, lerp(start_x, end_x, steps=11)), map(int, lerp(start_y, end_y, steps=11)), ): self.linenumber.sidebar_text.event_generate('', x=x, y=y) self.root.update() self.linenumber.sidebar_text.event_generate('', x=end_x, y=end_y) self.root.update() def test_drag_selection_down(self): self.linenumber.show_sidebar() self.text.insert('1.0', 'one\ntwo\nthree\nfour\nfive\n') self.root.update() # Drag from the second line to the fourth line. self.simulate_drag(2, 4) self.assertEqual(self.get_selection(), ('2.0', '5.0')) def test_drag_selection_up(self): self.linenumber.show_sidebar() self.text.insert('1.0', 'one\ntwo\nthree\nfour\nfive\n') self.root.update() # Drag from the fourth line to the second line. self.simulate_drag(4, 2) self.assertEqual(self.get_selection(), ('2.0', '5.0')) def test_scroll(self): self.linenumber.show_sidebar() self.text.insert('1.0', 'line\n' * 100) self.root.update() # Scroll down 10 lines. self.text.yview_scroll(10, 'unit') self.root.update() self.assertEqual(self.text.index('@0,0'), '11.0') self.assertEqual(self.linenumber.sidebar_text.index('@0,0'), '11.0') # Generate a mouse-wheel event and make sure it scrolled up or down. # The meaning of the "delta" is OS-dependant, so this just checks for # any change. self.linenumber.sidebar_text.event_generate('', x=0, y=0, delta=10) self.root.update() self.assertNotEqual(self.text.index('@0,0'), '11.0') self.assertNotEqual(self.linenumber.sidebar_text.index('@0,0'), '11.0') def test_font(self): ln = self.linenumber orig_font = ln.sidebar_text['font'] test_font = 'TkTextFont' self.assertNotEqual(orig_font, test_font) # Ensure line numbers aren't shown. ln.hide_sidebar() self.font_override = test_font # Nothing breaks when line numbers aren't shown. ln.update_font() # Activate line numbers, previous font change is immediately effective. ln.show_sidebar() self.assertEqual(ln.sidebar_text['font'], test_font) # Call the font update with line numbers shown, change is picked up. self.font_override = orig_font ln.update_font() self.assertEqual(ln.sidebar_text['font'], orig_font) def test_highlight_colors(self): ln = self.linenumber orig_colors = dict(self.highlight_cfg) test_colors = {'background': '#222222', 'foreground': '#ffff00'} def assert_colors_are_equal(colors): self.assertEqual(ln.sidebar_text['background'], colors['background']) self.assertEqual(ln.sidebar_text['foreground'], colors['foreground']) # Ensure line numbers aren't shown. ln.hide_sidebar() self.highlight_cfg = test_colors # Nothing breaks with inactive code context. ln.update_colors() # Show line numbers, previous colors change is immediately effective. ln.show_sidebar() assert_colors_are_equal(test_colors) # Call colors update with no change to the configured colors. ln.update_colors() assert_colors_are_equal(test_colors) # Call the colors update with line numbers shown, change is picked up. self.highlight_cfg = orig_colors ln.update_colors() assert_colors_are_equal(orig_colors) if __name__ == '__main__': unittest.main(verbosity=2)