namespace Fluent.Tests.Internal
{
    using Fluent.Internal;
    using NUnit.Framework;

    [TestFixture]
    public class ScopeGuardTests
    {
        [Test]
        public void IsActive_Marker_Should_Change_On_Dispose()
        {
            var guard = new ScopeGuard();

            Assert.That(guard.IsActive, Is.False);

            guard.Start();

            Assert.That(guard.IsActive, Is.True);

            guard.Dispose();

            Assert.That(guard.IsActive, Is.False);

            Assert.That(() => guard.Dispose(), Throws.Nothing);

            Assert.That(guard.IsActive, Is.False);
        }

        [Test]
        public void Actions_Should_Be_Called()
        {
            var entryActionCallCount = 0;
            void EntryAction() => ++entryActionCallCount;

            var disposeActionCallCount = 0;
            void DisposeAction() => ++disposeActionCallCount;

            var guard = new ScopeGuard(EntryAction, DisposeAction).Start();

            Assert.That(entryActionCallCount, Is.EqualTo(1));
            Assert.That(disposeActionCallCount, Is.EqualTo(0));

            guard.Dispose();

            Assert.That(entryActionCallCount, Is.EqualTo(1));
            Assert.That(disposeActionCallCount, Is.EqualTo(1));

            guard.Dispose();

            Assert.That(entryActionCallCount, Is.EqualTo(1));
            Assert.That(disposeActionCallCount, Is.EqualTo(1));
        }
    }
}