Completed
Push — master ( 2bc9f2...ef56ad )
by Lambda
01:45
created

test_delete_char_before_caret()   C

Complexity

Conditions 13

Size

Total Lines 17

Duplication

Lines 17
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 13
dl 17
loc 17
rs 5.2936
c 1
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like test_delete_char_before_caret() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
from unittest.mock import MagicMock
2
import pytest
3
4
from neovim_prompt.action import Action, DEFAULT_ACTION
5
6
7
@pytest.fixture
8
def action():
9
    return DEFAULT_ACTION
10
11
12
def test_Action():
13
    action = Action()
14
15
16
def test_action_register():
17
    callback = lambda prompt: None
18
    action = Action()
19
    action.register('prompt:test', callback)
20
    assert 'prompt:test' in action.registry
21
    assert action.registry['prompt:test'] == callback
22
23
24
def test_action_register_from_rules():
25
    callback = lambda prompt: None
26
    action = Action()
27
    action.register_from_rules([
28
        ('prompt:test1', callback),
29
        ('prompt:test2', callback),
30
    ])
31
    assert 'prompt:test1' in action.registry
32
    assert 'prompt:test2' in action.registry
33
    assert action.registry['prompt:test1'] == callback
34
    assert action.registry['prompt:test2'] == callback
35
36
37
def test_action_call(prompt):
38
    prompt.text = 'foo'
39
    callback = lambda prompt: prompt.text
40
    action = Action()
41
    action.register('prompt:test', callback)
42
    assert action.call(prompt, 'prompt:test') == 'foo'
43
44
    with pytest.raises(AttributeError):
45
        action.call(prompt, 'prompt:not_a_registered_action')
46
47
48
def test_Action_from_rules():
49
    callback = lambda prompt: None
50
    action = Action.from_rules([
51
        ('prompt:test1', callback),
52
        ('prompt:test2', callback),
53
    ])
54
    assert 'prompt:test1' in action.registry
55
    assert 'prompt:test2' in action.registry
56
    assert action.registry['prompt:test1'] == callback
57
    assert action.registry['prompt:test2'] == callback
58
59
60
def test_accept(prompt, action):
61
    from neovim_prompt.prompt import Status
62
    assert action.call(prompt, 'prompt:accept') == Status.accept
63
64
65
def test_cancel(prompt, action):
66
    from neovim_prompt.prompt import Status
67
    assert action.call(prompt, 'prompt:cancel') == Status.cancel
68
69
70
def test_toggle_insert_mode(prompt, action):
71
    from neovim_prompt.prompt import InsertMode
72
    prompt.insert_mode = InsertMode.insert
73
    assert action.call(prompt, 'prompt:toggle_insert_mode') is None
74
    assert prompt.insert_mode == InsertMode.replace
75
    assert action.call(prompt, 'prompt:toggle_insert_mode') is None
76
    assert prompt.insert_mode == InsertMode.insert
77
78
79 View Code Duplication
def test_delete_char_before_caret(prompt, action):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
80
    prompt.text = 'Hello Goodbye'
81
    prompt.caret.locus = 5
82
    assert action.call(prompt, 'prompt:delete_char_before_caret') is None
83
    assert prompt.text == 'Hell Goodbye'
84
    assert prompt.caret.locus == 4
85
86
    assert action.call(prompt, 'prompt:delete_char_before_caret') is None
87
    assert action.call(prompt, 'prompt:delete_char_before_caret') is None
88
    assert action.call(prompt, 'prompt:delete_char_before_caret') is None
89
    assert action.call(prompt, 'prompt:delete_char_before_caret') is None
90
    assert prompt.text == ' Goodbye'
91
    assert prompt.caret.locus == 0
92
93
    assert action.call(prompt, 'prompt:delete_char_before_caret') is None
94
    assert prompt.text == ' Goodbye'
95
    assert prompt.caret.locus == 0
96
97
98
def test_delete_char_under_caret(prompt, action):
99
    prompt.text = 'Hello Goodbye'
100
    prompt.caret.locus = 5
101
    assert action.call(prompt, 'prompt:delete_char_under_caret') is None
102
    assert prompt.text == 'HelloGoodbye'
103
    assert prompt.caret.locus == 5
104
105
106
def test_delete_text_after_caret(prompt, action):
107
    prompt.text = 'Hello Goodbye'
108
    prompt.caret.locus = 5
109
    assert action.call(prompt, 'prompt:delete_text_after_caret') is None
110
    assert prompt.text == 'Hello'
111
    assert prompt.caret.locus == 5
