Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Shared.Tests - Add Tests #708

Merged
merged 14 commits into from
Sep 12, 2023
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
30 changes: 30 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
types: [ "review_requested", "ready_for_review" ]
workflow_dispatch:
name: Tests
permissions:
id-token: write
contents: read
jobs:
shared:
name: "Test NickvisionMoney.Shared"
runs-on: ubuntu-latest
strategy:
matrix:
dotnet-version: [ '7.0.x' ]
steps:
- uses: actions/checkout@v3
- name: Setup .NET Core SDK ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v3
with:
dotnet-version: ${{ matrix.dotnet-version }}
- name: Install dependencies
run: dotnet restore NickvisionMoney.Shared/NickvisionMoney.Shared.csproj
- name: Build
run: dotnet build NickvisionMoney.Shared/NickvisionMoney.Shared.csproj --configuration Release --no-restore
- name: Test
run: dotnet test NickvisionMoney.Shared.Tests/NickvisionMoney.Shared.Tests.csproj --verbosity normal
1 change: 0 additions & 1 deletion NickvisionMoney.GNOME/Blueprints/group_dialog.blp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ Adw.Window _root {
modal: true;
resizable: false;
default-widget: _applyButton;
hide-on-close: true;

content: Gtk.Box {
orientation: vertical;
Expand Down
3 changes: 1 addition & 2 deletions NickvisionMoney.GNOME/Blueprints/shortcuts_dialog.blp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ Gtk.ShortcutsWindow _root {
modal: true;
resizable: true;
destroy-with-parent: false;
hide-on-close: true;


Gtk.ShortcutsSection {
Gtk.ShortcutsGroup {
title: _("Account");
Expand Down
1 change: 0 additions & 1 deletion NickvisionMoney.GNOME/Blueprints/transaction_dialog.blp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ Adw.Window _root {
default-width: 450;
resizable: false;
modal: true;
hide-on-close: true;

content: Gtk.Box {
orientation: vertical;
Expand Down
1 change: 1 addition & 0 deletions NickvisionMoney.GNOME/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public Program(string[] args)
@"* Fixed an issue where the currency conversion service would provide the wrong conversion rate
* Fixed an issue where small converted currency amounts would show as 0
* Improved UX in Currency Converter dialog
* Fixed incorrect display of amounts for locales that use Cape Verdean escudo as currency
* Updated and added translations (Thanks to everyone on Weblate)!";
_application.OnActivate += OnActivate;
if (File.Exists(Path.GetFullPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) + "/org.nickvision.money.gresource"))
Expand Down
178 changes: 178 additions & 0 deletions NickvisionMoney.Shared.Tests/CurrencyHelperTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
using System.Globalization;
using NickvisionMoney.Shared.Helpers;
using Xunit;

namespace NickvisionMoney.Shared.Tests;

public class CurrencyHelperTests
{
private static decimal[] SampleAmounts = { 0M, 109M, 100M, 10920M, 0.002M, 1.2M, 12.00000004M, 1.0234567890M };

public static IEnumerable<object[]> GetSampleDataWithRealCultures()
{
var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures).AsEnumerable();
foreach (var culture in cultures)
{
foreach (var number in SampleAmounts)
{
yield return new object[] { culture, number };
}
}
}

public static IEnumerable<object[]> GetSampleDataWithCustomCultures()
{
var culture1 = (CultureInfo)CultureInfo.InvariantCulture.Clone();
var culture2 = (CultureInfo)CultureInfo.InvariantCulture.Clone();
var culture3 = (CultureInfo)CultureInfo.InvariantCulture.Clone();
var culture4 = (CultureInfo)CultureInfo.InvariantCulture.Clone();
// Decimal digits
culture1.NumberFormat.CurrencyDecimalDigits = 1;
culture2.NumberFormat.CurrencyDecimalDigits = 2;
culture3.NumberFormat.CurrencyDecimalDigits = 3;
culture4.NumberFormat.CurrencyDecimalDigits = 99;
// Decimal separator
culture1.NumberFormat.CurrencyDecimalSeparator = ".";
culture2.NumberFormat.CurrencyDecimalSeparator = "/";
culture3.NumberFormat.CurrencyDecimalSeparator = "'";
culture4.NumberFormat.CurrencyDecimalSeparator = "*";
// Group separator
culture1.NumberFormat.CurrencyGroupSeparator = ",";
culture2.NumberFormat.CurrencyGroupSeparator = "-";
culture3.NumberFormat.CurrencyGroupSeparator = ".";
culture4.NumberFormat.CurrencyGroupSeparator = " ";
// Currency symbol
culture1.NumberFormat.CurrencySymbol = "\ud83e\ude99";
culture2.NumberFormat.CurrencySymbol = ":O";
culture3.NumberFormat.CurrencySymbol = ":D";
culture4.NumberFormat.CurrencySymbol = ":(";
// Currency positive pattern
culture1.NumberFormat.CurrencyPositivePattern = 0;
culture2.NumberFormat.CurrencyPositivePattern = 1;
culture3.NumberFormat.CurrencyPositivePattern = 2;
culture4.NumberFormat.CurrencyPositivePattern = 3;
foreach (var amount in SampleAmounts)
{
yield return new object[] { culture1, amount };
yield return new object[] { culture2, amount };
yield return new object[] { culture3, amount };
yield return new object[] { culture4, amount };
}
}

[Theory]
[MemberData(nameof(GetSampleDataWithRealCultures))]
public void ToAmountString_RealCulturesShouldWorkByDefault(CultureInfo culture, decimal amount)
{
var expected = amount.ToString("C", culture);
var result = amount.ToAmountString(culture, false);
Assert.Equal(expected, result);
}

[Theory]
[MemberData(nameof(GetSampleDataWithCustomCultures))]
public void ToAmountString_CustomCulturesShouldWorkByDefault(CultureInfo culture, decimal amount)
{
var expected = amount.ToString("C", culture);
RemoveSymbol(ref expected, culture);
FormatUnlimitedDecimals(ref expected, culture);
AddSymbol(ref expected, culture);
var result = amount.ToAmountString(culture, false);
Assert.Equal(expected, result);
}

[Theory]
[MemberData(nameof(GetSampleDataWithRealCultures))]
public void ToAmountString_RealCulturesShouldWorkWithNativeDigits(CultureInfo culture, decimal amount)
{
var expected = amount.ToString("C", culture);
expected = expected
.Replace("0", culture.NumberFormat.NativeDigits[0])
.Replace("1", culture.NumberFormat.NativeDigits[1])
.Replace("2", culture.NumberFormat.NativeDigits[2])
.Replace("3", culture.NumberFormat.NativeDigits[3])
.Replace("4", culture.NumberFormat.NativeDigits[4])
.Replace("5", culture.NumberFormat.NativeDigits[5])
.Replace("6", culture.NumberFormat.NativeDigits[6])
.Replace("7", culture.NumberFormat.NativeDigits[7])
.Replace("8", culture.NumberFormat.NativeDigits[8])
.Replace("9", culture.NumberFormat.NativeDigits[9]);
var result = amount.ToAmountString(culture, true);
Assert.Equal(expected, result);
}

[Theory]
[MemberData(nameof(GetSampleDataWithRealCultures))]
public void ToAmountString_RealCulturesShouldWorkWithoutCurrencySymbol(CultureInfo culture, decimal amount)
{
var expected = amount.ToString("C", culture);
expected = expected.Replace(culture.NumberFormat.CurrencySymbol, "").Trim();
var result = amount.ToAmountString(culture, false, false);
Assert.Equal(expected, result);
}

[Theory]
[MemberData(nameof(GetSampleDataWithCustomCultures))]
public void ToAmountString_CustomCulturesShouldWorkWithoutCurrencySymbol(CultureInfo culture, decimal amount)
{
var expected = amount.ToString("C", culture);
RemoveSymbol(ref expected, culture);
FormatUnlimitedDecimals(ref expected, culture);
var result = amount.ToAmountString(culture, false, false);
Assert.Equal(expected, result);
}

[Theory]
[MemberData(nameof(GetSampleDataWithRealCultures))]
public void ToAmountString_AllCulturesShouldWorkWithOverwriteDecimal(CultureInfo culture, decimal amount)
{
//Arrange
var expected = amount.ToString("C6", culture).Trim();
RemoveSymbol(ref expected, culture);
if (culture.Name is "kea-CV" or "pt-CV" && expected.EndsWith('0'))
{
expected = expected.TrimEnd('0');
if (expected.EndsWith(culture.NumberFormat.CurrencyDecimalSeparator))
expected = $"{expected}00";
else if (expected.Substring(expected.IndexOf(culture.NumberFormat.CurrencyDecimalSeparator) + 1).Length == 1)
expected += "0";
}
else
{
FormatUnlimitedDecimals(ref expected, culture, true);
}
AddSymbol(ref expected, culture);
//Act
var result = amount.ToAmountString(culture, false, overwriteDecimal: true);
//Assert
Assert.Equal(expected, result);
}

private static void RemoveSymbol(ref string amount, CultureInfo culture)
{
amount = amount.Replace(culture.NumberFormat.CurrencySymbol, "").Trim();
}

private static void FormatUnlimitedDecimals(ref string number, CultureInfo culture, bool force = false)
{
if (culture.NumberFormat.CurrencyDecimalDigits != 99 && !force)
return;

number = number.TrimEnd('0');
if(number.EndsWith(culture.NumberFormat.CurrencyDecimalSeparator))
number = number.Replace(culture.NumberFormat.CurrencyDecimalSeparator, "");
}

private static void AddSymbol(ref string amount, CultureInfo culture)
{
var formatString = culture.NumberFormat.CurrencyPositivePattern switch
{
0 => $"{culture.NumberFormat.CurrencySymbol}{{0}}",
1 => $"{{0}}{culture.NumberFormat.CurrencySymbol}",
2 => $"{culture.NumberFormat.CurrencySymbol} {{0}}",
3 => $"{{0}} {culture.NumberFormat.CurrencySymbol}",
_ => $"{culture.NumberFormat.CurrencySymbol}{{0}}"
};
amount = string.Format(formatString, amount);
}
}
28 changes: 28 additions & 0 deletions NickvisionMoney.Shared.Tests/NickvisionMoney.Shared.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2"/>
<PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<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>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\NickvisionMoney.Shared\NickvisionMoney.Shared.csproj" />
</ItemGroup>

</Project>
10 changes: 7 additions & 3 deletions NickvisionMoney.Shared/Helpers/CurrencyHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,18 @@ public static class CurrencyHelpers
/// <returns>Formatted amount string</returns>
public static string ToAmountString(this decimal amount, CultureInfo culture, bool useNativeDigits, bool showCurrencySymbol = true, bool overwriteDecimal = false)
{
var result = Math.Abs(amount).ToString(overwriteDecimal ? "C6" : "C", culture);
result = result.Remove(result.IndexOf(culture.NumberFormat.CurrencySymbol), culture.NumberFormat.CurrencySymbol.Length).Trim();
var result = Math.Abs(amount).ToString(overwriteDecimal ? "C6" : culture.Name is "kea-CV" or "pt-CV" ? "C2" : "C", culture);
result = result.Replace(culture.NumberFormat.CurrencySymbol, "").Trim();
if (culture.NumberFormat.CurrencyDecimalDigits == 99 || overwriteDecimal)
{
result = result.TrimEnd('0');
if (result.EndsWith(culture.NumberFormat.CurrencyDecimalSeparator))
{
result = result.Remove(result.LastIndexOf(culture.NumberFormat.CurrencyDecimalSeparator));
result = culture.Name is "kea-CV" or "pt-CV" ? $"{result}00" : result.Replace(culture.NumberFormat.CurrencyDecimalSeparator, "");
}
else if (result.Substring(result.IndexOf(culture.NumberFormat.CurrencyDecimalSeparator) + 1).Length == 1 && culture.Name is "kea-CV" or "pt-CV")
{
result = $"{result}0";
}
}
if (showCurrencySymbol)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
<p>- Fixed an issue where the currency conversion service would provide the wrong conversion rate</p>
<p>- Fixed an issue where small converted currency amounts would show as 0</p>
<p>- Improved UX in Currency Converter dialog</p>
<p>- Fixed incorrect display of amounts for locales that use Cape Verdean escudo as currency</p>
<p>- Updated translations (Thanks to everyone on Weblate)!</p>
</description>
</release>
Expand Down