๐Ÿ“ฆ amake / orgro

๐Ÿ“„ editing_utils_test.dart ยท 201 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201import 'package:flutter_test/flutter_test.dart';
import 'package:org_flutter/org_flutter.dart';
import 'package:orgro/src/pages/editor/util.dart';

import '../utils/editing.dart';

Matcher nodeAt(Type type, {required int start, required int end}) =>
    predicate<({OrgNode node, NodeSpan span})>(
      (node) =>
          node.node.runtimeType == type &&
          node.span.start == start &&
          node.span.end == end,
      'is $type from $start to $end',
    );

void main() {
  group('Find nodes', () {
    test('Offset', () {
      final doc = OrgDocument.parse('''

* foo
- bar
1. baz ~bazinga~
''');
      expect(doc.nodesAtOffset(0), [
        nodeAt(OrgPlainText, start: 0, end: 1),
        nodeAt(OrgContent, start: 0, end: 1),
        nodeAt(OrgParagraph, start: 0, end: 1),
        nodeAt(OrgContent, start: 0, end: 1),
        nodeAt(OrgDocument, start: 0, end: 1),
      ]);
      expect(doc.nodesAtOffset(1), [
        nodeAt(OrgHeadline, start: 1, end: 4),
        nodeAt(OrgSection, start: 1, end: 4),
        nodeAt(OrgDocument, start: 0, end: 4),
      ]);
      expect(doc.nodesAtOffset(2), [
        nodeAt(OrgHeadline, start: 1, end: 4),
        nodeAt(OrgSection, start: 1, end: 4),
        nodeAt(OrgDocument, start: 0, end: 4),
      ]);
      expect(doc.nodesAtOffset(3), [
        nodeAt(OrgPlainText, start: 3, end: 6),
        nodeAt(OrgContent, start: 3, end: 6),
        nodeAt(OrgHeadline, start: 1, end: 7),
        nodeAt(OrgSection, start: 1, end: 7),
        nodeAt(OrgDocument, start: 0, end: 7),
      ]);
      expect(doc.nodesAtOffset(7), [
        nodeAt(OrgListUnorderedItem, start: 7, end: 9),
        nodeAt(OrgList, start: 7, end: 9),
        nodeAt(OrgContent, start: 7, end: 9),
        nodeAt(OrgSection, start: 1, end: 9),
        nodeAt(OrgDocument, start: 0, end: 9),
      ]);
      expect(doc.nodesAtOffset(9), [
        nodeAt(OrgPlainText, start: 9, end: 13),
        nodeAt(OrgContent, start: 9, end: 13),
        nodeAt(OrgListUnorderedItem, start: 7, end: 13),
        nodeAt(OrgList, start: 7, end: 13),
        nodeAt(OrgContent, start: 7, end: 13),
        nodeAt(OrgSection, start: 1, end: 13),
        nodeAt(OrgDocument, start: 0, end: 13),
      ]);
      expect(doc.nodesAtOffset(13), [
        nodeAt(OrgListOrderedItem, start: 13, end: 16),
        nodeAt(OrgList, start: 7, end: 16),
        nodeAt(OrgContent, start: 7, end: 16),
        nodeAt(OrgSection, start: 1, end: 16),
        nodeAt(OrgDocument, start: 0, end: 16),
      ]);
      expect(doc.nodesAtOffset(16), [
        nodeAt(OrgPlainText, start: 16, end: 20),
        nodeAt(OrgContent, start: 16, end: 20),
        nodeAt(OrgListOrderedItem, start: 13, end: 20),
        nodeAt(OrgList, start: 7, end: 20),
        nodeAt(OrgContent, start: 7, end: 20),
        nodeAt(OrgSection, start: 1, end: 20),
        nodeAt(OrgDocument, start: 0, end: 20),
      ]);
      expect(doc.nodesAtOffset(20), [
        nodeAt(OrgMarkup, start: 20, end: 22),
        nodeAt(OrgContent, start: 16, end: 22),
        nodeAt(OrgListOrderedItem, start: 13, end: 22),
        nodeAt(OrgList, start: 7, end: 22),
        nodeAt(OrgContent, start: 7, end: 22),
        nodeAt(OrgSection, start: 1, end: 22),
        nodeAt(OrgDocument, start: 0, end: 22),
      ]);
      expect(doc.nodesAtOffset(10000), isEmpty);
    });
    test('Offset on boundaries', () {
      final doc = OrgDocument.parse('- foo\n\n');
      expect(doc.nodesAtOffset(0), [
        nodeAt(OrgListUnorderedItem, start: 0, end: 2),
        nodeAt(OrgList, start: 0, end: 3),
        nodeAt(OrgContent, start: 0, end: 3),
        nodeAt(OrgDocument, start: 0, end: 3),
      ]);
      expect(doc.nodesAtOffset(5), [
        nodeAt(OrgPlainText, start: 2, end: 6),
        nodeAt(OrgContent, start: 2, end: 6),
        nodeAt(OrgListUnorderedItem, start: 0, end: 6),
        nodeAt(OrgList, start: 0, end: 7),
        nodeAt(OrgContent, start: 0, end: 7),
        nodeAt(OrgDocument, start: 0, end: 7),
      ]);
      expect(doc.nodesAtOffset(6), [
        nodeAt(OrgList, start: 0, end: 7),
        nodeAt(OrgContent, start: 0, end: 7),
        nodeAt(OrgDocument, start: 0, end: 7),
      ]);
      expect(doc.nodesAtOffset(7), isEmpty);
    });
    test('Range', () {
      final doc = OrgDocument.parse('''

* foo
- bar
1. baz ~bazinga~
''');
      expect(doc.nodesInRange(0, 0), [
        nodeAt(OrgPlainText, start: 0, end: 1),
        nodeAt(OrgContent, start: 0, end: 1),
        nodeAt(OrgParagraph, start: 0, end: 1),
        nodeAt(OrgContent, start: 0, end: 1),
        nodeAt(OrgDocument, start: 0, end: 1),
      ]);
      expect(doc.nodesInRange(1, 7), [
        nodeAt(OrgPlainText, start: 3, end: 6),
        nodeAt(OrgContent, start: 3, end: 6),
        nodeAt(OrgHeadline, start: 1, end: 7),
        nodeAt(OrgListUnorderedItem, start: 7, end: 9),
        nodeAt(OrgList, start: 7, end: 9),
        nodeAt(OrgContent, start: 7, end: 9),
        nodeAt(OrgSection, start: 1, end: 9),
        nodeAt(OrgDocument, start: 0, end: 9),
      ]);
      expect(doc.nodesInRange(17, 22), [
        nodeAt(OrgPlainText, start: 16, end: 20),
        nodeAt(OrgPlainText, start: 21, end: 28),
        nodeAt(OrgContent, start: 21, end: 28),
        nodeAt(OrgMarkup, start: 20, end: 29),
        nodeAt(OrgContent, start: 16, end: 29),
        nodeAt(OrgListOrderedItem, start: 13, end: 29),
        nodeAt(OrgList, start: 7, end: 29),
        nodeAt(OrgContent, start: 7, end: 29),
        nodeAt(OrgSection, start: 1, end: 29),
        nodeAt(OrgDocument, start: 0, end: 29),
      ]);
      expect(doc.nodesInRange(10000, 10001), isEmpty);
    });
    test('to markup locating', () {
      final markup = '''

* foo
- bar
1. baz ~bazinga~
''';
      final doc = OrgDocument.parse(markup);
      final list = doc.find<OrgList>((_) => true)?.node as OrgList;
      expect(doc.toMarkupLocating(list), (text: markup, start: 7, end: 30));
      final firstItem = list.items.first;
      expect(list.toMarkupLocating(firstItem), (
        text: '- bar\n1. baz ~bazinga~\n',
        start: 0,
        end: 6,
      ));
      expect(firstItem.toMarkupLocating(firstItem.body!), (
        text: '- bar\n',
        start: 2,
        end: 6,
      ));
    });
  });
  group('Test helper', () {
    test('No selection', () {
      final value = testValue('foo bar|');
      expect(value.text, 'foo bar');
      expect(value.selection.baseOffset, 7);
      expect(value.selection.extentOffset, 7);
    });
    test('Selection', () {
      final value = testValue('foo |bar|');
      expect(value.text, 'foo bar');
      expect(value.selection.baseOffset, 4);
      expect(value.selection.extentOffset, 7);
    });
    test('Empty', () {
      final value = testValue('|');
      expect(value.text, '');
      expect(value.selection.baseOffset, 0);
      expect(value.selection.extentOffset, 0);
    });
    test('Invalid', () {
      expect(() => testValue(''), throwsA(isA<AssertionError>()));
      expect(() => testValue('|||'), throwsA(isA<AssertionError>()));
    });
  });
}