private static DigitalSignal Connect(DigitalSignalProvider provider, DigitalSignalConsumer consumer)
        {
            if (consumer.IsConnected && provider.IsConnected)
            {
                if (consumer.DigitalSignal != provider.DigitalSignal)
                {
                    throw new InvalidOperationException("Both Consumer and Provider are already connected to different signals.");
                }

                return(consumer.DigitalSignal);
            }

            DigitalSignal signal = null;

            if (consumer.IsConnected)
            {
                signal = consumer.DigitalSignal;
                provider.ConnectTo(signal);
            }
            else if (provider.IsConnected)
            {
                signal = provider.DigitalSignal;
                consumer.ConnectTo(signal);
            }

            return(signal);
        }
        public void Connected_Level_Floating()
        {
            var uut = new DigitalSignalConsumer();

            uut.ConnectTo(new DigitalSignal());

            uut.Level.Should().Be(DigitalLevel.Floating);
        }
        public void Connected_WithName_BuildName()
        {
            var name = "Test";
            var uut  = new DigitalSignalConsumer();

            uut.ConnectTo(new DigitalSignal(name));

            uut.Name.Should().StartWith(name);
        }
        public void Connect_WriteProvider_ConsumerSeesChanges()
        {
            var provider = new DigitalSignalProvider();
            var consumer = new DigitalSignalConsumer();
            var signal   = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer.ConnectTo(signal);

            provider.Write(DigitalLevel.High);

            consumer.Level.Should().Be(DigitalLevel.High);
        }
        public void Connect_WriteProvider_EventTriggered()
        {
            var provider = new DigitalSignalProvider();
            var consumer = new DigitalSignalConsumer();
            var signal   = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer.ConnectTo(signal);
            consumer.MonitorEvents();

            provider.Write(DigitalLevel.High);

            consumer.ShouldRaise("OnChanged");
        }
        public void Write_MultipleConsumers_AllSeeChangedLevel()
        {
            var provider  = new DigitalSignalProvider();
            var consumer1 = new DigitalSignalConsumer();
            var consumer2 = new DigitalSignalConsumer();
            var signal    = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer1.ConnectTo(signal);
            consumer2.ConnectTo(signal);

            provider.Write(DigitalLevel.High);

            consumer1.Level.Should().Be(DigitalLevel.High);
            consumer2.Level.Should().Be(DigitalLevel.High);
        }
        public static DigitalSignal GetOrAddSignal(this DigitalSignalConsumer consumer, string signalName = null)
        {
            DigitalSignal signal = null;

            if (!consumer.IsConnected)
            {
                signal = new DigitalSignal(signalName);
                consumer.ConnectTo(signal);
            }
            else
            {
                signal = consumer.DigitalSignal;
            }

            return(signal);
        }
        public static DigitalSignal ConnectTo(this DigitalSignalProvider provider, DigitalSignalConsumer consumer, string signalName = null)
        {
            DigitalSignal signal = Connect(provider, consumer);

            if (signal == null)
            {
                if (signalName == null)
                {
                    signalName = provider.Name;
                }
                signal = provider.GetOrAddSignal(signalName);
                consumer.ConnectTo(signal);
            }

            return(signal);
        }
        public static DigitalSignalProvider CreateConnection(this DigitalSignalConsumer consumer, DigitalSignalProvider provider = null, string signalName = null)
        {
            if (signalName == null && consumer.Name != null)
            {
                signalName = consumer.Name;
            }

            var signal = new DigitalSignal(signalName);

            if (provider == null)
            {
                provider = new DigitalSignalProvider();
            }

            consumer.ConnectTo(signal);
            provider.ConnectTo(signal);
            return(provider);
        }