input_test.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/services.dart';
  3. import 'package:flutter_test/flutter_test.dart';
  4. import 'package:mockito/annotations.dart';
  5. import 'package:mockito/mockito.dart';
  6. import 'package:xterm/frontend/input_behavior_desktop.dart';
  7. import 'package:xterm/xterm.dart';
  8. import 'input_test.mocks.dart';
  9. @GenerateMocks([
  10. TerminalUiInteraction,
  11. ])
  12. void main() {
  13. group('InputBehaviorDesktop', () {
  14. test('can handle fast typing', () {
  15. final mockTerminal = MockTerminalUiInteraction();
  16. final inputBehavior = InputBehaviorDesktop();
  17. inputBehavior.onTextEdit(composing('l', -1, -1), mockTerminal);
  18. verify(mockTerminal.raiseOnInput('l'));
  19. verifyNever(mockTerminal.updateComposingString(any));
  20. inputBehavior.onTextEdit(composing('ls', -1, -1), mockTerminal);
  21. verify(mockTerminal.raiseOnInput('s'));
  22. verifyNever(mockTerminal.updateComposingString(any));
  23. inputBehavior.onTextEdit(TextEditingValue.empty, mockTerminal);
  24. verifyNever(mockTerminal.raiseOnInput(any));
  25. verifyNever(mockTerminal.updateComposingString(any));
  26. });
  27. test('can handle English', () {
  28. final mockTerminal = MockTerminalUiInteraction();
  29. final inputBehavior = InputBehaviorDesktop();
  30. // typing 'hello'
  31. inputBehavior.onTextEdit(composing('h', 1, 1), mockTerminal);
  32. verify(mockTerminal.raiseOnInput('h'));
  33. verifyNever(mockTerminal.updateComposingString(any));
  34. inputBehavior.onTextEdit(TextEditingValue.empty, mockTerminal);
  35. inputBehavior.onTextEdit(composing('e', 1, 1), mockTerminal);
  36. verify(mockTerminal.raiseOnInput('e'));
  37. verifyNever(mockTerminal.updateComposingString(any));
  38. inputBehavior.onTextEdit(TextEditingValue.empty, mockTerminal);
  39. inputBehavior.onTextEdit(composing('l', 1, 1), mockTerminal);
  40. verify(mockTerminal.raiseOnInput('l'));
  41. verifyNever(mockTerminal.updateComposingString(any));
  42. inputBehavior.onTextEdit(TextEditingValue.empty, mockTerminal);
  43. inputBehavior.onTextEdit(composing('l', 1, 1), mockTerminal);
  44. verify(mockTerminal.raiseOnInput('l'));
  45. verifyNever(mockTerminal.updateComposingString(any));
  46. inputBehavior.onTextEdit(TextEditingValue.empty, mockTerminal);
  47. inputBehavior.onTextEdit(composing('o', 1, 1), mockTerminal);
  48. verify(mockTerminal.raiseOnInput('o'));
  49. verifyNever(mockTerminal.updateComposingString(any));
  50. });
  51. test('can handle Chinese', () {
  52. final mockTerminal = MockTerminalUiInteraction();
  53. final inputBehavior = InputBehaviorDesktop();
  54. // typing '你好'
  55. inputBehavior.onTextEdit(composing('n', 0, 1), mockTerminal);
  56. inputBehavior.onTextEdit(composing('ni', 0, 2), mockTerminal);
  57. inputBehavior.onTextEdit(composing('ni h', 0, 4), mockTerminal);
  58. inputBehavior.onTextEdit(composing('ni ha', 0, 5), mockTerminal);
  59. inputBehavior.onTextEdit(composing('ni hao', 0, 6), mockTerminal);
  60. inputBehavior.onTextEdit(composing('你好', 0, 2), mockTerminal);
  61. verify(mockTerminal.updateComposingString(any)).called(6);
  62. verifyNever(mockTerminal.raiseOnInput(any));
  63. inputBehavior.onTextEdit(composing('你好', -1, -1), mockTerminal);
  64. verify(mockTerminal.raiseOnInput('你好'));
  65. verify(mockTerminal.updateComposingString(''));
  66. });
  67. test('can handle Japanese', () {
  68. final mockTerminal = MockTerminalUiInteraction();
  69. final inputBehavior = InputBehaviorDesktop();
  70. // typing 'どうも'
  71. inputBehavior.onTextEdit(composing('d', 0, 1), mockTerminal);
  72. inputBehavior.onTextEdit(composing('ど', 0, 1), mockTerminal);
  73. inputBehavior.onTextEdit(composing('どう', 0, 2), mockTerminal);
  74. inputBehavior.onTextEdit(composing('どうm', 0, 3), mockTerminal);
  75. inputBehavior.onTextEdit(composing('どうも', 0, 3), mockTerminal);
  76. verify(mockTerminal.updateComposingString(any)).called(5);
  77. verifyNever(mockTerminal.raiseOnInput(any));
  78. inputBehavior.onTextEdit(composing('どうも', -1, -1), mockTerminal);
  79. verify(mockTerminal.raiseOnInput('どうも'));
  80. verify(mockTerminal.updateComposingString(''));
  81. });
  82. test('can handle Korean', () {
  83. final mockTerminal = MockTerminalUiInteraction();
  84. final inputBehavior = InputBehaviorDesktop();
  85. // typing '안녕'
  86. inputBehavior.onTextEdit(composing('ㅇ', 0, 1), mockTerminal);
  87. inputBehavior.onTextEdit(composing('아', 0, 1), mockTerminal);
  88. inputBehavior.onTextEdit(composing('안', 0, 1), mockTerminal);
  89. inputBehavior.onTextEdit(composing('안', 0, 1), mockTerminal);
  90. verify(mockTerminal.updateComposingString(any)).called(4);
  91. verifyNever(mockTerminal.raiseOnInput(any));
  92. inputBehavior.onTextEdit(composing('안', 1, 1), mockTerminal);
  93. verify(mockTerminal.raiseOnInput('안'));
  94. verify(mockTerminal.updateComposingString(''));
  95. inputBehavior.onTextEdit(TextEditingValue.empty, mockTerminal);
  96. inputBehavior.onTextEdit(composing('ㄴ', 0, 1), mockTerminal);
  97. inputBehavior.onTextEdit(composing('녀', 0, 1), mockTerminal);
  98. inputBehavior.onTextEdit(composing('녕', 0, 1), mockTerminal);
  99. verify(mockTerminal.updateComposingString(any)).called(3);
  100. verifyNever(mockTerminal.raiseOnInput(any));
  101. inputBehavior.onTextEdit(composing('녕', 1, 1), mockTerminal);
  102. verify(mockTerminal.raiseOnInput('녕'));
  103. verify(mockTerminal.updateComposingString(''));
  104. });
  105. });
  106. }
  107. TextEditingValue composing(String text, int start, int end) {
  108. return TextEditingValue(
  109. text: text,
  110. selection: TextSelection.collapsed(offset: text.length),
  111. composing: TextRange(start: start, end: end),
  112. );
  113. }