// Copyright (c) Microsoft. All rights reserved.
using System;
using System.Linq;
namespace Microsoft.Agents.AI.Abstractions.UnitTests;
///
/// Contains unit tests for the class.
///
public class AgentFeatureCollectionTests
{
[Fact]
public void Feature_RoundTrips()
{
// Arrange.
var interfaces = new AgentFeatureCollection();
var thing = new Thing();
// Act.
interfaces.Set(thing);
Assert.True(interfaces.TryGet(out var actualThing));
// Assert.
Assert.Same(actualThing, thing);
Assert.Equal(1, interfaces.Revision);
}
[Fact]
public void RemoveOfT_Removes()
{
// Arrange.
var interfaces = new AgentFeatureCollection();
var thing = new Thing();
interfaces.Set(thing);
Assert.True(interfaces.TryGet(out _));
// Act.
interfaces.Remove();
// Assert.
Assert.False(interfaces.TryGet(out _));
Assert.Equal(2, interfaces.Revision);
}
[Fact]
public void Remove_Removes()
{
// Arrange.
var interfaces = new AgentFeatureCollection();
var thing = new Thing();
interfaces.Set(thing);
Assert.True(interfaces.TryGet(out _));
// Act.
interfaces.Remove(typeof(IThing));
// Assert.
Assert.False(interfaces.TryGet(out _));
Assert.Equal(2, interfaces.Revision);
}
[Fact]
public void TryGetMissingFeature_ReturnsFalse()
{
// Arrange.
var interfaces = new AgentFeatureCollection();
// Act & Assert.
Assert.False(interfaces.TryGet(out var actualThing));
Assert.Null(actualThing);
}
[Fact]
public void Set_Null_Throws()
{
// Arrange.
var interfaces = new AgentFeatureCollection();
// Act & Assert.
Assert.Throws(() => interfaces.Set(null!));
}
[Fact]
public void IsReadOnly_DefaultsToFalse()
{
// Arrange.
var interfaces = new AgentFeatureCollection();
// Act & Assert.
Assert.False(interfaces.IsReadOnly);
}
[Fact]
public void TryGetOfT_FallsBackToInnerCollection()
{
// Arrange.
var inner = new AgentFeatureCollection();
var thing = new Thing();
inner.Set(thing);
var outer = new AgentFeatureCollection(inner);
// Act & Assert.
Assert.True(outer.TryGet(out var actualThing));
Assert.Same(actualThing, thing);
}
[Fact]
public void TryGetOfT_OverridesInnerWithOuterCollection()
{
// Arrange.
var inner = new AgentFeatureCollection();
var innerThing = new Thing();
inner.Set(innerThing);
var outer = new AgentFeatureCollection(inner);
var outerThing = new Thing();
outer.Set(outerThing);
// Act & Assert.
Assert.True(outer.TryGet(out var actualThing));
Assert.Same(outerThing, actualThing);
}
[Fact]
public void TryGet_FallsBackToInnerCollection()
{
// Arrange.
var inner = new AgentFeatureCollection();
var thing = new Thing();
inner.Set(thing);
var outer = new AgentFeatureCollection(inner);
// Act & Assert.
Assert.True(outer.TryGet(typeof(IThing), out var actualThing));
Assert.Same(actualThing, thing);
}
[Fact]
public void TryGet_OverridesInnerWithOuterCollection()
{
// Arrange.
var inner = new AgentFeatureCollection();
var innerThing = new Thing();
inner.Set(innerThing);
var outer = new AgentFeatureCollection(inner);
var outerThing = new Thing();
outer.Set(outerThing);
// Act & Assert.
Assert.True(outer.TryGet(typeof(IThing), out var actualThing));
Assert.Same(outerThing, actualThing);
}
[Fact]
public void Enumerate_OverridesInnerWithOuterCollection()
{
// Arrange.
var inner = new AgentFeatureCollection();
var innerThing = new Thing();
inner.Set(innerThing);
var outer = new AgentFeatureCollection(inner);
var outerThing = new Thing();
outer.Set(outerThing);
// Act.
var items = outer.ToList();
// Assert.
Assert.Single(items);
Assert.Same(outerThing, items.First().Value as IThing);
}
private interface IThing
{
string Hello();
}
private sealed class Thing : IThing
{
public string Hello()
{
return "World";
}
}
}