Skip to content

Commit dfae4ba

Browse files
authored
Some new notepad messages added (bruderstein#361)
* add setUntitledName method * add getTabColorID method * add getNativeLangFileName method * docu updates and fixes * add get- and setLineNumberWidthMode methods * add get-, setExternalLexerAutoIndentMode and isAutoIndention methods * docu updates * MENUCOMMAND enum related cleanups and docu updates * fixes and new tests * make FontStyle tests more robust and cleanups * Skip ansi related test with PythonScript3 version * docu update about correct rereplace usage
1 parent 1eca866 commit dfae4ba

File tree

11 files changed

+675
-164
lines changed

11 files changed

+675
-164
lines changed

PythonScript/python_tests/RunTests.py

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,62 @@
22
import sys
33
import unittest
44
import os
5+
from Npp import console, notepad, MESSAGEBOXFLAGS
56

6-
# unittest module expects argv to be set
7-
sys.argv = ['']
7+
def main():
88

9-
(path, runTestsName) = os.path.split(__file__)
9+
# A debug build influences the test runs due to the assertions and print outputs.
10+
if notepad.messageBox(
11+
"Make sure you have a release build of the PythonScript plugin if you want to run the test suite.\n\nShould the test suite be started?",
12+
"Run Tests?",
13+
MESSAGEBOXFLAGS.ICONQUESTION | MESSAGEBOXFLAGS.YESNO
14+
) == MESSAGEBOXFLAGS.RESULTNO:
15+
return
1016

11-
test_suites = []
17+
# unittest module expects argv to be set
18+
sys.argv = ['']
1219

13-
results = unittest.TestResult()
14-
loader = unittest.TestLoader()
15-
test_suites = loader.discover(os.path.join(path, 'tests'))
20+
(path, runTestsName) = os.path.split(__file__)
1621

17-
alltests = unittest.TestSuite(test_suites)
22+
test_suites = []
1823

19-
console.show()
20-
console.clear()
24+
results = unittest.TestResult()
25+
loader = unittest.TestLoader()
26+
test_suites = loader.discover(os.path.join(path, 'tests'))
2127

22-
alltests.run(results)
28+
alltests = unittest.TestSuite(test_suites)
2329

24-
# console.write('Tests Run: {} Errors: {} Failures: {}'.format(results.testRun, results.errors, results.failures))
30+
console.clear()
2531

26-
def writeTestFailure(error):
27-
console.write('TEST: %s\n' % error[0])
28-
console.writeError(error[1])
29-
console.write('\n----------------------------\n')
3032

31-
if results.errors:
32-
for error in results.errors:
33-
writeTestFailure(error)
33+
alltests.run(results)
3434

35-
if results.failures:
36-
for error in results.failures:
37-
writeTestFailure(error)
35+
# console.write('Tests Run: {} Errors: {} Failures: {}'.format(results.testRun, results.errors, results.failures))
36+
37+
def writeTestFailure(error):
38+
console.write('TEST: %s\n' % error[0])
39+
console.writeError(error[1])
40+
console.write('\n----------------------------\n')
41+
42+
if results.errors:
43+
for error in results.errors:
44+
writeTestFailure(error)
45+
46+
if results.failures:
47+
for error in results.failures:
48+
writeTestFailure(error)
49+
50+
if results.errors or results.failures:
51+
console.writeError('Tests Run: {} Errors: {} Failures: {}\n'.format(results.testsRun, len(results.errors), len(results.failures)))
52+
else:
53+
console.write('Tests Run: {} Errors: {} Failures: {}\n'.format(results.testsRun, len(results.errors), len(results.failures)))
3854

39-
if results.errors or results.failures:
40-
console.writeError('Tests Run: {} Errors: {} Failures: {}\n'.format(results.testsRun, len(results.errors), len(results.failures)))
41-
else:
42-
console.write('Tests Run: {} Errors: {} Failures: {}\n'.format(results.testsRun, len(results.errors), len(results.failures)))
4355
if results.skipped:
4456
console.write('Skipped: {}\n'.format(len(results.skipped)))
4557
for skipped_test in results.skipped:
4658
console.write(' {} - {}\n'.format(skipped_test[0], skipped_test[1]))
59+
60+
console.show()
61+
62+
63+
main()

PythonScript/python_tests/tests/test_NotepadWrapperTestCase.py

Lines changed: 129 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from threading import Timer
1111
import subprocess
1212

13-
from Npp import notepad, editor, console, WINVER, LANGTYPE, MENUCOMMAND, BUFFERENCODING
13+
from Npp import notepad, editor, console, WINVER, LANGTYPE, MENUCOMMAND, BUFFERENCODING, LINENUMWIDTHMODE
1414

1515
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool,
1616
ctypes.wintypes.HWND,
@@ -69,14 +69,11 @@ def _get_active_styler_xml(self):
6969
darkmode_enabled = xml_doc.find('GUIConfigs/GUIConfig[@name="DarkMode"]').get('enable')
7070
darkThemeName = xml_doc.find('GUIConfigs/GUIConfig[@name="DarkMode"]').get('darkThemeName')
7171
lightThemeName = xml_doc.find('GUIConfigs/GUIConfig[@name="DarkMode"]').get('lightThemeName')
72-
print(darkmode_enabled)
73-
themepath = os.path.join(self._get_config_directory(), r'stylers.xml')
72+
themepath = os.path.join(self._get_config_directory(), r'stylers.xml')
7473
if(darkmode_enabled != 'no'):
75-
print(darkThemeName)
76-
themepath = os.path.join(self._get_config_directory(), r'themes', darkThemeName)
74+
themepath = os.path.join(self._get_config_directory(), r'themes', darkThemeName)
7775
elif(lightThemeName != ''):
78-
print(lightThemeName)
79-
themepath = os.path.join(self._get_config_directory(), r'themes', lightThemeName)
76+
themepath = os.path.join(self._get_config_directory(), r'themes', lightThemeName)
8077
return themepath
8178

8279

@@ -447,26 +444,28 @@ def store_silent_updates(hwnd, lParam):
447444
f.close()
448445
beforeReload = editor.getText()
449446
# TODO: See https://github.com/notepad-plus-plus/notepad-plus-plus/issues/12418
450-
self.assertFalse(notepad.reloadFile(filename, False))
447+
self.assertTrue(notepad.reloadFile(filename, False))
451448
afterReload = editor.getText()
452449
notepad.close()
453450

454451
self.assertEqual(beforeReload, 'Reload test')
455452
self.assertEqual(afterReload, 'Updated outside')
456453

457454
def test_getPluginConfigDir(self):
458-
dir = notepad.getPluginConfigDir()
459-
self.assertTrue(dir.lower().endswith('plugins\\config'))
455+
cur_dir = notepad.getPluginConfigDir()
456+
self.assertTrue(cur_dir.lower().endswith('plugins\\config'))
460457

461458

462459
def test_nppCommandLineDir(self):
463-
dir = notepad.getNppDir()
460+
cur_dir = notepad.getNppDir()
464461
commandLine = notepad.getCommandLine()
465462

466-
nppExe = shlex.split(commandLine)[0]
463+
nppExe = shlex.split(commandLine, posix=False)[0]
467464
nppDirOfExe = os.path.dirname(nppExe)
468-
469-
self.assertEqual(dir, nppDirOfExe)
465+
if nppDirOfExe:
466+
self.assertEqual(cur_dir, nppDirOfExe, msg="Expected same value, got: {} vs. {}".format(cur_dir, nppDirOfExe))
467+
else:
468+
self.assertTrue(len(commandLine) != 0)
470469

471470

472471
# new tests
@@ -1501,7 +1500,8 @@ def start_monitor():
15011500

15021501
menu_handle = ctypes.windll.user32.SendMessageW(tabbar_context_menu_hwnd, MN_GETHMENU, 0, 0)
15031502
item_count = ctypes.windll.user32.GetMenuItemCount(menu_handle)
1504-
self.assertEqual(item_count, 16, msg=u'Expected 16 menu items but received:{}'.format(item_count))
1503+
# TODO: a hard-coded value is quite bad
1504+
self.assertEqual(item_count, 17, msg=u'Expected 17 menu items but received:{}'.format(item_count))
15051505
ctypes.windll.user32.SendMessageW(tabbar_context_menu_hwnd, WM_CLOSE, 0, 0)
15061506

15071507
timer = Timer(1, start_monitor)
@@ -1515,14 +1515,123 @@ def test_getPluginHomePath(self):
15151515
_, _, plugin_dir = notepad.getPluginHomePath().rpartition('\\')
15161516
self.assertTrue('plugins' == plugin_dir)
15171517

1518+
15181519
def test_getSettingsOnCloudPath(self):
15191520
''' Check if cloud path last part has default empty '''
15201521
self.__test_invalid_parameter_passed(notepad.getSettingsOnCloudPath)
15211522
_, _, cloud_dir = notepad.getSettingsOnCloudPath().rpartition('\\')
15221523
self.assertTrue('' == cloud_dir)
15231524

1525+
1526+
def test_setUntitledName(self):
1527+
''' '''
1528+
notepad_method = notepad.setUntitledName
1529+
with self.assertRaises(ArgumentError):
1530+
self._invalid_parameter_passed(notepad_method)
1531+
with self.assertRaises(ArgumentError):
1532+
self._invalid_parameter_passed(notepad_method, None,None)
1533+
with self.assertRaises(ArgumentError):
1534+
self._invalid_parameter_passed(notepad_method, None,None,None)
1535+
with self.assertRaises(ArgumentError):
1536+
self._invalid_parameter_passed(notepad_method, -1)
1537+
with self.assertRaises(ArgumentError):
1538+
self._invalid_parameter_passed(notepad_method, -1,-1,-1)
1539+
with self.assertRaises(ArgumentError):
1540+
self._invalid_parameter_passed(notepad_method, '','')
1541+
1542+
1543+
def test_getTabColorID(self):
1544+
''' '''
1545+
notepad_method = notepad.getTabColorID
1546+
with self.assertRaises(ArgumentError):
1547+
self._invalid_parameter_passed(notepad_method, None)
1548+
with self.assertRaises(ArgumentError):
1549+
self._invalid_parameter_passed(notepad_method, None,None)
1550+
with self.assertRaises(ArgumentError):
1551+
self._invalid_parameter_passed(notepad_method, None,None,None)
1552+
with self.assertRaises(ArgumentError):
1553+
self._invalid_parameter_passed(notepad_method, -1,-1,-1)
1554+
with self.assertRaises(ArgumentError):
1555+
self._invalid_parameter_passed(notepad_method, '','')
1556+
with self.assertRaises(ArgumentError):
1557+
self._invalid_parameter_passed(notepad_method, '42','42')
1558+
1559+
# first get the configured colors
1560+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_NONE)
1561+
tab_colour_none = notepad.getTabColorID()
1562+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_1)
1563+
tab_color_1 = notepad.getTabColorID()
1564+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_2)
1565+
tab_color_2 = notepad.getTabColorID()
1566+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_3)
1567+
tab_color_3 = notepad.getTabColorID()
1568+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_4)
1569+
tab_color_4 = notepad.getTabColorID()
1570+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_5)
1571+
tab_color_5 = notepad.getTabColorID()
1572+
1573+
# test
1574+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_NONE)
1575+
self.assertTrue(tab_colour_none == notepad.getTabColorID())
1576+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_1)
1577+
self.assertTrue(tab_color_1== notepad.getTabColorID())
1578+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_2)
1579+
self.assertTrue(tab_color_2== notepad.getTabColorID())
1580+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_3)
1581+
self.assertTrue(tab_color_3== notepad.getTabColorID())
1582+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_4)
1583+
self.assertTrue(tab_color_4== notepad.getTabColorID())
1584+
notepad.menuCommand(MENUCOMMAND.VIEW_TAB_COLOUR_5)
1585+
self.assertTrue(tab_color_5== notepad.getTabColorID())
1586+
1587+
1588+
def test_getNativeLangFileName(self):
1589+
''' '''
1590+
self.__test_invalid_parameter_passed(notepad.getNativeLangFileName)
1591+
1592+
1593+
def test_lineNumberWidthMode(self):
1594+
''' '''
1595+
self.__test_invalid_parameter_passed(notepad.getLineNumberWidthMode)
1596+
self.__test_invalid_parameter_passed(notepad.setLineNumberWidthMode)
1597+
1598+
mode = notepad.getLineNumberWidthMode()
1599+
if notepad.setLineNumberWidthMode(LINENUMWIDTHMODE.CONSTANT if mode == LINENUMWIDTHMODE.DYNAMIC else LINENUMWIDTHMODE.DYNAMIC):
1600+
changed_mode = notepad.getLineNumberWidthMode()
1601+
self.assertTrue(changed_mode != mode, msg="Expected different modes, got {} and {}".format(mode, changed_mode))
1602+
if notepad.setLineNumberWidthMode(LINENUMWIDTHMODE.CONSTANT if mode == LINENUMWIDTHMODE.CONSTANT else LINENUMWIDTHMODE.DYNAMIC):
1603+
revert_changed_mode = notepad.getLineNumberWidthMode()
1604+
self.assertTrue(revert_changed_mode == mode, msg="Expected same modes, got {} and {}".format(mode, changed_mode))
1605+
1606+
# TODO: How can this be tested in a meaningful way?
1607+
def test_getExternalLexerAutoIndentMode(self):
1608+
''' '''
1609+
notepad_method = notepad.getExternalLexerAutoIndentMode
1610+
with self.assertRaises(ArgumentError):
1611+
self._invalid_parameter_passed(notepad_method, None,None)
1612+
with self.assertRaises(ArgumentError):
1613+
self._invalid_parameter_passed(notepad_method, None,None,None)
1614+
with self.assertRaises(ArgumentError):
1615+
self._invalid_parameter_passed(notepad_method, -1)
1616+
with self.assertRaises(ArgumentError):
1617+
self._invalid_parameter_passed(notepad_method, -1,-1,-1)
1618+
with self.assertRaises(ArgumentError):
1619+
self._invalid_parameter_passed(notepad_method, '','')
1620+
1621+
# TODO: How can this be tested in a meaningful way?
1622+
def test_setExternalLexerAutoIndentMode(self):
1623+
''' '''
1624+
self.__test_invalid_parameter_passed(notepad.setExternalLexerAutoIndentMode)
1625+
1626+
# TODO: How can this be tested in a meaningful way?
1627+
def test_isAutoIndention(self):
1628+
''' '''
1629+
self.__test_invalid_parameter_passed(notepad.isAutoIndention)
1630+
1631+
1632+
suite = unittest.TestLoader().loadTestsFromTestCase(NotepadTestCase)
1633+
15241634
if __name__ == '__main__':
1525-
suite = unittest.TestLoader().loadTestsFromTestCase(NotepadTestCase)
15261635
alltests = unittest.TestSuite(suite)
15271636

