Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .docfx/Dockerfile.docfx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ARG NGINX_VERSION=1.30.0-alpine
ARG NGINX_VERSION=1.31.0-alpine

FROM --platform=$BUILDPLATFORM nginx:${NGINX_VERSION} AS base
RUN rm -rf /usr/share/nginx/html/*
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ jobs:
if: github.event_name != 'pull_request'
name: call-nuget
needs: [build, pack, test_linux, test_windows, sonarcloud, codecov, codeql]
uses: codebeltnet/jobs-nuget-push/.github/workflows/default.yml@v2
uses: codebeltnet/jobs-nuget-push/.github/workflows/default.yml@v3
with:
version: ${{ needs.build.outputs.version }}
environment: Production
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
Version: 10.0.7
Availability: .NET 10, .NET 9 and .NET Standard 2.0

# ALM
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)

Version: 10.0.6
Availability: .NET 10, .NET 9 and .NET Standard 2.0

Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ For more details, please refer to `PackageReleaseNotes.txt` on a per assembly ba
> [!NOTE]
> Changelog entries prior to version 9.0.1 was migrated from previous versions of Cuemon.Extensions.Globalization.

## [10.0.7] - 2026-05-23

This is a service update that focuses on package dependencies.

## [10.0.6] - 2026-04-18

This is a service update that focuses on package dependencies.
Expand Down
10 changes: 5 additions & 5 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Codebelt.Extensions.Xunit" Version="11.0.9" />
<PackageVersion Include="Codebelt.Extensions.YamlDotNet" Version="10.1.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageVersion Include="Codebelt.Extensions.Xunit" Version="11.0.10" />
<PackageVersion Include="Codebelt.Extensions.YamlDotNet" Version="10.1.3" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
<PackageVersion Include="MinVer" Version="7.0.0" />
<PackageVersion Include="coverlet.collector" Version="10.0.0" />
<PackageVersion Include="coverlet.msbuild" Version="10.0.0" />
<PackageVersion Include="coverlet.collector" Version="10.0.1" />
<PackageVersion Include="coverlet.msbuild" Version="10.0.1" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="xunit.v3.runner.console" Version="3.2.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Runtime.InteropServices;
using Codebelt.Extensions.Xunit;
using Xunit;
Expand All @@ -13,6 +14,36 @@ public CultureInfoExtensionsTest(ITestOutputHelper output) : base(output)
{
}

[Fact]
public void UseNationalLanguageSupport_ShouldCloneAndEnrich_WhenCultureInfoIsReadOnly()
{
var sut = CultureInfo.GetCultureInfo("fr-FR").UseNationalLanguageSupport();

Assert.NotNull(sut);
Assert.NotNull(sut.DateTimeFormat);
Assert.NotNull(sut.NumberFormat);

TestOutput.WriteLine($"{sut.EnglishName}: ShortDatePattern={sut.DateTimeFormat.ShortDatePattern}");
}

[Fact]
public void UseNationalLanguageSupport_ShouldThrowInvalidOperationException_WhenNoSurrogateExists()
{
Assert.Throws<InvalidOperationException>(() => new CultureInfo("en").UseNationalLanguageSupport());
}

[Fact]
public void UseNationalLanguageSupport_ShouldThrowArgumentNullException_WhenCultureIsNull()
{
Assert.Throws<ArgumentNullException>(() => ((CultureInfo)null).UseNationalLanguageSupport());
}

[Fact]
public void UseNationalLanguageSupport_ShouldThrowArgumentNullException_WhenCulturesIsNull()
{
Assert.Throws<ArgumentNullException>(() => ((IEnumerable<CultureInfo>)null).UseNationalLanguageSupport().ToList());
}

[Fact]
public void UseNationalLanguageSupport_ShouldHaveDifferentFormattingAsWindowsVariant()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System.Reflection;
using Codebelt.Extensions.Xunit;
using Xunit;

namespace Codebelt.Extensions.Globalization
{
public class CultureInfoSurrogateTest : Test
{
public CultureInfoSurrogateTest(ITestOutputHelper output) : base(output)
{
}

[Fact]
public void Constructor_ShouldAssignDateTimeAndNumberFormats_WhenSurrogatesAreProvided()
{
var assembly = typeof(CultureInfoExtensions).Assembly;
var cultureInfoSurrogateType = assembly.GetType("Codebelt.Extensions.Globalization.CultureInfoSurrogate");
var dtfiSurrogateType = assembly.GetType("Codebelt.Extensions.Globalization.DateTimeFormatInfoSurrogate");
var nfiSurrogateType = assembly.GetType("Codebelt.Extensions.Globalization.NumberFormatInfoSurrogate");

var dtSurrogate = System.Activator.CreateInstance(dtfiSurrogateType, nonPublic: true);
var nfSurrogate = System.Activator.CreateInstance(nfiSurrogateType, nonPublic: true);

var ctor = cultureInfoSurrogateType.GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new[] { dtfiSurrogateType, nfiSurrogateType },
null);

var sut = ctor.Invoke(new[] { dtSurrogate, nfSurrogate });

var dateTimeFormatProp = cultureInfoSurrogateType.GetProperty("DateTimeFormat", BindingFlags.Instance | BindingFlags.NonPublic);
var numberFormatProp = cultureInfoSurrogateType.GetProperty("NumberFormat", BindingFlags.Instance | BindingFlags.NonPublic);

Assert.Same(dtSurrogate, dateTimeFormatProp.GetValue(sut));
Assert.Same(nfSurrogate, numberFormatProp.GetValue(sut));

TestOutput.WriteLine($"DateTimeFormat assigned: {dateTimeFormatProp.GetValue(sut) != null}");
TestOutput.WriteLine($"NumberFormat assigned: {numberFormatProp.GetValue(sut) != null}");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System;
using System.Globalization;
using System.Reflection;
using Codebelt.Extensions.Xunit;
using Xunit;

namespace Codebelt.Extensions.Globalization
{
public class DateTimeFormatInfoSurrogateTest : Test
{
public DateTimeFormatInfoSurrogateTest(ITestOutputHelper output) : base(output)
{
}

[Fact]
public void Constructor_ShouldCopyAllPropertiesFromDateTimeFormatInfo_WhenDateTimeFormatInfoIsProvided()
{
var assembly = typeof(CultureInfoExtensions).Assembly;
var type = assembly.GetType("Codebelt.Extensions.Globalization.DateTimeFormatInfoSurrogate");
var ctor = type.GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new[] { typeof(DateTimeFormatInfo) },
null);

var dtfi = new CultureInfo("da-DK", false).DateTimeFormat;
var sut = ctor.Invoke(new object[] { dtfi });

Assert.Equal(dtfi.AMDesignator, (string)type.GetProperty("AMDesignator").GetValue(sut));
Assert.Equal(dtfi.CalendarWeekRule, (CalendarWeekRule)type.GetProperty("CalendarWeekRule").GetValue(sut));
Assert.Equal(dtfi.DateSeparator, (string)type.GetProperty("DateSeparator").GetValue(sut));
Assert.Equal(dtfi.FirstDayOfWeek, (DayOfWeek)type.GetProperty("FirstDayOfWeek").GetValue(sut));
Assert.Equal(dtfi.FullDateTimePattern, (string)type.GetProperty("FullDateTimePattern").GetValue(sut));
Assert.Equal(dtfi.LongDatePattern, (string)type.GetProperty("LongDatePattern").GetValue(sut));
Assert.Equal(dtfi.LongTimePattern, (string)type.GetProperty("LongTimePattern").GetValue(sut));
Assert.Equal(dtfi.MonthDayPattern, (string)type.GetProperty("MonthDayPattern").GetValue(sut));
Assert.Equal(dtfi.PMDesignator, (string)type.GetProperty("PMDesignator").GetValue(sut));
Assert.Equal(dtfi.ShortDatePattern, (string)type.GetProperty("ShortDatePattern").GetValue(sut));
Assert.Equal(dtfi.ShortTimePattern, (string)type.GetProperty("ShortTimePattern").GetValue(sut));
Assert.Equal(dtfi.TimeSeparator, (string)type.GetProperty("TimeSeparator").GetValue(sut));
Assert.Equal(dtfi.YearMonthPattern, (string)type.GetProperty("YearMonthPattern").GetValue(sut));
Assert.Equal(dtfi.ShortestDayNames, (string[])type.GetProperty("ShortestDayNames").GetValue(sut));
Assert.Equal(dtfi.AbbreviatedDayNames, (string[])type.GetProperty("AbbreviatedDayNames").GetValue(sut));
Assert.Equal(dtfi.AbbreviatedMonthNames, (string[])type.GetProperty("AbbreviatedMonthNames").GetValue(sut));
Assert.Equal(dtfi.AbbreviatedMonthGenitiveNames, (string[])type.GetProperty("AbbreviatedMonthGenitiveNames").GetValue(sut));

TestOutput.WriteLine($"ShortDatePattern: {(string)type.GetProperty("ShortDatePattern").GetValue(sut)}");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System.Globalization;
using System.Reflection;
using Codebelt.Extensions.Xunit;
using Xunit;

namespace Codebelt.Extensions.Globalization
{
public class NumberFormatInfoSurrogateTest : Test
{
public NumberFormatInfoSurrogateTest(ITestOutputHelper output) : base(output)
{
}

[Fact]
public void Constructor_ShouldCopyAllPropertiesFromNumberFormatInfo_WhenNumberFormatInfoIsProvided()
{
var assembly = typeof(CultureInfoExtensions).Assembly;
var type = assembly.GetType("Codebelt.Extensions.Globalization.NumberFormatInfoSurrogate");
var ctor = type.GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new[] { typeof(NumberFormatInfo) },
null);

var nfi = new CultureInfo("da-DK", false).NumberFormat;
var sut = ctor.Invoke(new object[] { nfi });

Assert.Equal(nfi.CurrencyDecimalDigits, (int)type.GetProperty("CurrencyDecimalDigits").GetValue(sut));
Assert.Equal(nfi.CurrencyDecimalSeparator, (string)type.GetProperty("CurrencyDecimalSeparator").GetValue(sut));
Assert.Equal(nfi.CurrencyGroupSeparator, (string)type.GetProperty("CurrencyGroupSeparator").GetValue(sut));
Assert.Equal(nfi.CurrencyNegativePattern, (int)type.GetProperty("CurrencyNegativePattern").GetValue(sut));
Assert.Equal(nfi.CurrencyPositivePattern, (int)type.GetProperty("CurrencyPositivePattern").GetValue(sut));
Assert.Equal(nfi.CurrencySymbol, (string)type.GetProperty("CurrencySymbol").GetValue(sut));
Assert.Equal(nfi.DigitSubstitution, (DigitShapes)type.GetProperty("DigitSubstitution").GetValue(sut));
Assert.Equal(nfi.NaNSymbol, (string)type.GetProperty("NaNSymbol").GetValue(sut));
Assert.Equal(nfi.NegativeInfinitySymbol, (string)type.GetProperty("NegativeInfinitySymbol").GetValue(sut));
Assert.Equal(nfi.NegativeSign, (string)type.GetProperty("NegativeSign").GetValue(sut));
Assert.Equal(nfi.NumberDecimalDigits, (int)type.GetProperty("NumberDecimalDigits").GetValue(sut));
Assert.Equal(nfi.NumberDecimalSeparator, (string)type.GetProperty("NumberDecimalSeparator").GetValue(sut));
Assert.Equal(nfi.NumberGroupSeparator, (string)type.GetProperty("NumberGroupSeparator").GetValue(sut));
Assert.Equal(nfi.NumberNegativePattern, (int)type.GetProperty("NumberNegativePattern").GetValue(sut));
Assert.Equal(nfi.PerMilleSymbol, (string)type.GetProperty("PerMilleSymbol").GetValue(sut));
Assert.Equal(nfi.PercentDecimalDigits, (int)type.GetProperty("PercentDecimalDigits").GetValue(sut));
Assert.Equal(nfi.PercentDecimalSeparator, (string)type.GetProperty("PercentDecimalSeparator").GetValue(sut));
Assert.Equal(nfi.PercentGroupSeparator, (string)type.GetProperty("PercentGroupSeparator").GetValue(sut));
Assert.Equal(nfi.PercentNegativePattern, (int)type.GetProperty("PercentNegativePattern").GetValue(sut));
Assert.Equal(nfi.PercentPositivePattern, (int)type.GetProperty("PercentPositivePattern").GetValue(sut));
Assert.Equal(nfi.PercentSymbol, (string)type.GetProperty("PercentSymbol").GetValue(sut));
Assert.Equal(nfi.PositiveInfinitySymbol, (string)type.GetProperty("PositiveInfinitySymbol").GetValue(sut));
Assert.Equal(nfi.PositiveSign, (string)type.GetProperty("PositiveSign").GetValue(sut));

TestOutput.WriteLine($"CurrencySymbol: {(string)type.GetProperty("CurrencySymbol").GetValue(sut)}");
}
}
}
Loading