Пример #1
0
        private void Devices_CollectionChanged(object sender, EventArgs e)
        {
            var devices = deviceList.GetDevicesCopy();

            var listDiff = new ListDiff <DeviceInfo, DeviceInfo> (deviceListStoreMirror, devices,
                                                                  match: (a, b) => a.UniqueKey == b.UniqueKey);

            var index = 0;

            foreach (var action in listDiff.Actions)
            {
                if (action.ActionType == ListDiffActionType.Add)
                {
                    InsertDevice(index, action.DestinationItem);
                    index++;
                }
                else if (action.ActionType == ListDiffActionType.Remove)
                {
                    RemoveDevice(index);
                }
                else
                {
                    index++;
                }
            }
        }
Пример #2
0
        public void diff_commonSuffixTest()
        {
            var equalityComparer = EqualityComparer <char> .Default;

            Assert.AreEqual(0, ListDiff.GetCommonSuffix("abc".ToCharArray(), "xyz".ToCharArray(), equalityComparer));
            Assert.AreEqual(4, ListDiff.GetCommonSuffix("abcdef1234".ToCharArray(), "xyz1234".ToCharArray(), equalityComparer));
            Assert.AreEqual(4, ListDiff.GetCommonSuffix("1234".ToCharArray(), "xyz1234".ToCharArray(), equalityComparer));
        }
Пример #3
0
        public void diff_halfmatchTest()
        {
            Assert.IsNull(ListDiff.GetHalfMatch("1234567890".ToCharArray(), "abcdef".ToCharArray()));

            Func <string, string, string[]> test =
                (a, b) => ListDiff.GetHalfMatch(a.ToCharArray(), b.ToCharArray()).Select(r => new string(r.ToArray())).ToArray();

            CollectionAssert.AreEqual(new[] { "12", "90", "a", "z", "345678" }, test("1234567890", "a345678z"));

            CollectionAssert.AreEqual(new[] { "a", "z", "12", "90", "345678" }, test("a345678z", "1234567890"));

            CollectionAssert.AreEqual(new[] { "12123", "123121", "a", "z", "1234123451234" }, test("121231234123451234123121", "a1234123451234z"));

            CollectionAssert.AreEqual(new[] { "", "-=-=-=-=-=", "x", "", "x-=-=-=-=-=-=-=" }, test("x-=-=-=-=-=-=-=-=-=-=-=-=", "xx-=-=-=-=-=-=-="));

            CollectionAssert.AreEqual(new[] { "-=-=-=-=-=", "", "", "y", "-=-=-=-=-=-=-=y" }, test("-=-=-=-=-=-=-=-=-=-=-=-=y", "-=-=-=-=-=-=-=yy"));
        }
Пример #4
0
        void UpdateTasks(TodoTaskStatusTypes status, string headerName, List <ButtonRow> taskButtons, string noIdentifier)
        {
            var header = GetRow <HeaderRow>(headerName);
            var tasks  = TodoList.GetTasks(status, TodoListSortMethod.ByTimestampDesc);

            if (tasks.Count > 0)
            {
                RemoveView(GetRow(noIdentifier));

                var diff = ListDiff.Compute(taskButtons, tasks, (a, b) => (a.Tag as TodoTask).Id == b.Id);
                diff.Process(taskButtons, tasks,
                             (row) =>
                {
                    RemoveView(row);
                    return(true);
                },
                             (idx, item) =>
                {
                    AddIndexBefore = false;
                    if (idx == 0)
                    {
                        AddIndex = header;
                    }
                    else
                    {
                        AddIndex = taskButtons[idx - 1];
                    }

                    var b = AddTaskButtonRow(item);
                    taskButtons.Insert(idx, b);
                });
            }
            else
            {
                taskButtons.Clear();
                ClearHeaderSection(headerName);

                AddIndex       = header;
                AddIndexBefore = false;
                AddInfoRow(noIdentifier);
            }
        }
