Ejemplo n.º 1
0
 private void WhereIsNotNull(XArray source, XArray unused, BitVector vector)
 {
     BoolComparer.WhereNull(source, false, vector);
 }
Ejemplo n.º 2
0
        /// <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");
            }
        }
Ejemplo n.º 3
0
        public void ToStringShouldDescribeTheCondition()
        {
            var comparer = new BoolComparer(false);

            Assert.AreEqual("equals 'False' ignoring case", comparer.ToString());
        }