15281637
results = unittest.TestResult()
@@ -1545,10 +1654,7 @@ def writeTestFailure(error):
15451654
console.writeError('Tests Run: {}\n Errors : {}\n Failures: {}\n'.format(results.testsRun, len(results.errors), len(results.failures)))
15461655
else:
15471656
console.write('Tests Run: {}\n Errors : {}\n Failures: {}\n'.format(results.testsRun, len(results.errors), len(results.failures)))
1548-
if results.skipped:
1549-
console.write('Skipped: {}\n'.format(len(results.skipped)))
1550-
for skipped_test in results.skipped:
1551-
console.write(' {} - {}\n'.format(skipped_test[0], skipped_test[1]))
1552-
console.show()
1553-
else:
1554-
suite = unittest.TestLoader().loadTestsFromTestCase(NotepadTestCase)
1657+
if results.skipped:
1658+
console.write('Skipped: {}\n'.format(len(results.skipped)))
1659+
for skipped_test in results.skipped:
1660+
console.write(' {} - {}\n'.format(skipped_test[0], skipped_test[1]))

PythonScript/python_tests/tests/test_ReplaceAnsiPythonFunction.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ def tearDown(self):
3333
editor.setSavePoint()
3434
notepad.close()
3535

36+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
3637
def test_replace_function(self):
3738
editor.rereplace(r'([a-z]+)([0-9]+)'.encode('windows-1252'), group2_with_counter)
3839
text = editor.getText()
3940
self.assertEqual(text, u'1231 54322 983\r\nä1234 ü54325 ö986\r\n'.encode('windows-1252'))
4041

