Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions Foundation.Data.Doublets.Cli.Tests/PinnedTypesDecoratorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Platform.Data;
using Platform.Data.Doublets;
using Platform.Data.Doublets.Memory.United.Generic;
using Platform.Delegates;
using Xunit;

namespace Foundation.Data.Doublets.Cli.Tests
{
public class PinnedTypesDecoratorTests
{
[Fact]
public void Should_Implement_Both_ILinks_And_IPinnedTypes()
{
// Arrange
var tempDbFile = Path.GetTempFileName();
try
{
using var links = new UnitedMemoryLinks<ulong>(tempDbFile);

// Act
var decorator = new PinnedTypesDecorator<ulong>(links);

// Assert - Should implement both interfaces
Assert.IsAssignableFrom<ILinks<ulong>>(decorator);
Assert.IsAssignableFrom<IPinnedTypes<ulong>>(decorator);
}
finally
{
File.Delete(tempDbFile);
}
}

[Fact]
public void Should_Enumerate_PinnedTypes()
{
// Arrange
var tempDbFile = Path.GetTempFileName();
try
{
using var links = new UnitedMemoryLinks<ulong>(tempDbFile);
var decorator = new PinnedTypesDecorator<ulong>(links);
var numberOfTypes = 3;

// Act
var result = new List<ulong>();
foreach (var type in decorator.Take(numberOfTypes))
{
result.Add(type);
}

// Assert
Assert.Equal(numberOfTypes, result.Count);
Assert.Equal(new ulong[] { 1, 2, 3 }, result);
}
finally
{
File.Delete(tempDbFile);
}
}

[Fact]
public void Should_Support_Deconstruction()
{
// Arrange
var tempDbFile = Path.GetTempFileName();
try
{
using var links = new UnitedMemoryLinks<ulong>(tempDbFile);
var decorator = new PinnedTypesDecorator<ulong>(links);
var initialSource = 1UL;

// Pre-create links to ensure they exist
links.GetOrCreate(initialSource, 1UL);
links.GetOrCreate(initialSource, 2UL);
links.GetOrCreate(initialSource, 3UL);

// Act
var (type1, type2, type3) = decorator;

// Assert
Assert.Equal(1UL, type1);
Assert.Equal(2UL, type2);
Assert.Equal(3UL, type3);
}
finally
{
File.Delete(tempDbFile);
}
}

[Fact]
public void Should_Work_As_ILinks_Decorator()
{
// Arrange
var tempDbFile = Path.GetTempFileName();
try
{
using var baseLinks = new UnitedMemoryLinks<ulong>(tempDbFile);
var decorator = new PinnedTypesDecorator<ulong>(baseLinks);

// Act & Assert - Test that it still works as a decorator and properly implements both interfaces
Assert.NotNull(decorator);
Assert.IsAssignableFrom<ILinks<ulong>>(decorator);
Assert.IsAssignableFrom<IPinnedTypes<ulong>>(decorator);
}
finally
{
File.Delete(tempDbFile);
}
}
}
}
22 changes: 21 additions & 1 deletion Foundation.Data.Doublets.Cli/PinnedTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@

namespace Foundation.Data.Doublets.Cli
{
public class PinnedTypes<TLinkAddress> : IEnumerable<TLinkAddress>
public interface IPinnedTypes<TLinkAddress> : IEnumerable<TLinkAddress>
where TLinkAddress : struct, System.Numerics.IUnsignedNumber<TLinkAddress>
{
void Deconstruct(out TLinkAddress type1, out TLinkAddress type2, out TLinkAddress type3);
}

public class PinnedTypes<TLinkAddress> : IPinnedTypes<TLinkAddress>
where TLinkAddress : struct, System.Numerics.IUnsignedNumber<TLinkAddress>
{
private readonly ILinks<TLinkAddress> _links;
Expand Down Expand Up @@ -83,5 +89,19 @@ public void Dispose()
// No resources to dispose
}
}

public void Deconstruct(out TLinkAddress type1, out TLinkAddress type2, out TLinkAddress type3)
{
using var enumerator = GetEnumerator();

enumerator.MoveNext();
type1 = enumerator.Current;

enumerator.MoveNext();
type2 = enumerator.Current;

enumerator.MoveNext();
type3 = enumerator.Current;
}
}
}
43 changes: 43 additions & 0 deletions Foundation.Data.Doublets.Cli/PinnedTypesDecorator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using Platform.Data;
using Platform.Data.Doublets;
using Platform.Data.Doublets.Decorators;
using Platform.Delegates;

namespace Foundation.Data.Doublets.Cli
{
public class PinnedTypesDecorator<TLinkAddress> : LinksDecoratorBase<TLinkAddress>, IPinnedTypes<TLinkAddress>
where TLinkAddress : struct,
IUnsignedNumber<TLinkAddress>,
IComparisonOperators<TLinkAddress, TLinkAddress, bool>,
IShiftOperators<TLinkAddress, int, TLinkAddress>,
IBitwiseOperators<TLinkAddress, TLinkAddress, TLinkAddress>,
IMinMaxValue<TLinkAddress>
{
private readonly IPinnedTypes<TLinkAddress> _pinnedTypes;

public PinnedTypesDecorator(ILinks<TLinkAddress> links) : base(links)
{
_pinnedTypes = new PinnedTypes<TLinkAddress>(links);
}

// Implement IPinnedTypes interface
public IEnumerator<TLinkAddress> GetEnumerator()
{
return _pinnedTypes.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}

public void Deconstruct(out TLinkAddress type1, out TLinkAddress type2, out TLinkAddress type3)
{
_pinnedTypes.Deconstruct(out type1, out type2, out type3);
}
}
}