Пример #5
0
        public static ListDiff <T> GetListDiff <T>(ICollection <T> toList, ICollection <T> fromList, Func <T, T, bool> match)
        {
            ListDiff <T> diff = new ListDiff <T>();

            // first see if there are new items
            foreach (var item in fromList)
            {
                // try to find this item in the to list
                if (!toList.Any(a => match(item, a)))
                {
                    // add this item
                    diff.NewEntries.Add(item);
                }
            }

            var delList = toList.Where(a => !fromList.Any(b => match(b, a))).ToList();

            diff.DeletedEntries.AddRange(delList);
            return(diff);
        }
Пример #6
0
        public void HandleTransactions(TransactionDownloadResult <Transaction> download)
        {
            if (download.Transactions.Count == 0)
            {
                if (_page.GetRow("NoMessageFound") == null)
                {
                    _page.AddIndex = _header;
                    _page.AddInfoRow("NoMessageFound");
                }
            }
            else
            {
                _page.RemoveView(_page.GetRow("NoMessageFound"));

                var diff = ListDiff.Compute(_messageRows, download.Transactions, (a, b) => (a.Tag as MessageViewBase).Transaction.TransactionId == b.TransactionId);

                diff.Process(_messageRows, download.Transactions,
                             (message) =>
                {
                    _page.RemoveView(message);
                    return(true);
                },
                             (idx, item) =>
                {
                    _page.AddIndexBefore = false;
                    if (idx == 0)
                    {
                        _page.AddIndex = _header;
                    }
                    else
                    {
                        _page.AddIndex = _messageRows[idx - 1];
                    }

                    var r = AddMessageRow(item);
                    _messageRows.Insert(idx, r);
                });

                _page.AddIndex = null;
            }
        }
Пример #7
0
        public int DumpComparison(Apis other)
        {
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("## " + type.FullName);
            Console.WriteLine();

            var diff = new ListDiff <Api, Api> (All, other.All, (x, y) => x.Index == y.Index);

            var n = 0;

            foreach (var a in diff.Actions)
            {
                switch (a.ActionType)
                {
                case ListDiffActionType.Add:
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine($"- [ ] *add* `{a.DestinationItem.Index.Replace('`', '_')}`");
                    n++;
                    break;

                case ListDiffActionType.Remove:
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine($"- [ ] *remove* `{a.SourceItem.Index.Replace('`', '_')}`");
                    n++;
                    break;

                case ListDiffActionType.Update:
                    Console.ForegroundColor = ConsoleColor.Gray;
                    Console.WriteLine($"- [x] `{a.SourceItem.Index.Replace('`', '_')}`");
                    break;
                }
            }
            Console.ResetColor();
            Console.WriteLine();
            Console.WriteLine($"**{n}** differences");
            Console.WriteLine();

            return(n);
        }