42+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
4143
def test_unicode_replace_function(self):
42-
editor.rereplace(ur'([a-zäöü]+)([0-9]+)', group1_with_counter)
44+
editor.rereplace(r'([a-zäöü]+)([0-9]+)', group1_with_counter)
4345
text = editor.getText()
4446
self.assertEqual(text, u'abc1 def2 gh3\r\näbc4 üef5 öh6\r\n'.encode('windows-1252'))
4547

@@ -55,24 +57,27 @@ def groups_check(self, m):
5557
self.assertEqual(m.groups(), groups_data_correct[counter])
5658
return counter
5759

60+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
5861
def test_groups(self):
59-
editor.rereplace(ur'([a-zäöü]+)([0-9]+)', lambda m: self.groups_check(m))
62+
editor.rereplace(r'([a-zäöü]+)([0-9]+)', lambda m: self.groups_check(m))
6063
text = editor.getText()
6164
self.assertEqual(text, '1 2 3\r\n4 5 6\r\n')
6265

63-
66+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
6467
def test_groups_with_named_groups(self):
65-
editor.rereplace(ur'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: self.groups_check(m))
68+
editor.rereplace(r'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: self.groups_check(m))
6669
text = editor.getText()
6770
self.assertEqual(text, '1 2 3\r\n4 5 6\r\n')
6871

72+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
6973
def test_named_groups(self):
70-
editor.rereplace(ur'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: m.group('letters'))
74+
editor.rereplace(r'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: m.group('letters'))
7175
text = editor.getText()
7276
self.assertEqual(text, u'abc def gh\r\näbc üef öh\r\n'.encode('windows-1252'))
7377

78+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
7479
def test_named_groups_2(self):
75-
editor.rereplace(ur'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: m.group('numbers'))
80+
editor.rereplace(r'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: m.group('numbers'))
7681
text = editor.getText()
7782
self.assertEqual(text, '123 5432 98\r\n123 5432 98\r\n')
7883

@@ -89,8 +94,9 @@ def group_tuples_check(self, m):
8994
self.assertEqual(m.group(2, 'letters', 'numbers'), groups_data_correct[counter])
9095
return counter
9196

97+
@unittest.skipIf(notepad.getPluginVersion()[0] == '3', "not yet py3-compatible")
9298
def test_group_tuples(self):
93-
editor.rereplace(ur'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: self.group_tuples_check(m))
99+
editor.rereplace(r'(?<letters>[a-zäöü]+)(?<numbers>[0-9]+)', lambda m: self.group_tuples_check(m))
94100
text = editor.getText()
95101
self.assertEqual(text, '1 2 3\r\n4 5 6\r\n')
96102

0 commit comments

Comments
 (0)