| // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file | |
| // for details. 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:language_server_protocol/protocol_custom_generated.dart'; | |
| import 'package:language_server_protocol/protocol_generated.dart'; | |
| import 'package:matcher/expect.dart'; | |
| import '../lsp/request_helpers_mixin.dart'; | |
| mixin InteractiveFormsTestMixin on LspRequestHelpersMixin { | |
| /// A helper to complete an interactive form, taking the place of a user and | |
| /// the client-side code. | |
| /// | |
| /// [command] is the original command that will be resolved. | |
| /// | |
| /// [answers] is a map of Field ID -> answer values that should be provided. | |
| /// | |
| /// Returns an updated command after fields have been answered that can be | |
| /// executed. | |
| Future<Command> completeInteractiveForm( | |
| Command command, | |
| Map<String, Object?> answers, | |
| ) async { | |
| var interactiveCommand = InteractiveExecuteCommandParams( | |
| command: command.command, | |
| arguments: command.arguments, | |
| ); | |
| // Perform an initial resolve to get the form. | |
| interactiveCommand = await resolveCommand(interactiveCommand); | |
| // Expect at least some fields (we wouldn't have been called if none were | |
| // expected). | |
| expect(interactiveCommand.formFields, allOf(isNotNull, isNotEmpty)); | |
| // Ensure all answers we have are in the form. | |
| expect( | |
| interactiveCommand.formFields!.map((field) => field.id), | |
| containsAll(answers.keys), | |
| ); | |
| // Resolve again, using the answers we were given. | |
| interactiveCommand = InteractiveExecuteCommandParams( | |
| command: interactiveCommand.command, | |
| arguments: interactiveCommand.arguments, | |
| formFields: interactiveCommand.formFields, | |
| formAnswers: answers.keys | |
| .map((id) => FormAnswer(id: id, value: answers[id])) | |
| .toList(), | |
| ); | |
| interactiveCommand = await resolveCommand(interactiveCommand); | |
| // Ensure the form is considered complete. | |
| expect(interactiveCommand.formFields, isNull); | |
| // Return the updated command. | |
| return Command( | |
| title: command.title, | |
| command: interactiveCommand.command, | |
| arguments: interactiveCommand.arguments, | |
| ); | |
| } | |
| } | |
| extension FormFieldExtension on FormField { | |
| /// Returns a [FormAnswer] for this field with the answer [value]. | |
| FormAnswer answer(Object? value) { | |
| return FormAnswer(id: id, value: value); | |
| } | |
| } |