| File: Realtime\RealtimeClientMessageTests.cs | |
| Project: ..\..\..\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; using System.Collections.Generic; using Xunit; #pragma warning disable MEAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. namespace Microsoft.Extensions.AI; public class RealtimeClientMessageTests { [Fact] public void RealtimeClientMessage_DefaultProperties() { var message = new RealtimeClientMessage(); Assert.Null(message.MessageId); Assert.Null(message.RawRepresentation); } [Fact] public void RealtimeClientMessage_Properties_Roundtrip() { var rawObj = new object(); var message = new RealtimeClientMessage { MessageId = "evt_001", RawRepresentation = rawObj, }; Assert.Equal("evt_001", message.MessageId); Assert.Same(rawObj, message.RawRepresentation); } [Fact] public void ConversationItemCreateMessage_Constructor_SetsProperties() { var contents = new List<AIContent> { new TextContent("Hello") }; var item = new RealtimeConversationItem(contents, "item_1", ChatRole.User); var message = new CreateConversationItemRealtimeClientMessage(item); Assert.Same(item, message.Item); } [Fact] public void ConversationItemCreateMessage_Properties_Roundtrip() { var item = new RealtimeConversationItem([new TextContent("Hello")]); var message = new CreateConversationItemRealtimeClientMessage(item); var newItem = new RealtimeConversationItem([new TextContent("World")]); message.Item = newItem; Assert.Same(newItem, message.Item); } [Fact] public void ConversationItemCreateMessage_InheritsClientMessage() { var item = new RealtimeConversationItem([new TextContent("Hello")]); var message = new CreateConversationItemRealtimeClientMessage(item) { MessageId = "evt_create_1", }; Assert.Equal("evt_create_1", message.MessageId); Assert.IsAssignableFrom<RealtimeClientMessage>(message); } [Fact] public void InputAudioBufferAppendMessage_Constructor_SetsContent() { var audioContent = new DataContent(new byte[] { 1, 2, 3 }, "audio/pcm"); var message = new InputAudioBufferAppendRealtimeClientMessage(audioContent); Assert.Same(audioContent, message.Content); } [Fact] public void InputAudioBufferAppendMessage_Properties_Roundtrip() { var audioContent = new DataContent(new byte[] { 1, 2, 3 }, "audio/pcm"); var message = new InputAudioBufferAppendRealtimeClientMessage(audioContent); var newContent = new DataContent(new byte[] { 4, 5, 6 }, "audio/wav"); message.Content = newContent; Assert.Same(newContent, message.Content); } [Fact] public void InputAudioBufferAppendMessage_InheritsClientMessage() { var audioContent = new DataContent(new byte[] { 1, 2, 3 }, "audio/pcm"); var message = new InputAudioBufferAppendRealtimeClientMessage(audioContent) { MessageId = "evt_append_1", }; Assert.Equal("evt_append_1", message.MessageId); Assert.IsAssignableFrom<RealtimeClientMessage>(message); } [Fact] public void InputAudioBufferCommitMessage_Constructor() { var message = new InputAudioBufferCommitRealtimeClientMessage(); Assert.IsAssignableFrom<RealtimeClientMessage>(message); Assert.Null(message.MessageId); } [Fact] public void ResponseCreateMessage_DefaultProperties() { var message = new CreateResponseRealtimeClientMessage(); Assert.Null(message.Items); Assert.Null(message.OutputAudioOptions); Assert.Null(message.OutputVoice); Assert.Null(message.ExcludeFromConversation); Assert.Null(message.Instructions); Assert.Null(message.MaxOutputTokens); Assert.Null(message.AdditionalProperties); Assert.Null(message.OutputModalities); Assert.Null(message.ToolMode); Assert.Null(message.Tools); } [Fact] public void ResponseCreateMessage_Properties_Roundtrip() { var message = new CreateResponseRealtimeClientMessage(); var items = new List<RealtimeConversationItem> { new RealtimeConversationItem([new TextContent("Hello")], "item_1", ChatRole.User), }; var audioFormat = new RealtimeAudioFormat("audio/pcm", 16000); var modalities = new List<string> { "text", "audio" }; var tools = new List<AITool> { AIFunctionFactory.Create(() => 42) }; var metadata = new AdditionalPropertiesDictionary { ["key"] = "value" }; message.Items = items; message.OutputAudioOptions = audioFormat; message.OutputVoice = "alloy"; message.ExcludeFromConversation = true; message.Instructions = "Be brief"; message.MaxOutputTokens = 100; message.AdditionalProperties = metadata; message.OutputModalities = modalities; message.ToolMode = ChatToolMode.Auto; message.Tools = tools; Assert.Same(items, message.Items); Assert.Same(audioFormat, message.OutputAudioOptions); Assert.Equal("alloy", message.OutputVoice); Assert.True(message.ExcludeFromConversation); Assert.Equal("Be brief", message.Instructions); Assert.Equal(100, message.MaxOutputTokens); Assert.Same(metadata, message.AdditionalProperties); Assert.Same(modalities, message.OutputModalities); Assert.Equal(ChatToolMode.Auto, message.ToolMode); Assert.Same(tools, message.Tools); } [Fact] public void ResponseCreateMessage_InheritsClientMessage() { var message = new CreateResponseRealtimeClientMessage { MessageId = "evt_resp_1", RawRepresentation = "raw", }; Assert.Equal("evt_resp_1", message.MessageId); Assert.Equal("raw", message.RawRepresentation); Assert.IsAssignableFrom<RealtimeClientMessage>(message); } }