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); }
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); }
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); }
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)); }
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)); }
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)); }
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()); }