public void AddMoreDesiresTest()
        {
            Config.IsInUnitTesting = true;
            CalcParameters parameters = CalcParametersFactory.MakeGoodDefaults();
            HouseholdKey   key        = new HouseholdKey("hh5");
            var            persons    = new List <ModularHouseholdPerson>();
            var            p          = new Person("blub", 1, 1, 1, 1,
                                                   PermittedGender.Male, string.Empty, string.Empty, Guid.NewGuid().ToStrGuid());
            var tt  = new TraitTag("traittag", "", TraitLimitType.NoLimit, TraitPriority.All, Guid.NewGuid().ToStrGuid());
            var mhp = new ModularHouseholdPerson(null, -1, p.PrettyName, "", p, tt, Guid.NewGuid().ToStrGuid());

            persons.Add(mhp);
            var          hhVacations = new List <VacationTimeframe>();
            Random       r           = new Random(1);
            NormalRandom nr          = new NormalRandom(0, 1, r);
            //DeviceCategoryPicker picker = new DeviceCategoryPicker(r,null);
            //var parameters = new CalcFactoryParameters(picker);
            //CalcFactoryParameters.SetSkipChecking(true);
            //var cloc = new CalcLocation("cloc", 1, Guid.NewGuid().ToStrGuid());
            //var mock = new Mock<ILogFile>();
            CalcParameters       calcParameters = CalcParametersFactory.MakeGoodDefaults();
            VacationDtoFactory   vfac           = new VacationDtoFactory(calcParameters, r);
            CalcPersonDtoFactory cpf            = new CalcPersonDtoFactory(parameters, r, nr, vfac);
            var hhtDesires =
                new List <ModularHousehold.PersonTraitDesireEntry>();
            var d         = new Desire("desire", 1, 1, 1, string.Empty, 1, false, 1, "", Guid.NewGuid().ToStrGuid());
            var hhtDesire = new HHTDesire(1, 1, 1, d, HealthStatus.Healthy, 1, 1, string.Empty, "name", 1, 100,
                                          PermittedGender.All, Guid.NewGuid().ToStrGuid());
            var hht = new HouseholdTrait("blub", null, "", "", "", 1, 1, 1, 1, 1, TimeType.Day, 1, 1, TimeType.Day, 1,
                                         1, EstimateType.FromCalculations,
                                         "", Guid.NewGuid().ToStrGuid());

            hhtDesires.Add(
                new ModularHousehold.PersonTraitDesireEntry(
                    ModularHouseholdTrait.ModularHouseholdTraitAssignType.Age, null, hhtDesire, hht));
            //var sharedDesireValues = new Dictionary<Desire, SharedDesireValue>();
            var cpersons = cpf.MakePersonDtos(persons, key, hhVacations, hhtDesires, "hhname");

            cpersons.Count.Should().Be(1);
            var cp = cpersons[0];

            //CalcPersonFactory.AddTraitDesires(hhtDesires, cpersons, 1, "name", sharedDesireValues);
            cp.Desires.Count.Should().Be(1);
            cp.Desires.Count.Should().Be(1);
            p.PrettyName.Should().Be(cp.Name);
            p.Age.Should().Be(cp.Age);
            // id 1 for the dictionary
            Assert.Equal(d.PrettyName, cp.Desires[0].Name);
        }
        public void SwapTagTest()
        {
            using (var db = new DatabaseSetup(Utili.GetCurrentMethodAndClass()))
            {
                Simulator              sim       = new Simulator(db.ConnectionString);
                ModularHousehold       mhh       = sim.ModularHouseholds.It[0];
                ModularHouseholdPerson mhhPerson = mhh.Persons[0];
                Person   dstPerson    = mhhPerson.Person;
                TraitTag dstTag       = sim.TraitTags.It[10];
                int      traitsBefore = mhh.Traits.Count;
                mhh.SwapPersons(mhhPerson, dstPerson, dstTag);
                int traitsAfter = mhh.Traits.Count;
                (traitsAfter).Should().Be(traitsBefore);

                db.Cleanup();
            }
        }
        public static List <ModularHousehold> RunCalculationTests([NotNull] Simulator sim)
        {
            var allhh = new List <ModularHousehold>();

            Logger.Info("Starting sync");
            foreach (var templatePerson in sim.TemplatePersons.It)
            {
                var personCode = templatePerson.Name.Substring(0, 4);
                if (!personCode.StartsWith("TP", StringComparison.Ordinal))
                {
                    Logger.Warning("Ignoring " + templatePerson.Name + " because name doesn't start with TP");
                    continue;
                }

                // Person
                var p = sim.Persons.It.FirstOrDefault(x => x.Name == templatePerson.Name);
                if (p == null)
                {
                    Logger.Info("Creating person " + templatePerson.Name);
                    p = sim.Persons.CreateNewItem(sim.ConnectionString);
                }
                else
                {
                    Logger.Warning("Person " + templatePerson.Name + " already existed.");
                }

                p.Name        = templatePerson.Name;
                p.Gender      = templatePerson.Gender;
                p.Age         = templatePerson.Age;
                p.SickDays    = templatePerson.SickDays;
                p.Description = "Created to test the template person " + templatePerson.Name;
                p.SaveToDB();
                // modular Household
                var chh = sim.ModularHouseholds.It.FirstOrDefault(x => x.Name == templatePerson.Name);
                if (chh == null)
                {
                    Logger.Info("Creating modular household  " + templatePerson.Name);
                    chh = sim.ModularHouseholds.CreateNewItem(sim.ConnectionString);
                }
                else
                {
                    Logger.Warning("Modular Household " + templatePerson.Name + " already existed.");
                }

                chh.Name     = templatePerson.Name;
                chh.Vacation = sim.Vacations[1];
                chh.SaveToDB();
                chh.Description = "Created to test the template person " + templatePerson.Name;
                if (templatePerson.BaseHousehold == null)
                {
                    throw new LPGException("base household was null");
                }
                //TODO: add traittag to template person
                ModularHouseholdPerson mhhperson =
                    templatePerson.BaseHousehold.Persons.FirstOrDefault(x => x.Person == templatePerson.BasePerson);
                TraitTag tt = null;
                if (mhhperson != null)
                {
                    tt = mhhperson.TraitTag;
                }
                else
                {
                    Logger.Error("no tag");
                }

                chh.AddPerson(p, tt);
                allhh.Add(chh);
                var i = 0;
                foreach (var personTrait in templatePerson.Traits)
                {
                    if (personTrait.Trait.Name.Contains("boardgame"))
                    {
                        continue;
                    }

                    chh.AddTrait(personTrait.Trait, ModularHouseholdTrait.ModularHouseholdTraitAssignType.Name, p);
                    i++;
                }

                Logger.Info("Added " + i + " traits.");
                var traits         = templatePerson.Traits.Select(x => x.Trait).ToList();
                var traitsToDelete = new List <ModularHouseholdTrait>();
                i = 0;
                foreach (var chhtrait in chh.Traits)
                {
                    if (!traits.Contains(chhtrait.HouseholdTrait))
                    {
                        traitsToDelete.Add(chhtrait);
                        i++;
                    }
                }

                foreach (var trait in traitsToDelete)
                {
                    chh.DeleteTraitFromDB(trait);
                }

                Logger.Info("Deleted " + i + " traits.");
            }

            return(allhh);
        }
        private void CheckMinimumPersonRequirements([NotNull] ModularHousehold modularHousehold,
                                                    [NotNull] ModularHouseholdPerson modularHouseholdPerson)
        {
            if (!PerformCleanupChecks)
            {
                return;
            }

            if (modularHouseholdPerson.Person.Name.ToUpperInvariant().Contains("MAID") ||
                modularHouseholdPerson.Person.Description.ToUpperInvariant().Contains("MAID"))
            {
                return;
            }
            var traitsForPerson =
                modularHousehold.Traits.Where(x => x.DstPerson == modularHouseholdPerson.Person).ToList();
            var traitNames =
                traitsForPerson.Select(x => x.HouseholdTrait.PrettyName.ToUpperInvariant()).ToList();
            var shower = traitNames.Any(x => x.Contains("SHOWER"));

            if (!shower && modularHouseholdPerson.Person.Age > 10)
            {
                throw new DataIntegrityException(
                          "No shower in the household " + modularHousehold.PrettyName + " for " +
                          modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            var sleep = traitNames.Any(x => x.Contains("SLEEP"));

            if (!sleep)
            {
                throw new DataIntegrityException(
                          "No sleep in the household " + modularHousehold.PrettyName + " for " +
                          modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            var unhungry = traitNames.Any(x => x.Contains("UNHUNGRY"));

            if (!unhungry)
            {
                //var hungryTrait = sim.HouseholdTraits.It.First(x => x.Name.Contains("Desire for food, join only"));
                //modularHousehold.AddTrait(hungryTrait,ModularHouseholdTrait.ModularHouseholdTraitAssignType.Name, modularHouseholdPerson.Person);
                throw new DataIntegrityException("Unhungry not set in the household " + modularHousehold.PrettyName + " for " + modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            var sickness = traitNames.Any(x => x.Contains("SICKNESS"));

            if (!sickness)
            {
                throw new DataIntegrityException(
                          "No sickness activities in the household " + modularHousehold.PrettyName + " for " +
                          modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            var toilet = traitNames.Any(x => x.Contains("TOILET"));

            if (!toilet && modularHouseholdPerson.Person.Age > 3)
            {
                throw new DataIntegrityException(
                          "No toilet activities in the household " + modularHousehold.PrettyName + " for " +
                          modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            var getready = traitNames.Any(x => x.Contains("READY"));

            if (!getready && modularHouseholdPerson.Person.Age > 5)
            {
                throw new DataIntegrityException(
                          "No get ready activities in the household " + modularHousehold.PrettyName + " for " +
                          modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            var work   = traitNames.Any(x => x.Contains("WORK"));
            var school = traitsForPerson.Any(y => y.HouseholdTrait.Tags.Any(x => x.Name.ToUpperInvariant() == "CHILD / SCHOOL"));
            var outsideafternoonTraits =
                traitsForPerson.Where(
                    x =>
                    x.HouseholdTrait.Tags.Any(
                        y => y.Name.ToUpperInvariant().Contains("OUTSIDE AFTERNOON ENTERTAINMENT"))).ToList();

            if (outsideafternoonTraits.Count == 0 && !work && !school && modularHouseholdPerson.Person.Age > 10)
            {
                throw new DataIntegrityException(
                          "Not a single outside afternoon entertainment in the household " + modularHousehold.PrettyName +
                          " for " + modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
            if (school)
            {
                var homework = traitsForPerson.Any(x => x.HouseholdTrait.Name.ToLower(CultureInfo.InvariantCulture).Contains("homework"));
                if (!homework)
                {
                    throw new DataIntegrityException("No homework in the household " + modularHousehold.PrettyName
                                                     + " for the person " + modularHouseholdPerson.Person.PrettyName, modularHousehold);
                }
            }

            var outsideEveningTraits =
                traitsForPerson.Where(
                    x =>
                    x.HouseholdTrait.Tags.Any(
                        y => y.Name.ToUpperInvariant().Contains("OUTSIDE EVENING ENTERTAINMENT"))).ToList();

            if (outsideEveningTraits.Count == 0 && modularHouseholdPerson.Person.Age > 15)
            {
                throw new DataIntegrityException(
                          "Not a single outside evening entertainment in the household " + modularHousehold.PrettyName +
                          " for " + modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }

            var hobby =
                traitsForPerson.Where(x => x.HouseholdTrait.Tags.Any(y => y.Name.ToUpperInvariant().Contains("HOBBY")))
                .ToList();

            if (hobby.Count == 0 && modularHouseholdPerson.Person.Age > 15)
            {
                throw new DataIntegrityException(
                          "Not a single hobby in the household " + modularHousehold.PrettyName + " for " +
                          modularHouseholdPerson.Person.PrettyName, modularHousehold);
            }
        }