Example #1
0
        IEnumerable <IdentifiedObject> Mutate(List <IdentifiedObject> source)
        {
            var random = new Random();

            foreach (var obj in source)
            {
                // 20% chance we will mutate
                if (random.Next(5) != 0)
                {
                    continue;
                }

                var cson       = _serializer.SerializeObject(obj);
                var jObject    = JObject.Parse(cson);
                var properties = jObject.Properties().Select(p => p.Name).ToArray();

                var propertiesToMutate = properties.InRandomOrder()
                                         .Take(random.Next(properties.Length / 2))
                                         .ToArray();

                var otherJObject = JObject.Parse(_serializer.SerializeObject(_factory.Create(obj.GetType())));

                foreach (var property in propertiesToMutate)
                {
                    jObject[property] = otherJObject[property];
                }

                yield return(_serializer.DeserializeObject(jObject.ToString()));
            }
        }
Example #2
0
        public void CanDetectObjectCreation()
        {
            var identifiedObject = _factory.Create <ConnectivityNode>();
            var newState         = new[] { identifiedObject };

            var result = _differ.GetDiff(None, newState).ToList();


            Assert.That(result.Count, Is.EqualTo(1));

            var dataSetMember = result.First();

            Console.WriteLine(dataSetMember.ToPrettyJson());

            var changeSetMember = dataSetMember.Change;

            Assert.That(changeSetMember, Is.TypeOf <ObjectCreation>());

            var objectCreation = (ObjectCreation)changeSetMember;
            var roundtrippedIdentifiedObject = objectCreation.Object;

            Assert.That(roundtrippedIdentifiedObject.ToPrettyJson(), Is.EqualTo(identifiedObject.ToPrettyJson()));
        }
        void CheckIt(IdentifiedObject currentState, bool verbose)
        {
            var type         = currentState.GetType();
            var newState     = _factory.Create(type);
            var typeAccessor = GetTypeAccessor(newState);

            // only change some of the properties
            foreach (var property in GetProperties(typeAccessor))
            {
                try
                {
                    // 20% chance we will change the value
                    if (_random.Next(5) == 0)
                    {
                        continue;
                    }

                    // 80% chance we will keep the previous value
                    typeAccessor[newState, property] = typeAccessor[currentState, property];
                }
                catch (Exception exception)
                {
                    throw new ApplicationException($"Could not set property '{property}'", exception);
                }
            }

            // it's the same object
            newState.mRID = currentState.mRID;

            if (verbose)
            {
                Console.WriteLine($@"Getting diff for this object modification:

{currentState.ToPrettyCson()}

=>

{newState.ToPrettyCson()}
");
            }

            var dataSetMembers = _differ.GetDiff(new[] { currentState }, new[] { newState }).ToList();

            if (dataSetMembers.Count == 0)
            {
                Assert.That(newState.ToPrettyCson(), Is.EqualTo(currentState.ToPrettyCson()),
                            "Didn't get a result from the differ, so the two states should be equal");
                return;
            }

            Assert.That(dataSetMembers.Count, Is.EqualTo(1));

            var dataSetMember = dataSetMembers.First();

            if (verbose)
            {
                Console.WriteLine($@"Got this diff:

{dataSetMember.ToPrettyCson()}
");
            }

            var roundtrippedSequence = _differ.ApplyDiff(new[] { currentState }, dataSetMembers).ToList();

            Assert.That(roundtrippedSequence.Count, Is.EqualTo(1));

            var roundtrippedState = roundtrippedSequence.First();

            if (verbose)
            {
                Console.WriteLine($@"Got this roundtripped state:

{roundtrippedState.ToPrettyCson()}");
            }

            Assert.That(roundtrippedState.ToPrettyJson(), Is.EqualTo(newState.ToPrettyJson()), $@"This state change (CURRENT):

{currentState.ToPrettyCson()}

=>

{newState.ToPrettyCson()}

yielded this diff:

{dataSetMember.ToPrettyCson()}

which, when applied to CURRENT, yielded THIS result:

{roundtrippedState.ToPrettyCson()}");
        }