Skip to content

Commit

Permalink
feat: fguid
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalschmidt97 committed Oct 18, 2023
1 parent c0d6c67 commit b0306d8
Show file tree
Hide file tree
Showing 8 changed files with 614 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0"/>
<PackageReference Include="xunit" Version="2.4.1"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="FluentAssertions" Version="6.2.0"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Allegro.Extensions.Guid\Allegro.Extensions.Guid.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
using FluentAssertions;
using Xunit;
using Xunit.Abstractions;

// ReSharper disable ArgumentsStyleNamedExpression
namespace Allegro.Extensions.Guid.Tests.Unit;

public class FGuidTests
{
private readonly ITestOutputHelper _output;

public FGuidTests(ITestOutputHelper output)
{
_output = output;
FGuid.ResetOptions();
}

[Fact]
public void Examples()
{
_output.WriteLine($"Generate(): {FGuid.Generate()}");
}

[Fact]
public void ExamplesStruct()
{
_output.WriteLine($"Generate(): {FGuid.NewGuid()}");
}

[Theory]
[InlineData("1234", true)]
[InlineData(" 1234 ", true)]
[InlineData("1-234", false)]
[InlineData("1a234", false)]
public void Parse(string toParse, bool expected)
{
var parsed = FGuid.TryParse(toParse, out _);
parsed.Should().Be(expected);
}

[Fact]
public void CompareStructs()
{
var fguid = FGuid.NewGuid();
var fguidToString = fguid.ToString();
var fguidFromString = FGuid.Parse(fguidToString);
var fguidRandomNumber = FGuid.Parse("1234");
fguid.Should().Be(fguidFromString);
fguid.Should().NotBe(fguidToString); // different type
fguid.Should().NotBe(fguidRandomNumber); // different value
// TODO: more comparision
}

[Fact]
public void ConfigurationNotChanged()
{
var configuration = FGuid.GetFormattedConfiguration();
_output.WriteLine($"GetFormatted: {configuration}");
configuration.Should().NotContain("192.168.1.1");
}

[Fact]
public void NoReasonableCollision()
{
var l = new List<string>();

for (var i = 0; i <= 1_200_000; i++)
{
var gen = FGuid.Generate();
l.Add(gen);
}

l.Should().OnlyHaveUniqueItems();
}

[Theory]
[InlineData(1_200_000)]
#pragma warning disable xUnit1028
public IList<long> NoReasonableCollisionLong(int count)
#pragma warning restore xUnit1028
{
var l = new List<long>();

for (var i = 0; i <= count; i++)
{
var gen = FGuid.GenerateLong();
l.Add(gen);
}

l.Should().OnlyHaveUniqueItems();

return l;
}

[Fact]
public void NoReasonableCollisionLong_MultiThread()
{
var range = Enumerable.Range(1, 4);
var results = new List<IEnumerable<long>>();

Parallel.ForEach(
range,
_ =>
{
_output.WriteLine(
$"Thread: {Environment.CurrentManagedThreadId}, Configuration: {FGuid.GetFormattedConfiguration}");
var l = NoReasonableCollisionLong(300_000);
_output.WriteLine($"count: {l.Count}");
results.Add(l);
});

var sum = results.SelectMany(list => list).ToList();
_output.WriteLine($"sum count: {sum.Count}");

sum.Should().OnlyHaveUniqueItems();
}

[Fact]
public void FGuidsAreShorterThanGuids()
{
var guid = System.Guid.NewGuid().ToString().Replace("-", string.Empty);
var guidLength = guid.Length;
var fguid = FGuid.Generate();
var fguidLength = fguid.Length;

_output.WriteLine($"Guid: Len: {guidLength} : {guid}");
_output.WriteLine($"Guid: Len: {fguidLength} : {fguid}");

guidLength.Should().Be(32);
fguidLength.Should().Be(19);
}

[Fact]
public void TestMaxLength()
{
FGuid.GetMaxLength().Should().Be(19);
}
}

public class FGuidConfigurationTests
{
private readonly ITestOutputHelper _output;

public FGuidConfigurationTests(ITestOutputHelper output)
{
_output = output;
FGuid.ResetOptions();
}

[Fact]
public void ChangeConfiguration()
{
FGuid.SetOptions(
new(
new GeneratorIdStructureOptions(
TimestampBits: GeneratorDefaultOptions.TimestampBits,
GeneratorIpBits: GeneratorDefaultOptions.GeneratorIpBits,
GeneratorClusterBits: GeneratorDefaultOptions.GeneratorClusterBits,
SequenceBits: GeneratorDefaultOptions.SequenceBits),
new GeneratorMachineOptions(
Ip: "192.168.1.1",
Netmask: 20,
ClusterNumber: 1)));

var configuration = FGuid.GetFormattedConfiguration();
_output.WriteLine($"GetFormatted: {configuration}");
configuration.Should().Contain("192.168.1.1");
}
}
22 changes: 22 additions & 0 deletions src/Allegro.Extensions.Guid/Allegro.Extensions.Guid.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Allegro.Extensions.Guid", "Allegro.Extensions.Guid\Allegro.Extensions.Guid.csproj", "{D47784BF-7EC8-4129-8F49-67BA9D3FF3C1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Allegro.Extensions.Guid.Tests.Unit", "Allegro.Extensions.Guid.Tests.Unit\Allegro.Extensions.Guid.Tests.Unit.csproj", "{EAB26A65-AD47-4EE1-9402-4697DD3F5B7A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D47784BF-7EC8-4129-8F49-67BA9D3FF3C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D47784BF-7EC8-4129-8F49-67BA9D3FF3C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D47784BF-7EC8-4129-8F49-67BA9D3FF3C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D47784BF-7EC8-4129-8F49-67BA9D3FF3C1}.Release|Any CPU.Build.0 = Release|Any CPU
{EAB26A65-AD47-4EE1-9402-4697DD3F5B7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EAB26A65-AD47-4EE1-9402-4697DD3F5B7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EAB26A65-AD47-4EE1-9402-4697DD3F5B7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EAB26A65-AD47-4EE1-9402-4697DD3F5B7A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<PackageId>Allegro.Extensions.Guid</PackageId>
<PackageDescription>Contains FGuid</PackageDescription>
<NoWarn>${NoWarn},SA1516,MA0076,MA0011,SA1118,SA1204,SA1202,MA0008</NoWarn>
</PropertyGroup>
<Import Project="..\..\Package.Build.props"/>
<ItemGroup>
<PackageReference Include="IdGen" Version="3.0.1"/>
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="Allegro.Extensions.Guid.Tests.Unit"/>
</ItemGroup>
</Project>
Loading

0 comments on commit b0306d8

Please sign in to comment.