|
@@ -14,176 +14,218 @@ void main() {
|
|
})
|
|
})
|
|
]);
|
|
]);
|
|
|
|
|
|
- final death = Delta().retain(12).insert("White", {
|
|
|
|
- 'color': '#fff',
|
|
|
|
- }).delete(4);
|
|
|
|
|
|
+ final death = Delta()
|
|
|
|
+ ..retain(12)
|
|
|
|
+ ..insert("White", {
|
|
|
|
+ 'color': '#fff',
|
|
|
|
+ })
|
|
|
|
+ ..delete(4);
|
|
|
|
|
|
final restores = delta.compose(death);
|
|
final restores = delta.compose(death);
|
|
- expect(restores.operations, <TextOperation>[
|
|
|
|
|
|
+ expect(restores.toList(), <TextOperation>[
|
|
TextInsert('Gandalf', {'bold': true}),
|
|
TextInsert('Gandalf', {'bold': true}),
|
|
TextInsert(' the '),
|
|
TextInsert(' the '),
|
|
TextInsert('White', {'color': '#fff'}),
|
|
TextInsert('White', {'color': '#fff'}),
|
|
]);
|
|
]);
|
|
});
|
|
});
|
|
test('compose()', () {
|
|
test('compose()', () {
|
|
- final a = Delta().insert('A');
|
|
|
|
- final b = Delta().insert('B');
|
|
|
|
- final expected = Delta().insert('B').insert('A');
|
|
|
|
|
|
+ final a = Delta()..insert('A');
|
|
|
|
+ final b = Delta()..insert('B');
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..insert('A');
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('insert + retain', () {
|
|
test('insert + retain', () {
|
|
- final a = Delta().insert('A');
|
|
|
|
- final b = Delta().retain(1, {
|
|
|
|
- 'bold': true,
|
|
|
|
- 'color': 'red',
|
|
|
|
- });
|
|
|
|
- final expected = Delta().insert('A', {
|
|
|
|
- 'bold': true,
|
|
|
|
- 'color': 'red',
|
|
|
|
- });
|
|
|
|
|
|
+ final a = Delta()..insert('A');
|
|
|
|
+ final b = Delta()
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'bold': true,
|
|
|
|
+ 'color': 'red',
|
|
|
|
+ });
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..insert('A', {
|
|
|
|
+ 'bold': true,
|
|
|
|
+ 'color': 'red',
|
|
|
|
+ });
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('insert + delete', () {
|
|
test('insert + delete', () {
|
|
- final a = Delta().insert('A');
|
|
|
|
- final b = Delta().delete(1);
|
|
|
|
|
|
+ final a = Delta()..insert('A');
|
|
|
|
+ final b = Delta()..delete(1);
|
|
final expected = Delta();
|
|
final expected = Delta();
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('delete + insert', () {
|
|
test('delete + insert', () {
|
|
- final a = Delta().delete(1);
|
|
|
|
- final b = Delta().insert('B');
|
|
|
|
- final expected = Delta().insert('B').delete(1);
|
|
|
|
|
|
+ final a = Delta()..delete(1);
|
|
|
|
+ final b = Delta()..insert('B');
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..delete(1);
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('delete + retain', () {
|
|
test('delete + retain', () {
|
|
- final a = Delta().delete(1);
|
|
|
|
- final b = Delta().retain(1, {
|
|
|
|
- 'bold': true,
|
|
|
|
- 'color': 'red',
|
|
|
|
- });
|
|
|
|
- final expected = Delta().delete(1).retain(1, {
|
|
|
|
- 'bold': true,
|
|
|
|
- 'color': 'red',
|
|
|
|
- });
|
|
|
|
|
|
+ final a = Delta()..delete(1);
|
|
|
|
+ final b = Delta()
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'bold': true,
|
|
|
|
+ 'color': 'red',
|
|
|
|
+ });
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..delete(1)
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'bold': true,
|
|
|
|
+ 'color': 'red',
|
|
|
|
+ });
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('delete + delete', () {
|
|
test('delete + delete', () {
|
|
- final a = Delta().delete(1);
|
|
|
|
- final b = Delta().delete(1);
|
|
|
|
- final expected = Delta().delete(2);
|
|
|
|
|
|
+ final a = Delta()..delete(1);
|
|
|
|
+ final b = Delta()..delete(1);
|
|
|
|
+ final expected = Delta()..delete(2);
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain + insert', () {
|
|
test('retain + insert', () {
|
|
- final a = Delta().retain(1, {'color': 'blue'});
|
|
|
|
- final b = Delta().insert('B');
|
|
|
|
- final expected = Delta().insert('B').retain(1, {
|
|
|
|
- 'color': 'blue',
|
|
|
|
- });
|
|
|
|
|
|
+ final a = Delta()..retain(1, {'color': 'blue'});
|
|
|
|
+ final b = Delta()..insert('B');
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'color': 'blue',
|
|
|
|
+ });
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain + retain', () {
|
|
test('retain + retain', () {
|
|
- final a = Delta().retain(1, {
|
|
|
|
- 'color': 'blue',
|
|
|
|
- });
|
|
|
|
- final b = Delta().retain(1, {
|
|
|
|
- 'bold': true,
|
|
|
|
- 'color': 'red',
|
|
|
|
- });
|
|
|
|
- final expected = Delta().retain(1, {
|
|
|
|
- 'bold': true,
|
|
|
|
- 'color': 'red',
|
|
|
|
- });
|
|
|
|
|
|
+ final a = Delta()
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'color': 'blue',
|
|
|
|
+ });
|
|
|
|
+ final b = Delta()
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'bold': true,
|
|
|
|
+ 'color': 'red',
|
|
|
|
+ });
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'bold': true,
|
|
|
|
+ 'color': 'red',
|
|
|
|
+ });
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain + delete', () {
|
|
test('retain + delete', () {
|
|
- final a = Delta().retain(1, {
|
|
|
|
- 'color': 'blue',
|
|
|
|
- });
|
|
|
|
- final b = Delta().delete(1);
|
|
|
|
- final expected = Delta().delete(1);
|
|
|
|
|
|
+ final a = Delta()
|
|
|
|
+ ..retain(1, {
|
|
|
|
+ 'color': 'blue',
|
|
|
|
+ });
|
|
|
|
+ final b = Delta()..delete(1);
|
|
|
|
+ final expected = Delta()..delete(1);
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('insert in middle of text', () {
|
|
test('insert in middle of text', () {
|
|
- final a = Delta().insert('Hello');
|
|
|
|
- final b = Delta().retain(3).insert('X');
|
|
|
|
- final expected = Delta().insert('HelXlo');
|
|
|
|
|
|
+ final a = Delta()..insert('Hello');
|
|
|
|
+ final b = Delta()
|
|
|
|
+ ..retain(3)
|
|
|
|
+ ..insert('X');
|
|
|
|
+ final expected = Delta()..insert('HelXlo');
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('insert and delete ordering', () {
|
|
test('insert and delete ordering', () {
|
|
- final a = Delta().insert('Hello');
|
|
|
|
- final b = Delta().insert('Hello');
|
|
|
|
- final insertFirst = Delta().retain(3).insert('X').delete(1);
|
|
|
|
- final deleteFirst = Delta().retain(3).delete(1).insert('X');
|
|
|
|
- final expected = Delta().insert('HelXo');
|
|
|
|
|
|
+ final a = Delta()..insert('Hello');
|
|
|
|
+ final b = Delta()..insert('Hello');
|
|
|
|
+ final insertFirst = Delta()
|
|
|
|
+ ..retain(3)
|
|
|
|
+ ..insert('X')
|
|
|
|
+ ..delete(1);
|
|
|
|
+ final deleteFirst = Delta()
|
|
|
|
+ ..retain(3)
|
|
|
|
+ ..delete(1)
|
|
|
|
+ ..insert('X');
|
|
|
|
+ final expected = Delta()..insert('HelXo');
|
|
expect(a.compose(insertFirst), expected);
|
|
expect(a.compose(insertFirst), expected);
|
|
expect(b.compose(deleteFirst), expected);
|
|
expect(b.compose(deleteFirst), expected);
|
|
});
|
|
});
|
|
test('delete entire text', () {
|
|
test('delete entire text', () {
|
|
- final a = Delta().retain(4).insert('Hello');
|
|
|
|
- final b = Delta().delete(9);
|
|
|
|
- final expected = Delta().delete(4);
|
|
|
|
|
|
+ final a = Delta()
|
|
|
|
+ ..retain(4)
|
|
|
|
+ ..insert('Hello');
|
|
|
|
+ final b = Delta()..delete(9);
|
|
|
|
+ final expected = Delta()..delete(4);
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain more than length of text', () {
|
|
test('retain more than length of text', () {
|
|
- final a = Delta().insert('Hello');
|
|
|
|
- final b = Delta().retain(10);
|
|
|
|
- final expected = Delta().insert('Hello');
|
|
|
|
|
|
+ final a = Delta()..insert('Hello');
|
|
|
|
+ final b = Delta()..retain(10);
|
|
|
|
+ final expected = Delta()..insert('Hello');
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain start optimization', () {
|
|
test('retain start optimization', () {
|
|
final a = Delta()
|
|
final a = Delta()
|
|
- .insert('A', {'bold': true})
|
|
|
|
- .insert('B')
|
|
|
|
- .insert('C', {'bold': true})
|
|
|
|
- .delete(1);
|
|
|
|
- final b = Delta().retain(3).insert('D');
|
|
|
|
|
|
+ ..insert('A', {'bold': true})
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..insert('C', {'bold': true})
|
|
|
|
+ ..delete(1);
|
|
|
|
+ final b = Delta()
|
|
|
|
+ ..retain(3)
|
|
|
|
+ ..insert('D');
|
|
final expected = Delta()
|
|
final expected = Delta()
|
|
- .insert('A', {'bold': true})
|
|
|
|
- .insert('B')
|
|
|
|
- .insert('C', {'bold': true})
|
|
|
|
- .insert('D')
|
|
|
|
- .delete(1);
|
|
|
|
|
|
+ ..insert('A', {'bold': true})
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..insert('C', {'bold': true})
|
|
|
|
+ ..insert('D')
|
|
|
|
+ ..delete(1);
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain end optimization', () {
|
|
test('retain end optimization', () {
|
|
final a = Delta()
|
|
final a = Delta()
|
|
- .insert('A', {'bold': true})
|
|
|
|
- .insert('B')
|
|
|
|
- .insert('C', {'bold': true});
|
|
|
|
- final b = Delta().delete(1);
|
|
|
|
- final expected = Delta().insert('B').insert('C', {'bold': true});
|
|
|
|
|
|
+ ..insert('A', {'bold': true})
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..insert('C', {'bold': true});
|
|
|
|
+ final b = Delta()..delete(1);
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..insert('C', {'bold': true});
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
test('retain end optimization join', () {
|
|
test('retain end optimization join', () {
|
|
final a = Delta()
|
|
final a = Delta()
|
|
- .insert('A', {'bold': true})
|
|
|
|
- .insert('B')
|
|
|
|
- .insert('C', {'bold': true})
|
|
|
|
- .insert('D')
|
|
|
|
- .insert('E', {'bold': true})
|
|
|
|
- .insert('F');
|
|
|
|
- final b = Delta().retain(1).delete(1);
|
|
|
|
|
|
+ ..insert('A', {'bold': true})
|
|
|
|
+ ..insert('B')
|
|
|
|
+ ..insert('C', {'bold': true})
|
|
|
|
+ ..insert('D')
|
|
|
|
+ ..insert('E', {'bold': true})
|
|
|
|
+ ..insert('F');
|
|
|
|
+ final b = Delta()
|
|
|
|
+ ..retain(1)
|
|
|
|
+ ..delete(1);
|
|
final expected = Delta()
|
|
final expected = Delta()
|
|
- .insert('AC', {'bold': true})
|
|
|
|
- .insert('D')
|
|
|
|
- .insert('E', {'bold': true})
|
|
|
|
- .insert('F');
|
|
|
|
|
|
+ ..insert('AC', {'bold': true})
|
|
|
|
+ ..insert('D')
|
|
|
|
+ ..insert('E', {'bold': true})
|
|
|
|
+ ..insert('F');
|
|
expect(a.compose(b), expected);
|
|
expect(a.compose(b), expected);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
group('invert', () {
|
|
group('invert', () {
|
|
test('insert', () {
|
|
test('insert', () {
|
|
- final delta = Delta().retain(2).insert('A');
|
|
|
|
- final base = Delta().insert('12346');
|
|
|
|
- final expected = Delta().retain(2).delete(1);
|
|
|
|
|
|
+ final delta = Delta()
|
|
|
|
+ ..retain(2)
|
|
|
|
+ ..insert('A');
|
|
|
|
+ final base = Delta()..insert('12346');
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..retain(2)
|
|
|
|
+ ..delete(1);
|
|
final inverted = delta.invert(base);
|
|
final inverted = delta.invert(base);
|
|
expect(expected, inverted);
|
|
expect(expected, inverted);
|
|
expect(base.compose(delta).compose(inverted), base);
|
|
expect(base.compose(delta).compose(inverted), base);
|
|
});
|
|
});
|
|
test('delete', () {
|
|
test('delete', () {
|
|
- final delta = Delta().retain(2).delete(3);
|
|
|
|
- final base = Delta().insert('123456');
|
|
|
|
- final expected = Delta().retain(2).insert('345');
|
|
|
|
|
|
+ final delta = Delta()
|
|
|
|
+ ..retain(2)
|
|
|
|
+ ..delete(3);
|
|
|
|
+ final base = Delta()..insert('123456');
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..retain(2)
|
|
|
|
+ ..insert('345');
|
|
final inverted = delta.invert(base);
|
|
final inverted = delta.invert(base);
|
|
expect(expected, inverted);
|
|
expect(expected, inverted);
|
|
expect(base.compose(delta).compose(inverted), base);
|
|
expect(base.compose(delta).compose(inverted), base);
|
|
@@ -199,7 +241,10 @@ void main() {
|
|
});
|
|
});
|
|
group('json', () {
|
|
group('json', () {
|
|
test('toJson()', () {
|
|
test('toJson()', () {
|
|
- final delta = Delta().retain(2).insert('A').delete(3);
|
|
|
|
|
|
+ final delta = Delta()
|
|
|
|
+ ..retain(2)
|
|
|
|
+ ..insert('A')
|
|
|
|
+ ..delete(3);
|
|
expect(delta.toJson(), [
|
|
expect(delta.toJson(), [
|
|
{'retain': 2},
|
|
{'retain': 2},
|
|
{'insert': 'A'},
|
|
{'insert': 'A'},
|
|
@@ -207,8 +252,9 @@ void main() {
|
|
]);
|
|
]);
|
|
});
|
|
});
|
|
test('attributes', () {
|
|
test('attributes', () {
|
|
- final delta =
|
|
|
|
- Delta().retain(2, {'bold': true}).insert('A', {'italic': true});
|
|
|
|
|
|
+ final delta = Delta()
|
|
|
|
+ ..retain(2, {'bold': true})
|
|
|
|
+ ..insert('A', {'italic': true});
|
|
expect(delta.toJson(), [
|
|
expect(delta.toJson(), [
|
|
{
|
|
{
|
|
'retain': 2,
|
|
'retain': 2,
|
|
@@ -226,8 +272,42 @@ void main() {
|
|
{'insert': 'A'},
|
|
{'insert': 'A'},
|
|
{'delete': 3},
|
|
{'delete': 3},
|
|
]);
|
|
]);
|
|
- final expected = Delta().retain(2).insert('A').delete(3);
|
|
|
|
|
|
+ final expected = Delta()
|
|
|
|
+ ..retain(2)
|
|
|
|
+ ..insert('A')
|
|
|
|
+ ..delete(3);
|
|
expect(delta, expected);
|
|
expect(delta, expected);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
+ group('runes', () {
|
|
|
|
+ test("stringIndexes", () {
|
|
|
|
+ final indexes = stringIndexes('😊');
|
|
|
|
+ expect(indexes[0], 0);
|
|
|
|
+ expect(indexes[1], 0);
|
|
|
|
+ });
|
|
|
|
+ test("next rune 1", () {
|
|
|
|
+ final delta = Delta()..insert('😊');
|
|
|
|
+ expect(delta.nextRunePosition(0), 2);
|
|
|
|
+ });
|
|
|
|
+ test("next rune 2", () {
|
|
|
|
+ final delta = Delta()..insert('😊a');
|
|
|
|
+ expect(delta.nextRunePosition(0), 2);
|
|
|
|
+ });
|
|
|
|
+ test("next rune 3", () {
|
|
|
|
+ final delta = Delta()..insert('😊陈');
|
|
|
|
+ expect(delta.nextRunePosition(2), 3);
|
|
|
|
+ });
|
|
|
|
+ test("prev rune 1", () {
|
|
|
|
+ final delta = Delta()..insert('😊陈');
|
|
|
|
+ expect(delta.prevRunePosition(2), 0);
|
|
|
|
+ });
|
|
|
|
+ test("prev rune 2", () {
|
|
|
|
+ final delta = Delta()..insert('😊');
|
|
|
|
+ expect(delta.prevRunePosition(2), 0);
|
|
|
|
+ });
|
|
|
|
+ test("prev rune 3", () {
|
|
|
|
+ final delta = Delta()..insert('😊');
|
|
|
|
+ expect(delta.prevRunePosition(0), -1);
|
|
|
|
+ });
|
|
|
|
+ });
|
|
}
|
|
}
|