public void TestNegation() { AutoResetEvent autoResetEvent = new AutoResetEvent(false); bool result = false; // Create elements var source = new LogicEmitter(); var filter = new NotGate(); var sink = new LogicActionInvoker(value => { result = value; autoResetEvent.Set(); // wait for processing to finish }); // Build the graph source.AttachOutput(filter); filter.AttachOutput(sink); // Start processing source.StartProcessing(); // Test initial state Assert.IsFalse(result); // Emit and test source.EmitTrue(); autoResetEvent.WaitOne(); Assert.IsFalse(result); // Emit and test source.EmitTrue(); autoResetEvent.WaitOne(); Assert.IsFalse(result); // Emit and test source.EmitFalse(); autoResetEvent.WaitOne(); Assert.IsTrue(result); // Emit and test source.EmitFalse(); autoResetEvent.WaitOne(); Assert.IsTrue(result); // Emit and test source.EmitTrue(); autoResetEvent.WaitOne(); Assert.IsFalse(result); // Emit and test source.EmitFalse(); autoResetEvent.WaitOne(); Assert.IsTrue(result); // Emit and test source.EmitFalse(); autoResetEvent.WaitOne(); Assert.IsTrue(result); // Emit and test source.EmitTrue(); autoResetEvent.WaitOne(); Assert.IsFalse(result); }