using ArducopterConfigurator;
using NUnit.Framework;

namespace ArducopterConfiguratorTest
{
    public abstract class VmTestBase<T> where T : MonitorVm
    {
        protected T _vm;
        protected MockComms _mockComms;
        protected string sampleLineOfData; // should be taken from a real APM if possible
        protected string getCommand;
        protected string setCommand;

        [Test]
        public void ActivateSendsCorrectCommand()
        {
            _vm.Activate();
            Assert.AreEqual(1, _mockComms.SentItems.Count);
            Assert.AreEqual(getCommand, _mockComms.SentItems[0]);
        }

        [Test]
        public void ReceivedDataIgnoredWhenNotActive()
        {
            bool inpcFired = false;
            _vm.PropertyChanged += delegate { inpcFired = true; };

            _mockComms.FireLineRecieve(sampleLineOfData);
            Assert.False(inpcFired);
        }

        [Test]
        public void ReceivedDataIgnoredAfterDeActive()
        {
            _vm.Activate();
            _mockComms.FireLineRecieve(sampleLineOfData);
            _vm.DeActivate();
            _mockComms.FireLineRecieve(sampleLineOfData);
            bool inpcFired = false;
            _vm.PropertyChanged += delegate { inpcFired = true; };

            Assert.False(inpcFired);
        }

        [Test]
        public void UpdateStringReceivedPopulatesValues()
        {
            bool inpcFired = false;
            _vm.PropertyChanged += delegate { inpcFired = true; };

            _vm.Activate();
            _mockComms.FireLineRecieve(sampleLineOfData);

            Assert.True(inpcFired);
        }
    }
}