File: ChatCompletion\ReasoningOptionsTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.AI.Abstractions.Tests\Microsoft.Extensions.AI.Abstractions.Tests.csproj (Microsoft.Extensions.AI.Abstractions.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using Xunit;
 
namespace Microsoft.Extensions.AI;
 
public class ReasoningOptionsTests
{
    [Fact]
    public void Constructor_Default_PropertiesAreNull()
    {
        ReasoningOptions options = new();
 
        Assert.Null(options.Effort);
        Assert.Null(options.Output);
    }
 
    [Theory]
    [InlineData(ReasoningEffort.None)]
    [InlineData(ReasoningEffort.Low)]
    [InlineData(ReasoningEffort.Medium)]
    [InlineData(ReasoningEffort.High)]
    [InlineData(ReasoningEffort.ExtraHigh)]
    public void Effort_Roundtrips(ReasoningEffort effort)
    {
        ReasoningOptions options = new() { Effort = effort };
        Assert.Equal(effort, options.Effort);
    }
 
    [Theory]
    [InlineData(ReasoningOutput.None)]
    [InlineData(ReasoningOutput.Summary)]
    [InlineData(ReasoningOutput.Full)]
    public void Output_Roundtrips(ReasoningOutput output)
    {
        ReasoningOptions options = new() { Output = output };
        Assert.Equal(output, options.Output);
    }
 
    [Fact]
    public void JsonSerialization_Roundtrips()
    {
        ReasoningOptions options = new()
        {
            Effort = ReasoningEffort.High,
            Output = ReasoningOutput.Full,
        };
 
        string json = JsonSerializer.Serialize(options, TestJsonSerializerContext.Default.ReasoningOptions);
        ReasoningOptions? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ReasoningOptions);
 
        Assert.NotNull(deserialized);
        Assert.Equal(options.Effort, deserialized.Effort);
        Assert.Equal(options.Output, deserialized.Output);
    }
 
    [Fact]
    public void JsonSerialization_NullProperties_Roundtrips()
    {
        ReasoningOptions options = new();
 
        string json = JsonSerializer.Serialize(options, TestJsonSerializerContext.Default.ReasoningOptions);
        ReasoningOptions? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ReasoningOptions);
 
        Assert.NotNull(deserialized);
        Assert.Null(deserialized.Effort);
        Assert.Null(deserialized.Output);
    }
 
    [Fact]
    public void JsonSerialization_EffortOnly_Roundtrips()
    {
        ReasoningOptions options = new() { Effort = ReasoningEffort.Medium };
 
        string json = JsonSerializer.Serialize(options, TestJsonSerializerContext.Default.ReasoningOptions);
        ReasoningOptions? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ReasoningOptions);
 
        Assert.NotNull(deserialized);
        Assert.Equal(ReasoningEffort.Medium, deserialized.Effort);
        Assert.Null(deserialized.Output);
    }
 
    [Fact]
    public void JsonSerialization_OutputOnly_Roundtrips()
    {
        ReasoningOptions options = new() { Output = ReasoningOutput.Summary };
 
        string json = JsonSerializer.Serialize(options, TestJsonSerializerContext.Default.ReasoningOptions);
        ReasoningOptions? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ReasoningOptions);
 
        Assert.NotNull(deserialized);
        Assert.Null(deserialized.Effort);
        Assert.Equal(ReasoningOutput.Summary, deserialized.Output);
    }
 
    [Fact]
    public void JsonSerialization_AllEffortValues_SerializeAsStrings()
    {
        // Test all ReasoningEffort values serialize correctly
        foreach (ReasoningEffort effort in new[] { ReasoningEffort.None, ReasoningEffort.Low, ReasoningEffort.Medium, ReasoningEffort.High, ReasoningEffort.ExtraHigh })
        {
            string json = JsonSerializer.Serialize(effort, TestJsonSerializerContext.Default.ReasoningEffort);
            ReasoningEffort? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ReasoningEffort);
            Assert.Equal(effort, deserialized);
        }
    }
 
    [Fact]
    public void JsonSerialization_AllOutputValues_SerializeAsStrings()
    {
        // Test all ReasoningOutput values serialize correctly
        foreach (ReasoningOutput output in new[] { ReasoningOutput.None, ReasoningOutput.Summary, ReasoningOutput.Full })
        {
            string json = JsonSerializer.Serialize(output, TestJsonSerializerContext.Default.ReasoningOutput);
            ReasoningOutput? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ReasoningOutput);
            Assert.Equal(output, deserialized);
        }
    }
}