public void AddDifference(PositionalDifference difference) { if (MissingBaselineFile || MissingSecondaryFile) { throw new Exception("Cant have differences if a file is missing."); } _differences.Add(difference); }
public static PositionalDifference FromJObject(JObject source) { int baselineStart = source.GetValue(nameof(BaselineStartPosition)).ToObject <int>(); string baselineData = source.GetValue(nameof(BaselineData)).ToString(); int secondaryStart = source.GetValue(nameof(SecondaryStartPosition)).ToObject <int>(); string secondaryData = source.GetValue(nameof(SecondaryData)).ToString(); int leeway = source.GetValue(nameof(LocationLeeway)).ToObject <int>(); string classificationString = source.GetValue(nameof(ClassificationString)).ToString(); DifferenceDatatype classification = Enum.Parse <DifferenceDatatype>(classificationString); PositionalDifference difference = new PositionalDifference(baselineStart, baselineData, secondaryStart, secondaryData, classification, leeway); return(difference); }
public static FileDifference FromJObject(JObject source) { string filename = source.GetValue(nameof(File)).ToString(); FileDifference fileDifference = new FileDifference(filename); if (source.TryGetValue(nameof(Differences), out JToken differenceJToken)) { foreach (JObject diffInfo in (JArray)differenceJToken) { PositionalDifference positionalDiff = PositionalDifference.FromJObject(diffInfo); fileDifference.AddDifference(positionalDiff); } } return(fileDifference); }
public IReadOnlyList <PositionalDifference> Compare() { List <PositionalDifference> differenceList = new List <PositionalDifference>(); PositionalDifference endDifference; bool unhandledDifference = false; using (FileStream baselineStream = File.Open(_baselineFilePath, FileMode.Open)) using (FileStream secondaryStream = File.Open(_secondaryFilePath, FileMode.Open)) { _baselineData = new BufferedReadStream(baselineStream); _secondaryData = new BufferedReadStream(secondaryStream); do { if (_baselineData.TryReadNext(out byte baselineByte) && _secondaryData.TryReadNext(out byte secondaryByte)) { if (baselineByte != secondaryByte) { if (TryFindDifferenceAtPosition(baselineByte, secondaryByte, out PositionalDifference difference)) { differenceList.Add(difference); } else { PositionalDifference tooLongDifference = SetupExplicitlyTypedDifference(DifferenceCheckWindowSize, DifferenceCheckWindowSize, baselineByte, secondaryByte, DifferenceDatatype.TooLong, 0); differenceList.Add(tooLongDifference); unhandledDifference = true; } } } } while (!IsDoneReading(out endDifference) && !unhandledDifference); } if (endDifference != null) { differenceList.Add(endDifference); } return(differenceList); }
private bool IsDoneReading(out PositionalDifference endDifference) { if (_baselineData.DoneReading && _secondaryData.DoneReading) { endDifference = null; return(true); } else if (_baselineData.DoneReading) { string checkPartialEnd = ReadPartialEndData(_secondaryData); endDifference = new PositionalDifference(_baselineData.LastReadPosition, string.Empty, _secondaryData.LastReadPosition, checkPartialEnd); return(true); } else if (_secondaryData.DoneReading) { string baselinePartialEnd = ReadPartialEndData(_baselineData); endDifference = new PositionalDifference(_baselineData.LastReadPosition, baselinePartialEnd, _secondaryData.LastReadPosition, string.Empty); return(true); } endDifference = null; return(false); }
// naive, greedy determination of where a content difference ends. private bool TryFindDifferenceAtPosition(byte previousBaselineByte, byte previousCheckByte, out PositionalDifference difference) { Dictionary <int, List <int> > checkStartToBaselineStartMatches = FindPotentialRealignments(); if (checkStartToBaselineStartMatches.Count == 0) { difference = null; return(false); } // the best difference is the one that has the smallest sum difference of start positions (sum of squares may yield a better result, may have to experiment) int bestStartDelta = int.MaxValue; int baselineStartOfBestRealign = int.MaxValue; int checkStartOfBestRealign = int.MaxValue; foreach (KeyValuePair <int, List <int> > candidate in checkStartToBaselineStartMatches) { int checkStartPosition = candidate.Key; foreach (int baselineStartPosition in candidate.Value) { int startDelta = checkStartPosition + baselineStartPosition; if (startDelta < bestStartDelta) { bestStartDelta = startDelta; baselineStartOfBestRealign = baselineStartPosition; checkStartOfBestRealign = checkStartPosition; } else if ((startDelta == bestStartDelta) && (baselineStartOfBestRealign < baselineStartPosition)) { baselineStartOfBestRealign = baselineStartPosition; checkStartOfBestRealign = checkStartPosition; } } } if (bestStartDelta == int.MaxValue) { // shouldn't be possible, but good to check while developing difference = null; return(false); } difference = SetupDifference(baselineStartOfBestRealign, checkStartOfBestRealign, previousBaselineByte, previousCheckByte); return(true); }