public void Similarity() { string text1 = "asldbcv3o9322lif;owq4o-u-4hf3fn4ofwh094f4qq43fqldadsa2GSUACUVAoo32g3f"; string text2 = "xsbadkvivuvsd;ojve;rieorqro8@O*ho848oq34floowahoOAGAGAODOWWOoq38aqo3af"; LettersDiffer differ = new LettersDiffer(); differ.AddTask(text1, 0); differ.AddTask(text2, 0); double diffSimilarity = differ.DoDiff(); double aseSimilarity = ASESimilarityAlgorithm.CalculateSimilarity(text1, text2); Assert.AreEqual(aseSimilarity, diffSimilarity, 0.05, "Incorrect similarity factor"); }
public void LettersDiff() { string text1 = "abcdefg;1"; string text2 = "xabcdfg1!"; LettersDiffer differ = new LettersDiffer(); DiffResult result = differ.DoDiff(text1, text2); IDiffObjectsCollection firstDiffs = result.DifferencesForFirst; IDiffObjectsCollection secondDiffs = result.DifferencesForSecond; Assert.IsTrue(firstDiffs[0].ValueEquals(new LetterDiffObject(0, 0, "e"))); Assert.IsTrue(firstDiffs[1].ValueEquals(new LetterDiffObject(0, 0, ";"))); Assert.IsTrue(secondDiffs[0].ValueEquals(new LetterDiffObject(0, 0, "x"))); Assert.IsTrue(secondDiffs[1].ValueEquals(new LetterDiffObject(0, 0, "!"))); }
/// <summary> /// Checks is the value is equal. If not where applicable a collection of granular differences is outputed /// </summary> /// <param name="diffObject"></param> /// <param name="diffsForSelf"></param> /// <param name="diffsForArgument"></param> /// <param name="commonElements"></param> /// <returns></returns> public bool ValueMatches(IDiffObject diffObject, out IDiffObjectsCollection diffsForSelf, out IDiffObjectsCollection diffsForArgument, out IDiffObjectsCollection commonElements) { BaseTextDiffObject otherObject = diffObject as BaseTextDiffObject; diffsForSelf = null; diffsForArgument = null; commonElements = null; bool matches = false; if (otherObject != null) { matches = this.ValueHash == otherObject.ValueHash; if (!matches) { double simFactor = ASESimilarityAlgorithm.CalculateSimilarity(this.Value, otherObject.Value); LettersDiffer granularDiffer = InitGranularDiffer(); if (simFactor > 0 && granularDiffer != null) { //calculate granular differences granularDiffer.AddTask(Value, Position); //imports the current word into a letters collection starting from the position of the current element granularDiffer.AddTask(otherObject.Value, otherObject.Position); double diffRatio = granularDiffer.DoDiff(0, 1); diffsForSelf = granularDiffer.GetResultingDifferences(0); diffsForArgument = granularDiffer.GetResultingDifferences(1); commonElements = granularDiffer.GetResultingCommonElements(0); matches = diffRatio >= this.SimilarityFactor; } } } return(matches); }
//[TestMethod] public void LargeDiffTask() { //generate two large chars strings string first = Utils.RandomString(10010, 12000); string second = Utils.RandomString(9000, 12000); DateTime start = DateTime.Now; LettersDiffer lettersDiffer = new LettersDiffer(); DiffResult res = lettersDiffer.DoDiff(first, second); DateTime end = DateTime.Now; TimeSpan delta = end.Subtract(start); Assert.IsTrue(delta.Minutes == 0 && delta.Seconds < 20, String.Format("Diff time was {0}", delta)); //generate two large word strings first = GenerateWordsSequence(900); second = GenerateWordsSequence(1020); WordsDiffer wordsDiffer = new WordsDiffer(); start = DateTime.Now; res = wordsDiffer.DoDiff(first, second); end = DateTime.Now; delta = end.Subtract(start); Assert.IsTrue(delta.Minutes == 0 && delta.Seconds < 20, String.Format("Diff time was {0}", delta)); }
/// <summary> /// Executes a diff operation /// </summary> /// <param name="firstRequestId"></param> /// <param name="secondRequestId"></param> /// <param name="source"></param> /// <returns></returns> public RequestsDifferResult Diff(int firstRequestId, int secondRequestId, ITrafficDataAccessor source) { RequestsDifferResult result = null; if (source.ContainsId(firstRequestId) && source.ContainsId(secondRequestId)) { //first retrieve the requests byte [] bytes1 = source.LoadRequestData(firstRequestId); byte [] bytes2 = source.LoadRequestData(secondRequestId); string firstRequest = String.Empty; string secondRequest = String.Empty; if (bytes1 != null) { firstRequest = GetString(bytes1); } if (bytes2 != null) { secondRequest = GetString(bytes2); } result = new RequestsDifferResult(); try //try to diff the request components { //diff the request line result = DiffFirstLine(result, firstRequest, secondRequest, 0, 0); //diff the request headers result = DiffHeaders(result, firstRequest, secondRequest, 0, 0); //next compare POST data if available result = DiffPostData(result, firstRequest, secondRequest); } catch (DiffException) //if the request are malformed use a regular letters differ { LettersDiffer lettersDiffer = new LettersDiffer(); DiffResult lettersResult = lettersDiffer.DoDiff(firstRequest, secondRequest); result.DiffsForFirst = lettersResult.DifferencesForFirst; result.DiffsForSecond = lettersResult.DifferencesForSecond; } //done with the requests calculate the base position for the response result.FirstText = firstRequest + "\n\n"; result.SecondText = secondRequest + "\n\n"; int firstRespBasePos = result.FirstText.Length; int secondRespBasePos = result.SecondText.Length; //load the responses bytes1 = source.LoadResponseData(firstRequestId); bytes2 = source.LoadResponseData(secondRequestId); string firstResponse = String.Empty; string secondResponse = String.Empty; if (bytes1 != null) { firstResponse = GetString(bytes1); } if (bytes2 != null) { secondResponse = GetString(bytes2); } try { //diff the status line result = DiffFirstLine(result, firstResponse, secondResponse, firstRespBasePos, secondRespBasePos); //diff the request headers result = DiffHeaders(result, firstResponse, secondResponse, firstRespBasePos, secondRespBasePos); //diff the response body result = DiffResponseBody(result, firstResponse, secondResponse, firstRespBasePos, secondRespBasePos); } catch (DiffException) { //if the responses are missing the headers use a regular lines differ LinesDiffer linesDiffer = new LinesDiffer(); linesDiffer.AddTask(firstResponse, firstRespBasePos); linesDiffer.AddTask(secondResponse, secondRespBasePos); linesDiffer.DoDiff(); result.DiffsForFirst = linesDiffer.GetResultingDifferences(0); result.DiffsForSecond = linesDiffer.GetResultingDifferences(1); } //append the responses to the result text result.FirstText += firstResponse; result.SecondText += secondResponse; //sort and merge the resulting differences result.DiffsForFirst.MergeAll(); result.DiffsForSecond.MergeAll(); } return(result); }