public void TestMethodEmployeeBaseCalculationSuccessor()
        {
            const double delta    = 0.00001;
            const double baseRate = 100;
            var          dateTest = new DateTime(2017, 01, 01);

            var unitOfWorkMosk = new Mock <IMyDbContextUnitOfWork>();
            var baseEmployeer  = new CalculationEmployeeBase <IMyDbContextUnitOfWork>(unitOfWorkMosk.Object, ParametersCalculationSource.ParametersCalculationForEmployee);
            var employee       = new Employee {
                BaseRate = baseRate, DateOfEmployment = dateTest
            };

            Assert.AreEqual(baseRate, baseEmployeer.Calculation(employee, dateTest), delta);
            Assert.AreEqual(baseRate * 1.03, baseEmployeer.Calculation(employee, dateTest.AddYears(1)), delta);
            Assert.AreEqual(baseRate * 1.30, baseEmployeer.Calculation(employee, dateTest.AddYears(10)), delta);
            Assert.AreEqual(baseRate * 1.30, baseEmployeer.Calculation(employee, dateTest.AddYears(15)), delta);
        }
        public void TestMethodSalesmanCalculationSuccessorWorkers()
        {
            const double delta    = 0.00001;
            const double baseRate = 1000;
            var          dateTest = new DateTime(2017, 01, 01);

            var unitOfWorkMosk = new Mock <IMyDbContextUnitOfWork>();

            var workers = new List <Employee>
            {
                new Employee {
                    ID = 1, BaseRate = baseRate, DateOfEmployment = dateTest
                },
                new Employee {
                    ID = 2, BaseRate = baseRate, DateOfEmployment = dateTest
                }
            };

            var manager = new Manager {
                ID = 3, BaseRate = baseRate, DateOfEmployment = dateTest
            };

            var workersSalesmans = new List <Employee>
            {
                manager,
                new Employee {
                    ID = 4, BaseRate = baseRate, DateOfEmployment = dateTest
                }
            };

            var employee = new Salesman {
                BaseRate = baseRate, DateOfEmployment = dateTest
            };

            var mock = new Mock <CalculationEmployeeSalesman <IMyDbContextUnitOfWork> >(unitOfWorkMosk.Object, ParametersCalculationSource.ParametersCalculationForSalesman)
            {
                CallBase = true
            };

            //salesman
            mock.Protected()
            .Setup <IEnumerable <Employee> >("GetWorkers", employee)
            .Returns(workersSalesmans.AsEnumerable());

            //manager
            mock.Protected()
            .Setup <IEnumerable <Employee> >("GetWorkers", workersSalesmans[0])
            .Returns(workers.AsEnumerable());

            //employers
            mock.Protected()
            .Setup <IEnumerable <Employee> >("GetWorkers", workersSalesmans[1])
            .Returns(new LinkedList <Employee>());

            mock.Protected()
            .Setup <IEnumerable <Employee> >("GetWorkers", workers[0])
            .Returns(workers.AsEnumerable());

            mock.Protected()
            .Setup <IEnumerable <Employee> >("GetWorkers", workers[1])
            .Returns(workers.AsEnumerable());

            var mockManager = new Mock <CalculationEmployeeManager <IMyDbContextUnitOfWork> >(unitOfWorkMosk.Object, ParametersCalculationSource.ParametersCalculationForManager)
            {
                CallBase = true
            };

            //manager
            mockManager.Protected()
            .Setup <IEnumerable <Employee> >("GetWorkers", manager)
            .Returns(workers.AsEnumerable());

            var baseEmployeer = new CalculationEmployeeBase <IMyDbContextUnitOfWork>(unitOfWorkMosk.Object, ParametersCalculationSource.ParametersCalculationForEmployee);
            var baseManager   = mockManager.Object;
            var baseSalesman  = mock.Object;

            baseSalesman.SetSuccessor(baseManager);
            baseManager.SetSuccessor(baseEmployeer);


            Assert.AreEqual(baseRate + (baseRate * 0.003) * 3 + (baseRate + (0.005 * baseRate) * 2) * 0.003,
                            baseSalesman.Calculation(employee, dateTest), delta);
        }