112
113
114
def test_delete_entire_text(prompt, action):
115
    prompt.text = 'Hello Goodbye'
116
    prompt.caret.locus = 5
117
    assert action.call(prompt, 'prompt:delete_entire_text') is None
118
    assert prompt.text == ''
119
    assert prompt.caret.locus == 0
120
121
122
def test_move_caret_to_left(prompt, action):
123
    prompt.text = 'Hello Goodbye'
124
    prompt.caret.locus = 5
125
    assert action.call(prompt, 'prompt:move_caret_to_left') is None
126
    assert prompt.text == 'Hello Goodbye'
127
    assert prompt.caret.locus == 4
128
129
    assert action.call(prompt, 'prompt:move_caret_to_left') is None
130
    assert action.call(prompt, 'prompt:move_caret_to_left') is None
131
    assert action.call(prompt, 'prompt:move_caret_to_left') is None
132
    assert action.call(prompt, 'prompt:move_caret_to_left') is None
133
    assert prompt.caret.locus == 0
134
    assert action.call(prompt, 'prompt:move_caret_to_left') is None
135
    assert prompt.caret.locus == 0
136
137
138 View Code Duplication
def test_move_caret_to_right(prompt, action):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
139
    prompt.text = 'Hello Goodbye'
140
    prompt.caret.locus = 5
141
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
142
    assert prompt.text == 'Hello Goodbye'
143
    assert prompt.caret.locus == 6
144
145
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
146
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
147
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
148
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
149
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
150
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
151
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
152
    assert prompt.caret.locus == 13
153
    assert action.call(prompt, 'prompt:move_caret_to_right') is None
154
    assert prompt.caret.locus == 13
155
156
157
def test_move_caret_to_head(prompt, action):
158
    prompt.text = 'Hello Goodbye'
159
    prompt.caret.locus = 5
160
    assert action.call(prompt, 'prompt:move_caret_to_head') is None
161
    assert prompt.text == 'Hello Goodbye'
162
    assert prompt.caret.locus == 0
163
    assert action.call(prompt, 'prompt:move_caret_to_head') is None
164
    assert prompt.caret.locus == 0
165
166
167
def test_move_caret_to_lead(prompt, action):
168
    prompt.text = '    Hello Goodbye'
169
    prompt.caret.locus = 9
170
    assert action.call(prompt, 'prompt:move_caret_to_lead') is None
171
    assert prompt.text == '    Hello Goodbye'
172 View Code Duplication
    assert prompt.caret.locus == 4
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
173
    assert action.call(prompt, 'prompt:move_caret_to_lead') is None
174
    assert prompt.caret.locus == 4
175
176
177
def test_move_caret_to_tail(prompt, action):
178
    prompt.text = 'Hello Goodbye'
179
    prompt.caret.locus = 5
180
    assert action.call(prompt, 'prompt:move_caret_to_tail') is None
181
    assert prompt.text == 'Hello Goodbye'
182
    assert prompt.caret.locus == 13
183
    assert action.call(prompt, 'prompt:move_caret_to_tail') is None
184
    assert prompt.caret.locus == 13
185
186
187
def test_assign_previous_text(prompt, action):
188
    prompt.history = MagicMock()
189
    prompt.history.previous.side_effect = [
190
        'foo', 'bar', 'hoge',
191
    ]
192 View Code Duplication
    prompt.text = 'Hello Goodbye'
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
193
    prompt.caret.locus = 5
194
    assert action.call(prompt, 'prompt:assign_previous_text') is None
195
    assert prompt.text == 'foo'
196
    assert prompt.caret.locus == len(prompt.text)
197
198
    assert action.call(prompt, 'prompt:assign_previous_text') is None
199
    assert prompt.text == 'bar'
200
    assert prompt.caret.locus == len(prompt.text)
201
202
    assert action.call(prompt, 'prompt:assign_previous_text') is None
203
    assert prompt.text == 'hoge'
204
    assert prompt.caret.locus == len(prompt.text)
205
206
207
def test_assign_next_text(prompt, action):
208
    prompt.history = MagicMock()
209
    prompt.history.next.side_effect = [
210
        'foo', 'bar', 'hoge',
211
    ]
212 View Code Duplication
    prompt.text = 'Hello Goodbye'
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
213
    prompt.caret.locus = 5
214
    assert action.call(prompt, 'prompt:assign_next_text') is None
215
    assert prompt.text == 'foo'
216
    assert prompt.caret.locus == len(prompt.text)
217
218
    assert action.call(prompt, 'prompt:assign_next_text') is None
219
    assert prompt.text == 'bar'
220
    assert prompt.caret.locus == len(prompt.text)
