public void Successfully_PostsDiverge_Stored()
        {
            var post1  = new RollPost();
            var post2  = new RollPost();
            var stream = new MemoryStream();

            post1.AddRoll("1d20", Roll9Conf);
            post1.AddRoll("1d20", Roll9Conf);
            post2.AddRoll("1d20", Roll9Conf);
            post2.AddRoll("1d20", Roll1Conf);
            post1.Validate();
            post2.Validate();

            post1.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post3 = RollPost.Deserialize(stream);

            stream.Dispose();

            stream = new MemoryStream();
            post2.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post4 = RollPost.Deserialize(stream);

            stream.Dispose();

            Assert.IsTrue(post3.HasDivergedFrom(post4));
        }
        public void Successfully_NotValidate_WhenKeepingStoredPost()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            post.AddRoll("1d20");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            post2.AddRoll("1d20+1");
            EatExceptions(() => post2.AddRoll("q"));
            post2.Validate();

            stream.Dispose();
            stream = new MemoryStream();
            post2.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post3 = RollPost.Deserialize(stream);

            post3.AddRoll("1d20+1");
            EatExceptions(() => post3.AddRoll("q"));

            Assert.IsFalse(post3.Validate());
            Assert.AreEqual(post3.Stored[0], post3.Current[0]);
        }
        public void Successfully_ChangeInvalidToValid_Stored()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            post.AddRoll("1d20");
            post.AddRoll("1d20");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            EatExceptions(DiceErrorCode.ParseError, () => post2.AddRoll("qwerty"));
            post2.AddRoll("1d20", Roll9Conf);
            post2.Validate();

            stream.Dispose();
            stream = new MemoryStream();
            post2.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post3 = RollPost.Deserialize(stream);

            post3.AddRoll("1d20+1");
            post3.AddRoll("1d20", Roll20Conf);

            Assert.IsFalse(post3.Validate());
            Assert.AreEqual(post3.Stored[1], post3.Current[1]);
            Assert.AreEqual(1, post3.Diverged);
        }
        public void Successfully_NotValidate_WhenRemovingRolls()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            post.AddRoll("1d20");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            Assert.IsFalse(post2.Validate());
        }
        public void Successfully_Validate_WhenSavedPostMatches()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            post.AddRoll("1d20");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            post2.AddRoll("1d20");

            Assert.IsTrue(post2.Validate());
        }
        public void Successfully_NotValidate_WhenChangingRollToInvalid()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            post.AddRoll("1d20");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            EatExceptions(DiceErrorCode.ParseError, () => post2.AddRoll("qwerty"));

            Assert.IsFalse(post2.Validate());
            Assert.AreEqual(RollResult.InvalidRoll, post2.Current[0]);
        }
        public void Successfully_Validate_WhenChangingInvalidRollToValid()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            EatExceptions(DiceErrorCode.ParseError, () => post.AddRoll("qwerty"));
            post.AddRoll("1d20");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            post2.AddRoll("1d20");
            post2.AddRoll("1d20");

            Assert.IsTrue(post2.Validate());
            Assert.AreEqual(0, post2.Diverged);
        }
        public void Successfully_PreserveMetadata()
        {
            var metadata = "foobar";
            var stream   = new MemoryStream();
            var post     = new RollPost();

            post.AddRoll("1d20", null, new RollData()
            {
                Metadata = metadata
            });
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            post2.AddRoll("1d20");
            post2.Validate();

            Assert.AreEqual(metadata, (string)post2.Current[0].Metadata);
        }
        public void Successfully_RoundtripRollPost_ForPersistence()
        {
            var stream = new MemoryStream();
            var post   = new RollPost();

            post.AddRoll("20d20+4");
            post.AddRoll("2d6+3");
            post.AddRoll("[roll:2]-2");
            post.Validate();

            post.Serialize(stream);
            stream.Seek(0, SeekOrigin.Begin);
            var post2 = RollPost.Deserialize(stream);

            CollectionAssert.AreEqual(post.Pristine.ToList(), post2.Pristine.ToList());
            CollectionAssert.AreEqual(post.Current.ToList(), post2.Stored.ToList());
            CollectionAssert.AreEqual(new List <RollResult>(), post2.Current.ToList());
            Assert.AreEqual(0, post2.Diverged);

            post2.AddRoll("10d20+4");
            Assert.AreEqual(2, post2.Diverged);
        }