From cf8aa960d81a652f543bfcff39efdf8ffb78b7d4 Mon Sep 17 00:00:00 2001 From: Chika Date: Tue, 20 Oct 2020 17:00:46 +0300 Subject: [PATCH] more columns && comparer --- .../.idea/contentModel.xml | 20 +- .../.idea/workspace.xml | 204 ++++++------ .../Columns/AcceptInsuranceColumn.cs | 21 ++ .../Columns/AcceptKaskoColumn.cs | 22 ++ .../Columns/AcceptOsagoColumn.cs | 22 ++ .../Columns/AcceptSumColumn.cs | 27 ++ .../Columns/DeprecationColumn.cs | 23 ++ .../Columns/DeprecationLDColumn.cs | 32 ++ .../Columns/DeprecationLPColumn.cs | 22 ++ .../Columns/NPVBonusExpensesColumn.cs | 32 ++ .../Bisection.cs | 295 ------------------ .../GoalXIRR.cs | 23 -- .../Models/Prepared/PreparedParams.cs | 2 +- .../Columns/AcceptInsuranceTests.cs | 136 ++++++++ .../Calculation/Columns/AcceptKaskoTests.cs | 61 ++++ .../Calculation/Columns/AcceptOsagoTests.cs | 61 ++++ .../Calculation/Columns/AcceptSumTests.cs | 251 +++++++++++++++ .../Calculation/Columns/DeprecationLDTests.cs | 72 +++++ .../Calculation/Columns/DeprecationLPTests.cs | 189 +++++++++++ .../Calculation/Columns/DeprecationTests.cs | 153 +++++++++ .../Columns/NPVBonusExpensesTests.cs | 130 ++++++++ .../Calculation/Columns/SumColumnTest.cs | 4 +- .../DoubleArrayComparer.cs | 29 ++ 23 files changed, 1397 insertions(+), 434 deletions(-) create mode 100644 EvoCalculator.Core.Calculation/Columns/AcceptInsuranceColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/AcceptKaskoColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/AcceptOsagoColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/AcceptSumColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/DeprecationColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/DeprecationLDColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/DeprecationLPColumn.cs create mode 100644 EvoCalculator.Core.Calculation/Columns/NPVBonusExpensesColumn.cs delete mode 100644 EvoCalculator.Core.FinanceFormulas/Bisection.cs delete mode 100644 EvoCalculator.Core.FinanceFormulas/GoalXIRR.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/AcceptInsuranceTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/AcceptKaskoTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/AcceptOsagoTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/AcceptSumTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLDTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLPTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/DeprecationTests.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/Columns/NPVBonusExpensesTests.cs create mode 100644 EvoCalculator.Core.Tests/DoubleArrayComparer.cs diff --git a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml index 84d008b..08fea41 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml @@ -11,6 +11,7 @@ + @@ -38,12 +39,20 @@ + + + + + + + + @@ -73,9 +82,7 @@ - - @@ -122,10 +129,18 @@ + + + + + + + + @@ -137,6 +152,7 @@ + diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml index a2538c9..47d7871 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml @@ -14,9 +14,28 @@ + + + + + + + + + + + + + + + + + + - - + + + - - - - - - - - - - - - - - - - + - - - - - - + - @@ -185,7 +183,8 @@ - + + 1602593830686 @@ -237,94 +236,94 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + @@ -345,37 +344,20 @@ - + - - + + - - + + - + - - - - file://$PROJECT_DIR$/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs - 308 - - - - - - - - - diff --git a/EvoCalculator.Core.Calculation/Columns/AcceptInsuranceColumn.cs b/EvoCalculator.Core.Calculation/Columns/AcceptInsuranceColumn.cs new file mode 100644 index 0000000..6907ef4 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/AcceptInsuranceColumn.cs @@ -0,0 +1,21 @@ +using System.Linq; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class AcceptInsuranceColumn : BaseColumn + { + public AcceptInsuranceColumn(int count) : base(count) + { + } + + public void ComputeValues(AcceptKaskoColumn acceptKaskoColumn, AcceptOsagoColumn acceptOsagoColumn) + { + for (var i = 1; i < Values.Length; i++) + { + Values[i] = acceptKaskoColumn.Values[i] + acceptOsagoColumn.Values[i]; + } + + Values[0] = Values.Skip(1).Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/AcceptKaskoColumn.cs b/EvoCalculator.Core.Calculation/Columns/AcceptKaskoColumn.cs new file mode 100644 index 0000000..ef43853 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/AcceptKaskoColumn.cs @@ -0,0 +1,22 @@ +using System.Linq; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class AcceptKaskoColumn : BaseColumn + { + public AcceptKaskoColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues) + { + Values[1] = 0; + for (var i = 2; i < Values.Length; i++) + { + Values[i] = preparedValues.InsuranceKaskoNmper / (preparedValues.Nmper - 1); + } + Values[0] = Values.Skip(1).Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/AcceptOsagoColumn.cs b/EvoCalculator.Core.Calculation/Columns/AcceptOsagoColumn.cs new file mode 100644 index 0000000..ae30f6a --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/AcceptOsagoColumn.cs @@ -0,0 +1,22 @@ +using System.Linq; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class AcceptOsagoColumn : BaseColumn + { + public AcceptOsagoColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues) + { + for (var i = 0; i < Values.Length; i++) + { + Values[i] = i > 1 && i <= 12 ? preparedValues.InsuranceOsago / 11 : 0; + } + + Values[0] = Values.Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/AcceptSumColumn.cs b/EvoCalculator.Core.Calculation/Columns/AcceptSumColumn.cs new file mode 100644 index 0000000..bd67918 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/AcceptSumColumn.cs @@ -0,0 +1,27 @@ +using System.Linq; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class AcceptSumColumn : BaseColumn + { + public AcceptSumColumn(int count) : base(count) + { + } + + public void ComputeValues( + PreparedValues preparedValues + , SumColumn sumColumn + , VATColumn vatColumn + , SumWithVATColumn sumWithVatColumn) + { + for (var i = 1; i < Values.Length; i++) + { + Values[i] = preparedValues.AcceptSum * sumColumn.Values[i] / + (sumWithVatColumn.Values[0] - vatColumn.Values[0]); + } + + Values[0] = Values.Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/DeprecationColumn.cs b/EvoCalculator.Core.Calculation/Columns/DeprecationColumn.cs new file mode 100644 index 0000000..c304604 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/DeprecationColumn.cs @@ -0,0 +1,23 @@ +using System.Linq; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class DeprecationColumn : BaseColumn + { + public DeprecationColumn(int count) : base(count) + { + } + + public void ComputeValues(DeprecationLPColumn deprecationLpColumn, DeprecationLDColumn deprecationLdColumn) + { + for (var i = 1; i < Values.Length; i++) + { + Values[i] = i < deprecationLpColumn.Values.Length + ? deprecationLpColumn.Values[i] + deprecationLdColumn.Values[i] + : 0 + deprecationLdColumn.Values[i]; + } + + Values[0] = Values.Skip(1).Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/DeprecationLDColumn.cs b/EvoCalculator.Core.Calculation/Columns/DeprecationLDColumn.cs new file mode 100644 index 0000000..780a243 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/DeprecationLDColumn.cs @@ -0,0 +1,32 @@ +using System.Linq; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class DeprecationLDColumn : BaseColumn + { + public DeprecationLDColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues) + { + Values[1] = 0; + for (var i = 2; i < Values.Length - 1; i++) + { + Values[i] = preparedValues.BalanceHolder == 100000001 + ? preparedValues.DeprecationTime * + (preparedValues.AcceptSum - Values.Skip(2).Take(i - 1).Sum(x => x)) / 100 + : 0; + } + + Values[^1] = preparedValues.BalanceHolder == 100000001 + ? preparedValues.AcceptSum - Values.Skip(2) + .Take(Values.Length - 1) + .Sum(x => x) + : 0; + + Values[0] = Values.Skip(1).Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/DeprecationLPColumn.cs b/EvoCalculator.Core.Calculation/Columns/DeprecationLPColumn.cs new file mode 100644 index 0000000..5275ebc --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/DeprecationLPColumn.cs @@ -0,0 +1,22 @@ +using System.Linq; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class DeprecationLPColumn : BaseColumn + { + public DeprecationLPColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues, AcceptSumColumn acceptSumColumn) + { + for (var i = 1; i < Values.Length; i++) + { + Values[i] = preparedValues.BalanceHolder == 100000000 ? acceptSumColumn.Values[i] : 0; + } + + Values[0] = Values.Skip(1).Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/NPVBonusExpensesColumn.cs b/EvoCalculator.Core.Calculation/Columns/NPVBonusExpensesColumn.cs new file mode 100644 index 0000000..35d4ce1 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/NPVBonusExpensesColumn.cs @@ -0,0 +1,32 @@ +using System.Linq; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class NPVBonusExpensesColumn : BaseColumn + { + public NPVBonusExpensesColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues) + { + Values[1] = -1 * (preparedValues.RatBonus + preparedValues.NsBonus + preparedValues.NsibBonus) * + (1 + preparedValues.SalaryRate) * + (1 + preparedValues.MarketRate + preparedValues.DistrictRate); + + Values[2] = preparedValues.BonusFix > 0 + ? -preparedValues.BonusFix + : -1 * preparedValues.BonusBase * preparedValues.Bonus * (1 + preparedValues.SalaryRate) * + (1 + preparedValues.MarketRate + preparedValues.DistrictRate); + + + for (var i = 3; i < Values.Length; i++) + { + Values[i] = 0; + } + + Values[0] = Values.Skip(1).Sum(x => x); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.FinanceFormulas/Bisection.cs b/EvoCalculator.Core.FinanceFormulas/Bisection.cs deleted file mode 100644 index 1cf9a14..0000000 --- a/EvoCalculator.Core.FinanceFormulas/Bisection.cs +++ /dev/null @@ -1,295 +0,0 @@ -// using System; -// using System.Linq; -// using Money = System.Decimal; -// using Rate = System.Double; -// using System.Collections.Generic; -// -// public -// struct Pair -// { -// public Pair(T first, Z second) -// { -// First = first; -// Second = second; -// } -// -// public readonly T First; -// -// public readonly Z Second; -// } -// -// -// public class CashFlow -// { -// public CashFlow(Money amount, DateTime date) -// { -// Amount = amount; -// Date = date; -// } -// -// public readonly Money Amount; -// public readonly DateTime Date; -// } -// -// public struct AlgorithmResult -// { -// public AlgorithmResult(TKindOfResult kind, TValue value) -// { -// Kind = kind; -// Value = value; -// } -// -// public readonly TKindOfResult Kind; -// public readonly TValue Value; -// } -// -// public enum ApproximateResultKind -// { -// ApproximateSolution, -// ExactSolution, -// NoSolutionWithinTolerance -// } -// -// public static class Algorithms -// { -// internal static Money CalculateXNPV(IEnumerable cfs, Rate r) -// { -// if (r <= -1) -// r = -0.99999999; // Very funky ... Better check what an IRR <= -100% means -// -// return (from cf in cfs -// let startDate = cfs.OrderBy(cf1 => cf1.Date).First().Date -// select cf.Amount / (decimal) Math.Pow(1 + r, (cf.Date - startDate).Days / 365.0)).Sum(); -// } -// -// internal static Pair FindBrackets(Func, Rate, Money> func, -// IEnumerable cfs) -// { -// // Abracadabra magic numbers ... -// const int maxIter = 100; -// const Rate bracketStep = 0.5; -// const Rate guess = 0.1; -// -// Rate leftBracket = guess - bracketStep; -// Rate rightBracket = guess + bracketStep; -// var iter = 0; -// -// while (func(cfs, leftBracket) * func(cfs, rightBracket) > 0 && iter++ < maxIter) -// { -// leftBracket -= bracketStep; -// rightBracket += bracketStep; -// } -// -// if (iter >= maxIter) -// return new Pair(0, 0); -// -// return new Pair(leftBracket, rightBracket); -// } -// -// // From "Applied Numerical Analyis" by Gerald -// internal static AlgorithmResult Bisection(Func func, -// Pair brackets, Rate tol, int maxIters) -// { -// int iter = 1; -// -// Money f3 = 0; -// Rate x3 = 0; -// Rate x1 = brackets.First; -// Rate x2 = brackets.Second; -// -// do -// { -// var f1 = func(x1); -// var f2 = func(x2); -// -// if (f1 == 0 && f2 == 0) -// return new AlgorithmResult(ApproximateResultKind.NoSolutionWithinTolerance, -// x1); -// -// if (f1 * f2 > 0) -// throw new ArgumentException("x1 x2 values don't bracket a root"); -// -// x3 = (x1 + x2) / 2; -// f3 = func(x3); -// -// if (f3 * f1 < 0) -// x2 = x3; -// else -// x1 = x3; -// -// iter++; -// } while (Math.Abs(x1 - x2) / 2 > tol && f3 != 0 && iter < maxIters); -// -// if (f3 == 0) -// return new AlgorithmResult(ApproximateResultKind.ExactSolution, x3); -// -// if (Math.Abs(x1 - x2) / 2 < tol) -// return new AlgorithmResult(ApproximateResultKind.ApproximateSolution, x3); -// -// if (iter > maxIters) -// return new AlgorithmResult(ApproximateResultKind.NoSolutionWithinTolerance, -// x3); -// -// throw new Exception("It should never get here"); -// } -// -// public static AlgorithmResult CalculateXIRR(IEnumerable cfs, Rate tolerance, -// int maxIters) -// { -// var brackets = FindBrackets(CalculateXNPV, cfs); -// -// if (brackets.First == brackets.Second) -// return new AlgorithmResult(ApproximateResultKind.NoSolutionWithinTolerance, -// brackets.First); -// -// return Bisection(r => CalculateXNPV(cfs, r), brackets, tolerance, maxIters); -// } -// } -// -// // TESTS -// using Microsoft.VisualStudio.TestTools.UnitTesting; -// using System.Collections.Generic; -// using System; -// using Rate = System.Double; -// -// namespace TimeLineTest -// { -// [TestClass()] -// public class AlgorithmsTest -// { -// IEnumerable cfs = new CashFlow[] -// { -// new CashFlow(-10000, new DateTime(2008, 1, 1)), -// new CashFlow(2750, new DateTime(2008, 3, 1)), -// new CashFlow(4250, new DateTime(2008, 10, 30)), -// new CashFlow(3250, new DateTime(2009, 2, 15)), -// new CashFlow(2750, new DateTime(2009, 4, 1)) -// }; -// -// IEnumerable bigcfs = new CashFlow[] -// { -// new CashFlow(-10, new DateTime(2000, 1, 1)), -// new CashFlow(10, new DateTime(2002, 1, 2)), -// new CashFlow(20, new DateTime(2003, 1, 3)) -// }; -// -// IEnumerable negcfs = new CashFlow[] -// { -// new CashFlow(-10, new DateTime(2000, 1, 1)), -// new CashFlow(-1, new DateTime(2002, 1, 2)), -// new CashFlow(1, new DateTime(2003, 1, 3)) -// }; -// -// IEnumerable samedaysamecfs = new CashFlow[] -// { -// new CashFlow(-10, new DateTime(2000, 1, 1)), -// new CashFlow(10, new DateTime(2000, 1, 1)), -// }; -// -// IEnumerable samedaydifferentcfs = new CashFlow[] -// { -// new CashFlow(-10, new DateTime(2000, 1, 1)), -// new CashFlow(100, new DateTime(2000, 1, 1)), -// }; -// -// IEnumerable bigratecfs = new CashFlow[] -// { -// new CashFlow(-10, new DateTime(2000, 1, 1)), -// new CashFlow(20, new DateTime(2000, 5, 30)), -// }; -// -// IEnumerable zeroRate = new CashFlow[] -// { -// new CashFlow(-10, new DateTime(2000, 1, 1)), -// new CashFlow(10, new DateTime(2003, 1, 1)), -// }; -// -// IEnumerable doubleNegative = new CashFlow[] -// { -// new CashFlow(-10000, new DateTime(2008, 1, 1)), -// new CashFlow(2750, new DateTime(2008, 3, 1)), -// new CashFlow(-4250, new DateTime(2008, 10, 30)), -// new CashFlow(3250, new DateTime(2009, 2, 15)), -// new CashFlow(2750, new DateTime(2009, 4, 1)) -// }; -// -// IEnumerable badDoubleNegative = new CashFlow[] -// { -// new CashFlow(-10000, new DateTime(2008, 1, 1)), -// new CashFlow(2750, new DateTime(2008, 3, 1)), -// new CashFlow(-4250, new DateTime(2008, 10, 30)), -// new CashFlow(3250, new DateTime(2009, 2, 15)), -// new CashFlow(-2750, new DateTime(2009, 4, 1)) -// }; -// -// double r = 0.09; -// double tolerance = 0.0001; -// int maxIters = 100; -// -// private TestContext testContextInstance; -// -// public TestContext TestContext -// { -// get { return testContextInstance; } -// set { testContextInstance = value; } -// } -// -// [TestMethod()] -// public void CalculateXNPV() -// { -// Assert.AreEqual(2086.6476020315416570634272814M, Algorithms.CalculateXNPV(cfs, r)); -// Assert.AreEqual(-10.148147600710372651326920258M, Algorithms.CalculateXNPV(negcfs, 0.5)); -// Assert.AreEqual(4.9923725815954514810351876895M, Algorithms.CalculateXNPV(bigcfs, 0.3)); -// } -// -// [TestMethod] -// public void FindBrackets() -// { -// var brackets = Algorithms.FindBrackets(Algorithms.CalculateXNPV, cfs); -// Assert.IsTrue(brackets.First < 0.3733 && brackets.Second > 0.3733); -// -// brackets = Algorithms.FindBrackets(Algorithms.CalculateXNPV, bigcfs); -// Assert.IsTrue(brackets.First < 0.5196 && brackets.Second > 0.5196); -// -// brackets = Algorithms.FindBrackets(Algorithms.CalculateXNPV, negcfs); -// Assert.IsTrue(brackets.First < -0.6059 && brackets.Second > -0.6059); -// } -// -// [TestMethod] -// public void XIRRTest() -// { -// var irr = Algorithms.CalculateXIRR(cfs, tolerance, maxIters); -// Assert.AreEqual(0.3733, irr.Value, 0.001); -// Assert.AreEqual(ApproximateResultKind.ApproximateSolution, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(bigcfs, tolerance, maxIters); -// Assert.AreEqual(0.5196, irr.Value, 0.001); -// Assert.AreEqual(ApproximateResultKind.ApproximateSolution, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(negcfs, tolerance, maxIters); -// Assert.AreEqual(-0.6059, irr.Value, 0.001); -// Assert.AreEqual(ApproximateResultKind.ApproximateSolution, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(samedaysamecfs, tolerance, maxIters); -// Assert.AreEqual(ApproximateResultKind.NoSolutionWithinTolerance, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(samedaydifferentcfs, tolerance, maxIters); -// Assert.AreEqual(ApproximateResultKind.NoSolutionWithinTolerance, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(bigratecfs, tolerance, maxIters); -// Assert.AreEqual(4.40140, irr.Value, 0.001); -// Assert.AreEqual(ApproximateResultKind.ApproximateSolution, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(zeroRate, tolerance, maxIters); -// Assert.AreEqual(0, irr.Value, 0.001); -// Assert.AreEqual(ApproximateResultKind.ApproximateSolution, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(doubleNegative, tolerance, maxIters); -// Assert.AreEqual(-0.537055, irr.Value, 0.001); -// Assert.AreEqual(ApproximateResultKind.ApproximateSolution, irr.Kind); -// -// irr = Algorithms.CalculateXIRR(badDoubleNegative, tolerance, maxIters); -// Assert.AreEqual(ApproximateResultKind.NoSolutionWithinTolerance, irr.Kind); -// } -// } -// } \ No newline at end of file diff --git a/EvoCalculator.Core.FinanceFormulas/GoalXIRR.cs b/EvoCalculator.Core.FinanceFormulas/GoalXIRR.cs deleted file mode 100644 index a3f0998..0000000 --- a/EvoCalculator.Core.FinanceFormulas/GoalXIRR.cs +++ /dev/null @@ -1,23 +0,0 @@ -using TridentGoalSeek; - -namespace EvoCalculator.Core.FinanceFormulas -{ - public class GoalXIRR : IGoalSeekAlgorithm - { - private readonly int x; - - public GoalXIRR(int x) - { - this.x = x; - } - - public decimal Calculate(decimal inputVariable) - { - // Value[2]+=10; - // ComputeValues - // XIRR - // return XIRR - return inputVariable * this.x; - } - } -} \ No newline at end of file diff --git a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs index 8b6aeb6..a3d48da 100644 --- a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs +++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs @@ -70,7 +70,7 @@ namespace EvoCalculator.Core.Models.Calculation.Models.Prepared public double TransportTaxGr { get; set; } public double NsibBrutto { get; set; } public double NsibNetto { get; set; } - public double NmperDeprecation { get; set; } + public int NmperDeprecation { get; set; } public double DeprecationTime { get; set; } public double RatBonus { get; set; } public double NsBonus { get; set; } diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/AcceptInsuranceTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptInsuranceTests.cs new file mode 100644 index 0000000..0a76579 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptInsuranceTests.cs @@ -0,0 +1,136 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class AcceptInsuranceTests + { + [Fact] + public void AcceptInsuranceTest1() + { + var preparedValues = new PreparedValues() + { + Nmper = 30, + }; + + var acceptKaskoColumn = new AcceptKaskoColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 123666.666666667, + 0.00, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + } + }; + + + var acceptOsagoColumn = new AcceptOsagoColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 30000, + 0.00, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 2727.27272727273, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + } + }; + + + var acceptInsuranceColumn = new AcceptInsuranceColumn(preparedValues.Nmper + 1); + acceptInsuranceColumn.ComputeValues(acceptKaskoColumn, acceptOsagoColumn); + + var expected = new[] + { + 153666.6666666666, + 0.00, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 6991.64054336468, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + 4264.36781609195, + }; + + Assert.Equal(expected, acceptInsuranceColumn.Values); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/AcceptKaskoTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptKaskoTests.cs new file mode 100644 index 0000000..bf5d101 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptKaskoTests.cs @@ -0,0 +1,61 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class AcceptKaskoTests + { + [Fact] + public void AcceptKaskoTest1() + { + var preparedValues = new PreparedValues() + { + Nmper = 30, + InsuranceKaskoNmper = 123666.666666667 + }; + + + var expected = new[] + { + 123666.666666667, + 0.00, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + 4264.367816091965, + }; + + + var acceptKaskoColumn = new AcceptKaskoColumn(preparedValues.Nmper + 1); + acceptKaskoColumn.ComputeValues(preparedValues); + + Assert.Equal(expected, acceptKaskoColumn.Values); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/AcceptOsagoTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptOsagoTests.cs new file mode 100644 index 0000000..5f9d51f --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptOsagoTests.cs @@ -0,0 +1,61 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class AcceptOsagoTests + { + [Fact] + public void AcceptOsagoTest1() + { + var preparedValues = new PreparedValues() + { + Nmper = 30, + InsuranceOsago = 30000 + }; + + + var expected = new[] + { + 30000.000000000004, + 0.00, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 2727.2727272727275, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + }; + + + var acceptOsagoColumn = new AcceptOsagoColumn(preparedValues.Nmper + 1); + acceptOsagoColumn.ComputeValues(preparedValues); + + Assert.Equal(expected, acceptOsagoColumn.Values); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/AcceptSumTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptSumTests.cs new file mode 100644 index 0000000..dba17af --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/AcceptSumTests.cs @@ -0,0 +1,251 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class AcceptSumTests + { + [Fact] + public void AcceptSumTest1() + { + var preparedValues = + new PreparedValues() + { + Nmper = 30, + AcceptSum = 2500000 + }; + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2020, 10, 12), + new DateTime(2020, 10, 12), + new DateTime(2020, 11, 12), + new DateTime(2020, 12, 12), + new DateTime(2021, 1, 12), + new DateTime(2021, 2, 12), + new DateTime(2021, 3, 12), + new DateTime(2021, 4, 12), + new DateTime(2021, 5, 12), + new DateTime(2021, 6, 12), + new DateTime(2021, 7, 12), + new DateTime(2021, 8, 12), + new DateTime(2021, 9, 12), + new DateTime(2021, 10, 12), + new DateTime(2021, 11, 12), + new DateTime(2021, 12, 12), + new DateTime(2022, 1, 12), + new DateTime(2022, 2, 12), + new DateTime(2022, 3, 12), + new DateTime(2022, 4, 12), + new DateTime(2022, 5, 12), + new DateTime(2022, 6, 12), + new DateTime(2022, 7, 12), + new DateTime(2022, 8, 12), + new DateTime(2022, 9, 12), + new DateTime(2022, 10, 12), + new DateTime(2022, 11, 12), + new DateTime(2022, 12, 12), + new DateTime(2023, 1, 12), + new DateTime(2023, 2, 12), + new DateTime(2023, 3, 12), + new DateTime(2023, 4, 12), + new DateTime(2023, 5, 12), + new DateTime(2023, 6, 12), + new DateTime(2023, 7, 12), + new DateTime(2023, 8, 12), + new DateTime(2023, 9, 12), + new DateTime(2023, 10, 12), + new DateTime(2023, 11, 12), + new DateTime(2023, 12, 12), + new DateTime(2024, 1, 12), + new DateTime(2024, 2, 12), + new DateTime(2024, 3, 12), + new DateTime(2024, 4, 12), + new DateTime(2024, 5, 12), + new DateTime(2024, 6, 12), + new DateTime(2024, 7, 12), + new DateTime(2024, 8, 12), + new DateTime(2024, 9, 12), + new DateTime(2024, 10, 12), + new DateTime(2024, 11, 12), + new DateTime(2024, 12, 12), + new DateTime(2025, 1, 12), + new DateTime(2025, 2, 12), + new DateTime(2025, 3, 12), + new DateTime(2025, 4, 12), + new DateTime(2025, 5, 12), + new DateTime(2025, 6, 12), + new DateTime(2025, 7, 12), + new DateTime(2025, 8, 12), + new DateTime(2025, 9, 12), + new DateTime(2025, 10, 12), + new DateTime(2025, 11, 12), + new DateTime(2025, 12, 12), + new DateTime(2026, 1, 12), + new DateTime(2026, 2, 12), + new DateTime(2026, 3, 12), + } + }; + + var sumColumn = new SumColumn(preparedValues.Nmper + 1, dateTempColumn, null, null) + { + Values = new[] + { + -2542903.66268442, + 625000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 120000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 108000.00, + 96000.00, + 96000.00, + 96000.00, + 96000.00, + 96000.00, + 96000.00, + 96000.00, + 25000.00, + } + }; + + var vatColumn = new VATColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 742000.00, + 125000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 24000.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 21600.00, + 19200.00, + 19200.00, + 19200.00, + 19200.00, + 19200.00, + 19200.00, + 19200.00, + 5000.00, + } + }; + + var sumWithVatColumn = new SumWithVATColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 4452000.00, + 750000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 144000.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 129600.00, + 115200.00, + 115200.00, + 115200.00, + 115200.00, + 115200.00, + 115200.00, + 115200.00, + 30000.00, + } + }; + + var expected = new[] + { + 2500000, + 421159.0296495957, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 80862.53369272237, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 72776.280323450133, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 16846.361185983827, + }; + + + var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1); + acceptSumColumn.ComputeValues(preparedValues, sumColumn, vatColumn, sumWithVatColumn); + + var values = acceptSumColumn.Values; + Assert.Equal(expected, values); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLDTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLDTests.cs new file mode 100644 index 0000000..94fc891 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLDTests.cs @@ -0,0 +1,72 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class DeprecationLDTests + { + [Fact] + public void DeprecationLDTest1() + { + var preparedValues = new PreparedValues() + { + BalanceHolder = 100000001, + NmperDeprecation = 37, + DeprecationTime = 5.60, + AcceptSum = 2500000 + }; + + + var deprecationLDColumn = new DeprecationLDColumn(preparedValues.NmperDeprecation + 2); + deprecationLDColumn.ComputeValues(preparedValues); + + var expected = new[] + { + 2500000.00, + 0.00, + 140000.00, + 132160.00, + 124759.04, + 117772.53376, + 111177.27186944, + 104951.344644751, + 99074.0693446453, + 93525.9214613451, + 88288.4698595098, + 83344.3155473772, + 78677.0338767241, + 74271.1199796276, + 70111.9372607684, + 66185.6687741654, + 62479.2713228121, + 58980.4321287346, + 55677.5279295255, + 52559.5863654721, + 49616.2495290057, + 46837.7395553813, + 44214.82614028, + 41738.7958764243, + 39401.4233073445, + 37194.9436021332, + 35112.0267604138, + 33145.7532618306, + 31289.5910791681, + 29537.3739787347, + 27883.2810359255, + 26321.8172979137, + 24847.7955292305, + 23456.3189795936, + 22142.7651167364, + 20902.7702701992, + 19732.215135068, + 18627.2110875042, + 314001.558332213, + }; + + + var values = deprecationLDColumn.Values; + Assert.Equal(expected, values, new DoubleArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLPTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLPTests.cs new file mode 100644 index 0000000..c76dfd5 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationLPTests.cs @@ -0,0 +1,189 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class DeprecationLPTests + { + [Fact] + public void DeprecationLPTest1() + { + var preparedValues = new PreparedValues() + { + BalanceHolder = 100000001, + Nmper = 30 + }; + + var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 2224393.53099731, + 421159.029649596, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 16846.3611859838, + } + }; + + var deprecationLPColumn = new DeprecationLPColumn(preparedValues.Nmper + 1); + deprecationLPColumn.ComputeValues(preparedValues, acceptSumColumn); + + var expected = new[] + { + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + }; + + + var values = deprecationLPColumn.Values; + Assert.Equal(expected, values); + } + + [Fact] + public void DeprecationLPTest2() + { + var preparedValues = new PreparedValues() + { + BalanceHolder = 100000000, + Nmper = 30 + }; + + var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 2224393.53099731, + 421159.029649596, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 80862.533692722398, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 72776.280323450104, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 64690.026954177898, + 16846.3611859838, + } + }; + + var deprecationLPColumn = new DeprecationLPColumn(preparedValues.Nmper + 1); + deprecationLPColumn.ComputeValues(preparedValues, acceptSumColumn); + + var expected = new[] + { + 2500000.00, + 421159.029649596, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 80862.5336927224, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 72776.2803234501, + 64690.0269541779, + 64690.0269541779, + 64690.0269541779, + 64690.0269541779, + 64690.0269541779, + 64690.0269541779, + 64690.0269541779, + 16846.3611859838, + }; + + + var values = deprecationLPColumn.Values; + Assert.Equal(expected, values, new DoubleArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationTests.cs new file mode 100644 index 0000000..ed8c7b9 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/DeprecationTests.cs @@ -0,0 +1,153 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class DeprecationTests + { + [Fact] + public void DepreactionTest1() + { + var preparedValues = new PreparedValues() + { + NmperDeprecation = 37, + Nmper = 30 + }; + + var deprecationLPColumn = new DeprecationLPColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + } + }; + + var deprectionLDColumn = new DeprecationLDColumn(preparedValues.NmperDeprecation + 2) + { + Values = new[] + { + 2500000.00, + 0.00, + 140000.00, + 132160.00, + 124759.04, + 117772.53376, + 111177.27186944, + 104951.344644751, + 99074.0693446453, + 93525.9214613451, + 88288.4698595098, + 83344.3155473772, + 78677.0338767241, + 74271.1199796276, + 70111.9372607684, + 66185.6687741654, + 62479.2713228121, + 58980.4321287346, + 55677.5279295255, + 52559.5863654721, + 49616.2495290057, + 46837.7395553813, + 44214.82614028, + 41738.7958764243, + 39401.4233073445, + 37194.9436021332, + 35112.0267604138, + 33145.7532618306, + 31289.5910791681, + 29537.3739787347, + 27883.2810359255, + 26321.8172979137, + 24847.7955292305, + 23456.3189795936, + 22142.7651167364, + 20902.7702701992, + 19732.215135068, + 18627.2110875042, + 314001.558332213, + } + }; + + var deprecationColumn = new DeprecationColumn(preparedValues.NmperDeprecation + 2); + deprecationColumn.ComputeValues(deprecationLPColumn, deprectionLDColumn); + + var expected = new[] + { + 2500000.00, + 0.00, + 140000.00, + 132160.00, + 124759.04, + 117772.53376, + 111177.27186944, + 104951.344644751, + 99074.0693446453, + 93525.9214613451, + 88288.4698595098, + 83344.3155473772, + 78677.0338767241, + 74271.1199796276, + 70111.9372607684, + 66185.6687741654, + 62479.2713228121, + 58980.4321287346, + 55677.5279295255, + 52559.5863654721, + 49616.2495290057, + 46837.7395553813, + 44214.82614028, + 41738.7958764243, + 39401.4233073445, + 37194.9436021332, + 35112.0267604138, + 33145.7532618306, + 31289.5910791681, + 29537.3739787347, + 27883.2810359255, + 26321.8172979137, + 24847.7955292305, + 23456.3189795936, + 22142.7651167364, + 20902.7702701992, + 19732.215135068, + 18627.2110875042, + 314001.558332213, + }; + + + var values = deprecationColumn.Values; + Assert.Equal(expected, values, new DoubleArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/NPVBonusExpensesTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/NPVBonusExpensesTests.cs new file mode 100644 index 0000000..6c6edaf --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/NPVBonusExpensesTests.cs @@ -0,0 +1,130 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class NPVBonusExpensesTests + { + [Fact] + public void NPVBonusExpensesTest1() + { + var preparedValue = new PreparedValues + { + SalaryRate = 0.3, + MarketRate = 0.01, + DistrictRate = 0.02, + RatBonus = 360.00, + NsBonus = 90.00, + NsibBonus = 97.014, + BonusFix = 0.00, + BonusBase = 2003933.33333333, + Bonus = 0.011, + Nmper = 30 + }; + + + var npvBonusExpensesColumn = new NPVBonusExpensesColumn(preparedValue.Nmper + 1); + npvBonusExpensesColumn.ComputeValues(preparedValue); + + var expected = new[] + { + -30248.3858126666, + -732.451746, + -29515.9340666666, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + }; + + + Assert.Equal(expected, npvBonusExpensesColumn.Values, new DoubleArrayComparer()); + } + + + [Fact] + public void NPVBonusExpensesTest2() + { + var preparedValue = new PreparedValues + { + SalaryRate = 0.3, + MarketRate = 0.01, + DistrictRate = 0.02, + RatBonus = 360.00, + NsBonus = 90.00, + NsibBonus = 97.014, + BonusFix = 20000.00, + BonusBase = 2003933.33333333, + Bonus = 0.011, + Nmper = 30 + }; + + + var npvBonusExpensesColumn = new NPVBonusExpensesColumn(preparedValue.Nmper + 1); + npvBonusExpensesColumn.ComputeValues(preparedValue); + + var expected = new[] + { + -20732.451746, + -732.451746, + -20000.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + }; + + + Assert.Equal(expected, npvBonusExpensesColumn.Values, new DoubleArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs b/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs index a13c135..f1feb90 100644 --- a/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs +++ b/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs @@ -176,7 +176,7 @@ namespace EvoCalculator.Core.Tests.Calculation.Columns , percentPaymentColumn); sumColumn.ComputeValues(Convert.ToDecimal(preparedValues.IrrExpected)); var values = sumColumn.Values; - Assert.Equal(expected, values); + Assert.Equal(expected, values, new DoubleArrayComparer(100)); } [Fact] @@ -306,7 +306,7 @@ namespace EvoCalculator.Core.Tests.Calculation.Columns , percentPaymentColumn); sumColumn.ComputeValues(Convert.ToDecimal(preparedValues.IrrExpected)); var values = sumColumn.Values; - Assert.Equal(expected, values); + Assert.Equal(expected, values, new DoubleArrayComparer(100)); } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/DoubleArrayComparer.cs b/EvoCalculator.Core.Tests/DoubleArrayComparer.cs new file mode 100644 index 0000000..5c49c5b --- /dev/null +++ b/EvoCalculator.Core.Tests/DoubleArrayComparer.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace EvoCalculator.Core.Tests +{ + public class DoubleArrayComparer : IEqualityComparer + { + private double _tolerance = 0.001; + + public DoubleArrayComparer(double tolerance) + { + this._tolerance = tolerance; + } + public DoubleArrayComparer() + { + + } + + public bool Equals(double x, double y) + { + return Math.Abs(x - y) < _tolerance; + } + + public int GetHashCode(double obj) + { + return obj.GetHashCode(); + } + } +} \ No newline at end of file