Skip to content

Commit 67a6a1b

Browse files
Minor improvements based on feedback at PR#231
1 parent b0e893b commit 67a6a1b

File tree

7 files changed

+169
-67
lines changed

7 files changed

+169
-67
lines changed

lib/src/code_field/code_controller.dart

+13-11
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import 'package:meta/meta.dart';
1111
import '../../flutter_code_editor.dart';
1212
import '../autocomplete/autocompleter.dart';
1313
import '../code/code_edit_result.dart';
14-
import '../code_modifiers/insertion.dart';
1514
import '../code/key_event.dart';
15+
import '../code_modifiers/insertion.dart';
1616
import '../history/code_history_controller.dart';
1717
import '../history/code_history_record.dart';
1818
import '../search/controller.dart';
@@ -51,6 +51,7 @@ class CodeController extends TextEditingController {
5151
/// Calls [AbstractAnalyzer.analyze] after change with 500ms debounce.
5252
AbstractAnalyzer get analyzer => _analyzer;
5353
AbstractAnalyzer _analyzer;
54+
5455
set analyzer(AbstractAnalyzer analyzer) {
5556
if (_analyzer == analyzer) {
5657
return;
@@ -108,6 +109,7 @@ class CodeController extends TextEditingController {
108109

109110
SearchSettingsController get _searchSettingsController =>
110111
searchController.settingsController;
112+
111113
SearchNavigationController get _searchNavigationController =>
112114
searchController.navigationController;
113115

@@ -134,16 +136,16 @@ class CodeController extends TextEditingController {
134136
};
135137

136138
static const defaultCodeModifiers = [
137-
IndentModifier(),
138-
CloseBlockModifier(),
139-
TabModifier(),
140-
InsertionCodeModifier.backticks,
141-
InsertionCodeModifier.braces,
142-
InsertionCodeModifier.brackets,
143-
InsertionCodeModifier.doubleQuotes,
144-
InsertionCodeModifier.parentheses,
145-
InsertionCodeModifier.singleQuotes,
146-
];
139+
IndentModifier(),
140+
CloseBlockModifier(),
141+
TabModifier(),
142+
InsertionCodeModifier.backticks,
143+
InsertionCodeModifier.braces,
144+
InsertionCodeModifier.brackets,
145+
InsertionCodeModifier.doubleQuotes,
146+
InsertionCodeModifier.parentheses,
147+
InsertionCodeModifier.singleQuotes,
148+
];
147149

148150
CodeController({
149151
String? text,

lib/src/code_modifiers/close_block_code_modifier.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:flutter/widgets.dart';
55
import '../code_field/editor_params.dart';
66
import 'code_modifier.dart';
77

8-
/// [CloseBlockModifier] is an implementation of [CodeModifier]
8+
/// [CloseBlockModifier] is an implementation of [CodeModifier]
99
/// that remove spaces before the closing bracket, if required.
1010
class CloseBlockModifier extends CodeModifier {
1111
const CloseBlockModifier() : super('}');

lib/src/code_modifiers/code_modifier.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ abstract class CodeModifier {
77

88
const CodeModifier(this.char);
99

10-
// Helper to insert [str] in [text] between [start] and [end]
10+
/// Helper to insert [str] in [text] between [start] and [end]
1111
TextEditingValue replace(String text, int start, int end, String str) {
1212
final len = str.length;
1313
return TextEditingValue(

lib/src/wip/autocomplete/popup.dart

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Popup extends StatefulWidget {
4545

4646
class PopupState extends State<Popup> {
4747
final pageStorageBucket = PageStorageBucket();
48+
4849
@override
4950
void initState() {
5051
widget.controller.reset();

lib/src/wip/autocomplete/popup_controller.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ class PopupController extends ChangeNotifier {
2424
int get selectedIndex => _selectedIndex;
2525

2626
void reset() {
27-
itemScrollController = ItemScrollController();
27+
if (itemScrollController.isAttached) {
28+
itemScrollController.jumpTo(index: 0);
29+
}
2830
}
2931

3032
void show(List<String> suggestions) {
31-
if (enabled == false) {
33+
if (!enabled) {
3234
return;
3335
}
3436

test/src/code_modifiers/insertion_test.dart

+49-51
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,70 @@ import 'package:flutter_code_editor/src/code_modifiers/insertion.dart';
44
import 'package:flutter_test/flutter_test.dart';
55

66
void main() {
7-
test('inserts at the start of string correctly', () {
7+
group('InsertionCodeModifier', () {
88
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23');
9-
const text = 'Hello World';
10-
final selection = TextSelection.fromPosition(const TextPosition(offset: 0));
119
const editorParams = EditorParams();
1210

13-
final result = modifier.updateString(text, selection, editorParams);
11+
test('inserts at the start of string correctly', () {
12+
const text = 'Hello World';
13+
final selection =
14+
TextSelection.fromPosition(const TextPosition(offset: 0));
1415

15-
expect(result!.text, '123Hello World');
16-
expect(result.selection.baseOffset, 1);
17-
expect(result.selection.extentOffset, 1);
18-
});
16+
final result = modifier.updateString(text, selection, editorParams);
1917

20-
test('inserts in the middle of string correctly', () {
21-
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23');
22-
const text = 'Hello World';
23-
final selection = TextSelection.fromPosition(const TextPosition(offset: 5));
24-
const editorParams = EditorParams();
18+
expect(result!.text, '123Hello World');
19+
expect(result.selection.baseOffset, 1);
20+
expect(result.selection.extentOffset, 1);
21+
});
2522

26-
final result = modifier.updateString(text, selection, editorParams);
23+
test('inserts in the middle of string correctly', () {
24+
const text = 'Hello World';
25+
final selection =
26+
TextSelection.fromPosition(const TextPosition(offset: 5));
2727

28-
expect(result!.text, 'Hello123 World');
29-
expect(result.selection.baseOffset, 6);
30-
expect(result.selection.extentOffset, 6);
31-
});
28+
final result = modifier.updateString(text, selection, editorParams);
3229

33-
test('inserts at the end of string correctly', () {
34-
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23');
35-
const text = 'Hello World';
36-
final selection =
37-
TextSelection.fromPosition(const TextPosition(offset: text.length));
38-
const editorParams = EditorParams();
30+
expect(result!.text, 'Hello123 World');
31+
expect(result.selection.baseOffset, 6);
32+
expect(result.selection.extentOffset, 6);
33+
});
3934

40-
final result = modifier.updateString(text, selection, editorParams);
35+
test('inserts at the end of string correctly', () {
36+
const text = 'Hello World';
37+
final selection =
38+
TextSelection.fromPosition(const TextPosition(offset: text.length));
4139

42-
expect(result!.text, 'Hello World123');
43-
expect(result.selection.baseOffset, text.length + 1);
44-
expect(result.selection.extentOffset, text.length + 1);
45-
});
40+
final result = modifier.updateString(text, selection, editorParams);
4641

47-
test('inserts in the middle of string with selection correctly', () {
48-
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23');
49-
const text = 'Hello World';
50-
const selection = TextSelection(
51-
baseOffset: 5,
52-
extentOffset: 7,
53-
);
54-
const editorParams = EditorParams();
42+
expect(result!.text, 'Hello World123');
43+
expect(result.selection.baseOffset, text.length + 1);
44+
expect(result.selection.extentOffset, text.length + 1);
45+
});
5546

56-
final result = modifier.updateString(text, selection, editorParams);
47+
test('inserts in the middle of string with selection correctly', () {
48+
const text = 'Hello World';
49+
const selection = TextSelection(
50+
baseOffset: 5,
51+
extentOffset: 7,
52+
);
5753

58-
expect(result!.text, 'Hello123orld');
59-
expect(result.selection.baseOffset, 6);
60-
expect(result.selection.extentOffset, 6);
61-
});
54+
final result = modifier.updateString(text, selection, editorParams);
6255

63-
test('inserts at empty string correctly', () {
64-
const modifier = InsertionCodeModifier(openChar: '1', closeString: '23');
65-
const text = '';
66-
final selection = TextSelection.fromPosition(const TextPosition(offset: 0));
67-
const editorParams = EditorParams();
56+
expect(result!.text, 'Hello123orld');
57+
expect(result.selection.baseOffset, 6);
58+
expect(result.selection.extentOffset, 6);
59+
});
60+
61+
test('inserts at empty string correctly', () {
62+
const text = '';
63+
final selection =
64+
TextSelection.fromPosition(const TextPosition(offset: 0));
6865

69-
final result = modifier.updateString(text, selection, editorParams);
66+
final result = modifier.updateString(text, selection, editorParams);
7067

71-
expect(result!.text, '123');
72-
expect(result.selection.baseOffset, 1);
73-
expect(result.selection.extentOffset, 1);
68+
expect(result!.text, '123');
69+
expect(result.selection.baseOffset, 1);
70+
expect(result.selection.extentOffset, 1);
71+
});
7472
});
7573
}

test/src/search/code_controller_test.dart

+100-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/services.dart';
2+
import 'package:flutter_code_editor/flutter_code_editor.dart';
23
import 'package:flutter_code_editor/src/search/match.dart';
34
import 'package:flutter_code_editor/src/search/result.dart';
45
import 'package:flutter_code_editor/src/search/settings.dart';
@@ -7,7 +8,7 @@ import 'package:flutter_test/flutter_test.dart';
78
import '../common/create_app.dart';
89

910
void main() {
10-
group('CodeController', () {
11+
group('CodeController, Search-related functionality', () {
1112
testWidgets('CTRL + F shows search, Escape hides', (wt) async {
1213
const text = 'AaAa';
1314
final controller = await pumpController(wt, text);
@@ -60,4 +61,102 @@ void main() {
6061
await wt.pumpAndSettle();
6162
});
6263
});
64+
65+
/// Requested to add at {@link https://github.com/akvelon/flutter-code-editor/pull/231}
66+
group('CodeController-related formatting checks [Default params]', () {
67+
/// tests insertion of existing modifiers into the code controller
68+
/// at the defined index
69+
void testInsertionAtIndex(
70+
CodeController controller,
71+
String initialText,
72+
String insertedStart,
73+
String insertedEnd,
74+
int insertionIndex,
75+
) {
76+
final selection = TextSelection(
77+
baseOffset: insertionIndex,
78+
extentOffset: insertionIndex,
79+
);
80+
// to move selection of textEditingValue at defined place
81+
controller.value = TextEditingValue(
82+
text: initialText,
83+
selection: selection,
84+
);
85+
86+
final textWithInsertedStart = initialText.replaceRange(
87+
insertionIndex,
88+
insertionIndex,
89+
insertedStart,
90+
);
91+
controller.value = TextEditingValue(
92+
text: textWithInsertedStart,
93+
selection: selection,
94+
);
95+
96+
final expectedText = initialText.replaceRange(
97+
insertionIndex,
98+
insertionIndex,
99+
'$insertedStart$insertedEnd',
100+
);
101+
expect(controller.value.text, expectedText);
102+
}
103+
104+
/// tests insertion at the start, middle and end of the initial text
105+
Future<void> testInsertion(
106+
WidgetTester wt,
107+
String insertedStart, {
108+
String? insertedEnd,
109+
}) async {
110+
insertedEnd ??= insertedStart;
111+
112+
const initialText = 'Hello';
113+
final controller = await pumpController(wt, initialText);
114+
115+
testInsertionAtIndex(
116+
controller,
117+
initialText,
118+
insertedStart,
119+
insertedEnd,
120+
0,
121+
);
122+
testInsertionAtIndex(
123+
controller,
124+
initialText,
125+
insertedStart,
126+
insertedEnd,
127+
2,
128+
);
129+
testInsertionAtIndex(
130+
controller,
131+
initialText,
132+
insertedStart,
133+
insertedEnd,
134+
initialText.length,
135+
);
136+
}
137+
138+
testWidgets('controller handles insertion of backticks', (wt) async {
139+
await testInsertion(wt, '`');
140+
});
141+
142+
testWidgets('controller handles insertion of single quotes', (wt) async {
143+
await testInsertion(wt, '\'');
144+
});
145+
146+
testWidgets('controller handles insertion of double quotes', (wt) async {
147+
await testInsertion(wt, '"');
148+
});
149+
150+
testWidgets('controller handles insertion of parentheses', (wt) async {
151+
await testInsertion(wt, '(', insertedEnd: ')');
152+
});
153+
154+
testWidgets('controller handles insertion of braces', (wt) async {
155+
await testInsertion(wt, '{', insertedEnd: '}');
156+
});
157+
158+
testWidgets('controller handles insertion of square brackets', (wt) async {
159+
await testInsertion(wt, '[', insertedEnd: ']');
160+
});
161+
});
63162
}

0 commit comments

Comments
 (0)