Skip to content
Open
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
14 changes: 7 additions & 7 deletions src/Samples/KalkulatorRabatu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,24 @@ public class KalkulatorRabatu
private const decimal Prog2 = 0.5m;
private const decimal DarmowaWysylka = 1m;

public static decimal PoliczRabat(Func<decimal> getValue, Func<bool> isLoyal)
public static decimal PoliczRabat(decimal value, bool isLoyal)
{
var modifier = isLoyal() ? 1 : 2;
var modifier = isLoyal ? 1 : 2;

if (getValue() < 50 * modifier)
if (value < 50 * modifier)
return Prog0;

if (getValue() < 250 * modifier)
if (value < 250 * modifier)
return Prog1;

if (getValue() < 500 * modifier)
if (value < 500 * modifier)
return Prog2;

return DarmowaWysylka;
}

public static bool LojalnyKontrahent(Func<IEnumerable<Date>> dokumenty) =>
dokumenty().Count(x => x > Date.Today.AddMonths(-6)) >= 5;
public static bool LojalnyKontrahent(IEnumerable<Date> dates) =>
dates.Count(x => x > Date.Today.AddMonths(-6)) >= 5;

}
}
122 changes: 70 additions & 52 deletions src/Samples/ZmianaDokumentuHandlowego.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Collections.Generic;
using System.Linq;
using Samples;
using Soneta.Handel;
Expand All @@ -9,57 +8,76 @@

namespace Samples
{
class ZmianaDokumentuHandlowego : IZmianaDokumentuHandlowego
public class ZmianaDokumentuHandlowego : IZmianaDokumentuHandlowego
{
public ILogika Logika { get; set; } = new Domyslna();

public void ZmianaStanu( ZmianaStanuDokumentuHandlowegoArgs args )
{
if (args.PrzedZmianą &&
args.NowyStan == StanDokumentuHandlowego.Zatwierdzony)
{
Logika.DodajTransport( args, Logika.PoliczRabat( args ) );
}
}

#region Niezaimplementowane metody

public void ZmianaWartości( ZmianaDokumentuHandlowegoArgs args )
{
}

public void ZmianaPozycji( ZmianaPozycjiDokumentuArgs args )
{
}

public void WyliczenieCenyPozycji( WyliczenieCenyPozycjiDokumentuArgs args )
{
}

public void ZmianaPłatności( ZmianaDokumentuHandlowegoArgs args )
{
}

public void Zatwierdzanie( ZmianaDokumentuHandlowegoArgs args )
{
}

public void Zatwierdzony( ZmianaDokumentuHandlowegoArgs args )
{
public void ZmianaStanu(ZmianaStanuDokumentuHandlowegoArgs args)
{
if (args.PrzedZmianą && args.NowyStan == StanDokumentuHandlowego.Zatwierdzony)
{
DodajTransport(args.Dokument, KalkulatorRabatu.PoliczRabat(WartoscDokumentu, Lojalny));
}

bool Lojalny() => KalkulatorRabatu.LojalnyKontrahent(() => PobierzDokumenty(args.Dokument).Select(x => x.Data));
decimal WartoscDokumentu() => args.Dokument.Suma.Netto;
}

public IEnumerable<DokumentHandlowy> PobierzDokumenty(DokumentHandlowy dh)
{
return dh.Session.GetHandel().DokHandlowe.WgKontrahent[dh.Kontrahent];
}

public void DodajTransport(DokumentHandlowy dokument, decimal rabat)
{
var pos = new PozycjaDokHandlowego(dokument);
dokument.Session.GetHandel().PozycjeDokHan.AddRow(pos);

pos.Towar = dokument.Session.GetTowary().Towary.WgKodu["TRANSPORT"];
pos.Rabat = new Percent(rabat);
}

#region Niezaimplementowane metody
public void ZmianaWartości(ZmianaDokumentuHandlowegoArgs args)
{
}

public void ZmianaPozycji(ZmianaPozycjiDokumentuArgs args)
{
}

public void WyliczenieCenyPozycji(WyliczenieCenyPozycjiDokumentuArgs args)
{
}

public void ZmianaPłatności(ZmianaDokumentuHandlowegoArgs args)
{
}

public void Zatwierdzanie(ZmianaDokumentuHandlowegoArgs args)
{
}

public void Zatwierdzony(ZmianaDokumentuHandlowegoArgs args)
{
}
#endregion
}

#endregion

class Domyslna : ILogika
{
decimal ILogika.PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args ) =>
KalkulatorRabatu.PoliczRabat(
args.Dokument.Suma.Netto,
KalkulatorRabatu.LojalnyKontrahent(
args.Dokument.Table.WgKontrahent[ args.Dokument.Kontrahent ]
.Select( x => x.Data ) ) );

void ILogika.DodajTransport(
ZmianaStanuDokumentuHandlowegoArgs args,
decimal rabat )
{
var pos = new PozycjaDokHandlowego( args.Dokument );
args.Dokument.Session.GetHandel().PozycjeDokHan.AddRow( pos );

pos.Towar = args.Dokument.Session.GetTowary().Towary
.WgKodu[ "TRANSPORT" ];
pos.Rabat = new Percent( rabat );
}
}

public interface ILogika
{
void DodajTransport(
ZmianaStanuDokumentuHandlowegoArgs args,
decimal rabat );

decimal PoliczRabat( ZmianaStanuDokumentuHandlowegoArgs args );
}
}
}
8 changes: 4 additions & 4 deletions tests/Samples.Tests/KalkulatorRabatuTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ class KalkulatorRabatuTests
[TestCase(500, true, ExpectedResult = 1)]
[TestCase(999, true, ExpectedResult = 1)]
[TestCase(1000, true, ExpectedResult = 1)]
public decimal Policz(decimal wartosc, bool lojalny) => KalkulatorRabatu.PoliczRabat( () => wartosc, () => lojalny);
public decimal Policz(decimal wartosc, bool lojalny) => KalkulatorRabatu.PoliczRabat( wartosc, lojalny);

