Mercurial > pub > bltoolkit
diff UnitTests/Fluent/MockDataBase/MockCommand.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UnitTests/Fluent/MockDataBase/MockCommand.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,165 @@ +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text.RegularExpressions; + +namespace BLToolkit.Fluent.Test.MockDataBase +{ + public partial class MockDb + { + /// <summary> + /// IDbCommand + /// </summary> + private partial class MockCommand : IDbCommand + { + private readonly MockDb _db; + private readonly Regex _findTableRx = new Regex(MockSqlProvider.TableMarker + @"(\w+)"); + private readonly Regex _findFieldRx = new Regex(MockSqlProvider.FieldMarker + @"(\w+)"); + + public MockCommand(MockDb db) + { + _db = db; + Parameters = new DataParameterCollection(); + } + + public void Dispose() + { + } + + public void Prepare() + { + } + + public void Cancel() + { + } + + public IDbDataParameter CreateParameter() + { + return new MockDbDataParameter(); + } + + public int ExecuteNonQuery() + { + return MockCommandData().NonQueryResult; + } + + public IDataReader ExecuteReader() + { + return new MockReader(MockCommandData(false)); + } + + public IDataReader ExecuteReader(CommandBehavior behavior) + { + return ExecuteReader(); + } + + public object ExecuteScalar() + { + return MockCommandData().ScalarResult; + } + + public IDbConnection Connection { get; set; } + + public IDbTransaction Transaction { get; set; } + + public string CommandText { get; set; } + + public int CommandTimeout { get; set; } + + public CommandType CommandType { get; set; } + + public IDataParameterCollection Parameters { get; private set; } + + public UpdateRowSource UpdatedRowSource { get; set; } + + private MockCommandData MockCommandData(bool isUsing = true) + { + Dictionary<string, int> fields; + List<string> tables; + FindFields(CommandText, out fields); + FindTables(CommandText, out tables); + CommandText = ClearMockMarkers(CommandText); + + var cmd = _db.NextCommand(); + cmd.CommandText = CommandText; + cmd.Parameters = Parameters.Cast<MockDbDataParameter>().ToList(); + cmd.Fields = fields; + cmd.Tables = tables; + cmd.IsUsing = isUsing; + return cmd; + } + + private string ClearMockMarkers(string commandText) + { + return commandText + .Replace(MockSqlProvider.FieldMarker, "") + .Replace(MockSqlProvider.TableMarker, ""); + } + + private void FindTables(string commandText, out List<string> tables) + { + tables = (from Match match in _findTableRx.Matches(commandText) select match.Groups[1].Value) + .Distinct().ToList(); + } + + private void FindFields(string commandText, out Dictionary<string, int> fields) + { + fields = (from Match match in _findFieldRx.Matches(commandText) select match.Groups[1].Value) + .GroupBy(s => s, (s, ss) => new { Key = s, Value = ss.Count() }) + .ToDictionary(kv => kv.Key, kv => kv.Value); + } + + private class DataParameterCollection : List<MockDbDataParameter>, IDataParameterCollection + { + public bool Contains(string parameterName) + { + return this.Any(p => p.ParameterName == parameterName); + } + + public int IndexOf(string parameterName) + { + for (int i = 0; i < Count; i++) + { + if (this[i].ParameterName == parameterName) + { + return i; + } + } + return -1; + } + + public void RemoveAt(string parameterName) + { + var data = this.FirstOrDefault(p => p.ParameterName == parameterName); + if (null != data) + { + Remove(data); + } + } + + public object this[string parameterName] + { + get + { + var data = this.FirstOrDefault(p => p.ParameterName == parameterName); + return null == data ? null : data.Value; + } + set + { + var data = this.FirstOrDefault(p => p.ParameterName == parameterName); + if (null == data) + { + Add(new MockDbDataParameter { ParameterName = parameterName, Value = value }); + } + else + { + data.Value = value; + } + } + } + } + } + } +} \ No newline at end of file