Ejemplo n.º 1
0
        public void AddDifference(PositionalDifference difference)
        {
            if (MissingBaselineFile || MissingSecondaryFile)
            {
                throw new Exception("Cant have differences if a file is missing.");
            }

            _differences.Add(difference);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        // 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);
        }