Add typed procedure contract result handling

This commit is contained in:
2026-02-27 15:18:11 +01:00
parent 79cce3d1f4
commit c9a41adef3
8 changed files with 564 additions and 49 deletions

View File

@@ -113,5 +113,87 @@ namespace DynamORM.Tests.Procedure
Assert.AreEqual("XYZ", p0.Value);
}
}
[Test]
public void TestDeclaredResultTypeComesFromContractInterface()
{
Assert.AreEqual(typeof(ProcedureParameterResult), DynamicProcedureResultBinder.GetDeclaredResultType(new ProcedureParameterObject()));
Assert.AreEqual(typeof(ProcedureMultiResult), DynamicProcedureResultBinder.GetDeclaredResultType(new ProcedureMultiResultArgs()));
Assert.IsNull(DynamicProcedureResultBinder.GetDeclaredResultType(new object()));
}
[Test]
public void TestDeclaredResultPayloadBindingMapsMainAndOutValues()
{
var result = DynamicProcedureResultBinder.BindPayload(
typeof(ProcedureParameterResult),
"sp_Test",
15,
new System.Collections.Generic.Dictionary<string, object>
{
{ "result", 7 },
{ "description", "done" },
{ "status", 3 }
}) as ProcedureParameterResult;
Assert.NotNull(result);
Assert.AreEqual(15, result.MainResult);
Assert.AreEqual(7, result.Result);
Assert.AreEqual("done", result.Description);
Assert.AreEqual(3, result.Status);
}
[Test]
public void TestDeclaredResultReaderCanConsumeMultipleResultSets()
{
using (var reader = new FakeMultiResultDataReader(
Tuple.Create(
new[] { "Code" },
new[] { typeof(string) },
new[]
{
new object[] { "A" },
new object[] { "B" }
}),
Tuple.Create(
new[] { "State" },
new[] { typeof(int) },
new[]
{
new object[] { 10 },
new object[] { 20 }
})))
{
var result = DynamicProcedureResultBinder.ReadDeclaredResult(typeof(ProcedureMultiResult), reader) as ProcedureMultiResult;
Assert.NotNull(result);
CollectionAssert.AreEqual(new[] { "A", "B" }, result.Codes);
CollectionAssert.AreEqual(new[] { 10, 20 }, result.States);
}
}
[Test]
public void TestDeclaredResultPayloadCanAugmentReaderResult()
{
var existing = new ProcedureMultiResult();
existing.Codes.Add("A");
existing.States.Add(10);
var result = DynamicProcedureResultBinder.BindPayload(
typeof(ProcedureMultiResult),
"sp_Multi",
99,
new System.Collections.Generic.Dictionary<string, object>
{
{ "status", 5 }
},
existing) as ProcedureMultiResult;
Assert.AreSame(existing, result);
Assert.AreEqual(99, result.MainResult);
Assert.AreEqual(5, result.Status);
CollectionAssert.AreEqual(new[] { "A" }, result.Codes);
CollectionAssert.AreEqual(new[] { 10 }, result.States);
}
}
}