Пример #1
0
        public void CanFilterActions()
        {
            var b = XElement.Parse("<a><z id='1' code='2'/><z id='3' code='4'/></a>");
            var n = XElement.Parse("<a><z id='3' set-code='2'/><z id='1' set-code='4'/><z id='5'/></a>");

            var result = GetResult(b, n);

            Assert.AreEqual(@"CreateElement n0
	NewestElement : (<z id='5' />)
ChangeAttribute n1
	BasisElement name=z id=1
	NewestAttribute code :4
ChangeAttribute n2
	BasisElement name=z id=3
	NewestAttribute code :2"    .Length, result.Length);
            Console.WriteLine();
            var opts = new XDiffOptions();

            opts.IncludeActions = opts.IncludeActions & ~XDiffAction.CreateElement;
            result = GetResult(b, n, opts);
            Assert.AreEqual(@"ChangeAttribute n0
	BasisElement name=z id=1
	NewestAttribute code :4
ChangeAttribute n1
	BasisElement name=z id=3
	NewestAttribute code :2"    .Length, result.Length);
            Console.WriteLine();
            opts = new XDiffOptions();
            opts.IncludeActions = opts.IncludeActions & ~XDiffAction.ChangeAttribute;
            result = GetResult(b, n, opts);
            Assert.AreEqual(@"CreateElement n0
	NewestElement : (<z id='5' />)"    .Length, result.Length);
        }
Пример #2
0
        private static string GetResult(XElement b, XElement n, XDiffOptions opts = null)
        {
            var result = new XDiffGenerator(opts).GetDiff(b, n).LogToString().Replace("\"", "'").Trim();

            Console.WriteLine(result);
            return(result);
        }
Пример #3
0
        private void Collect(DiffPair pair, ConcurrentDictionary <string, DataDiffTable> result)
        {
            var basis         = pair.Base ?? new XElement("stub");
            var updated       = pair.Updated ?? new XElement("stub");
            var baseTableName = pair.Updated.Attr("table");
            var mixed         = pair.Updated.Attr("mixed").ToBool();
            var dynamicname   = mixed || string.IsNullOrWhiteSpace(baseTableName);
            var hierarchy     = pair.Updated.Attr("tree").ToBool();
            var script        = pair.Updated.Attr("script");

            if (string.IsNullOrWhiteSpace(script))
            {
                script = "10_Main";
            }
            var diffconfig = new XDiffOptions {
                IsHierarchy                    = hierarchy,
                MergeAttributeChanges          = true,
                TreatNewAttributesAsChanges    = true,
                TreatDeleteAttributesAsChanges = _context.EmptyAttributesAsUpdates,
                IncludeActions                 = XDiffAction.RenameElement | XDiffAction.MainCreateOrUpdate
            };
            var sw   = Stopwatch.StartNew();
            var diff = new XDiffGenerator(diffconfig).GetDiff(basis, updated).ToArray();

            Collect(dynamicname, baseTableName, diff, result, script);
            sw.Stop();
            _context.Log.Debug("diff of " + baseTableName + " : " + sw.Elapsed);
        }
Пример #4
0
        public void CanPreventActions()
        {
            var b    = XElement.Parse("<a><z id='1' code='2'/><z id='3' code='4'/></a>");
            var n    = XElement.Parse("<a><z id='3' code='2'/><z id='1' code='4'/><z id='5'/></a>");
            var opts = new XDiffOptions();

            opts.ErrorActions = opts.ErrorActions | XDiffAction.CreateElement;
            Assert.Throws <Exception>(() => GetResult(b, n, opts));
        }
Пример #5
0
        public void CanAppplyPatchHierarchcallyWithNameChanges()
        {
            var b    = XElement.Parse("<a><z code='2' name='y'/><z id='3' code='4'><x id='5' name='x'/></z></a>");
            var n    = XElement.Parse("<a><u code='2' name='y'><y id='5' name='x'/></u><z id='3' code='4'></z></a>");
            var opts = new XDiffOptions {
                IsHierarchy = true, IsNameIndepended = true
            };

            GetResult(b, n, opts);
            Assert.True(new XDiffGenerator(opts).IsDiff(b, n));
            var result = new XDiffGenerator(opts).GetDiff(b, n).Apply(b, opts);

            Console.WriteLine(result.ToString());
            Assert.False(new XDiffGenerator(opts).IsDiff(b, n));
        }
Пример #6
0
        public void CanMergeNonSeparateNewAndUpdatedAttributes()
        {
            var b    = XElement.Parse("<a><z id='1' name='2' a='3' b='4' c='5'/></a>");
            var n    = XElement.Parse("<a><z id='1' name='2' a='6' b='4' c='7' d='8' e='9'/></a>");
            var opts = new XDiffOptions {
                MergeAttributeChanges = true, TreatNewAttributesAsChanges = true
            };
            var diff = new XDiffGenerator(opts).GetDiff(b, n).ToArray();
            var log  = diff.LogToString();

            Console.WriteLine(log);
            Assert.AreEqual(1, diff.Length);
            Assert.AreEqual(@"ChangeAttribute n0
	BasisElement name=z id=1
	NewestElement : (<update a=""6"" c=""7"" d=""8"" e=""9"" />)
", log);

            diff.Apply(b, opts);
            Assert.False(new XDiffGenerator().IsDiff(b, n));
        }
Пример #7
0
        public void CanMergeNonSeparateDeleteAsChangesAttributes()
        {
            var b    = XElement.Parse("<a><z id='1' name='2' a='3' b='4' c='5' x='aaa6'/></a>");
            var n    = XElement.Parse("<a><z id='1' name='2' a='3' b='3' /></a>");
            var opts = new XDiffOptions {
                MergeAttributeChanges = true, TreatDeleteAttributesAsChanges = true
            };
            var diff = new XDiffGenerator(opts).GetDiff(b, n).ToArray();
            var log  = diff.LogToString();

            Console.WriteLine(log);
            Assert.AreEqual(1, diff.Length);
            Assert.AreEqual(@"ChangeAttribute n0
	BasisElement name=z id=1
	NewestElement : (<update b=""3"" c=""0"" x="""" />)
".LfOnly().Trim(), log.LfOnly().Trim());

            diff.Apply(b, opts);
            Console.WriteLine(b);
            Assert.AreEqual(@"<a>
  <z id=""1"" name=""2"" a=""3"" b=""3"" c=""0"" x="""" />
</a>".Trim().LfOnly(), b.ToString().Trim().LfOnly());
        }