| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/services.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| late TextStyle composingStyle; |
| late TextStyle misspelledTextStyle; |
| |
| void main() { |
| setUp(() { |
| composingStyle = const TextStyle(decoration: TextDecoration.underline); |
| |
| // Using Android handling for testing. |
| misspelledTextStyle = TextField.materialMisspelledTextStyle; |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions ignores composing region when composing region out of range', |
| () { |
| const String text = 'Hello, wrold! Hey'; |
| const TextEditingValue value = TextEditingValue(text: text); |
| const bool composingRegionOutOfRange = true; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(text, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 7, end: 12), <String>['world', 'word', 'old']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions, isolated misspelled word with separate composing region example', |
| () { |
| const String text = 'Hello, wrold! Hey'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 14, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(text, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 7, end: 12), <String>['world', 'word', 'old']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! '), |
| TextSpan(style: composingStyle, text: 'Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions, composing region and misspelled words overlap example', |
| () { |
| const String text = 'Right worng worng right'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 12, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(text, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 6, end: 11), <String>['wrong', 'worn', 'wrung']), |
| SuggestionSpan( |
| TextRange(start: 12, end: 17), <String>['wrong', 'worn', 'wrung']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Right '), |
| TextSpan(style: misspelledTextStyle, text: 'worng'), |
| const TextSpan(text: ' '), |
| TextSpan(style: composingStyle, text: 'worng'), |
| const TextSpan(text: ' right'), |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions, consecutive misspelled words example', |
| () { |
| const String text = 'Right worng worng right'; |
| const TextEditingValue value = TextEditingValue(text: text); |
| const bool composingRegionOutOfRange = true; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(text, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 6, end: 11), <String>['wrong', 'worn', 'wrung']), |
| SuggestionSpan( |
| TextRange(start: 12, end: 17), <String>['wrong', 'worn', 'wrung']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Right '), |
| TextSpan(style: misspelledTextStyle, text: 'worng'), |
| const TextSpan(text: ' '), |
| TextSpan(style: misspelledTextStyle, text: 'worng'), |
| const TextSpan(text: ' right'), |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions corrects results when they lag, results text shorter than actual text example', |
| () { |
| const String text = 'Hello, wrold! Hey'; |
| const String resultsText = 'Hello, wrold!'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 14, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(resultsText, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 7, end: 12), <String>['world', 'word', 'old']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! '), |
| TextSpan(style: composingStyle, text: 'Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions corrects results when they lag, results text longer with more misspelled words than actual text example', |
| () { |
| const String text = 'Hello, wrold! Hey'; |
| const String resultsText = 'Hello, wrold Hey feirnd!'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 14, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(resultsText, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 7, end: 12), <String>['world', 'word', 'old']), |
| SuggestionSpan( |
| TextRange(start: 17, end: 23), <String>['friend', 'fiend', 'fern']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! '), |
| TextSpan(style: composingStyle, text: 'Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions corrects results when they lag, results text mismatched example', |
| () { |
| const String text = 'Hello, wrold! Hey'; |
| const String resultsText = 'Hello, wrild! Hey'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 14, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(resultsText, <SuggestionSpan>[ |
| SuggestionSpan(TextRange(start: 7, end: 12), <String>['wild', 'world']), |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, wrold! '), |
| TextSpan(style: composingStyle, text: 'Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions corrects results when they lag, results shifted forward example', |
| () { |
| const String text = 'Hello, there wrold! Hey'; |
| const String resultsText = 'Hello, wrold! Hey'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 20, end: 23)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(resultsText, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 7, end: 12), <String>['world', 'word', 'old']), |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, there '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! '), |
| TextSpan(style: composingStyle, text: 'Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions corrects results when they lag, results shifted backwards example', |
| () { |
| const String text = 'Hello, wrold! Hey'; |
| const String resultsText = 'Hello, great wrold! Hey'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 14, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(resultsText, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 13, end: 18), <String>['world', 'word', 'old']), |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! '), |
| TextSpan(style: composingStyle, text: 'Hey') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| |
| test( |
| 'buildTextSpanWithSpellCheckSuggestions corrects results when they lag, results shifted backwards and forwards example', |
| () { |
| const String text = 'Hello, wrold! And Hye!'; |
| const String resultsText = 'Hello, great wrold! Hye!'; |
| const TextEditingValue value = TextEditingValue( |
| text: text, composing: TextRange(start: 14, end: 17)); |
| const bool composingRegionOutOfRange = false; |
| const SpellCheckResults spellCheckResults = |
| SpellCheckResults(resultsText, <SuggestionSpan>[ |
| SuggestionSpan( |
| TextRange(start: 13, end: 18), <String>['world', 'word', 'old']), |
| SuggestionSpan(TextRange(start: 20, end: 23), <String>['Hey', 'He']) |
| ]); |
| |
| final TextSpan expectedTextSpanTree = TextSpan(children: <TextSpan>[ |
| const TextSpan(text: 'Hello, '), |
| TextSpan(style: misspelledTextStyle, text: 'wrold'), |
| const TextSpan(text: '! '), |
| TextSpan(style: composingStyle, text: 'And'), |
| const TextSpan(text: ' '), |
| TextSpan(style: misspelledTextStyle, text: 'Hye'), |
| const TextSpan(text: '!') |
| ]); |
| final TextSpan textSpanTree = |
| buildTextSpanWithSpellCheckSuggestions( |
| value, |
| composingRegionOutOfRange, |
| null, |
| misspelledTextStyle, |
| spellCheckResults, |
| ); |
| |
| expect(textSpanTree, equals(expectedTextSpanTree)); |
| }); |
| } |