public void GivenDemographicForAnyAgeAndSpecificState_WhenCheckingIfTheDemographicAppliesToAMember_ThenReturnTrueOnlyIfMemberIsInThatState([ValueSource("AllStates")] State memberState, [ValueSource("AllStates")] State demographicState)
        {
            var member = new Member("Name", memberState, new DateTime(1970, 1, 1));
            var demographic = new Demographic(demographicState, null, null);

            var applies = demographic.Contains(member, DateTime.UtcNow);

            Assert.That(applies, Is.EqualTo(memberState == demographicState));
        }
        public void GivenDemographicForAllMembers_WhenCheckingIfTheDemographicAppliesToAMember_ThenReturnTrue()
        {
            var member = new Member("Name", State.Wa, new DateTime(1970, 1, 1));
            var demographic = Demographic.AllMembers;

            var applies = demographic.Contains(member, DateTime.UtcNow);

            Assert.That(applies, Is.True);
        }
        public void GivenDemographicWithStateAndAgeRange_WhenCheckingIfTheDemographicAppliesToAMember_ThenReturnTrueOnlyIfTheMemberConformsToAllParameters([Range(1, 25)] int age, [ValueSource("AllStates")] State state)
        {
            var now = DateTime.UtcNow;
            var member = new Member("Name", state, now.AddYears(-age));
            var demographic = new Demographic(State.Wa, 18, 19);

            var applies = demographic.Contains(member, now);

            Assert.That(applies, Is.EqualTo(state == State.Wa && (age == 18 || age == 19)));
        }
        public void GivenDemographicForAnyStateWithMinimumAge_WhenCheckingIfTheDemographicAppliesToAMember_ThenReturnTrueOnlyIfMemberIsThatAgeOrOlder([Range(1, 25)] int memberAge, [Range(1, 25)] int minimumAge)
        {
            var now = DateTime.UtcNow;
            var member = new Member("Name", State.Wa, now.AddYears(-(memberAge+1)).AddSeconds(1));
            var demographic = new Demographic(null, minimumAge, null);

            var applies = demographic.Contains(member, now);

            Assert.That(applies, Is.EqualTo(memberAge >= minimumAge));
        }
        public bool Contains(Member member, DateTime now)
        {
            var age = member.GetAge(now);

            if (MinimumAge != null && age < MinimumAge)
                return false;

            if (MaximumAge != null && age > MaximumAge)
                return false;

            if (State != null && member.State != State)
                return false;

            return true;
        }
        public void GivenProductsWithCurrentCampaignWithSomeThatApplyToTheMember_WhenQuerying_ThenReturnTheProductsThatApplyToTheMember()
        {
            var member = new Member("Name", State.Wa, _now.AddYears(-10).AddDays(-1));
            var products = Builder<Product>.CreateListOfSize(3)
                .TheFirst(1).WithConstructor(() => new Product("Product 1 (applies)"))
                    .And(p => p.CreateCampaign(_now, Demographic.AllMembers, _now.AddDays(-1), _now.AddDays(1)))
                .TheNext(1).WithConstructor(() => new Product("Product 2 (doesn't apply)"))
                    .And(p => p.CreateCampaign(_now, new Demographic(State.Act, null, null), _now.AddDays(-1), _now.AddDays(1)))
                .TheNext(1).WithConstructor(() => new Product("Product 3 (applies)"))
                    .And(p => p.CreateCampaign(_now, new Demographic(State.Wa, 9, 11), _now.AddDays(-1), _now.AddDays(1)))
                .Build();
            products.ToList().ForEach(p => Session.Save(p));

            var result = Execute(new GetProductsForMember(_now, member));

            Assert.That(result.Select(p => p.Name).ToArray(), Is.EqualTo(new[]{products[0].Name, products[2].Name}));
        }