// 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 completeInteractiveForm( Command command, Map 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); } }