Lift line coverage back over the 95% floor after the Flutter 3.44.1 merge nudged it to 94.99%. Adds tests for the changeWord/no-op-edit/ empty-paste/word-motion-edge branches in vim_edit_ops, the lone-key flush path in SequenceMatcher, and the keybindings-ui / vim extension identity + deactivate paths. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
87 lines
2.7 KiB
Dart
87 lines
2.7 KiB
Dart
/// T-207: the Vim extension enables its layer only under the `vim` preset,
|
|
/// registers mode-transition commands (no global bindings), and drives the
|
|
/// mode through those commands.
|
|
library;
|
|
|
|
import 'package:clide/builtin/vim/vim.dart';
|
|
import 'package:clide/extension/extension.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
import '../../helpers/kernel_fixture.dart';
|
|
|
|
void main() {
|
|
late KernelFixture f;
|
|
late VimExtension ext;
|
|
|
|
setUp(() async {
|
|
f = await KernelFixture.create();
|
|
ext = VimExtension();
|
|
f.services.extensions.register(ext);
|
|
});
|
|
tearDown(() => f.dispose());
|
|
|
|
bool flag(String name) => f.services.keymap.scope[name] ?? false;
|
|
|
|
test('identifies itself', () {
|
|
expect(ext.id, 'builtin.vim');
|
|
expect(ext.title, 'Vim');
|
|
expect(ext.version, '0.1.0');
|
|
});
|
|
|
|
test('inert under the default preset', () async {
|
|
await f.services.extensions.activate('builtin.vim');
|
|
expect(ext.modeService!.enabled, isFalse);
|
|
expect(flag('vim.normal'), isFalse);
|
|
});
|
|
|
|
test('enables when the vim preset is active', () async {
|
|
await f.services.keymap.setPreset('vim');
|
|
await f.services.extensions.activate('builtin.vim');
|
|
expect(ext.modeService!.enabled, isTrue);
|
|
expect(flag('vim.normal'), isTrue);
|
|
});
|
|
|
|
test('follows a live preset switch', () async {
|
|
await f.services.extensions.activate('builtin.vim');
|
|
expect(ext.modeService!.enabled, isFalse);
|
|
|
|
await f.services.keymap.setPreset('vim');
|
|
expect(ext.modeService!.enabled, isTrue);
|
|
|
|
await f.services.keymap.setPreset('default');
|
|
expect(ext.modeService!.enabled, isFalse);
|
|
expect(flag('vim.normal'), isFalse);
|
|
});
|
|
|
|
test('mode commands drive the scope flags', () async {
|
|
await f.services.keymap.setPreset('vim');
|
|
await f.services.extensions.activate('builtin.vim');
|
|
|
|
await f.services.commands.execute('vim.mode.insert');
|
|
expect(flag('vim.insert'), isTrue);
|
|
expect(flag('vim.normal'), isFalse);
|
|
|
|
await f.services.commands.execute('vim.mode.normal');
|
|
expect(flag('vim.normal'), isTrue);
|
|
expect(flag('vim.insert'), isFalse);
|
|
});
|
|
|
|
test('mode commands carry no default binding', () {
|
|
final cmds = ext.contributions.whereType<CommandContribution>();
|
|
expect(cmds, isNotEmpty);
|
|
expect(cmds.every((c) => c.defaultBinding == null), isTrue);
|
|
});
|
|
|
|
test('deactivate clears flags and disables the layer', () async {
|
|
await f.services.keymap.setPreset('vim');
|
|
await f.services.extensions.activate('builtin.vim');
|
|
await f.services.commands.execute('vim.mode.insert');
|
|
expect(flag('vim.insert'), isTrue);
|
|
|
|
final svc = ext.modeService!;
|
|
await f.services.extensions.deactivate('builtin.vim');
|
|
expect(svc.enabled, isFalse);
|
|
expect(flag('vim.insert'), isFalse);
|
|
});
|
|
}
|