import 'package:flutter_test/flutter_test.dart'; import 'package:flowy_editor/document/text_delta.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); test('test delta', () { final delta = Delta([ TextInsert('Gandalf', { 'bold': true, }), TextInsert(' the '), TextInsert('Grey', { 'color': '#ccc', }) ]); final death = Delta().retain(12).insert("White", { 'color': '#fff', }).delete(4); final restores = delta.compose(death); expect(restores.operations, [ TextInsert('Gandalf', {'bold': true}), TextInsert(' the '), TextInsert('White', {'color': '#fff'}), ]); }); test('compose()', () { final a = Delta().insert('A'); final b = Delta().insert('B'); final expected = Delta().insert('B').insert('A'); expect(a.compose(b), expected); }); 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', }); expect(a.compose(b), expected); }); test('insert + delete', () { final a = Delta().insert('A'); final b = Delta().delete(1); final expected = Delta(); expect(a.compose(b), expected); }); test('delete + insert', () { final a = Delta().delete(1); final b = Delta().insert('B'); final expected = Delta().insert('B').delete(1); expect(a.compose(b), expected); }); 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', }); expect(a.compose(b), expected); }); test('delete + delete', () { final a = Delta().delete(1); final b = Delta().delete(1); final expected = Delta().delete(2); expect(a.compose(b), expected); }); test('retain + insert', () { 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); }); 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', }); expect(a.compose(b), expected); }); test('retain + delete', () { final a = Delta().retain(1, { 'color': 'blue', }); final b = Delta().delete(1); final expected = Delta().delete(1); expect(a.compose(b), expected); }); test('insert in middle of text', () { final a = Delta().insert('Hello'); final b = Delta().retain(3).insert('X'); final expected = Delta().insert('HelXlo'); expect(a.compose(b), expected); }); 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'); expect(a.compose(insertFirst), expected); expect(b.compose(deleteFirst), expected); }); test('delete entire text', () { final a = Delta().retain(4).insert('Hello'); final b = Delta().delete(9); final expected = Delta().delete(4); expect(a.compose(b), expected); }); test('retain more than length of text', () { final a = Delta().insert('Hello'); final b = Delta().retain(10); final expected = Delta().insert('Hello'); expect(a.compose(b), expected); }); test('retain start optimization', () { final a = Delta() .insert('A', {'bold': true}) .insert('B') .insert('C', {'bold': true}) .delete(1); final b = Delta().retain(3).insert('D'); final expected = Delta() .insert('A', {'bold': true}) .insert('B') .insert('C', {'bold': true}) .insert('D') .delete(1); expect(a.compose(b), expected); }); test('retain end optimization', () { 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}); expect(a.compose(b), expected); }); test('retain end optimization join', () { 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); final expected = Delta() .insert('AC', {'bold': true}) .insert('D') .insert('E', {'bold': true}) .insert('F'); expect(a.compose(b), expected); }); }