チェンジセット 1645 (default)
- 日時:
- 2024/05/24 19:10:48 (4ヵ月前)
- 場所:
- framework/trunk
- ファイル:
-
- 5個の追加
- 6個の更新
凡例:
- 未変更
- 追加
- 削除
-
framework/trunk/CoreLibrary/Sources/Data/DbDataOperator.cs
r1644 r1645 2670 2670 } 2671 2671 2672 /// MEMO: このメソッドは DbDataComparer.TableQuery.ResolveVariable と同じ実装 2672 2673 /// <summary> 2673 2674 /// 文字列中の変数を解決して返します。 … … 2678 2679 /// 変数を解決した文字列。 2679 2680 /// </returns> 2680 private static objectResolveVariable(string value, IDictionary<string, object> variables)2681 private static string ResolveVariable(string value, IDictionary<string, object> variables) 2681 2682 { 2682 2683 // 変数が未設定の場合や、変数の文字数に足りていない場合 -
framework/trunk/CoreTest/CoreTest.csproj
r1644 r1645 376 376 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\34-VariableOnlyString-2.txt" /> 377 377 </ItemGroup> 378 <ItemGroup> 379 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\01-Append-0-QuoteString.txt" /> 380 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\01-Append-0-Regex.txt" /> 381 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\01-Append-0-Variable.txt" /> 382 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\01-Append-0-VariableInQuoteString.txt" /> 383 <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\34-VariableOnlyString-0-NoVariable.txt" /> 384 </ItemGroup> 378 385 <Import Project="$(MSBuildThisFileDirectory)..\MSBuild.Common.targets" /> 379 386 </Project> -
framework/trunk/CoreTest/Sources/Data/DbDataOperatorImportTest.cs
r1644 r1645 166 166 }); 167 167 } 168 169 /// <summary> 170 /// インポートを実行し比較します。 171 /// </summary> 172 /// <param name="importFileName">ファイル名。</param> 173 /// <param name="useVariables"> 174 /// 埋め込みに使用する変数を使用する場合は <see langword="true"/>。 175 /// それ以外の場合は <see langword="false"/>。 176 /// </param> 177 /// <param name="expedtedDataFile">結果のデータ。</param> 178 [Test] 179 [TestCase(@"01-Append.txt", false, @"01-Append-0.txt")] 180 [TestCase(@"01-Append.txt", false, @"01-Append-0-QuoteString.txt")] 181 [TestCase(@"01-Append.txt", false, @"01-Append-0-Regex.txt")] 182 [TestCase(@"01-Append.txt", true, @"01-Append-0-Variable.txt")] 183 [TestCase(@"01-Append.txt", true, @"01-Append-0-VariableInQuoteString.txt")] 184 [TestCase(@"34-VariableOnlyString.txt", false, @"34-VariableOnlyString-0-NoVariable.txt")] 185 public void TestCompare(string importFileName, bool useVariables, string expedtedDataFile) 186 { 187 string path = UnitTestUtility.NormalizeDataPath(Path.Combine("Import", importFileName)); 188 189 Execute( 190 delegate(ICommonDbTransaction transaction) 191 { 192 IDictionary<string, object> variables = null; 193 if (useVariables) 194 { 195 variables = new Dictionary<string, object>() 196 { 197 { "I_111", 111 }, 198 { "I_2", 2 }, 199 { "S_ABC", "ABC" }, 200 { "S_Y", "Y" }, 201 }; 202 } 203 204 int actualAffectedRows; 205 using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) 206 { 207 actualAffectedRows = DbDataOperator.Import(transaction, fileStream); 208 } 209 210 Assert.That( 211 transaction, 212 Stores.SameAs(GetType().Assembly, ResourceNamePrefix + expedtedDataFile, variables), 213 "CompareTest"); 214 215 Assert.That( 216 actualAffectedRows, 217 Is.EqualTo(2), 218 "AffectedRows"); 219 }); 220 } 168 221 } 169 222 } -
framework/trunk/TestLibrary/Sources/DbDataComparer.cs
r1236 r1645 10 10 // you may not use this file except in compliance with the License. You 11 11 // may obtain a copy of the License at 12 // 12 // 13 13 // http://www.apache.org/licenses/LICENSE-2.0 14 // 14 // 15 15 // Unless required by applicable law or agreed to in writing, software 16 16 // distributed under the License is distributed on an "AS IS" BASIS, … … 23 23 { 24 24 using System; 25 using System.Collections.Generic; 25 26 using System.ComponentModel; 26 27 using System.Globalization; … … 45 46 /// <param name="transaction">データを読み込むトランザクション。</param> 46 47 /// <param name="stream">定義を読み込むストリーム。</param> 48 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 47 49 /// <param name="notify">比較して正しくない場合に呼び出されるコールバック。</param> 48 50 /// <returns> … … 53 55 /// データ定義の文字列からデータベースの型に変換できません。 54 56 /// </exception> 55 public static bool Compare(ICommonDbTransaction transaction, Stream stream, DbDataComparerNotify notify) 57 /// <exception cref="IOException"> 58 /// I/O エラーが発生しました。 59 /// </exception> 60 /// <exception cref="DbException"> 61 /// データを取得中に例外が発生しました。 62 /// </exception> 63 public static bool Compare( 64 ICommonDbTransaction transaction, 65 Stream stream, 66 IDictionary<string, object> variables, 67 DbDataComparerNotify notify) 56 68 { 57 69 using (AutoDetectEncodingStreamReader reader … … 138 150 139 151 // データ行 140 if (!tableQuery.Compare(lineNumber, line, ref failure))152 if (!tableQuery.Compare(lineNumber, line, variables, ref failure)) 141 153 { 142 154 return false; … … 159 171 /// <param name="reader">データを読み込むデータリーダー。</param> 160 172 /// <param name="stream">定義を読み込むストリーム。</param> 173 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 161 174 /// <param name="notify">比較して正しくない場合に呼び出されるコールバック。</param> 162 175 /// <returns> … … 167 180 /// データ定義の文字列からデータベースの型に変換できません。 168 181 /// </exception> 169 public static bool Compare(ICommonDbDataReader reader, Stream stream, DbDataComparerNotify notify) 182 /// <exception cref="IOException"> 183 /// I/O エラーが発生しました。 184 /// </exception> 185 /// <exception cref="DbException"> 186 /// データを取得中に例外が発生しました。 187 /// </exception> 188 public static bool Compare( 189 ICommonDbDataReader reader, 190 Stream stream, 191 IDictionary<string, object> variables, 192 DbDataComparerNotify notify) 170 193 { 171 194 using (AutoDetectEncodingStreamReader streamReader … … 220 243 221 244 // データ行 222 if (!tableQuery.Compare(lineNumber, line, ref failure))245 if (!tableQuery.Compare(lineNumber, line, variables, ref failure)) 223 246 { 224 247 return false; … … 251 274 /// カラムのセパレータを表す文字の配列。 252 275 /// </summary> 253 private static readonly char[] ColumnSeparatorChars = new[] { ColumnSeparatorChar }; 276 private static readonly char[] ColumnSeparatorChars = { ColumnSeparatorChar }; 277 278 /// <summary> 279 /// 変数を表す正規表現。 280 /// </summary> 281 private static readonly Regex VariableRegex 282 = new Regex( 283 @"\${(?<name>[^${:}]+)}", 284 RegexOptions.ExplicitCapture); 254 285 255 286 /// <summary> … … 501 532 /// <param name="lineNumber">定義ファイルの行番号。</param> 502 533 /// <param name="line">定義ファイルのデータ行。</param> 534 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 503 535 /// <param name="failure">失敗しているかどうか。</param> 504 536 /// <returns> … … 506 538 /// それ以外の場合は <see langword="false"/>。 507 539 /// </returns> 508 internal bool Compare(int lineNumber, string line, ref bool failure)540 internal bool Compare(int lineNumber, string line, IDictionary<string, object> variables, ref bool failure) 509 541 { 510 542 rowNumber++; … … 533 565 object actual = fieldValues[fieldMap[fieldIndex]]; 534 566 object expected; 535 if (!Compare(actual, out expected, columnIndex < lineColumns.Length ? lineColumns[columnIndex] : null, fieldTypeConverters[fieldIndex] ))567 if (!Compare(actual, out expected, columnIndex < lineColumns.Length ? lineColumns[columnIndex] : null, fieldTypeConverters[fieldIndex], variables)) 536 568 { 537 569 failure = true; … … 590 622 /// <param name="column">指定されている値。</param> 591 623 /// <param name="typeConverter">タイプコンバータ。</param> 624 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 592 625 /// <returns> 593 626 /// 同じであれば <see langword="true"/>。 594 627 /// それ以外の場合は <see langword="false"/>。 595 628 /// </returns> 596 private static bool Compare(object actual, out object expected, string column, TypeConverter typeConverter )629 private static bool Compare(object actual, out object expected, string column, TypeConverter typeConverter, IDictionary<string, object> variables) 597 630 { 598 631 // カラムが空か、範囲外の場合 … … 623 656 int delteLength = column[column.Length - 1] == '/' ? 2 : 3; 624 657 625 // FIXME /../ で囲まれた正規表現をパースする機能を TextUtility に作る (//i 等も対応する) 658 // FIXME /../ で囲まれた正規表現をパースする機能を TextUtility に作る (//i 等も対応する) 626 659 return Regex.IsMatch( 627 660 actual != null && actual != DBNull.Value … … 637 670 break; 638 671 } 672 673 column = ResolveVariable(column, variables); 639 674 } 640 675 … … 643 678 644 679 return actual.Equals(expected); 680 } 681 682 /// MEMO: このメソッドは DbDataOperator.InsertCommand.ResolveVariable と同じ実装 683 /// <summary> 684 /// 文字列中の変数を解決して返します。 685 /// </summary> 686 /// <param name="value">文字列。</param> 687 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 688 /// <returns> 689 /// 変数を解決した文字列。 690 /// </returns> 691 private static string ResolveVariable(string value, IDictionary<string, object> variables) 692 { 693 // 変数が未設定の場合や、変数の文字数に足りていない場合 694 if (variables == null || value.Length < 4) 695 { 696 return value; 697 } 698 699 return VariableRegex.Replace( 700 value, 701 delegate(Match match) 702 { 703 object variableValue; 704 return variables.TryGetValue(match.Groups["name"].Value, out variableValue) 705 ? (variableValue != null ? variableValue.ToString() : string.Empty) 706 : match.Value; 707 }); 645 708 } 646 709 … … 736 799 } 737 800 738 builder.Append(fieldNamesBuilder .ToString());801 builder.Append(fieldNamesBuilder); 739 802 builder.Append(" FROM "); 740 803 builder.Append(utility.EscapeTableName(tableName, null)); -
framework/trunk/TestLibrary/Sources/SameDataStoresConstraint.cs
r1275 r1645 23 23 { 24 24 using System; 25 using System.Collections.Generic; 25 26 using System.Data; 26 27 using System.Diagnostics; … … 54 55 55 56 /// <summary> 57 /// 変数名をキーとして埋め込む値を値としたディクショナリ。 58 /// </summary> 59 [DebuggerBrowsable(DebuggerBrowsableState.Never)] 60 private readonly IDictionary<string, object> variables; 61 62 /// <summary> 56 63 /// ファイルパス。 57 64 /// </summary> … … 66 73 /// <param name="resourceName">リソース名。</param> 67 74 public SameDataStoresConstraint(Assembly assembly, string resourceName) 75 : this(assembly, resourceName, null) 76 { 77 // AVOID 78 } 79 80 /// <summary> 81 /// アセンブリリソースから制約を作成します。 82 /// </summary> 83 /// <param name="assembly">アセンブリ。</param> 84 /// <param name="resourceName">リソース名。</param> 85 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 86 public SameDataStoresConstraint( 87 Assembly assembly, 88 string resourceName, 89 IDictionary<string, object> variables) 68 90 { 69 91 this.assembly = assembly; 70 92 this.resourceName = resourceName; 93 this.variables = variables; 71 94 } 72 95 … … 125 148 } 126 149 } 150 151 /// <summary> 152 /// 変数名をキーとして埋め込む値を値としたディクショナリを取得します。 153 /// </summary> 154 /// <value> 155 /// 変数名をキーとして埋め込む値を値としたディクショナリ。 156 /// 変数が指定されていない場合は <see langword="null"/>。 157 /// </value> 158 public IDictionary<string, object> Variables 159 { 160 get 161 { 162 return variables; 163 } 164 } 165 127 166 128 167 /// <summary> … … 148 187 /// <exception cref="TypeDeclarationException"> 149 188 /// データ定義の文字列からデータベースの型に変換できません。 189 /// </exception> 190 /// <exception cref="DbException"> 191 /// データを取得中に例外が発生しました。 150 192 /// </exception> 151 193 public override ConstraintResult ApplyTo<TActual>(TActual actual) … … 200 242 { 201 243 // トランザクションが指定された場合 202 DbDataComparer.Compare(transaction, stream, notify);244 DbDataComparer.Compare(transaction, stream, variables, notify); 203 245 } 204 246 else if (connection != null) … … 208 250 = connection.BeginTransaction(IsolationLevel.ReadCommitted)) 209 251 { 210 DbDataComparer.Compare(createdTransaction, stream, notify);252 DbDataComparer.Compare(createdTransaction, stream, variables, notify); 211 253 } 212 254 } … … 214 256 { 215 257 // データリーダが指定された場合 216 DbDataComparer.Compare(reader, stream, notify);258 DbDataComparer.Compare(reader, stream, variables, notify); 217 259 } 218 260 else … … 222 264 { 223 265 // コマンドを実行 224 DbDataComparer.Compare(createdReader, stream, notify);266 DbDataComparer.Compare(createdReader, stream, variables, notify); 225 267 } 226 268 } -
framework/trunk/TestLibrary/Sources/Stores.cs
r893 r1645 10 10 // you may not use this file except in compliance with the License. You 11 11 // may obtain a copy of the License at 12 // 12 // 13 13 // http://www.apache.org/licenses/LICENSE-2.0 14 // 14 // 15 15 // Unless required by applicable law or agreed to in writing, software 16 16 // distributed under the License is distributed on an "AS IS" BASIS, … … 22 22 namespace FCSoft.SilverFrost.Framework.Test 23 23 { 24 using System.Collections.Generic; 24 25 using System.Reflection; 25 26 … … 43 44 return new SameDataStoresConstraint(assembly, resourceName); 44 45 } 46 47 /// <summary> 48 /// データストレージに、アセンブリリソースに指定されたデータと 49 /// 同様のデータが格納されているかの制約を返します。 50 /// </summary> 51 /// <param name="assembly">アセンブリ。</param> 52 /// <param name="resourceName">リソース名。</param> 53 /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 54 /// <returns> 55 /// 制約を表す <see cref="SameDataStoresConstraint"/>。 56 /// </returns> 57 public static SameDataStoresConstraint SameAs(Assembly assembly, string resourceName, IDictionary<string, object> variables) 58 { 59 return new SameDataStoresConstraint(assembly, resourceName, variables); 60 } 45 61 } 46 62 }
※ 詳しい使い方は
TracChangeset を参照してください。