public void TemplateIsCorrect()
        {
            Action dummy = delegate { };
            var    sut   = new TemplateMethodQuery(dummy.GetMethodInfo());

            Assert.Equal(dummy.GetMethodInfo(), sut.Template);
        }
        public void SelectMethodsWithNullThrows()
        {
            Action dummy = delegate { };
            var    sut   = new TemplateMethodQuery(dummy.GetMethodInfo());

            Assert.Throws <ArgumentNullException>(() => sut.SelectMethods(null));
        }
        public void SutIsIMethodQuery()
        {
            Action dummy = delegate { };
            var    sut   = new TemplateMethodQuery(dummy.GetMethodInfo());

            Assert.IsAssignableFrom <IMethodQuery>(sut);
        }
        public void OwnerIsCorrect()
        {
            Action dummy = delegate { };
            var    owner = new object();

            var sut = new TemplateMethodQuery(dummy.GetMethodInfo(), owner);

            Assert.Equal(owner, sut.Owner);
        }
        public void SelectMethodsReturnsCorrectResultWhenInitializedWithNullOwner(Type templateType, string methodName, Type targetType, object[] arguments, object[] expected)
        {
            var templateMethod = templateType.GetMethod(methodName);
            var sut            = new TemplateMethodQuery(templateMethod);

            var results = sut.SelectMethods(targetType)
                          .Select(m => m.Invoke(arguments))
                          .ToArray();

            Assert.Equal(expected, results);
        }
        public void SelectMethodsReturnsCorrectResult(Type templateType, string methodName, Type targetType, object[] arguments, object[] expected)
        {
            var templateMethod = templateType.GetMethod(methodName);
            var owner          = Activator.CreateInstance(targetType);
            var sut            = new TemplateMethodQuery(templateMethod, owner);

            var results = sut.SelectMethods(targetType)
                          .Select(m => m.Invoke(arguments))
                          .ToArray();

            Assert.Equal(expected, results);
        }
        public void SelectMethodsDoesNotReturnIncorrectResult()
        {
            var templateMethod = typeof(TypeWithTemplateMethods).GetMethod("MethodWithFunc");
            var sut            = new TemplateMethodQuery(templateMethod);

            var results = sut.SelectMethods(typeof(TypeWithMethods))
                          .Select(m => m.Invoke(new[] { new Func <string>(() => string.Empty) }));

            var result = Assert.Single(results);

            Assert.True((bool)result);
        }
        public void SelectMethodsReturnsInCorrectOrderWhenInitializedWithNullOwner(Type templateType, Type targetType, string methodName, object[] arguments)
        {
            var templateMethod = templateType.GetMethod(methodName);
            var owner          = Activator.CreateInstance(targetType);
            var sut            = new TemplateMethodQuery(templateMethod, owner);

            var results = sut.SelectMethods(targetType)
                          .Select(m => m.Invoke(arguments))
                          .ToArray();

            var expected = Enumerable.Range(0, results.Count()).Cast <object>().ToArray();

            Assert.Equal(expected, results);
        }