blob: 027a37f80767369b95e8e5f264e2e2335b373fb9 [file]
// 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);
}
}