public void Works_when_adding_argument_from_other_thread_during_consuming_iteration()
        {
            var function = new Func<string, string, string>((x, y) => x + y);
            var sut = new Basic.Appendable(function, "a", "b");
            var wh = new ManualResetEventSlim();
            var e = sut.GetConsumingEnumerable().GetEnumerator();

            IsTrue(e.MoveNext());
            AreEqual("aa", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("ab", e.Current.Function.DynamicInvoke());

            Task.Run(() =>
            {
                sut.Add("c");
                sut.Complete();
                wh.Set();
            });

            if (!wh.Wait(500))
                throw new TimeoutException();

            IsTrue(e.MoveNext());
            AreEqual("ba", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("bb", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("ca", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("cb", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("ac", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("bc", e.Current.Function.DynamicInvoke());
            IsTrue(e.MoveNext());
            AreEqual("cc", e.Current.Function.DynamicInvoke());
            IsFalse(e.MoveNext());
        }
 public void Cancelling_works()
 {
     var function = new Func<string, string, string>((x, y) => x + y);
     var sut = new Basic.Appendable(function, "a", "b");
     var cts = new CancellationTokenSource();
     var e = sut.GetConsumingEnumerable(cts.Token).GetEnumerator();
     IsTrue(e.MoveNext());
     AreEqual("aa", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ab", e.Current.Function.DynamicInvoke());
     sut.Add("c");
     IsTrue(e.MoveNext());
     AreEqual("ba", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ca", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ac", e.Current.Function.DynamicInvoke());
     cts.Cancel();
     IsTrue(e.MoveNext());
     AreEqual("bc", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cc", e.Current.Function.DynamicInvoke());
     IsFalse(e.MoveNext());
 }
 public void Adding_argument_when_invoker_is_completed_has_no_effect()
 {
     var function = new Func<string, string, string>((x, y) => x + y);
     var sut = new Basic.Appendable(function, "a", "b");
     var e = sut.GetConsumingEnumerable().GetEnumerator();
     IsTrue(e.MoveNext());
     AreEqual("aa", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ab", e.Current.Function.DynamicInvoke());
     sut.Add("c");
     sut.Complete();
     sut.Add("d");
     sut.Add("e");
     IsTrue(e.MoveNext());
     AreEqual("ba", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ca", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ac", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bc", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cc", e.Current.Function.DynamicInvoke());
     IsFalse(e.MoveNext());
 }
 public void Works_when_adding_two_arguments_during_consuming_iteration()
 {
     var function = new Func<string, string, string>((x, y) => x + y);
     var sut = new Basic.Appendable(function, "a", "b");
     var e = sut.GetConsumingEnumerable().GetEnumerator();
     IsTrue(e.MoveNext());
     AreEqual("aa", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ab", e.Current.Function.DynamicInvoke());
     sut.Add("c");
     sut.Add("d");
     sut.Complete();
     IsTrue(e.MoveNext());
     AreEqual("ba", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ca", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ac", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bc", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cc", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("da", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("db", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("dc", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ad", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bd", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cd", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("dd", e.Current.Function.DynamicInvoke());
     IsFalse(e.MoveNext());
 }
 public void Works_when_add_argument_during_iteration()
 {
     var function = new Func<string, string, string>((x, y) => x + y);
     var sut = new Basic.Appendable(function, "a", "b");
     var e = sut.GetEnumerator();
     IsTrue(e.MoveNext());
     AreEqual("aa", e.Current.Function.DynamicInvoke());
     sut.Add("c");
     IsTrue(e.MoveNext());
     AreEqual("ab", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ba", e.Current.Function.DynamicInvoke());
     sut.Add("d");
     IsTrue(e.MoveNext());
     AreEqual("bb", e.Current.Function.DynamicInvoke());
     IsFalse(e.MoveNext());
 }
 public void Works_with_two_consecutive_iterations()
 {
     var function = new Func<string, string, string>((x, y) => x + y);
     var sut = new Basic.Appendable(function, "a", "b");
     var e = sut.GetEnumerator();
     IsTrue(e.MoveNext());
     AreEqual("aa", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ab", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ba", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bb", e.Current.Function.DynamicInvoke());
     IsFalse(e.MoveNext());
     e = sut.GetEnumerator();
     sut.Add("c");
     IsTrue(e.MoveNext());
     AreEqual("aa", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ab", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ba", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ca", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cb", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("ac", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("bc", e.Current.Function.DynamicInvoke());
     IsTrue(e.MoveNext());
     AreEqual("cc", e.Current.Function.DynamicInvoke());
     IsFalse(e.MoveNext());
 }