Mercurial > pub > bltoolkit
comparison UnitTests/Fluent/MockDataBase/MockCommand.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System.Collections; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Data; | |
| 4 using System.Linq; | |
| 5 using System.Text.RegularExpressions; | |
| 6 | |
| 7 namespace BLToolkit.Fluent.Test.MockDataBase | |
| 8 { | |
| 9 public partial class MockDb | |
| 10 { | |
| 11 /// <summary> | |
| 12 /// IDbCommand | |
| 13 /// </summary> | |
| 14 private partial class MockCommand : IDbCommand | |
| 15 { | |
| 16 private readonly MockDb _db; | |
| 17 private readonly Regex _findTableRx = new Regex(MockSqlProvider.TableMarker + @"(\w+)"); | |
| 18 private readonly Regex _findFieldRx = new Regex(MockSqlProvider.FieldMarker + @"(\w+)"); | |
| 19 | |
| 20 public MockCommand(MockDb db) | |
| 21 { | |
| 22 _db = db; | |
| 23 Parameters = new DataParameterCollection(); | |
| 24 } | |
| 25 | |
| 26 public void Dispose() | |
| 27 { | |
| 28 } | |
| 29 | |
| 30 public void Prepare() | |
| 31 { | |
| 32 } | |
| 33 | |
| 34 public void Cancel() | |
| 35 { | |
| 36 } | |
| 37 | |
| 38 public IDbDataParameter CreateParameter() | |
| 39 { | |
| 40 return new MockDbDataParameter(); | |
| 41 } | |
| 42 | |
| 43 public int ExecuteNonQuery() | |
| 44 { | |
| 45 return MockCommandData().NonQueryResult; | |
| 46 } | |
| 47 | |
| 48 public IDataReader ExecuteReader() | |
| 49 { | |
| 50 return new MockReader(MockCommandData(false)); | |
| 51 } | |
| 52 | |
| 53 public IDataReader ExecuteReader(CommandBehavior behavior) | |
| 54 { | |
| 55 return ExecuteReader(); | |
| 56 } | |
| 57 | |
| 58 public object ExecuteScalar() | |
| 59 { | |
| 60 return MockCommandData().ScalarResult; | |
| 61 } | |
| 62 | |
| 63 public IDbConnection Connection { get; set; } | |
| 64 | |
| 65 public IDbTransaction Transaction { get; set; } | |
| 66 | |
| 67 public string CommandText { get; set; } | |
| 68 | |
| 69 public int CommandTimeout { get; set; } | |
| 70 | |
| 71 public CommandType CommandType { get; set; } | |
| 72 | |
| 73 public IDataParameterCollection Parameters { get; private set; } | |
| 74 | |
| 75 public UpdateRowSource UpdatedRowSource { get; set; } | |
| 76 | |
| 77 private MockCommandData MockCommandData(bool isUsing = true) | |
| 78 { | |
| 79 Dictionary<string, int> fields; | |
| 80 List<string> tables; | |
| 81 FindFields(CommandText, out fields); | |
| 82 FindTables(CommandText, out tables); | |
| 83 CommandText = ClearMockMarkers(CommandText); | |
| 84 | |
| 85 var cmd = _db.NextCommand(); | |
| 86 cmd.CommandText = CommandText; | |
| 87 cmd.Parameters = Parameters.Cast<MockDbDataParameter>().ToList(); | |
| 88 cmd.Fields = fields; | |
| 89 cmd.Tables = tables; | |
| 90 cmd.IsUsing = isUsing; | |
| 91 return cmd; | |
| 92 } | |
| 93 | |
| 94 private string ClearMockMarkers(string commandText) | |
| 95 { | |
| 96 return commandText | |
| 97 .Replace(MockSqlProvider.FieldMarker, "") | |
| 98 .Replace(MockSqlProvider.TableMarker, ""); | |
| 99 } | |
| 100 | |
| 101 private void FindTables(string commandText, out List<string> tables) | |
| 102 { | |
| 103 tables = (from Match match in _findTableRx.Matches(commandText) select match.Groups[1].Value) | |
| 104 .Distinct().ToList(); | |
| 105 } | |
| 106 | |
| 107 private void FindFields(string commandText, out Dictionary<string, int> fields) | |
| 108 { | |
| 109 fields = (from Match match in _findFieldRx.Matches(commandText) select match.Groups[1].Value) | |
| 110 .GroupBy(s => s, (s, ss) => new { Key = s, Value = ss.Count() }) | |
| 111 .ToDictionary(kv => kv.Key, kv => kv.Value); | |
| 112 } | |
| 113 | |
| 114 private class DataParameterCollection : List<MockDbDataParameter>, IDataParameterCollection | |
| 115 { | |
| 116 public bool Contains(string parameterName) | |
| 117 { | |
| 118 return this.Any(p => p.ParameterName == parameterName); | |
| 119 } | |
| 120 | |
| 121 public int IndexOf(string parameterName) | |
| 122 { | |
| 123 for (int i = 0; i < Count; i++) | |
| 124 { | |
| 125 if (this[i].ParameterName == parameterName) | |
| 126 { | |
| 127 return i; | |
| 128 } | |
| 129 } | |
| 130 return -1; | |
| 131 } | |
| 132 | |
| 133 public void RemoveAt(string parameterName) | |
| 134 { | |
| 135 var data = this.FirstOrDefault(p => p.ParameterName == parameterName); | |
| 136 if (null != data) | |
| 137 { | |
| 138 Remove(data); | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 public object this[string parameterName] | |
| 143 { | |
| 144 get | |
| 145 { | |
| 146 var data = this.FirstOrDefault(p => p.ParameterName == parameterName); | |
| 147 return null == data ? null : data.Value; | |
| 148 } | |
| 149 set | |
| 150 { | |
| 151 var data = this.FirstOrDefault(p => p.ParameterName == parameterName); | |
| 152 if (null == data) | |
| 153 { | |
| 154 Add(new MockDbDataParameter { ParameterName = parameterName, Value = value }); | |
| 155 } | |
| 156 else | |
| 157 { | |
| 158 data.Value = value; | |
| 159 } | |
| 160 } | |
| 161 } | |
| 162 } | |
| 163 } | |
| 164 } | |
| 165 } |
