diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..d86ba9f04161e2cb8020bed955e8edf383c6dc66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +obj/ +bin/ \ No newline at end of file diff --git a/Code/Money_Bridge/Bridge_Money.sln b/Code/Money_Bridge/Bridge_Money.sln new file mode 100644 index 0000000000000000000000000000000000000000..cb418a5ad3b129f86bbaf6b5b52e7328393bb369 --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bridge_Money_Console", "Bridge_Money_Console\Bridge_Money_Console.csproj", "{C545E045-C885-4BDC-BF60-7078DF93BD98}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bridge_Money_Tests", "Bridge_Money_Tests\Bridge_Money_Tests.csproj", "{5BC73D57-39BC-46F0-9B07-C7AFC65635FD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C545E045-C885-4BDC-BF60-7078DF93BD98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C545E045-C885-4BDC-BF60-7078DF93BD98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C545E045-C885-4BDC-BF60-7078DF93BD98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C545E045-C885-4BDC-BF60-7078DF93BD98}.Release|Any CPU.Build.0 = Release|Any CPU + {5BC73D57-39BC-46F0-9B07-C7AFC65635FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BC73D57-39BC-46F0-9B07-C7AFC65635FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BC73D57-39BC-46F0-9B07-C7AFC65635FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BC73D57-39BC-46F0-9B07-C7AFC65635FD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Code/Money_Bridge/Bridge_Money.sln.DotSettings.user b/Code/Money_Bridge/Bridge_Money.sln.DotSettings.user new file mode 100644 index 0000000000000000000000000000000000000000..62b82ac0e6e3c09d4752c58e6ca39e34b291514c --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money.sln.DotSettings.user @@ -0,0 +1,4 @@ +<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=7f881cf9_002D5d3d_002D4ec7_002D9a80_002Dab4711aa407c/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="Test_GetTextFrom" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Solution /> +</SessionState></s:String></wpf:ResourceDictionary> \ No newline at end of file diff --git a/Code/Money_Bridge/Bridge_Money_Console/Bridge_Money_Console.csproj b/Code/Money_Bridge/Bridge_Money_Console/Bridge_Money_Console.csproj new file mode 100644 index 0000000000000000000000000000000000000000..2c0dacc0117b04a63939b0e105c117b16afe8877 --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Console/Bridge_Money_Console.csproj @@ -0,0 +1,8 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + </PropertyGroup> + +</Project> diff --git a/Code/Money_Bridge/Bridge_Money_Console/Money.cs b/Code/Money_Bridge/Bridge_Money_Console/Money.cs new file mode 100644 index 0000000000000000000000000000000000000000..e0259f79d5cdf345c353f48ced3ac45bde5e2261 --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Console/Money.cs @@ -0,0 +1,13 @@ +using System; + +namespace Bridge_Money_Console +{ + public struct Money + { + // Ranges from 0 to 99 + public int Cents; + + public int Euro; + } + +} \ No newline at end of file diff --git a/Code/Money_Bridge/Bridge_Money_Console/MoneyUtility.cs b/Code/Money_Bridge/Bridge_Money_Console/MoneyUtility.cs new file mode 100644 index 0000000000000000000000000000000000000000..4260195dd0c0f50b8d12ce8f32a6103b68add3bd --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Console/MoneyUtility.cs @@ -0,0 +1,88 @@ +using System; + +namespace Bridge_Money_Console +{ + + public static class MoneyUtility + { + public static Money CreateFrom(int euro, int cents) + { + Money result = new Money(); + + int euroInCents = euro * 100; + int totalCents = cents + euroInCents; + + result.Euro = totalCents / 100; + result.Cents = totalCents % 100; + + return result; + } + + public static Money Add(Money leftAmount, Money rightAmount) + { + int totalCents = MoneyUtility.GetTotalCentsFrom(leftAmount) + + MoneyUtility.GetTotalCentsFrom(rightAmount); + + Money result = new Money(); + result.Euro = totalCents / 100; + result.Cents = totalCents % 100; + + return result; + } + + public static Money Subtract(Money toSubstractFrom, Money toSubstract) + { + int totalCents = MoneyUtility.GetTotalCentsFrom(toSubstractFrom) + - MoneyUtility.GetTotalCentsFrom(toSubstract); + + Money result = new Money(); + + result.Euro = totalCents / 100; + result.Cents = totalCents % 100; + + return result; + } + + public static Money GetChange(Money price, Money actualPayment) + { + Money change = Subtract(actualPayment, price); + + if (change.Euro < 0 || change.Cents < 0) + { + change.Euro = 0; + change.Cents = 0; + } + + return change; + } + + public static bool IsEqual(Money leftAmount, Money rightAmount) + { + return leftAmount.Euro == rightAmount.Euro && + leftAmount.Cents == rightAmount.Cents; + } + + public static string GetTextFrom(Money toConvertToText) + { + // Make sure that the numbers are positive to prevents things like + // texts like 0.-45 + int absoluteCents = Math.Abs(toConvertToText.Cents); + int absoluteEuro = Math.Abs(toConvertToText.Euro); + + // If one cents or euro is negative then the whole amount is negative + // Covers the case in which the euro amount is zero but the cents is negative. + bool isNegative = toConvertToText.Euro < 0 || toConvertToText.Cents < 0; + string sign = isNegative ? "-" : ""; + + return $"{sign}{absoluteEuro}.{absoluteCents} Euro"; + } + + public static int GetTotalCentsFrom(Money toGetCentsFrom) + { + int totalCents = toGetCentsFrom.Cents; + int euroInCents = toGetCentsFrom.Euro * 100; + return totalCents + euroInCents; + } + } + +} \ No newline at end of file diff --git a/Code/Money_Bridge/Bridge_Money_Console/Program.cs b/Code/Money_Bridge/Bridge_Money_Console/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..b247f814f30695bb70468580cab364491c33e419 --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Console/Program.cs @@ -0,0 +1,13 @@ +using System; + +namespace Bridge_Money_Console +{ + internal static class Program + { + private static void Main(string[] args) + { + Money amount = MoneyUtility.CreateFrom(-2, 20); + Console.WriteLine($"Amount is {MoneyUtility.GetTextFrom(amount)}"); + } + } +} \ No newline at end of file diff --git a/Code/Money_Bridge/Bridge_Money_Tests/Bridge_Money_Tests.csproj b/Code/Money_Bridge/Bridge_Money_Tests/Bridge_Money_Tests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..6a0429218b8d4ae1e399e1b54661c874f1b8138b --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Tests/Bridge_Money_Tests.csproj @@ -0,0 +1,20 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netcoreapp3.1</TargetFramework> + + <IsPackable>false</IsPackable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" /> + <PackageReference Include="xunit" Version="2.4.0" /> + <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> + <PackageReference Include="coverlet.collector" Version="1.2.0" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Bridge_Money_Console\Bridge_Money_Console.csproj" /> + </ItemGroup> + +</Project> diff --git a/Code/Money_Bridge/Bridge_Money_Tests/TestCases_MoneyUtility.cs b/Code/Money_Bridge/Bridge_Money_Tests/TestCases_MoneyUtility.cs new file mode 100644 index 0000000000000000000000000000000000000000..ea42a4ab1fb6b02e9c21f7cc066984b380b490c9 --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Tests/TestCases_MoneyUtility.cs @@ -0,0 +1,213 @@ +using Xunit; + +using Bridge_Money_Console; + +namespace Bridge_Money_Tests +{ + public partial class TestMoneyUtility + { + public static TheoryData<int, int, Money> TestData_CreateFrom + => new TheoryData<int, int, Money>() + { + { + 5, 0, new Money() {Euro = 5, Cents = 0} + }, + { + 0, 33, new Money() {Euro = 0, Cents = 33} + }, + { + 2, -33, new Money() {Euro = 1, Cents = 67} + }, + { + 2, 20, new Money() {Euro = 2, Cents = 20} + }, + }; + + /// <summary> + /// 1. Parameter as Money + /// Given money amount to be converted to a text. + /// 2. Parameter as string + /// Expected text from money amount + /// </summary> + /// <returns></returns> + public static TheoryData<Money, string> TestData_GetTextFrom + => new TheoryData<Money, string>() + { + { + new Money() {Euro = 0, Cents = 0}, + "0.0 Euro" + }, + { + new Money() {Euro = 2, Cents = 0}, + "2.0 Euro" + }, + { + new Money() {Euro = 0, Cents = 45}, + "0.45 Euro" + }, + { + new Money() {Euro = 2, Cents = 50}, + "2.50 Euro" + }, + { + new Money() {Euro = -2, Cents = 0}, + "-2.0 Euro" + }, + { + new Money() {Euro = 0, Cents = -45}, + "-0.45 Euro" + }, + { + new Money() {Euro = -2, Cents = -50}, + "-2.50 Euro" + }, + }; + + /// <summary> + /// 1. Parameter as Money + /// Given money amount to be converted to cents only. + /// 2. Parameter as int + /// Expected amount of total cents + /// </summary> + /// <returns></returns> + public static TheoryData<Money, int> TestData_GetTotalCentsFrom + => new TheoryData<Money, int>() + { + { + new Money() {Euro = 2, Cents = 0}, + 200 + }, + { + new Money() {Euro = 0, Cents = 45}, + 45 + }, + { + new Money() {Euro = 2, Cents = 20}, + 220 + }, + { + new Money() {Euro = -2, Cents = 0}, + -200 + }, + { + new Money() {Euro = 0, Cents = -45}, + -45 + }, + { + new Money() {Euro = -2, Cents = -20}, + -220 + }, + }; + + + public static TheoryData<Money, Money, bool> TestData_IsEqual + => new TheoryData<Money, Money, bool>() + { + { + new Money() {Euro = 2, Cents = 20}, + new Money() {Euro = 2, Cents = 20}, + true + }, + { + new Money() {Euro = 2, Cents = 10}, + new Money() {Euro = 2, Cents = 20}, + false + }, + { + new Money() {Euro = -2, Cents = -20}, + new Money() {Euro = 2, Cents = 20}, + false + }, + { + new Money() {Euro = -2, Cents = -20}, + new Money() {Euro = -2, Cents = -20}, + true + } + }; + + public static TheoryData<Money, Money, Money> TestData_Add + => new TheoryData<Money, Money, Money>() + { + { + new Money() {Euro = 0, Cents = 0}, + new Money() {Euro = 0, Cents = 0}, + new Money() {Euro = 0, Cents = 0} + }, + { + new Money() {Euro = 2, Cents = 0}, + new Money() {Euro = 5, Cents = 0}, + new Money() {Euro = 7, Cents = 0} + }, + { + new Money() {Euro = 0, Cents = 50}, + new Money() {Euro = 0, Cents = 80}, + new Money() {Euro = 1, Cents = 30} + }, + { + new Money() {Euro = 2, Cents = 50}, + new Money() {Euro = 1, Cents = 80}, + new Money() {Euro = 4, Cents = 30} + }, + { + new Money() {Euro = 2, Cents = 0}, + new Money() {Euro = -5, Cents = 0}, + new Money() {Euro = -3, Cents = 0} + }, + { + new Money() {Euro = 0, Cents = 50}, + new Money() {Euro = 0, Cents = -40}, + new Money() {Euro = 0, Cents = 10} + }, + { + new Money() {Euro = 2, Cents = 50}, + new Money() {Euro = -4, Cents = -40}, + new Money() {Euro = -1, Cents = -90} + }, + }; + + public static TheoryData<Money, Money, Money> TestData_Subtract + => new TheoryData<Money, Money, Money>() + { + { + new Money(), + new Money(), + new Money() + }, + { + new Money() { Euro = 12, Cents = 0}, + new Money() { Euro = 7, Cents = 0}, + new Money() { Euro = 5, Cents = 0} + }, + { + new Money() { Euro = 5, Cents = 20}, + new Money() { Euro = 7, Cents = 0}, + new Money() { Euro = -1, Cents = -80} + }, + }; + + public static TheoryData<Money, Money, Money> TestData_GetChange + => new TheoryData<Money, Money, Money>() + { + { + new Money() {Euro = 2, Cents = 0}, + new Money() {Euro = 3, Cents = 0}, + new Money() {Euro = 1, Cents = 0} + }, + { + new Money() {Euro = 0, Cents = 80}, + new Money() {Euro = 0, Cents = 90}, + new Money() {Euro = 0, Cents = 10} + }, + { + new Money() {Euro = 2, Cents = 50}, + new Money() {Euro = 4, Cents = 0}, + new Money() {Euro = 1, Cents = 50} + }, + { + new Money() {Euro = 5, Cents = 0}, + new Money() {Euro = 4, Cents = 20}, + new Money() {Euro = 0, Cents = 0} + } + }; + } +} \ No newline at end of file diff --git a/Code/Money_Bridge/Bridge_Money_Tests/TestMoneyUtility.cs b/Code/Money_Bridge/Bridge_Money_Tests/TestMoneyUtility.cs new file mode 100644 index 0000000000000000000000000000000000000000..b79d95b3506552cf472856fa6ab753e51c016bc2 --- /dev/null +++ b/Code/Money_Bridge/Bridge_Money_Tests/TestMoneyUtility.cs @@ -0,0 +1,89 @@ +using System; +using Xunit; + +using Bridge_Money_Console; + + +namespace Bridge_Money_Tests +{ + public partial class TestMoneyUtility + { + [Theory] + [MemberData(nameof(TestData_CreateFrom))] + public void Test_CreateFrom(int givenEuro, int givenCents, Money expectedAmount) + { + // Act + Money actualAmount = MoneyUtility.CreateFrom(givenEuro, givenCents); + + // Assert + Assert.Equal(expectedAmount.Euro, actualAmount.Euro); + Assert.Equal(expectedAmount.Cents, actualAmount.Cents); + } + + [Theory] + [MemberData(nameof(TestData_GetTextFrom))] + public void Test_GetTextFrom(Money givenAmount, string expectedText) + { + // Act + string actualText = MoneyUtility.GetTextFrom(givenAmount); + + // Assert + Assert.Equal(expectedText, actualText); + } + + [Theory] + [MemberData(nameof(TestData_GetTotalCentsFrom))] + public void Test_GetTotalCentsFrom(Money givenAmount, int expectedCentsAmount) + { + // Act + int actualCentAmount = MoneyUtility.GetTotalCentsFrom(givenAmount); + // Assert + Assert.Equal(expectedCentsAmount, actualCentAmount); + } + + [Theory] + [MemberData(nameof(TestData_Add))] + public void Test_Add(Money leftAmount, Money rightAmount, Money expectedSum) + { + // Act + Money actualSum = MoneyUtility.Add(leftAmount, rightAmount); + // Assert + Assert.Equal(expectedSum.Euro, actualSum.Euro); + Assert.Equal(expectedSum.Cents, actualSum.Cents); + } + + [Theory] + [MemberData(nameof(TestData_Subtract))] + public void Test_Subtract(Money leftAmount, Money rightAmount, Money expectedDifference) + { + // Act + Money actualSum = MoneyUtility.Subtract(leftAmount, rightAmount); + // Assert + Assert.Equal(expectedDifference.Euro, actualSum.Euro); + Assert.Equal(expectedDifference.Cents, actualSum.Cents); + } + + [Theory] + [MemberData(nameof(TestData_IsEqual))] + public void Test_IsEqual(Money leftAmount, Money rightAmount, bool expected) + { + // Act + bool actual = MoneyUtility.IsEqual(leftAmount, rightAmount); + // Assert + Assert.Equal(expected, actual); + } + + [Theory] + [MemberData(nameof(TestData_GetChange))] + public void Test_GetChange(Money price, Money givenMoney, Money expectedChange) + { + // Act + Money actualChange = MoneyUtility.GetChange(price, givenMoney); + // Assert + Assert.Equal(expectedChange.Euro, actualChange.Euro); + Assert.Equal(expectedChange.Cents, actualChange.Cents); + } + + + } +} \ No newline at end of file diff --git a/Code/Money_Bridge/global.json b/Code/Money_Bridge/global.json new file mode 100644 index 0000000000000000000000000000000000000000..5898a0498aa39f03f1f97cf19990a93878f9605b --- /dev/null +++ b/Code/Money_Bridge/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "3.1.0", + "rollForward": "latestMinor", + "allowPrerelease": false + } +} \ No newline at end of file