チェンジセット 1645 (default)


以下の違いを無視:
日時:
2024/05/24 19:10:48 (4ヵ月前)
更新者:
hizuya@…
ログメッセージ:
  • Stores.SameAs (SameDataStoresConstraint) で (単純な) 変数を使用出来るようにした。
場所:
framework/trunk
ファイル:
5個の追加
6個の更新

凡例:

未変更
追加
削除
  • framework/trunk/CoreLibrary/Sources/Data/DbDataOperator.cs

    r1644 r1645  
    26702670            } 
    26712671 
     2672            /// MEMO: このメソッドは DbDataComparer.TableQuery.ResolveVariable と同じ実装 
    26722673            /// <summary> 
    26732674            /// 文字列中の変数を解決して返します。 
     
    26782679            /// 変数を解決した文字列。 
    26792680            /// </returns> 
    2680             private static object ResolveVariable(string value, IDictionary<string, object> variables) 
     2681            private static string ResolveVariable(string value, IDictionary<string, object> variables) 
    26812682            { 
    26822683                // 変数が未設定の場合や、変数の文字数に足りていない場合 
  • framework/trunk/CoreTest/CoreTest.csproj

    r1644 r1645  
    376376    <EmbeddedResource Include="TestResources\Data\DbDataOperatorImportTest\34-VariableOnlyString-2.txt" /> 
    377377  </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> 
    378385  <Import Project="$(MSBuildThisFileDirectory)..\MSBuild.Common.targets" /> 
    379386</Project> 
  • framework/trunk/CoreTest/Sources/Data/DbDataOperatorImportTest.cs

    r1644 r1645  
    166166                }); 
    167167        } 
     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        } 
    168221    } 
    169222} 
  • framework/trunk/TestLibrary/Sources/DbDataComparer.cs

    r1236 r1645  
    1010//   you may not use this file except in compliance with the License.  You 
    1111//   may obtain a copy of the License at 
    12 //  
     12// 
    1313//     http://www.apache.org/licenses/LICENSE-2.0 
    14 //  
     14// 
    1515//   Unless required by applicable law or agreed to in writing, software 
    1616//   distributed under the License is distributed on an "AS IS" BASIS, 
     
    2323{ 
    2424    using System; 
     25    using System.Collections.Generic; 
    2526    using System.ComponentModel; 
    2627    using System.Globalization; 
     
    4546        /// <param name="transaction">データを読み込むトランザクション。</param> 
    4647        /// <param name="stream">定義を読み込むストリーム。</param> 
     48        /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 
    4749        /// <param name="notify">比較して正しくない場合に呼び出されるコールバック。</param> 
    4850        /// <returns> 
     
    5355        /// データ定義の文字列からデータベースの型に変換できません。 
    5456        /// </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) 
    5668        { 
    5769            using (AutoDetectEncodingStreamReader reader 
     
    138150 
    139151                        // データ行 
    140                         if (!tableQuery.Compare(lineNumber, line, ref failure)) 
     152                        if (!tableQuery.Compare(lineNumber, line, variables, ref failure)) 
    141153                        { 
    142154                            return false; 
     
    159171        /// <param name="reader">データを読み込むデータリーダー。</param> 
    160172        /// <param name="stream">定義を読み込むストリーム。</param> 
     173        /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 
    161174        /// <param name="notify">比較して正しくない場合に呼び出されるコールバック。</param> 
    162175        /// <returns> 
     
    167180        /// データ定義の文字列からデータベースの型に変換できません。 
    168181        /// </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) 
    170193        { 
    171194            using (AutoDetectEncodingStreamReader streamReader 
     
    220243 
    221244                        // データ行 
    222                         if (!tableQuery.Compare(lineNumber, line, ref failure)) 
     245                        if (!tableQuery.Compare(lineNumber, line, variables, ref failure)) 
    223246                        { 
    224247                            return false; 
     
    251274            /// カラムのセパレータを表す文字の配列。 
    252275            /// </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); 
    254285 
    255286            /// <summary> 
     
    501532            /// <param name="lineNumber">定義ファイルの行番号。</param> 
    502533            /// <param name="line">定義ファイルのデータ行。</param> 
     534            /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 
    503535            /// <param name="failure">失敗しているかどうか。</param> 
    504536            /// <returns> 
     
    506538            /// それ以外の場合は <see langword="false"/>。 
    507539            /// </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) 
    509541            { 
    510542                rowNumber++; 
     
    533565                    object actual = fieldValues[fieldMap[fieldIndex]]; 
    534566                    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)) 
    536568                    { 
    537569                        failure = true; 
     
    590622            /// <param name="column">指定されている値。</param> 
    591623            /// <param name="typeConverter">タイプコンバータ。</param> 
     624            /// <param name="variables">変数名をキーとして埋め込む値を値としたディクショナリ。</param> 
    592625            /// <returns> 
    593626            /// 同じであれば <see langword="true"/>。 
    594627            /// それ以外の場合は <see langword="false"/>。 
    595628            /// </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) 
    597630            { 
    598631                // カラムが空か、範囲外の場合 
     
    623656                                    int delteLength = column[column.Length - 1] == '/' ? 2 : 3; 
    624657 
    625                                     // FIXME /../ で囲まれた正規表現をパースする機能を TextUtility に作る (//i 等も対応する)  
     658                                    // FIXME /../ で囲まれた正規表現をパースする機能を TextUtility に作る (//i 等も対応する) 
    626659                                    return Regex.IsMatch( 
    627660                                        actual != null && actual != DBNull.Value 
     
    637670                                break; 
    638671                        } 
     672 
     673                        column = ResolveVariable(column, variables); 
    639674                    } 
    640675 
     
    643678 
    644679                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                    }); 
    645708            } 
    646709 
     
    736799                } 
    737800 
    738                 builder.Append(fieldNamesBuilder.ToString()); 
     801                builder.Append(fieldNamesBuilder); 
    739802                builder.Append(" FROM "); 
    740803                builder.Append(utility.EscapeTableName(tableName, null)); 
  • framework/trunk/TestLibrary/Sources/SameDataStoresConstraint.cs

    r1275 r1645  
    2323{ 
    2424    using System; 
     25    using System.Collections.Generic; 
    2526    using System.Data; 
    2627    using System.Diagnostics; 
     
    5455 
    5556        /// <summary> 
     57        /// 変数名をキーとして埋め込む値を値としたディクショナリ。 
     58        /// </summary> 
     59        [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     60        private readonly IDictionary<string, object> variables; 
     61 
     62        /// <summary> 
    5663        /// ファイルパス。 
    5764        /// </summary> 
     
    6673        /// <param name="resourceName">リソース名。</param> 
    6774        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) 
    6890        { 
    6991            this.assembly = assembly; 
    7092            this.resourceName = resourceName; 
     93            this.variables = variables; 
    7194        } 
    7295 
     
    125148            } 
    126149        } 
     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 
    127166 
    128167        /// <summary> 
     
    148187        /// <exception cref="TypeDeclarationException"> 
    149188        /// データ定義の文字列からデータベースの型に変換できません。 
     189        /// </exception> 
     190        /// <exception cref="DbException"> 
     191        /// データを取得中に例外が発生しました。 
    150192        /// </exception> 
    151193        public override ConstraintResult ApplyTo<TActual>(TActual actual) 
     
    200242                { 
    201243                    // トランザクションが指定された場合 
    202                     DbDataComparer.Compare(transaction, stream, notify); 
     244                    DbDataComparer.Compare(transaction, stream, variables, notify); 
    203245                } 
    204246                else if (connection != null) 
     
    208250                        = connection.BeginTransaction(IsolationLevel.ReadCommitted)) 
    209251                    { 
    210                         DbDataComparer.Compare(createdTransaction, stream, notify); 
     252                        DbDataComparer.Compare(createdTransaction, stream, variables, notify); 
    211253                    } 
    212254                } 
     
    214256                { 
    215257                    // データリーダが指定された場合 
    216                     DbDataComparer.Compare(reader, stream, notify); 
     258                    DbDataComparer.Compare(reader, stream, variables, notify); 
    217259                } 
    218260                else 
     
    222264                    { 
    223265                        // コマンドを実行 
    224                         DbDataComparer.Compare(createdReader, stream, notify); 
     266                        DbDataComparer.Compare(createdReader, stream, variables, notify); 
    225267                    } 
    226268                } 
  • framework/trunk/TestLibrary/Sources/Stores.cs

    r893 r1645  
    1010//   you may not use this file except in compliance with the License.  You 
    1111//   may obtain a copy of the License at 
    12 //  
     12// 
    1313//     http://www.apache.org/licenses/LICENSE-2.0 
    14 //  
     14// 
    1515//   Unless required by applicable law or agreed to in writing, software 
    1616//   distributed under the License is distributed on an "AS IS" BASIS, 
     
    2222namespace FCSoft.SilverFrost.Framework.Test 
    2323{ 
     24    using System.Collections.Generic; 
    2425    using System.Reflection; 
    2526 
     
    4344            return new SameDataStoresConstraint(assembly, resourceName); 
    4445        } 
     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        } 
    4561    } 
    4662} 
詳しい使い方は TracChangeset を参照してください。