import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:flutter_test/flutter_test.dart'; import '../infra/test_editor.dart'; void main() { group('TextCommands extension tests', () { testWidgets('insertText', (tester) async { final editor = tester.editor ..insertEmptyTextNode() ..insertTextNode('World'); await editor.startTesting(); editor.editorState.insertText(0, 'Hello', path: [0]); await tester.pumpAndSettle(); expect( (editor.editorState.getTextNode(path: [0]).delta.first as TextInsert) .text, 'Hello', ); }); testWidgets('insertTextAtCurrentSelection', (tester) async { final editor = tester.editor..insertTextNode('Helrld!'); await editor.startTesting(); final selection = Selection( start: Position(path: [0], offset: 3), end: Position(path: [0], offset: 3), ); await editor.updateSelection(selection); editor.editorState.insertTextAtCurrentSelection('lo Wo'); await tester.pumpAndSettle(); expect( (editor.editorState.getTextNode(path: [0]).delta.first as TextInsert) .text, 'Hello World!', ); }); testWidgets('formatText', (tester) async { final editor = tester.editor..insertTextNode('Hello'); await editor.startTesting(); final selection = Selection( start: Position(path: [0]), end: Position(path: [0], offset: 5), ); await editor.updateSelection(selection); editor.editorState .formatText(null, {BuiltInAttributeKey.bold: true}, path: [0]); await tester.pumpAndSettle(); final textNode = editor.editorState.getTextNode(path: [0]); final textInsert = textNode.delta.first as TextInsert; expect(textInsert.text, 'Hello'); expect(textInsert.attributes?[BuiltInAttributeKey.bold], true); }); testWidgets('formatTextWithBuiltInAttribute w/ Partial Style Key', (tester) async { final editor = tester.editor..insertTextNode('Hello'); await editor.startTesting(); final selection = Selection( start: Position(path: [0]), end: Position(path: [0], offset: 5), ); await editor.updateSelection(selection); editor.editorState.formatTextWithBuiltInAttribute( BuiltInAttributeKey.underline, {BuiltInAttributeKey.underline: true}, path: [0], ); await tester.pumpAndSettle(); final textNode = editor.editorState.getTextNode(path: [0]); final textInsert = textNode.delta.first as TextInsert; expect(textInsert.text, 'Hello'); expect(textInsert.attributes?[BuiltInAttributeKey.underline], true); }); testWidgets('formatTextWithBuiltInAttribute w/ Global Style Key', (tester) async { final editor = tester.editor ..insertTextNode( 'Hello', /// Formatting global style over another global style, /// will remove the existing one before adding the new one attributes: {BuiltInAttributeKey.checkbox: true}, ); await editor.startTesting(); editor.editorState.formatTextWithBuiltInAttribute( BuiltInAttributeKey.heading, {BuiltInAttributeKey.heading: BuiltInAttributeKey.h1}, path: [0], ); await tester.pumpAndSettle(); final textNode = editor.editorState.getTextNode(path: [0]); final textInsert = textNode.delta.first as TextInsert; expect(textInsert.text, 'Hello'); expect(textNode.attributes.heading, BuiltInAttributeKey.h1); expect(textNode.attributes['subtype'], BuiltInAttributeKey.heading); }); testWidgets('formatTextToCheckbox', (tester) async { final editor = tester.editor..insertTextNode('TextNode to Checkbox'); await editor.startTesting(); editor.editorState.formatTextToCheckbox(false, path: [0]); await tester.pumpAndSettle(); final checkboxNode = editor.editorState.getNode(path: [0]); expect(checkboxNode.attributes.check, false); expect(checkboxNode.attributes['subtype'], BuiltInAttributeKey.checkbox); }); testWidgets('formatLinkInText', (tester) async { const href = "https://appflowy.io/"; final editor = tester.editor..insertTextNode('TextNode to Link'); await editor.startTesting(); final selection = Selection( start: Position(path: [0]), end: Position(path: [0], offset: 5), ); await editor.updateSelection(selection); editor.editorState.formatLinkInText(href, path: [0]); await tester.pumpAndSettle(); final textNode = editor.editorState.getTextNode(path: [0]); final textInsert = textNode.delta.first as TextInsert; expect(textInsert.attributes?[BuiltInAttributeKey.href], href); }); testWidgets('insertNewLine', (tester) async { final editor = tester.editor; await editor.startTesting(); expect(editor.documentLength, 0); editor.editorState.insertNewLine(path: [0]); await tester.pumpAndSettle(); expect(editor.documentLength, 1); }); testWidgets('insertNewLine without path', (tester) async { final editor = tester.editor..insertTextNode('Hello World'); await editor.startTesting(); expect(editor.documentLength, 1); final selection = Selection( start: Position(path: [0], offset: 5), end: Position(path: [0], offset: 5), ); await editor.updateSelection(selection); editor.editorState.insertNewLine(path: null); await tester.pumpAndSettle(); expect(editor.documentLength, 2); final textNode = editor.editorState.getTextNode(path: [0]); final textInsert = textNode.delta.first as TextInsert; expect(textInsert.text, 'Hello World'); }); testWidgets('insertNewLineAtCurrentSelection', (tester) async { final editor = tester.editor..insertTextNode('HelloWorld'); await editor.startTesting(); final selection = Selection( start: Position(path: [0], offset: 5), end: Position(path: [0], offset: 5), ); await editor.updateSelection(selection); expect(editor.documentLength, 1); editor.editorState.insertNewLineAtCurrentSelection(); await tester.pumpAndSettle(); expect(editor.documentLength, 2); final firstTextNode = editor.editorState.getTextNode(path: [0]); final firstTextInsert = firstTextNode.delta.first as TextInsert; expect(firstTextInsert.text, 'Hello'); final secondTextNode = editor.editorState.getTextNode(path: [1]); final secondTextInsert = secondTextNode.delta.first as TextInsert; expect(secondTextInsert.text, 'World'); }); }); }