public void PropertyVisitor_WithMixedAdapters_CanIterate()
        {
            var container = new MixedContainer();
            var visitor   = new TestVisitor("");

            visitor.AddAdapter(new MixedContravariantAdapter(visitor));
            visitor.AddAdapter(new MixedAdapter(visitor));

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Is.EqualTo("AA"));
        }
        public void PropertyVisitor_WithInertAdapter_ContinuesAsExpected()
        {
            var container = new Container();
            var visitor   = new TestVisitor("");

            visitor.AddAdapter(new MixedContravariantAdapter(visitor));
            visitor.AddAdapter(new MixedAdapter(visitor));
            visitor.AddAdapter(new MultiAdapter(visitor));

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Is.EqualTo("IVisit<Container, int>"));
        }
        public void PropertyVisitor_WhenCallingMultipleAdapters_RespectVisitation(bool withAdapters)
        {
            for (var count = 0; count < 10; ++count)
            {
                var container = new Container();
                var visitor   = new TestVisitor("1");

                visitor.AddAdapter(new MultiContinueAdapter(visitor, count, withAdapters));
                visitor.AddAdapter(new MessageAdapter(visitor, "0"));

                PropertyContainer.Accept(visitor, ref container);

                var result = withAdapters ? new string('0', count) : new string('1', count);
                Assert.That(visitor.ToString(), Is.EqualTo(result));
            }
        }
        public void PropertyVisitor_WhenChainingAdapters_RespectVisitation(int count, params VisitStatus[] statuses)
        {
            var container = new Container();

            var expectedHasDefault = true;

            foreach (var status in statuses)
            {
                if (status == VisitStatus.Stop)
                {
                    expectedHasDefault = false;
                    break;
                }

                if (status == VisitStatus.Handled)
                {
                    break;
                }
            }

            var visitor = new TestVisitor(expectedHasDefault ? "0" : "");

            foreach (var status in statuses)
            {
                visitor.AddAdapter(new ChainedAdapter(visitor, status));
            }

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Is.EqualTo(new string('0', count)));
        }
        public void PropertyVisitor_WithContravariantAdapters_CallsMostTyped()
        {
            var container = new ContainerWithInterface();
            var visitor   = new TestVisitor("");

            visitor.AddAdapter(new ContravariantAdapter(visitor));

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Is.EqualTo("ABA"));
        }
        public void PropertyVisitor_WithExcludeAdapter_StopsVisitationWhenRequired()
        {
            var container = new ExcludeContainer();
            var visitor   = new TestVisitor("X");

            visitor.AddAdapter(new ExcludeAdapter(visitor));

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Does.Not.Contain("int"));
            Assert.That(visitor.ToString(), Does.Contain("float"));
        }
        public void PropertyVisitor_WithWrappingAdapter_CallsAdapterAndDefault()
        {
            var container = new Container();
            var visitor   = new TestVisitor("Failure is inevitable");

            visitor.AddAdapter(new WrappingAdapter(visitor));

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(),
                        Is.EqualTo("This sentence: \"Failure is inevitable\" is simply not true"));
        }
        public void PropertyVisitor_WithMultiAdapter_CallsMostTypedAdapter()
        {
            var container = new Container();
            var visitor   = new TestVisitor("Failure");

            visitor.AddAdapter(new MultiAdapter(visitor));

            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Is.EqualTo("IVisit<Container, int>"));
            visitor.Reset();
            PropertyContainer.Accept(visitor, ref container);
            Assert.That(visitor.ToString(), Is.EqualTo("IVisit<Container, int>"));
        }