Skip to content

Commit

Permalink
Dev (#28)
Browse files Browse the repository at this point in the history
* Feature/ci (#18)

* test ci

* try to release on github

* deploy only in master

* beautify readme

* try to fix deploy in master only

* Feature/ci (#20)

* test

* test

* fix

* fix

* dont deploy in pr

* fix base url

* fix warnings

* update packages

* Bug/23 (#27)

* #23 add tests

* add matcher

* ignore rider files

* add more tests

* fix one case, break another

* fix #23
  • Loading branch information
framebassman committed May 28, 2019
1 parent 1e1f355 commit fa760d5
Show file tree
Hide file tree
Showing 9 changed files with 217 additions and 55 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# User files
*.user
.idea
15 changes: 9 additions & 6 deletions Izzy.Web.Tests/Izzy.Web.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
Expand All @@ -7,13 +7,16 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<PackageReference Include="NHamcrest" Version="2.0.1" />
<PackageReference Include="NHamcrest.XUnit" Version="2.0.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Izzy.Web\Izzy.Web.csproj" />
<ItemGroup>
<ProjectReference Include="..\Izzy.Web\Izzy.Web.csproj" />
</ItemGroup>

</Project>
40 changes: 40 additions & 0 deletions Izzy.Web.Tests/Matchers/HasTransfer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System.Collections.Generic;
using System.Linq;
using Izzy.Web.Model;
using Newtonsoft.Json;
using NHamcrest;
using Xunit;

namespace Izzy.Web.Tests.Matchers
{
public class HasTransfer : IMatcher<List<Transfer>>
{
private Transfer _expected;

public HasTransfer(Transfer expected)
{
_expected = expected;
}

public void DescribeTo(IDescription description)
{
description.AppendText("From DescribeTo");
}

public bool Matches(List<Transfer> actual)
{
return actual
.Any(
t =>
t.From == _expected.From
&& t.To == _expected.To
&& t.Roubles == _expected.Roubles
);
}

public void DescribeMismatch(List<Transfer> item, IDescription description)
{
description.AppendText("From DescribeMismatch").AppendText(JsonConvert.SerializeObject(item));
}
}
}
36 changes: 0 additions & 36 deletions Izzy.Web.Tests/ReceiptTests.cs

This file was deleted.

31 changes: 31 additions & 0 deletions Izzy.Web.Tests/Receipts/OneMoreThanMiddle/ThreePersons.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System.Collections.Generic;
using Izzy.Web.Model;
using Izzy.Web.Tests.Matchers;
using NHamcrest;
using Xunit;

namespace Izzy.Web.Tests.Receipts.OneMoreThanMiddle
{
public class ThreePersons
{
[Fact]
public void Test()
{
// Act
var receipt = new Receipt(
new List<Person>{
new Person("Alice", 100),
new Person("Bob", 30),
new Person("Carol", 20)
}
);

var transfers = receipt.Transfers();

// Assert
NHamcrest.XUnit.Assert.That(transfers, Is.OfLength(2));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Bob", "Alice", 20m)));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Carol", "Alice", 30m)));
}
}
}
29 changes: 29 additions & 0 deletions Izzy.Web.Tests/Receipts/OneMoreThanMiddle/TwoPersons.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using Izzy.Web.Model;
using Izzy.Web.Tests.Matchers;
using NHamcrest;
using Xunit;

namespace Izzy.Web.Tests.Receipts.OneMoreThanMiddle
{
public class TwoPersons
{
[Fact]
public void Test1()
{
// Act
var receipt = new Receipt(
new List<Person>{
new Person("Alice", 100),
new Person("Bob", 0)
}
);

var transfers = receipt.Transfers();

// Assert
NHamcrest.XUnit.Assert.That(transfers, Is.OfLength(1));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Bob", "Alice", 50m)));
}
}
}
35 changes: 35 additions & 0 deletions Izzy.Web.Tests/Receipts/TwoMoreThanMiddle/FivePersons.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System.Collections.Generic;
using Izzy.Web.Model;
using Izzy.Web.Tests.Matchers;
using NHamcrest;
using Xunit;

namespace Izzy.Web.Tests.Receipts.TwoMoreThanMiddle
{
public class FivePerson
{
[Fact]
public void TwoMoreThanMiddle_Calculate_ValidTransfers()
{
// Act
var receipt = new Receipt(
new List<Person>{
new Person("Alice", 6800),
new Person("Bob", 2900),
new Person("Carol", 1500),
new Person("Dave", 6400),
new Person("Eve", 100)
}
);

var transfers = receipt.Transfers();

// Assert
NHamcrest.XUnit.Assert.That(transfers, Is.OfLength(4));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Bob", "Dave", 640m)));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Eve", "Dave", 180m)));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Eve", "Alice", 3260m)));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Carol", "Dave", 2040m)));
}
}
}
32 changes: 32 additions & 0 deletions Izzy.Web.Tests/Receipts/TwoMoreThanMiddle/ThreePersons.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System.Collections.Generic;
using Izzy.Web.Model;
using Izzy.Web.Tests.Matchers;
using NHamcrest;
using Xunit;