Пример #8
0
        public void diff_cleanupMergeTest()
        {
            var equalityComparer = EqualityComparer <char> .Default;

            // Cleanup a messy diff.
            var diffs = new List <Diff <char> >();

            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> >(), diffs);

            Func <Operation, string, Diff <char> > makeDiff = (o, s) => new Diff <char>(o, s.ToCharArray());

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "b"), makeDiff(Operation.Insert, "c")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "b"), makeDiff(Operation.Insert, "c")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Equal, "b"), makeDiff(Operation.Equal, "c")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Equal, "abc")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "a"), makeDiff(Operation.Delete, "b"), makeDiff(Operation.Delete, "c")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Delete, "abc")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Insert, "a"), makeDiff(Operation.Insert, "b"), makeDiff(Operation.Insert, "c")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Insert, "abc")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "a"), makeDiff(Operation.Insert, "b"), makeDiff(Operation.Delete, "c"), makeDiff(Operation.Insert, "d"), makeDiff(Operation.Equal, "e"), makeDiff(Operation.Equal, "f")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Delete, "ac"), makeDiff(Operation.Insert, "bd"), makeDiff(Operation.Equal, "ef")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "a"), makeDiff(Operation.Insert, "abc"), makeDiff(Operation.Delete, "dc")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "d"), makeDiff(Operation.Insert, "b"), makeDiff(Operation.Equal, "c")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Insert, "ba"), makeDiff(Operation.Equal, "c")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Insert, "ab"), makeDiff(Operation.Equal, "ac")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "c"), makeDiff(Operation.Insert, "ab"), makeDiff(Operation.Equal, "a")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Equal, "ca"), makeDiff(Operation.Insert, "ba")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "b"), makeDiff(Operation.Equal, "c"), makeDiff(Operation.Delete, "ac"), makeDiff(Operation.Equal, "x")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Delete, "abc"), makeDiff(Operation.Equal, "acx")
            }, diffs);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "x"), makeDiff(Operation.Delete, "ca"), makeDiff(Operation.Equal, "c"), makeDiff(Operation.Delete, "b"), makeDiff(Operation.Equal, "a")
            };
            ListDiff.CleanupMerge(diffs, equalityComparer);
            CollectionAssert.AreEqual(new List <Diff <char> > {
                makeDiff(Operation.Equal, "xca"), makeDiff(Operation.Delete, "cba")
            }, diffs);
        }
Пример #9
0
        public void diff_mainTest()
        {
            var equalityComparer = EqualityComparer <char> .Default;

            Func <Operation, string, Diff <char> > makeDiff = (o, s) => new Diff <char>(o, s.ToCharArray());

            TimeSpan?timeout   = null;
            var      threshold = 32;

            // ReSharper disable once AccessToModifiedClosure
            Func <string, string, List <Diff <char> > > compare = (x, y) => ListDiff.Compare(x.ToCharArray(), y.ToCharArray(), equalityComparer, timeout, threshold).ToList();

            // Perform a trivial diff.
            List <Diff <char> > diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "abc")
            };

            CollectionAssert.AreEqual(diffs, compare("abc", "abc"), "Compare: Null case.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "ab"), makeDiff(Operation.Insert, "123"), makeDiff(Operation.Equal, "c")
            };
            CollectionAssert.AreEqual(diffs, compare("abc", "ab123c"), "Compare: Simple Insertion.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "123"), makeDiff(Operation.Equal, "bc")
            };
            CollectionAssert.AreEqual(diffs, compare("a123bc", "abc"), "Compare: Simple deletion.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Insert, "123"), makeDiff(Operation.Equal, "b"), makeDiff(Operation.Insert, "456"), makeDiff(Operation.Equal, "c")
            };
            CollectionAssert.AreEqual(diffs, compare("abc", "a123b456c"), "Compare: Two insertions.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "123"), makeDiff(Operation.Equal, "b"), makeDiff(Operation.Delete, "456"), makeDiff(Operation.Equal, "c")
            };
            CollectionAssert.AreEqual(diffs, compare("a123b456c", "abc"), "Compare: Two deletions.");

            timeout = TimeSpan.FromDays(10);

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "a"), makeDiff(Operation.Insert, "b")
            };
            CollectionAssert.AreEqual(diffs, compare("a", "b"), "Compare: Simple case #1.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "Apple"), makeDiff(Operation.Insert, "Banana"), makeDiff(Operation.Equal, "s are a"), makeDiff(Operation.Insert, "lso"), makeDiff(Operation.Equal, " fruit.")
            };
            CollectionAssert.AreEqual(diffs, compare("Apples are a fruit.", "Bananas are also fruit."), "Compare: Simple case #2.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "a"), makeDiff(Operation.Insert, "\u0680"), makeDiff(Operation.Equal, "x"), makeDiff(Operation.Delete, "\t"), makeDiff(Operation.Insert, new string(new[] { (char)0 }))
            };
            CollectionAssert.AreEqual(diffs, compare("ax\t", "\u0680x" + (char)0), "Compare: Simple case #3.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "1"), makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "y"), makeDiff(Operation.Equal, "b"), makeDiff(Operation.Delete, "2"), makeDiff(Operation.Insert, "xab")
            };
            CollectionAssert.AreEqual(diffs, compare("1ayb2", "abxab"), "Compare: Overlap #1.");

            diffs = new List <Diff <char> > {
                makeDiff(Operation.Insert, "xaxcx"), makeDiff(Operation.Equal, "abc"), makeDiff(Operation.Delete, "y")
            };
            CollectionAssert.AreEqual(diffs, compare("abcy", "xaxcxabc"), "Compare: Overlap #2.");

            // Sub-optimal double-ended diff.
            threshold = 2;
            diffs     = new List <Diff <char> > {
                makeDiff(Operation.Insert, "x"), makeDiff(Operation.Equal, "a"), makeDiff(Operation.Delete, "b"), makeDiff(Operation.Insert, "x"), makeDiff(Operation.Equal, "c"), makeDiff(Operation.Delete, "y"), makeDiff(Operation.Insert, "xabc")
            };
            CollectionAssert.AreEqual(diffs, compare("abcy", "xaxcxabc"), "Compare: Overlap #3.");

            threshold = 32;
            timeout   = TimeSpan.FromSeconds(0.001);
            string a = "`Twas brillig, and the slithy toves\nDid gyre and gimble in the wabe:\nAll mimsy were the borogoves,\nAnd the mome raths outgrabe.\n";
            string b = "I am the very model of a modern major general,\nI've information vegetable, animal, and mineral,\nI know the kings of England, and I quote the fights historical,\nFrom Marathon to Waterloo, in order categorical.\n";

            // Increase the text lengths by 1024 times to ensure a timeout.
            for (int x = 0; x < 10; x++)
            {
                a = a + a;
                b = b + b;
            }
            Assert.IsNull(new ListDiff(timeout.Value, threshold).GetMap(a.ToCharArray(), b.ToCharArray(), equalityComparer), "Compare: Timeout.");
        }
