public void TestParseFilterModel()
        {
            queryString.Add("s_stringfilter", "StringValue");
            queryString.Add("s_intfilter", "10");
            queryString.Add("s_datefilter", "2010-09-08");
            queryString.Add("s_boolfilter", "true");
            queryString.Add("s_stringfilter2", "StringValue1,StringValue2,StringValue3");
            queryString.Add("s_intfilter2", "20,30,40");
            queryString.Add("s_rangeintfilter", "10,50");
            queryString.Add("s_rangedatefilter", "2009-08-07,2010-09-08");

            var selectFilterAttribute = new SelectFilterAttribute { FiltersModel = typeof(TestFilterModel) };
            selectFilterAttribute.OnActionExecuting(filterContext.Object);

            var model = controller.Object.ViewBag.FiltersModel as TestFilterModel;
            Assert.IsNotNull(model);

            Assert.IsTrue(model.StringFilter.Selected);
            Assert.AreEqual("StringValue", model.StringFilter.Value);

            Assert.IsTrue(model.IntFilter.Selected);
            Assert.AreEqual(10, model.IntFilter.Value);

            Assert.IsTrue(model.DateFilter.Selected);
            Assert.AreEqual(new DateTime(2010, 09, 08), model.DateFilter.Value);

            Assert.IsTrue(model.BoolFilter.Selected);
            Assert.AreEqual(true, model.BoolFilter.Value);

            Assert.IsTrue(model.EnumerableStringFilter.Selected);
            Assert.AreEqual(3, model.EnumerableStringFilter.Value.Count());
            Assert.AreEqual("StringValue1", model.EnumerableStringFilter.Value.ElementAt(0));
            Assert.AreEqual("StringValue2", model.EnumerableStringFilter.Value.ElementAt(1));
            Assert.AreEqual("StringValue3", model.EnumerableStringFilter.Value.ElementAt(2));

            Assert.IsTrue(model.EnumerableIntFilter.Selected);
            Assert.AreEqual(3, model.EnumerableIntFilter.Value.Count());
            Assert.AreEqual(20, model.EnumerableIntFilter.Value.ElementAt(0));
            Assert.AreEqual(30, model.EnumerableIntFilter.Value.ElementAt(1));
            Assert.AreEqual(40, model.EnumerableIntFilter.Value.ElementAt(2));

            Assert.IsTrue(model.RangeIntFilter.Selected);
            Assert.AreEqual(10, model.RangeIntFilter.Value.LowerBound);
            Assert.AreEqual(50, model.RangeIntFilter.Value.UpperBound);

            Assert.IsTrue(model.RangeDateFilter.Selected);
            Assert.AreEqual(new DateTime(2009, 08, 07), model.RangeDateFilter.Value.LowerBound);
            Assert.AreEqual(new DateTime(2010, 09, 08), model.RangeDateFilter.Value.UpperBound);
        }
        public void TestParseNotSelected()
        {
            queryString.Add("s_stringfilter", "abcd");
            queryString.Add("s_intfilter", "202");

            var selectFilterAttribute = new SelectFilterAttribute { FiltersModel = typeof(TestFilterModel) };
            selectFilterAttribute.OnActionExecuting(filterContext.Object);

            var model = controller.Object.ViewBag.FiltersModel as TestFilterModel;
            Assert.IsNotNull(model);

            Assert.AreEqual("I'm not selected", model.StringFilter.NotSelectedValue);

            Assert.AreEqual("101", model.IntFilter.NotSelectedValue);
        }
        public void TestParseNullableFilterModel()
        {
            var selectFilterAttribute = new SelectFilterAttribute { FiltersModel = typeof(TestFilterModel) };
            selectFilterAttribute.OnActionExecuting(filterContext.Object);

            var model = controller.Object.ViewBag.FiltersModel as TestFilterModel;
            Assert.IsNotNull(model);

            Assert.IsFalse(model.StringFilter.Selected);
            Assert.IsFalse(model.IntFilter.Selected);
            Assert.IsFalse(model.DateFilter.Selected);
            Assert.IsFalse(model.BoolFilter.Selected);
            Assert.IsFalse(model.EnumerableStringFilter.Selected);
            Assert.IsFalse(model.EnumerableIntFilter.Selected);
            Assert.IsFalse(model.RangeIntFilter.Selected);
            Assert.IsFalse(model.RangeDateFilter.Selected);
        }
        public void TestParseInvalidFormattedFilterModel()
        {
            queryString.Add("s_intfilter", "abcde");
            queryString.Add("s_datefilter", "abcde");
            queryString.Add("s_boolfilter", "abcde");

            var selectFilterAttribute = new SelectFilterAttribute { FiltersModel = typeof(TestFilterModel) };
            selectFilterAttribute.OnActionExecuting(filterContext.Object);

            var model = controller.Object.ViewBag.FiltersModel as TestFilterModel;
            Assert.IsNotNull(model);

            Assert.IsFalse(model.IntFilter.Selected);
            Assert.IsInstanceOfType(model.IntFilter.FormatException, typeof(FormatException));

            Assert.IsFalse(model.DateFilter.Selected);
            Assert.IsInstanceOfType(model.DateFilter.FormatException, typeof(FormatException));

            Assert.IsFalse(model.BoolFilter.Selected);
            Assert.IsInstanceOfType(model.BoolFilter.FormatException, typeof(FormatException));
        }