示例#1
0
        HirelingDiff BuildHirelingDiff(HirelingDiff newVal, HirelingDiff prevVal)
        {
            if (prevVal == null && newVal == null)
            {
                return(null);
            }

            if (prevVal == null || newVal == null)
            {
                return(newVal);
            }

            var diff    = new HirelingDiff();
            var hasDiff = false;

            var hirelingItemDiff = ItemsDiff(newVal.Items, prevVal.Items);

            diff.AddedItems   = hirelingItemDiff.Item1;
            diff.RemovedItems = hirelingItemDiff.Item2;

            if (!ListsEqual(prevVal.SkillIds, newVal.SkillIds))
            {
                diff.SkillIds = newVal.SkillIds;
            }

            foreach (string propertyName in HirelingDiff.AutocompareProps)
            {
                var property  = typeof(HirelingDiff).GetProperty(propertyName);
                var prevValue = property.GetValue(prevVal);
                var newValue  = property.GetValue(newVal);
                if (!ObjectsEqual(prevValue, newValue))
                {
                    hasDiff = true;
                    property.SetValue(diff, newValue);
                }
            }

            hasDiff = hasDiff ||
                      diff.AddedItems != null ||
                      diff.RemovedItems != null ||
                      diff.SkillIds != null;

            return(hasDiff ? diff : null);
        }
        public void TestGetDiff()
        {
            HirelingDiff prev;
            HirelingDiff curr;
            HirelingDiff expected;
            HirelingDiff actual;

            // null
            prev = null;
            curr = null;
            Assert.IsNull(HirelingDiff.GetDiff(curr, prev));

            // prev is null
            prev = null;
            curr = new HirelingDiff();
            Assert.AreEqual(curr, HirelingDiff.GetDiff(curr, prev));

            // curr is null
            prev = new HirelingDiff();
            curr = null;
            Assert.AreEqual(curr, HirelingDiff.GetDiff(curr, prev));

            // has some auto property diff
            prev = new HirelingDiff {
                Level = 3
            };
            curr = new HirelingDiff {
                Level = 10
            };
            expected = new HirelingDiff {
                Level = 10
            };
            actual = HirelingDiff.GetDiff(curr, prev);
            Assert.AreEqual(expected.Level, actual.Level);

            // has some item diff
            var item1 = new ItemInfo {
                GUID = 1, Class = 1
            };
            var item2 = new ItemInfo {
                GUID = 2, Class = 2
            };

            prev = new HirelingDiff {
                Items = new List <ItemInfo> {
                    item1
                }
            };
            curr = new HirelingDiff {
                Items = new List <ItemInfo> {
                    item2
                }
            };
            expected = new HirelingDiff {
                RemovedItems = new List <ItemInfo> {
                    item1
                },
                AddedItems = new List <ItemInfo> {
                    item2
                },
            };
            actual = HirelingDiff.GetDiff(curr, prev);
            Assert.AreEqual(expected.Items, actual.Items);
            CollectionAssert.AreEqual(expected.RemovedItems, actual.RemovedItems);
            CollectionAssert.AreEqual(expected.AddedItems, actual.AddedItems);

            // has some new skills
            prev = new HirelingDiff {
                SkillIds = new List <uint> {
                    1, 2
                }
            };
            curr = new HirelingDiff {
                SkillIds = new List <uint> {
                    1, 2, 3
                }
            };
            expected = new HirelingDiff
            {
                SkillIds = new List <uint> {
                    1, 2, 3
                },
            };
            actual = HirelingDiff.GetDiff(curr, prev);
            CollectionAssert.AreEqual(expected.SkillIds, actual.SkillIds);

            // has lost some skills
            prev = new HirelingDiff {
                SkillIds = new List <uint> {
                    1, 2, 3
                }
            };
            curr = new HirelingDiff {
                SkillIds = new List <uint> {
                    1, 2
                }
            };
            expected = new HirelingDiff
            {
                SkillIds = new List <uint> {
                    1, 2
                },
            };
            actual = HirelingDiff.GetDiff(curr, prev);
            CollectionAssert.AreEqual(expected.SkillIds, actual.SkillIds);

            // no change
            prev = new HirelingDiff
            {
                Level = 1,
                Items = new List <ItemInfo> {
                    new ItemInfo {
                        GUID = 1, Class = 1
                    }
                },
                SkillIds = new List <uint> {
                    1, 2, 3
                },
            };
            curr = new HirelingDiff
            {
                Level = 1,
                Items = new List <ItemInfo> {
                    new ItemInfo {
                        GUID = 1, Class = 1
                    }
                },
                SkillIds = new List <uint> {
                    1, 2, 3
                },
            };
            actual = HirelingDiff.GetDiff(curr, prev);
            Assert.IsNull(actual);
        }