Пример #1
0
            public void TestSwitchSValuesLoop()
            {
                DiscreteCellStreamSink <IReadOnlyList <TestObject> > streamSink = new DiscreteCellStreamSink <IReadOnlyList <TestObject> >();
                DiscreteCell <IReadOnlyList <TestObject> >           cell       = Transaction.Run(() =>
                {
                    DiscreteCellLoop <IReadOnlyList <TestObject> > cellLoop = new DiscreteCellLoop <IReadOnlyList <TestObject> >();
                    DiscreteCell <IReadOnlyList <TestObject> > cellLocal    = streamSink.Map <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => _ => v)
                                                                              .Merge(cellLoop.Map(oo => oo.Select(o => o.Output).Lift(vv => vv.Sum()).Values).SwitchS().Filter(sum => sum < 50).MapTo <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => v.Concat(new[] { new TestObject() }).ToArray()), (f, g) => v => g(f(v)))
                                                                              .Snapshot(cellLoop, (f, v) => f(v))
                                                                              .Hold(Enumerable.Range(1, 10).Select(_ => new TestObject()).ToArray());
                    cellLoop.Loop(cellLocal);
                    return(cellLocal);
                });

                List <int> objectCounts = new List <int>();

                objectCounts.Add(-1);
                cell.Listen(vv => objectCounts.Add(vv.Count));
                objectCounts.Add(-1);
                cell.Cell.Sample()[2].Input1.Send(1);
                objectCounts.Add(-1);
                cell.Cell.Sample()[1].Input1.Send(-20);
                objectCounts.Add(-1);
                streamSink.Send(new TestObject[0]);
                objectCounts.Add(-1);

                // Ideal result, likely not achievable.
                //CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 15, -1, 10, -1 }, objectCounts);

                // Glitchy result, also not returned by this method.
                //CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 12, 13, 14, 15, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1 }, objectCounts);

                // Incorrect result we will see.
                CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 12, -1, 0, -1 }, objectCounts);
            }
Пример #2
0
            public void TestSwitchCLoop()
            {
                Exception actual = null;

                try
                {
                    DiscreteCellStreamSink <IReadOnlyList <TestObject> > streamSink = new DiscreteCellStreamSink <IReadOnlyList <TestObject> >();
                    DiscreteCell <IReadOnlyList <TestObject> >           cell       = Transaction.Run(() =>
                    {
                        DiscreteCellLoop <IReadOnlyList <TestObject> > cellLoop = new DiscreteCellLoop <IReadOnlyList <TestObject> >();
                        DiscreteCell <IReadOnlyList <TestObject> > cellLocal    = streamSink.Map <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => _ => v)
                                                                                  .Merge(cellLoop.Map(oo => oo.Select(o => o.Output).Lift(vv => vv.Sum())).SwitchC().Updates.Filter(sum => sum < 50).MapTo <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => v.Concat(new[] { new TestObject() }).ToArray()), (f, g) => v => g(f(v)))
                                                                                  .Snapshot(cellLoop, (f, v) => f(v))
                                                                                  .Hold(Enumerable.Range(1, 10).Select(_ => new TestObject()).ToArray());
                        cellLoop.Loop(cellLocal);
                        return(cellLocal);
                    });

                    List <int> objectCounts = new List <int>();
                    objectCounts.Add(-1);
                    cell.Listen(vv => objectCounts.Add(vv.Count));
                    objectCounts.Add(-1);
                    cell.Cell.Sample()[2].Input1.Send(1);
                    objectCounts.Add(-1);
                    cell.Cell.Sample()[1].Input1.Send(-20);
                    objectCounts.Add(-1);
                    streamSink.Send(new TestObject[0]);
                    objectCounts.Add(-1);
                }
                catch (AggregateException e)
                {
                    actual = e.InnerExceptions.FirstOrDefault(ex => ex.Message == "A dependency cycle was detected.");
                }
                catch (Exception e)
                {
                    actual = e;
                }

                Assert.IsNotNull(actual);
                Assert.AreEqual("A dependency cycle was detected.", actual.Message);
            }