1919"""
2020
2121import logging
22+ import time
23+ from multiprocessing import Queue
2224from tempfile import mkdtemp
2325from typing import Any
2426
27+ import mock
2528import parameterized # type: ignore
2629import unittest2 # type: ignore
27- from mock import Mock
2830from pygls .types import DiagnosticSeverity , MessageType , Position , Range
2931
3032from hdl_checker import lsp
3133from hdl_checker .diagnostics import CheckerDiagnostic , DiagType
3234from hdl_checker .path import Path , TemporaryPath
35+ from hdl_checker .utils import debounce
3336
3437_logger = logging .getLogger (__name__ )
3538
@@ -51,7 +54,7 @@ class TestCheckerDiagToLspDict(unittest2.TestCase):
5154 (DiagType .NONE , DiagnosticSeverity .Error ),
5255 ]
5356 )
54- def test_converting_to_lsp (self , diag_type , severity ):
57+ def test_convertingDiagnosticType (self , diag_type , severity ):
5558 # type: (...) -> Any
5659 """
5760 Test conversion between hdl_checker.DiagType to pygls.types.DiagnosticSeverity
@@ -81,12 +84,12 @@ def test_converting_to_lsp(self, diag_type, severity):
8184 ),
8285 )
8386
84- def test_workspace_notify (self ) -> None : # pylint: disable=no-self-use
87+ def test_workspaceNotify (self ) -> None : # pylint: disable=no-self-use
8588 """
8689 Test server notification messages call the appropriate LS methods
8790 """
88- workspace = Mock ()
89- workspace .show_message = Mock ()
91+ workspace = mock . Mock ()
92+ workspace .show_message = mock . Mock ()
9093
9194 server = lsp .Server (
9295 workspace , root_dir = TemporaryPath (mkdtemp (prefix = "hdl_checker_" ))
@@ -105,3 +108,59 @@ def test_workspace_notify(self) -> None: # pylint: disable=no-self-use
105108
106109 server ._handleUiError ("some error" ) # pylint: disable=protected-access
107110 workspace .show_message .assert_called_once_with ("some error" , MessageType .Error )
111+
112+ def test_debounceWithoutKey (self ):
113+ _logger .info ("#" * 100 )
114+ interval = 0.1
115+
116+ queue = Queue ()
117+
118+ def func (arg ):
119+ _logger .info ("Called with %s" , arg )
120+ queue .put (arg )
121+
122+ wrapped = debounce (interval )(func )
123+ self .assertTrue (queue .empty ())
124+
125+ wrapped (1 )
126+ wrapped (2 )
127+ self .assertTrue (queue .empty ())
128+
129+ time .sleep (2 * interval )
130+
131+ self .assertEqual (queue .get (1 ), 2 )
132+ self .assertTrue (queue .empty ())
133+
134+ def test_debounceWithKey (self ):
135+ _logger .info ("#" * 100 )
136+ interval = 0.1
137+
138+ obj = mock .Mock ()
139+
140+ def func (arg ):
141+ _logger .info ("Called with %s" , arg )
142+ obj (arg )
143+
144+ wrapped = debounce (interval , "arg" )(func )
145+ obj .assert_not_called ()
146+
147+ wrapped (1 )
148+ wrapped (2 )
149+ wrapped (3 )
150+
151+ obj .assert_not_called ()
152+
153+ time .sleep (2 * interval )
154+
155+ obj .assert_has_calls (
156+ [mock .call (1 ), mock .call (2 ), mock .call (3 ),], any_order = True
157+ )
158+
159+ wrapped (4 )
160+ wrapped (4 )
161+ wrapped (4 )
162+ time .sleep (2 * interval )
163+
164+ obj .assert_has_calls (
165+ [mock .call (1 ), mock .call (2 ), mock .call (3 ), mock .call (4 ),], any_order = True
166+ )
0 commit comments