// Copyright (c) Microsoft. All rights reserved. using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.AI; namespace Microsoft.Agents.AI.UnitTests.AgentSkills; /// /// Unit tests for . /// public sealed class AgentInlineSkillScriptTests { [Fact] public async Task RunAsync_InvokesDelegate_ReturnsResultAsync() { // Arrange var script = new AgentInlineSkillScript("greet", () => "hello"); var skill = new AgentInlineSkill("test-skill", "Test.", "Instructions."); // Act var result = await script.RunAsync(skill, new AIFunctionArguments(), CancellationToken.None); // Assert Assert.Equal("hello", result?.ToString()); } [Fact] public async Task RunAsync_WithParameters_PassesArgumentsAsync() { // Arrange var script = new AgentInlineSkillScript("add", (int a, int b) => a + b); var skill = new AgentInlineSkill("calc-skill", "Calc.", "Instructions."); var args = new AIFunctionArguments { ["a"] = 3, ["b"] = 7 }; // Act var result = await script.RunAsync(skill, args, CancellationToken.None); // Assert Assert.Equal(10, int.Parse(result?.ToString()!)); } [Fact] public void ParametersSchema_NoParameters_ReturnsSchema() { // Arrange var script = new AgentInlineSkillScript("noop", () => "ok"); // Act var schema = script.ParametersSchema; // Assert — parameterless delegates still produce a schema Assert.NotNull(schema); } [Fact] public void ParametersSchema_WithParameters_ContainsPropertyNames() { // Arrange var script = new AgentInlineSkillScript("search", (string query, int limit) => $"{query}:{limit}"); // Act var schema = script.ParametersSchema; // Assert Assert.NotNull(schema); var schemaText = schema!.Value.GetRawText(); Assert.Contains("query", schemaText); Assert.Contains("limit", schemaText); } [Fact] public void Constructor_SetsNameAndDescription() { // Arrange & Act var script = new AgentInlineSkillScript("my-script", () => "ok", "Does something."); // Assert Assert.Equal("my-script", script.Name); Assert.Equal("Does something.", script.Description); } [Fact] public void Constructor_NullDescription_DescriptionIsNull() { // Arrange & Act var script = new AgentInlineSkillScript("my-script", () => "ok"); // Assert Assert.Null(script.Description); } [Fact] public void Constructor_NullName_Throws() { // Act & Assert Assert.Throws(() => new AgentInlineSkillScript(null!, () => "ok")); } [Fact] public void Constructor_WhitespaceName_Throws() { // Act & Assert Assert.Throws(() => new AgentInlineSkillScript(" ", () => "ok")); } [Fact] public void Constructor_NullMethod_Throws() { // Act & Assert Assert.Throws(() => new AgentInlineSkillScript("my-script", null!)); } [Fact] public async Task RunAsync_StringParameter_WorksAsync() { // Arrange var script = new AgentInlineSkillScript("echo", (string message) => message); var skill = new AgentInlineSkill("test-skill", "Test.", "Instructions."); var args = new AIFunctionArguments { ["message"] = "hello world" }; // Act var result = await script.RunAsync(skill, args, CancellationToken.None); // Assert Assert.Equal("hello world", result?.ToString()); } }