示例#1
0
        public object GetSnapshot(SnapshotId snapshotId)
        {
            if (!File.Exists(snapshotId.FilePath))
            {
                return(null);
            }

            var fullSnapshot = JObjectHelper.ParseFromString(File.ReadAllText(snapshotId.FilePath));

            if (snapshotId.PrimaryId == null && snapshotId.SecondaryId == null)
            {
                return(fullSnapshot);
            }

            if (snapshotId.PrimaryId != null &&
                fullSnapshot.TryGetValue(snapshotId.PrimaryId, out var partialSnapshot))
            {
                if (snapshotId.SecondaryId != null &&
                    partialSnapshot is JObject partialSnapshotJObject &&
                    partialSnapshotJObject.TryGetValue(snapshotId.SecondaryId, out partialSnapshot))
                {
                    return(partialSnapshot);
                }

                return(partialSnapshot);
            }
            return(null);
        }
示例#2
0
        public object SanitiseSnapshot(object snapshot)
        {
            try
            {
                if (snapshot is string stringSnapshot)
                {
                    if (StringIsJsonObject(stringSnapshot))
                    {
                        try
                        {
                            return(JObjectHelper.ParseFromString(stringSnapshot));
                        }
                        catch (Exception e)
                        {
                            throw new MalformedJsonSnapshotException(e);
                        }
                    }
                }

                JObjectHelper.FromObject(snapshot);
                return(snapshot);
            }
            catch (ArgumentException)
            {
                return(new { AutoGenerated = snapshot });
            }
        }
示例#3
0
        public bool CompareSnapshots(object oldSnap, object newSnap)
        {
            var old = JObjectHelper.FromObject(oldSnap);

            var @new = JObjectHelper.FromObject(newSnap);

            @new = JObjectHelper.ParseFromString(@new.ToString());
            return(JToken.DeepEquals(old, @new));
        }
示例#4
0
        public static string GetDiffMessage(object currentSnapshot, object newSnapshot)
        {
            var currentSnapshotJObject = JObjectHelper.FromObject(currentSnapshot);
            var newSnapshotJObject     = JObjectHelper.FromObject(newSnapshot);

            var dmp       = new diff_match_patch();
            var a         = dmp.diff_linesToChars(currentSnapshotJObject.ToString(), newSnapshotJObject.ToString());
            var lineText1 = (string)a[0];
            var lineText2 = (string)a[1];
            var lineArray = (List <string>)a[2];
            var diffs     = dmp.diff_main(lineText1, lineText2, false);

            dmp.diff_charsToLines(diffs, lineArray);
            dmp.diff_cleanupEfficiency(diffs);

            var builder = new StringBuilder(Environment.NewLine);

            builder.AppendLine("Snapshots do not match");
            builder.AppendLine(RemovedLegendString);
            builder.AppendLine(AddedLegendString);
            builder.AppendLine(Environment.NewLine);

            for (var i = 0; i < diffs.Count; i++)
            {
                var diff = diffs[i];

                var lines = GetLines(diff.text);

                switch (diff.operation)
                {
                case Operation.DELETE:
                    lines.ForEach(l => builder.AppendLine($"-  {l}"));
                    break;

                case Operation.INSERT:
                    lines.ForEach(l => builder.AppendLine($"+  {l}"));
                    break;

                case Operation.EQUAL:
                    GetEqualLines(lines, i == 0, i == diffs.Count - 1).ForEach(l => builder.AppendLine(l));
                    break;
                }
            }

            return(builder.ToString());
        }
示例#5
0
        public void StoreSnapshot(SnapshotId snapshotId, object value)
        {
            Directory.CreateDirectory(Path.GetDirectoryName(snapshotId.FilePath));

            var newSnapshot = JObjectHelper.FromObject(value);

            JToken newSnapshotToWrite;

            if (snapshotId.PrimaryId == null && snapshotId.SecondaryId == null)
            {
                newSnapshotToWrite = newSnapshot;
            }
            else
            {
                var rawSnapshotContent = GetRawSnapshotContent(snapshotId.FilePath);
                newSnapshotToWrite = rawSnapshotContent == null
                    ? new JObject()
                    : JObject.Parse(rawSnapshotContent);

                if (snapshotId.PrimaryId != null && snapshotId.SecondaryId == null)
                {
                    newSnapshotToWrite[snapshotId.PrimaryId] = newSnapshot;
                }
                else if (snapshotId.PrimaryId != null && snapshotId.SecondaryId != null)
                {
                    var firstLevel = newSnapshotToWrite[snapshotId.PrimaryId];
                    if (firstLevel == null)
                    {
                        newSnapshotToWrite[snapshotId.PrimaryId] = new JObject();
                    }

                    newSnapshotToWrite[snapshotId.PrimaryId][snapshotId.SecondaryId] = newSnapshot;
                }
            }

            File.WriteAllText(snapshotId.FilePath, newSnapshotToWrite.ToString());
        }