| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 | import 'package:flowy_editor/src/document/attributes.dart';import 'package:flutter_test/flutter_test.dart';import 'package:flowy_editor/src/document/text_delta.dart';void main() {  group('compose', () {    test('test delta', () {      final delta = Delta(<TextOperation>[        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.toList(), <TextOperation>[        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);    });  });  group('invert', () {    test('insert', () {      final delta = Delta()        ..retain(2)        ..insert('A');      final base = Delta()..insert('12346');      final expected = Delta()        ..retain(2)        ..delete(1);      final inverted = delta.invert(base);      expect(expected, inverted);      expect(base.compose(delta).compose(inverted), base);    });    test('delete', () {      final delta = Delta()        ..retain(2)        ..delete(3);      final base = Delta()..insert('123456');      final expected = Delta()        ..retain(2)        ..insert('345');      final inverted = delta.invert(base);      expect(expected, inverted);      expect(base.compose(delta).compose(inverted), base);    });    test('retain', () {      final delta = Delta()        ..retain(2)        ..retain(3, {'bold': true});      final base = Delta()..insert('123456');      final expected = Delta()        ..retain(2)        ..retain(3, {'bold': null});      final inverted = delta.invert(base);      expect(expected, inverted);      final t = base.compose(delta).compose(inverted);      expect(t, base);    });  });  group('json', () {    test('toJson()', () {      final delta = Delta()        ..retain(2)        ..insert('A')        ..delete(3);      expect(delta.toJson(), [        {'retain': 2},        {'insert': 'A'},        {'delete': 3}      ]);    });    test('attributes', () {      final delta = Delta()        ..retain(2, {'bold': true})        ..insert('A', {'italic': true});      expect(delta.toJson(), [        {          'retain': 2,          'attributes': {'bold': true},        },        {          'insert': 'A',          'attributes': {'italic': true},        },      ]);    });    test('fromJson()', () {      final delta = Delta.fromJson([        {'retain': 2},        {'insert': 'A'},        {'delete': 3},      ]);      final expected = Delta()        ..retain(2)        ..insert('A')        ..delete(3);      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);    });  });  group("attributes", () {    test("compose", () {      final attrs = composeAttributes({"a": null}, {"b": null}, true);      expect(attrs != null, true);      expect(attrs!.containsKey("a"), true);      expect(attrs.containsKey("b"), true);      expect(attrs["a"], null);      expect(attrs["b"], null);    });  });}
 |