[Test]
public void LojalnyKontrahent_5DokumentowZOstatniegoPolrocza_True()
{
var result = KalkulatorRabatu.LojalnyKontrahent(() => new[]
var result = KalkulatorRabatu.LojalnyKontrahent(new[]
{
Date.Today,
Date.Today.AddMonths(-1),
Expand All @@ -41,7 +41,7 @@ public void LojalnyKontrahent_5DokumentowZOstatniegoPolrocza_True()
[Test]
public void LojalnyKontrahent_4DokumentyZOstatniegoPolrocza_False()
{
var result = KalkulatorRabatu.LojalnyKontrahent(() => new[]
var result = KalkulatorRabatu.LojalnyKontrahent(new[]
{
Date.Today,
Date.Today.AddMonths(-1),
Expand All @@ -54,7 +54,7 @@ public void LojalnyKontrahent_4DokumentyZOstatniegoPolrocza_False()
[Test]
public void LojalnyKontrahent_Powyzej4DokumentowAleTylkoTrzyZOstatniegoPolrocza_False()
{
var result = KalkulatorRabatu.LojalnyKontrahent(() => new[]
var result = KalkulatorRabatu.LojalnyKontrahent(new[]
{
Date.Today,
Date.Today.AddMonths(-4),
Expand Down
4 changes: 4 additions & 0 deletions tests/Samples.Tests/Samples.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
<PropertyGroup>
<TargetFramework>$(SonetaTargetFramework)</TargetFramework>
<IsTestProject>true</IsTestProject>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NSubstitute" Version="4.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Samples\Samples.csproj" />
</ItemGroup>
Expand Down
86 changes: 86 additions & 0 deletions tests/Samples.Tests/ZmianaStanuTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// =============================================================================
// <copyright file="ZmianaStanuTest.cs" company="Soneta sp. z o.o.">
// Copyright (c) 2019 Soneta sp. z o.o. All rights reserved.
// </copyright>
// =============================================================================

using NSubstitute;
using NUnit.Framework;
using Soneta.Handel;

namespace Samples.Tests
{
class ZmianaStanuTest
{
ZmianaDokumentuHandlowego _zmianaDokumentu;

[Test]
[Description( "Nigdy nie oczekuje się reakcji po zmianie stanu." )]
public void Ignoruj(
[Values(
StanDokumentuHandlowego.Zatwierdzony,
StanDokumentuHandlowego.Anulowany,
StanDokumentuHandlowego.Bufor,
StanDokumentuHandlowego.Zablokowany )]
StanDokumentuHandlowego stan,
[Values( false )] bool przed )
{
var args =
new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed );
_zmianaDokumentu.ZmianaStanu( args );

_zmianaDokumentu.Logika.Received( 0 )
.PoliczRabat( args );
_zmianaDokumentu.Logika.Received( 0 )
.DodajTransport( args, Arg.Any<decimal>() );
}

[Test]
[Description(
"Przypadki, kiedy reakcja nie jest oczekiwana przed zmianą stanu" )]
public void NieReaguj(
[Values(
StanDokumentuHandlowego.Anulowany,
StanDokumentuHandlowego.Bufor,
StanDokumentuHandlowego.Zablokowany )]
StanDokumentuHandlowego stan,
[Values( true )] bool przed )
{
var args =
new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed );
_zmianaDokumentu.ZmianaStanu( args );

_zmianaDokumentu.Logika.Received( 0 )
.PoliczRabat( args );
_zmianaDokumentu.Logika.Received( 0 )
.DodajTransport( args, Arg.Any<decimal>() );
}

[Test]
[Description(
"Przypadek, kiedy reakcja jest oczekiwana przed zatwierdzeniem" )]
public void Reaguj(
[Values( StanDokumentuHandlowego.Zatwierdzony )]
StanDokumentuHandlowego stan,
[Values( true )] bool przed )
{
const decimal rabat = 20m;
var args =
new ZmianaStanuDokumentuHandlowegoArgs( default, stan, przed );
_zmianaDokumentu.Logika.PoliczRabat( args ).Returns( rabat );
_zmianaDokumentu.ZmianaStanu( args );

_zmianaDokumentu.Logika.Received( 1 )
.PoliczRabat( args );
_zmianaDokumentu.Logika.Received( 1 )
.DodajTransport( args, rabat );
}

[OneTimeSetUp]
public void SetupOnce() =>
_zmianaDokumentu = new ZmianaDokumentuHandlowego
{
Logika = Substitute.For<ZmianaDokumentuHandlowego.ILogika>()
};
}
}