Пример #10
0
        public void diff_pathTest()
        {
            // First, check footprints are different.
            Assert.IsTrue(ListDiff.GetFootprint(1, 10) != ListDiff.GetFootprint(10, 1), "diff_footprint:");

            // Single letters.
            // Trace a path from back to front.
            HashSet <long> rowSet;
            var            vMap = new List <HashSet <long> >();
            {
                rowSet = new HashSet <long> {
                    ListDiff.GetFootprint(0, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long> {
                    ListDiff.GetFootprint(0, 1), ListDiff.GetFootprint(1, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 2),
                    ListDiff.GetFootprint(2, 0),
                    ListDiff.GetFootprint(2, 2)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 3),
                    ListDiff.GetFootprint(2, 3),
                    ListDiff.GetFootprint(3, 0),
                    ListDiff.GetFootprint(4, 3)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 4),
                    ListDiff.GetFootprint(2, 4),
                    ListDiff.GetFootprint(4, 0),
                    ListDiff.GetFootprint(4, 4),
                    ListDiff.GetFootprint(5, 3)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 5),
                    ListDiff.GetFootprint(2, 5),
                    ListDiff.GetFootprint(4, 5),
                    ListDiff.GetFootprint(5, 0),
                    ListDiff.GetFootprint(6, 3),
                    ListDiff.GetFootprint(6, 5)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 6),
                    ListDiff.GetFootprint(2, 6),
                    ListDiff.GetFootprint(4, 6),
                    ListDiff.GetFootprint(6, 6),
                    ListDiff.GetFootprint(7, 5)
                };
                vMap.Add(rowSet);
            }

            Func <Operation, string, Diff <char> > makeDiff = (o, s) => new Diff <char>(o, s.ToCharArray());

            List <Diff <char> > diffs = new List <Diff <char> > {
                makeDiff(Operation.Insert, "W"),
                makeDiff(Operation.Delete, "A"),
                makeDiff(Operation.Equal, "1"),
                makeDiff(Operation.Delete, "B"),
                makeDiff(Operation.Equal, "2"),
                makeDiff(Operation.Insert, "X"),
                makeDiff(Operation.Delete, "C"),
                makeDiff(Operation.Equal, "3"),
                makeDiff(Operation.Delete, "D")
            };

            CollectionAssert.AreEqual(diffs, ListDiff.DiffPath1(vMap, "A1B2C3D".ToCharArray(), "W12X3".ToCharArray()), "diff_path1: Single letters.");

            // Trace a path from front to back.
            vMap.RemoveAt(vMap.Count - 1);
            diffs = new List <Diff <char> > {
                makeDiff(Operation.Equal, "4"),
                makeDiff(Operation.Delete, "E"),
                makeDiff(Operation.Insert, "Y"),
                makeDiff(Operation.Equal, "5"),
                makeDiff(Operation.Delete, "F"),
                makeDiff(Operation.Equal, "6"),
                makeDiff(Operation.Delete, "G"),
                makeDiff(Operation.Insert, "Z")
            };
            CollectionAssert.AreEqual(diffs, ListDiff.DiffPath2(vMap, "4E5F6G".ToCharArray(), "4Y56Z".ToCharArray()), "diff_path2: Single letters.");

            // Double letters.
            // Trace a path from back to front.
            vMap = new List <HashSet <long> >();
            {
                rowSet = new HashSet <long> {
                    ListDiff.GetFootprint(0, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long> {
                    ListDiff.GetFootprint(0, 1), ListDiff.GetFootprint(1, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 2),
                    ListDiff.GetFootprint(1, 1),
                    ListDiff.GetFootprint(2, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 3),
                    ListDiff.GetFootprint(1, 2),
                    ListDiff.GetFootprint(2, 1),
                    ListDiff.GetFootprint(3, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(0, 4),
                    ListDiff.GetFootprint(1, 3),
                    ListDiff.GetFootprint(3, 1),
                    ListDiff.GetFootprint(4, 0),
                    ListDiff.GetFootprint(4, 4)
                };
                vMap.Add(rowSet);
            }
            diffs = new List <Diff <char> > {
                makeDiff(Operation.Insert, "WX"),
                makeDiff(Operation.Delete, "AB"),
                makeDiff(Operation.Equal, "12")
            };
            CollectionAssert.AreEqual(diffs, ListDiff.DiffPath1(vMap, "AB12".ToCharArray(), "WX12".ToCharArray()), "diff_path1: Double letters.");

            // Trace a path from front to back.
            vMap = new List <HashSet <long> >();
            {
                rowSet = new HashSet <long> {
                    ListDiff.GetFootprint(0, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long> {
                    ListDiff.GetFootprint(0, 1), ListDiff.GetFootprint(1, 0)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(1, 1),
                    ListDiff.GetFootprint(2, 0),
                    ListDiff.GetFootprint(2, 4)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(2, 1),
                    ListDiff.GetFootprint(2, 5),
                    ListDiff.GetFootprint(3, 0),
                    ListDiff.GetFootprint(3, 4)
                };
                vMap.Add(rowSet);
                rowSet = new HashSet <long>
                {
                    ListDiff.GetFootprint(2, 6),
                    ListDiff.GetFootprint(3, 5),
                    ListDiff.GetFootprint(4, 4)
                };
                vMap.Add(rowSet);
            }
            diffs = new List <Diff <char> > {
                makeDiff(Operation.Delete, "CD"),
                makeDiff(Operation.Equal, "34"),
                makeDiff(Operation.Insert, "YZ")
            };
            CollectionAssert.AreEqual(diffs, ListDiff.DiffPath2(vMap, "CD34".ToCharArray(), "34YZ".ToCharArray()), "diff_path2: Double letters.");
        }
Пример #11
0
        public virtual ChangedSchemaBO Diff <T>(
            OpenApiComponents leftComponents,
            OpenApiComponents rightComponents,
            T left,
            T right,
            DiffContextBO context)
            where T : OpenApiSchema
        {
            var leftEnumStrings  = left.Enum.Select(x => ((IOpenApiPrimitive)x)?.GetValueString()).ToList();
            var rightEnumStrings = right.Enum.Select(x => ((IOpenApiPrimitive)x)?.GetValueString()).ToList();
            var leftDefault      = (IOpenApiPrimitive)left.Default;
            var rightDefault     = (IOpenApiPrimitive)right.Default;

            var changedEnum =
                ListDiff.Diff(new ChangedEnumBO(leftEnumStrings, rightEnumStrings, context));

            ChangedSchema.Context            = context;
            ChangedSchema.OldSchema          = left;
            ChangedSchema.NewSchema          = right;
            ChangedSchema.IsChangeDeprecated = !left.Deprecated && right.Deprecated;
            ChangedSchema.IsChangeTitle      = left.Title != right.Title;
            ChangedSchema.Required           =
                ListDiff.Diff(new ChangedRequiredBO(left.Required.ToList(), right.Required.ToList(), context));
            ChangedSchema.IsChangeDefault = leftDefault?.GetValueString() != rightDefault?.GetValueString();
            ChangedSchema.Enumeration     = changedEnum;
            ChangedSchema.IsChangeFormat  = left.Format != right.Format;
            ChangedSchema.ReadOnly        = new ChangedReadOnlyBO(left.ReadOnly, right.ReadOnly, context);
            ChangedSchema.WriteOnly       = new ChangedWriteOnlyBO(left.WriteOnly, right.WriteOnly, context);
            ChangedSchema.MinLength       = new ChangedMinLengthBO(left.MinLength, right.MinLength, context);
            ChangedSchema.MaxLength       = new ChangedMaxLengthBO(left.MaxLength, right.MaxLength, context);

            var extendedDiff = OpenApiDiff.ExtensionsDiff.Diff(left.Extensions, right.Extensions, context);

            if (extendedDiff != null)
            {
                ChangedSchema.Extensions = extendedDiff;
            }
            var metaDataDiff = OpenApiDiff.MetadataDiff.Diff(left.Description, right.Description, context);

            if (metaDataDiff != null)
            {
                ChangedSchema.Description = metaDataDiff;
            }

            var leftProperties  = left.Properties;
            var rightProperties = right.Properties;
            var propertyDiff    = MapKeyDiff <string, OpenApiSchema> .Diff(leftProperties, rightProperties);

            foreach (var s in propertyDiff.SharedKey)
            {
                var diff = OpenApiDiff
                           .SchemaDiff
                           .Diff(leftProperties[s], rightProperties[s], Required(context, s, right.Required));

                if (diff != null)
                {
                    ChangedSchema.ChangedProperties.Add(s, diff);
                }
            }

            CompareAdditionalProperties(left, right, context);

            var allIncreasedProperties = FilterProperties(TypeEnum.Added, propertyDiff.Increased, context);

            foreach (var(key, value) in allIncreasedProperties)
            {
                ChangedSchema.IncreasedProperties.Add(key, value);
            }
            var allMissingProperties = FilterProperties(TypeEnum.Removed, propertyDiff.Missing, context);

            foreach (var(key, value) in allMissingProperties)
            {
                ChangedSchema.MissingProperties.Add(key, value);
            }

            return(IsApplicable(context));
        }
Пример #12
0
 public void diff_commonSuffixTest()
 {
     Assert.AreEqual(0, ListDiff.GetCommonSuffix("abc".ToCharArray(), "xyz".ToCharArray()));
     Assert.AreEqual(4, ListDiff.GetCommonSuffix("abcdef1234".ToCharArray(), "xyz1234".ToCharArray()));
     Assert.AreEqual(4, ListDiff.GetCommonSuffix("1234".ToCharArray(), "xyz1234".ToCharArray()));
 }