private void WhereIsNotNull(XArray source, XArray unused, BitVector vector) { BoolComparer.WhereNull(source, false, vector); }
/// <summary> /// Asserts that the Sub-set schema is contained within the Super-set schema /// </summary> public static void AssertContained(ILogger logger, string superSetConnectionString, string subSetConnectionString, bool compareIndexes, params string[] ignoreTables) { var mismatchLogger = new MismatchLogger(logger); var superSet = GetDatabase(superSetConnectionString); var subSet = GetDatabase(subSetConnectionString); var boolComparer = new BoolComparer(); var intComparer = new IntComparer(); var stringComparer = StringComparer.InvariantCulture; var sqlDataTypeComparer = new SqlDataTypeComparer(); foreach (var subSetTable in subSet.Tables.Cast <Table>()) { if (ignoreTables.Contains(subSetTable.Name)) { mismatchLogger.LogInfo("Ignoring table '{0}'", subSetTable.Name); continue; } if (!superSet.Tables.Contains(subSetTable.Name)) { mismatchLogger.LogWarning("Table '{0}' does not exist in '{1}'", subSetTable.Name, superSet.Name); continue; } mismatchLogger.LogInfo("Comparing table '{0}'", subSetTable.Name); var superSetTable = superSet.Tables[subSetTable.Name]; var superSetColumns = superSetTable.Columns.Cast <Column>().Where(c => !c.Name.EndsWith("NullBuster")).ToDictionary(c => c.Name); var subSetColumns = subSetTable.Columns.Cast <Column>().ToDictionary(c => c.Name); if (subSetColumns.Count != superSetColumns.Count) { mismatchLogger.LogWarning( "Table '{0}' in '{1}' has '{2}' columns compared to '{3}' in '{4}'", subSetTable.Name, subSet.Name, subSetTable.Columns.Count, superSetColumns.Count, superSet.Name); } foreach (var superSetColumn in superSetColumns) { if (!subSetColumns.ContainsKey(superSetColumn.Key)) { mismatchLogger.LogWarning("Column '{0}' does not exist in '{1}' in '{2}'", superSetColumn.Key, subSetTable.Name, subSet.Name); } } foreach (var subSetColumn in subSetColumns) { if (!superSetColumns.ContainsKey(subSetColumn.Key)) { mismatchLogger.LogWarning("Column '{0}' does not exist in '{1}' in '{2}'", subSetColumn.Key, superSetTable.Name, superSet.Name); continue; } var superSetColumn = superSetColumns[subSetColumn.Key]; Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.DataType.SqlDataType, sqlDataTypeComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.DataType.MaximumLength, intComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.DataType.NumericPrecision, intComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.DataType.NumericScale, intComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.Nullable, boolComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.Default, stringComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.Identity, boolComparer); Compare(mismatchLogger, subSetTable, subSetColumn.Value, superSetColumn, c => c.InPrimaryKey, boolComparer); } if (compareIndexes) { var superSetUniqueIndexes = superSetTable.Indexes.Cast <Index>().Where(c => c.IsUnique).ToList(); var subSetUniqueIndexes = subSetTable.Indexes.Cast <Index>().Where(c => c.IsUnique).ToList(); if (subSetUniqueIndexes.Count != superSetUniqueIndexes.Count) { mismatchLogger.LogWarning( "Table '{0}' in '{1}' has '{2}' unique indexes compared to '{3}' in '{4}'", subSetTable.Name, subSet.Name, subSetUniqueIndexes.Count, superSetUniqueIndexes.Count, superSet.Name); } // Primary Keys and Unique Keys can have different names, so can't check for equality foreach (var subSetUniqueIndex in subSetUniqueIndexes) { var subSetIndexColumns = new HashSet <string>(subSetUniqueIndex.IndexedColumns.Cast <IndexedColumn>().Select(c => c.Name)); var found = false; foreach (var superSetUniqueIndex in superSetUniqueIndexes) { var superSetIndexColumns = new HashSet <string>(superSetUniqueIndex.IndexedColumns.Cast <IndexedColumn>().Select(c => c.Name)); if (superSetIndexColumns.SetEquals(subSetIndexColumns)) { found = true; break; } } if (!found) { mismatchLogger.LogWarning("Table '{0}' in '{1}' has unexpected unique index over columns '{2}'", subSetTable.Name, subSet.Name, string.Join(",", subSetIndexColumns)); } } } // TODO: Check FK (keys can have different names) } if (mismatchLogger.Errors || mismatchLogger.Warnings) { Assert.Fail("Schema comparison failed - see ILog output for details"); } }
public void ToStringShouldDescribeTheCondition() { var comparer = new BoolComparer(false); Assert.AreEqual("equals 'False' ignoring case", comparer.ToString()); }