public void Exclude_OnAlreadyFilter_Fail()
            {
                var harvester = new ProjectionHarvester();

                harvester.AddFilter <A>(x => null);
                harvester.Exclude <A>(x => x.X);
            }
            public void AddFilter_OnAlreadyInclude_Success()
            {
                var harvester = new ProjectionHarvester();

                harvester.AddFilter <A>(x => null);
                harvester.AddFilter <A>(x => null);
            }
            public void Include_OnAlreadyInclude_Fail()
            {
                var harvester = new ProjectionHarvester();

                harvester.Exclude <A>(x => x.X);
                harvester.Include <A>(x => x.X);
            }
            public void AddExclude_FieldOnDifferentType_Fail()
            {
                var harvester = new ProjectionHarvester();
                var ex        = Assert.Throws <ArgumentException>(() => harvester.Exclude <A>(x => x.X.Year));

                Assert.AreEqual("Field 'Year' is declared on type 'DateTime' not on argument: 'A'", ex.Message);
            }
            public void AddFilter_WorksForTypesAndSubtypes()
            {
                var selective = new ProjectionHarvester();

                selective.AddFilter <A>(x => x.Where(y => y.SanitizedName != "X" && y.SanitizedName != "Y"));

                Asserts(selective);
            }
            public void Fields_params_WorksForTypesAndSubtypes()
            {
                var harvester = new ProjectionHarvester();

                harvester.Exclude <A>(x => x.X, x => x.Y);

                Asserts(harvester);
            }
            public void Include_OnAlreadyInclude_Fail()
            {
                var harvester = new ProjectionHarvester();

                harvester.Exclude <A>(x => x.X);
                var ex = Assert.Throws <ArgumentException>(() => harvester.Include <A>(x => x.X));

                Assert.AreEqual("Type A has already been configured as an excluder.", ex.Message);
            }
            public void WrongSpec_Fail()
            {
                var harvester = new ProjectionHarvester();
                var ex        = Assert.Throws <ArgumentException>(() => harvester.Exclude <A>(x => Math.Min(3, 3)));

                Assert.AreEqual("Field specification must refer to a field", ex.Message);

                ex = Assert.Throws <ArgumentException>(() => harvester.Exclude <A>(x => 1));
                Assert.AreEqual("Field specification must refer to a field", ex.Message);
            }
        static void Asserts(ProjectionHarvester harvester)
        {
            IFieldHarvester fh = (IFieldHarvester)harvester;

            Assert.IsTrue(fh.CanHandleType(typeof(A)));
            var fields = fh.GetFields(typeof(A)).Select(x => x.SanitizedName);

            CollectionAssert.AreEquivalent(new[] { "Name" }, fields);

            Assert.IsTrue(fh.CanHandleType(typeof(B)));
            fields = fh.GetFields(typeof(B)).Select(x => x.SanitizedName);
            CollectionAssert.AreEquivalent(new[] { "Name", "Age" }, fields);

            Assert.IsFalse(fh.CanHandleType(typeof(C)));
        }
            public void Include_Fieldsarr_WorksForTypesAndSubtypes()
            {
                var harvester = new ProjectionHarvester();

                harvester.Include <B>(x => x.Name, x => x.Age);

                IFieldHarvester fh = (IFieldHarvester)harvester;

                Assert.IsFalse(fh.CanHandleType(typeof(A)));
                Assert.IsTrue(fh.CanHandleType(typeof(B)));
                var fields = fh.GetFields(typeof(B)).Select(x => x.SanitizedName);

                CollectionAssert.AreEquivalent(new[] { "Name", "Age" }, fields);

                Assert.IsFalse(fh.CanHandleType(typeof(C)));
            }
 public void Include_OnAlreadyInclude_Fail()
 {
     var harvester = new ProjectionHarvester();
     harvester.Exclude<A>(x => x.X);
     harvester.Include<A>(x => x.X);
 }
        static void Asserts(ProjectionHarvester harvester)
        {
            IFieldHarvester fh = (IFieldHarvester)harvester;
            Assert.IsTrue(fh.CanHandleType(typeof(A)));
            var fields = fh.GetFields(typeof(A)).Select(x => x.SanitizedName);
            CollectionAssert.AreEquivalent(new[] { "Name" }, fields);

            Assert.IsTrue(fh.CanHandleType(typeof(B)));
            fields = fh.GetFields(typeof(B)).Select(x => x.SanitizedName);
            CollectionAssert.AreEquivalent(new[] { "Name", "Age" }, fields);

            Assert.IsFalse(fh.CanHandleType(typeof(C)));
        }
            public void AddFilter_WorksForTypesAndSubtypes()
            {
                var selective = new ProjectionHarvester();
                selective.AddFilter<A>(x => x.Where(y => y.SanitizedName != "X" && y.SanitizedName != "Y"));

                Asserts(selective);
            }
 public void AddFilter_OnAlreadyInclude_Success()
 {
     var harvester = new ProjectionHarvester();
     harvester.AddFilter<A>(x => null);
     harvester.AddFilter<A>(x => null);
 }
 public void AddExclude_FieldOnDifferentType_Fail()
 {
     var harvester = new ProjectionHarvester();
     harvester.Exclude<A>(x => x.X.Year);
 }
            public void AddExclude_FieldOnDifferentType_Fail()
            {
                var harvester = new ProjectionHarvester();

                harvester.Exclude <A>(x => x.X.Year);
            }
 public void Exclude_OnAlreadyFilter_Fail()
 {
     var harvester = new ProjectionHarvester();
     harvester.AddFilter<A>(x => null);
     harvester.Exclude<A>(x => x.X);
 }
            public void Fields_WorksForTypesAndSubtypes()
            {
                var harvester = new ProjectionHarvester();
                harvester
                    .Exclude<A>(x => x.X)
                    .Exclude<A>(x => x.Y);

                Asserts(harvester);
            }
 /// <summary>
 /// Adds to the configuration a <see cref="ProjectionHarvester"/> and returns it.
 /// </summary>
 public ProjectionHarvester Projectionharvester()
 {
     return(projection ?? (projection = new ProjectionHarvester(this)));
 }
            public void WrongSpec_Fail()
            {
                var harvester = new ProjectionHarvester();
                var ex = Assert.Throws<ArgumentException>(() => harvester.Exclude<A>(x => Math.Min(3, 3)));
                Assert.AreEqual("Field specification must refer to a field", ex.Message);

                ex = Assert.Throws<ArgumentException>(() => harvester.Exclude<A>(x => 1));
                Assert.AreEqual("Field specification must refer to a field", ex.Message);
            }
            public void Include_Fieldsarr_WorksForTypesAndSubtypes()
            {
                var harvester = new ProjectionHarvester();
                harvester.Include<B>(x => x.Name, x => x.Age);

                IFieldHarvester fh = (IFieldHarvester)harvester;
                Assert.IsFalse(fh.CanHandleType(typeof(A)));
                Assert.IsTrue(fh.CanHandleType(typeof(B)));
                var fields = fh.GetFields(typeof(B)).Select(x => x.SanitizedName);
                CollectionAssert.AreEquivalent(new[] { "Name", "Age" }, fields);

                Assert.IsFalse(fh.CanHandleType(typeof(C)));
            }