namespace Izzy.Web.Tests.Receipts.TwoMoreThanMiddle
{
public class TwoMoreThanMiddleTests
{
[Fact]
public void TwoMoreThanMiddle_Calculate_ValidTransfers()
{
// Act
var receipt = new Receipt(
new List<Person>{
new Person("Alice", 600),
new Person("Bob", 1100),
new Person("Carol", 0)
}
);

var transfers = receipt.Transfers();

// Assert
NHamcrest.XUnit.Assert.That(transfers, Is.OfLength(2));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Carol", "Alice", 33.33m)));
NHamcrest.XUnit.Assert.That(transfers, new HasTransfer(new Transfer("Carol", "Bob", 533.33m)));
}
}
}
53 changes: 40 additions & 13 deletions Izzy.Web/Model/Receipt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,49 @@ public List<Transfer> Transfers()
{
var transfers = new List<Transfer>();
var total = this._persons.Sum(p => p.Roubles);
var roublesPerOne = Decimal.Round(total / this._persons.Count(), 2);
var personsTop = this._persons
.OrderByDescending(p => p.Roubles);
var spender = personsTop.First();
var personsExceptSpender = personsTop.Skip(1);
foreach (var person in personsExceptSpender)
var middle = Decimal.Round(total / this._persons.Count(), 2);
var personsTop = this._persons.OrderByDescending(p => p.Roubles).ToList();
var moreThanMiddle = personsTop.Where(p => p.Roubles >= middle).ToList();
var lessThanMiddle = personsTop.Except(moreThanMiddle).ToList();
for (int i = 0; i < moreThanMiddle.Count; i++)
{
transfers.Add(
new DifferenceTransfer(
person,
spender,
roublesPerOne - person.Roubles
)
);
var spender = moreThanMiddle[i];
for (int j = lessThanMiddle.Count - 1; j >= 0; j--)
{
if (spender.Roubles - middle != 0)
{
var debtor = lessThanMiddle[j];
var debtorDiff = middle - debtor.Roubles;
var spenderDiff = spender.Roubles - middle;
if (debtorDiff > spenderDiff)
{
transfers.Add(new Transfer(debtor, spender, spenderDiff));
debtor.Roubles += spenderDiff;
spender.Roubles -= spenderDiff;
}
else
{
transfers.Add(new Transfer(debtor, spender, debtorDiff));
debtor.Roubles += debtorDiff;
spender.Roubles -= debtorDiff;
}
}
}
}

return transfers;
}

private Decimal diff(Person debtor, Person spender, Decimal middle)
{
if (debtor.Roubles > spender.Roubles - middle)
{
return spender.Roubles - middle;
}
else
{
return debtor.Roubles;
}
}
}
}

0 comments on commit fa760d5

Please sign in to comment.