public void SnapshotAndReplace()
        {
            var property = new AnimatableProperty <float> {
                Value = 10.0f
            };
            var animation = new SingleFromToByAnimation
            {
                From       = 100.0f,
                To         = 200.0f,
                IsAdditive = true,
            };

            var manager = new AnimationManager();

            var controller = manager.CreateController(animation, property);

            Assert.AreEqual(10.0f, property.Value);

            controller.Start(AnimationTransitions.SnapshotAndReplace());
            controller.UpdateAndApply();
            Assert.AreEqual(110.0f, property.Value);

            // Changing the base value has no effect.
            property.Value = 20.0f;
            manager.Update(TimeSpan.Zero);
            manager.ApplyAnimations();
            Assert.AreEqual(110.0f, property.Value);

            // Start second animation using SnapshotAndReplace.
            controller = manager.CreateController(animation, property);
            Assert.AreEqual(110.0f, property.Value);

            controller.Start(AnimationTransitions.SnapshotAndReplace());
            controller.UpdateAndApply();
            Assert.AreEqual(210.0f, property.Value);

            controller.Stop();
            controller.UpdateAndApply();
            Assert.AreEqual(20.0f, property.Value);
        }
        public void SnapshotFromDelegateAnimatableProperty()
        {
            var testObject = new TestObject {
                Value = 123.4f
            };
            Func <float>   getter   = () => testObject.Value;
            Action <float> setter   = f => { testObject.Value = f; };
            var            property = new DelegateAnimatableProperty <float>(getter, setter);

            var manager     = new AnimationManager();
            var byAnimation = new SingleFromToByAnimation
            {
                Duration = TimeSpan.Zero,
                By       = 25.0f,
            };

            var controller = manager.StartAnimation(byAnimation, property, AnimationTransitions.SnapshotAndReplace());

            controller.UpdateAndApply();

            // The DelegateAnimatableProperty<T> does not provide a base value.
            // --> No snapshot is created.
            Assert.AreEqual(25.0f, testObject.Value); // 0.0f (SingleTraits.Identity) + 25.0f (By Animation)
        }
        public void AnimationShapshots()
        {
            var property = new AnimatableProperty <float> {
                Value = 10.0f
            };

            var manager     = new AnimationManager();
            var byAnimation = new SingleFromToByAnimation
            {
                Duration = TimeSpan.Zero,
                By       = 25.0f,
            };

            var byController = manager.CreateController(byAnimation, property);

            Assert.AreEqual(10.0f, property.Value);

            // Without snapshot.
            byController.Start(AnimationTransitions.Replace());
            byController.UpdateAndApply();
            Assert.AreEqual(35.0f, property.Value);

            property.Value = 100.0f;
            manager.Update(TimeSpan.Zero);
            manager.ApplyAnimations();
            Assert.AreEqual(125.0f, property.Value);

            byController.Stop();
            byController.UpdateAndApply();
            Assert.AreEqual(100.0f, property.Value);

            // With snapshot.
            property.Value = 10.0f;
            byController.Start(AnimationTransitions.SnapshotAndReplace());
            byController.UpdateAndApply();
            Assert.AreEqual(35.0f, property.Value);

            property.Value = 100.0f;
            manager.Update(TimeSpan.Zero);
            manager.ApplyAnimations();
            Assert.AreEqual(35.0f, property.Value);

            // Create another snapshot.
            var additiveAnimation = new SingleFromToByAnimation
            {
                Duration   = TimeSpan.Zero,
                To         = 200.0f,
                IsAdditive = true,
            };
            var additiveController = manager.CreateController(additiveAnimation, property);

            additiveController.Start(AnimationTransitions.SnapshotAndReplace());
            additiveController.UpdateAndApply();
            Assert.AreEqual(235.0f, property.Value);

            byController.Stop();
            Assert.AreEqual(235.0f, property.Value);

            byController.Start(AnimationTransitions.Replace());
            byController.UpdateAndApply();
            Assert.AreEqual(60.0f, property.Value); // 35.0f (Snapshot) + 25.0f (By Animation)
        }