/* * DynamORM - Dynamic Object-Relational Mapping library. * Copyright (c) 2012-2026, Grzegorz Russek (grzegorz.russek@gmail.com) * All rights reserved. */ using System.Data; using DynamORM.Helpers; using DynamORM.Tests.Helpers; using NUnit.Framework; namespace DynamORM.Tests.Procedure { [TestFixture] public class ProcedureParameterBinderTests : TestsBase { [SetUp] public void SetUp() { CreateTestDatabase(); CreateDynamicDatabase( DynamicDatabaseOptions.SingleConnection | DynamicDatabaseOptions.SingleTransaction | DynamicDatabaseOptions.SupportStoredProcedures | DynamicDatabaseOptions.SupportStoredProceduresResult | DynamicDatabaseOptions.SupportSchema); } [TearDown] public void TearDown() { DestroyDynamicDatabase(); DestroyTestDatabase(); } [Test] public void TestCanBindProcedureParameterObject() { Assert.IsTrue(DynamicProcedureParameterBinder.CanBind(new ProcedureParameterObject())); Assert.IsTrue(DynamicProcedureParameterBinder.CanBind(new ProcedureParameterColumnFallbackObject())); Assert.IsFalse(DynamicProcedureParameterBinder.CanBind("x")); Assert.IsFalse(DynamicProcedureParameterBinder.CanBind(5)); } [Test] public void TestBindUsesAttributeMetadataAndOrder() { using (IDbCommand cmd = new FakeDbCommand()) { var result = DynamicProcedureParameterBinder.Bind(Database, cmd, new ProcedureParameterObject { Code = "ABC", Description = "seed" }); Assert.IsTrue(result.ReturnValueAdded); Assert.NotNull(result.ReturnParameters); Assert.AreEqual(3, result.ReturnParameters.Count); Assert.AreEqual(4, cmd.Parameters.Count); var p0 = (IDbDataParameter)cmd.Parameters[0]; var p1 = (IDbDataParameter)cmd.Parameters[1]; var p2 = (IDbDataParameter)cmd.Parameters[2]; var p3 = (IDbDataParameter)cmd.Parameters[3]; Assert.AreEqual(Database.GetParameterName("status"), p0.ParameterName); Assert.AreEqual(ParameterDirection.ReturnValue, p0.Direction); Assert.AreEqual(DbType.Int32, p0.DbType); Assert.AreEqual(4, p0.Size); Assert.AreEqual(Database.GetParameterName("code"), p1.ParameterName); Assert.AreEqual(ParameterDirection.Input, p1.Direction); Assert.AreEqual(DbType.String, p1.DbType); Assert.AreEqual(32, p1.Size); Assert.AreEqual("ABC", p1.Value); Assert.AreEqual(Database.GetParameterName("result"), p2.ParameterName); Assert.AreEqual(ParameterDirection.Output, p2.Direction); Assert.AreEqual(DbType.Int32, p2.DbType); Assert.AreEqual(DBNull.Value, p2.Value); Assert.AreEqual(Database.GetParameterName("description"), p3.ParameterName); Assert.AreEqual(ParameterDirection.InputOutput, p3.Direction); Assert.AreEqual(DbType.String, p3.DbType); Assert.AreEqual(256, p3.Size); Assert.AreEqual("seed", p3.Value); Assert.AreEqual(0, result.ReturnParameters["status"]); Assert.AreEqual(2, result.ReturnParameters["result"]); Assert.AreEqual(3, result.ReturnParameters["description"]); } } [Test] public void TestBindFallsBackToColumnAttributeMetadata() { using (IDbCommand cmd = new FakeDbCommand()) { var result = DynamicProcedureParameterBinder.Bind(Database, cmd, new ProcedureParameterColumnFallbackObject { Code = "XYZ" }); Assert.IsFalse(result.ReturnValueAdded); Assert.IsNull(result.ReturnParameters); Assert.AreEqual(1, cmd.Parameters.Count); var p0 = (IDbDataParameter)cmd.Parameters[0]; Assert.AreEqual(Database.GetParameterName("code"), p0.ParameterName); Assert.AreEqual(ParameterDirection.Input, p0.Direction); Assert.AreEqual(DbType.String, p0.DbType); Assert.AreEqual(64, p0.Size); Assert.AreEqual("XYZ", p0.Value); } } } }