diff --git a/Musoq.Evaluator.Tests/GenericTests.cs b/Musoq.Evaluator.Tests/GenericTests.cs index c0386ae9..c15f3ae9 100644 --- a/Musoq.Evaluator.Tests/GenericTests.cs +++ b/Musoq.Evaluator.Tests/GenericTests.cs @@ -151,4 +151,22 @@ public void WhenSkipAndTakeWithoutReductionRequired_ShouldPass() Assert.AreEqual(1, table.Count); Assert.AreEqual("e", Encoding.UTF8.GetString((byte[])table[0].Values[0])); } + + [TestMethod] + public void WhenInferredValueIsNull_ShouldUseDefaultValue() + { + var table = TestResultMethodTemplate("GetCountryOrDefault('test')"); + + Assert.AreEqual(1, table.Count); + Assert.AreEqual("test", table[0].Values[0]); + } + + [TestMethod] + public void WhenResolvedMethodIsGenericWithInjectSpecificSourceAttribute_ShouldConcretizeItAccordingly() + { + var table = TestResultMethodTemplate("GetCountryOrDefaultGeneric('test')"); + + Assert.AreEqual(1, table.Count); + Assert.AreEqual("test", table[0].Values[0]); + } } \ No newline at end of file diff --git a/Musoq.Evaluator.Tests/Schema/Basic/BasicEntityTestBase.cs b/Musoq.Evaluator.Tests/Schema/Basic/BasicEntityTestBase.cs index 1dade1ca..3d21ee58 100644 --- a/Musoq.Evaluator.Tests/Schema/Basic/BasicEntityTestBase.cs +++ b/Musoq.Evaluator.Tests/Schema/Basic/BasicEntityTestBase.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Dynamic; using System.Linq; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -8,8 +7,6 @@ using Musoq.Converter; using Musoq.Converter.Build; using Musoq.Evaluator.Tables; -using Musoq.Evaluator.Tests.Schema.Dynamic; -using Musoq.Evaluator.Tests.Schema.Unknown; using Musoq.Plugins; using Musoq.Schema; using Musoq.Tests.Common; diff --git a/Musoq.Evaluator.Tests/Schema/Basic/Library.cs b/Musoq.Evaluator.Tests/Schema/Basic/Library.cs index 37ebcf17..35416184 100644 --- a/Musoq.Evaluator.Tests/Schema/Basic/Library.cs +++ b/Musoq.Evaluator.Tests/Schema/Basic/Library.cs @@ -109,6 +109,18 @@ public decimal GetPopulation([InjectSpecificSource(typeof(BasicEntity))] BasicEn { return entity.Population; } + + [BindableMethod] + public string GetCountryOrDefault([InjectSpecificSource(typeof(BasicEntity))] BasicEntity entity, string @default) + { + return entity.Country ?? @default; + } + + [BindableMethod] + public string GetCountryOrDefaultGeneric([InjectSpecificSource(typeof(BasicEntity))] BasicEntity entity, TColumn @default) + { + return entity.Country ?? @default.ToString(); + } [BindableMethod] public string ThrowException() diff --git a/Musoq.Evaluator/Visitors/BuildMetadataAndInferTypeVisitor.cs b/Musoq.Evaluator/Visitors/BuildMetadataAndInferTypeVisitor.cs index b9b78c8f..422759f9 100644 --- a/Musoq.Evaluator/Visitors/BuildMetadataAndInferTypeVisitor.cs +++ b/Musoq.Evaluator/Visitors/BuildMetadataAndInferTypeVisitor.cs @@ -1687,10 +1687,17 @@ private static bool TryConstructGenericMethod(MethodInfo methodInfo, ArgsListNod foreach (var genericArgument in genericArguments) { - for (var i = 0; i < parameters.Length; i++) + var i = 0; + var shiftArgsWhenInjectSpecificSourcePresent = 0; + if (parameters[0].GetCustomAttribute() != null) + { + i = 1; + shiftArgsWhenInjectSpecificSourcePresent = 1; + } + for (; i < parameters.Length; i++) { var parameter = parameters[i]; - var returnType = args.Args.Where((arg, index) => index == i).Single().ReturnType; + var returnType = args.Args.Where((_, index) => index == i - shiftArgsWhenInjectSpecificSourcePresent).Single().ReturnType; var elementType = returnType.GetElementType(); if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == parameter.ParameterType.GetGenericTypeDefinition())