221
222
    assert action.call(prompt, 'prompt:assign_next_text') is None
223
    assert prompt.text == 'hoge'
224
    assert prompt.caret.locus == len(prompt.text)
225
226
227
def test_assign_previous_matched_text(prompt, action):
228
    prompt.history = MagicMock()
229
    prompt.history.previous_match.side_effect = [
230
        'foo', 'bar', 'hoge',
231
    ]
232 View Code Duplication
    prompt.text = 'Hello Goodbye'
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
233
    prompt.caret.locus = 5
234
    assert action.call(prompt, 'prompt:assign_previous_matched_text') is None
235
    assert prompt.text == 'foo'
236
    assert prompt.caret.locus == len(prompt.text)
237
238
    assert action.call(prompt, 'prompt:assign_previous_matched_text') is None
239
    assert prompt.text == 'bar'
240
    assert prompt.caret.locus == len(prompt.text)
241
242
    assert action.call(prompt, 'prompt:assign_previous_matched_text') is None
243
    assert prompt.text == 'hoge'
244
    assert prompt.caret.locus == len(prompt.text)
245
246
247
def test_assign_next_matched_text(prompt, action):
248
    prompt.history = MagicMock()
249
    prompt.history.next_match.side_effect = [
250
        'foo', 'bar', 'hoge',
251
    ]
252
    prompt.text = 'Hello Goodbye'
253
    prompt.caret.locus = 5
254
    assert action.call(prompt, 'prompt:assign_next_matched_text') is None
255
    assert prompt.text == 'foo'
256
    assert prompt.caret.locus == len(prompt.text)
257
258
    assert action.call(prompt, 'prompt:assign_next_matched_text') is None
259
    assert prompt.text == 'bar'
260
    assert prompt.caret.locus == len(prompt.text)
261
262
    assert action.call(prompt, 'prompt:assign_next_matched_text') is None
263
    assert prompt.text == 'hoge'
264
    assert prompt.caret.locus == len(prompt.text)
265 View Code Duplication
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
266
267
def test_paste_from_register(prompt, action):
268
    prompt.nvim.eval = MagicMock()
269
    prompt.nvim.call = MagicMock()
270
    prompt.nvim.command = MagicMock()
271
    prompt.nvim.eval.return_value = 'a'
272
    prompt.nvim.call.side_effect = lambda fname, reg: '<%s>' % reg
273
    prompt.text = 'Hello Goodbye'
274
    prompt.caret.locus = 5
275
    assert action.call(prompt, 'prompt:paste_from_register') is None
276
    assert prompt.text == 'Hello<a> Goodbye'
277
    assert prompt.caret.locus == 8
278
279 View Code Duplication
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
280
def test_paste_from_default_register(prompt, action):
281
    prompt.nvim.vvars = {
282
        'register': '*',
283
    }
284
    prompt.nvim.call = MagicMock()
285
    prompt.nvim.command = MagicMock()
286
    prompt.nvim.call.side_effect = lambda fname, reg: '<%s>' % reg
287
    prompt.text = 'Hello Goodbye'
288
    prompt.caret.locus = 5
289
    assert action.call(prompt, 'prompt:paste_from_default_register') is None
290
    assert prompt.text == 'Hello<*> Goodbye'
291
    assert prompt.caret.locus == 8
292 View Code Duplication
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
293
294
def test_yank_to_register(prompt, action):
295
    prompt.nvim.eval = MagicMock()
296
    prompt.nvim.call = MagicMock()
297
    prompt.nvim.command = MagicMock()
298
    prompt.nvim.eval.return_value = 'a'
299
    prompt.text = 'Hello Goodbye'
300
    prompt.caret.locus = 5
301
    assert action.call(prompt, 'prompt:yank_to_register') is None
302
    assert prompt.text == 'Hello Goodbye'
303
    assert prompt.caret.locus == 5
304
    prompt.nvim.call.assert_called_with('setreg', 'a', 'Hello Goodbye')
305
306
307
def test_yank_to_default_register(prompt, action):
308
    prompt.nvim.vvars = {
309
        'register': '*',
310
    }
311
    prompt.nvim.call = MagicMock()
312
    prompt.nvim.command = MagicMock()
313
    prompt.text = 'Hello Goodbye'
314
    prompt.caret.locus = 5
315
    assert action.call(prompt, 'prompt:yank_to_default_register') is None
316
    assert prompt.text == 'Hello Goodbye'
317
    assert prompt.caret.locus == 5
318
    prompt.nvim.call.assert_called_with('setreg', '*', 'Hello Goodbye')
319