public void Without_IoC_Tecture_Choses_Parameterless_Constructor()
        {
            var tb      = new TectureBuilder();
            var tecture = tb.Build();

            tecture.Let <TestService1>().Action();
        }
        public void Trace_Can_Describe_Default_Commands()
        {
            var tb      = new TectureBuilder();
            var tecture = tb.Build();

            tecture.BeginTrace();

            tecture.Let <Service2>().Action();
            tecture.Save();

            var trace = tecture.EndTrace();

            var          explanation         = trace.Explain();
            const string expectedExplanation =
                @"    1.  [ { ]  Test Cycle
    2.  [// ]  Test
    3.  [ + ]  Loop iteration
    4.  [// ]  Test
    5.  [ + ]  Loop iteration
    6.  [// ]  Test
    7.  [ + ]  Loop iteration
    8.  [ } ]  Test Cycle
    9.  [ <-]  Save
    10.  [// ]  <<< Finally block >>>
    11.  [// ]  <<< End of Finally block >>>
    12.  [ ! ]  End
";

            Assert.Equal(expectedExplanation, explanation);
        }
예제 #3
0
        public void Tecture_Ensures_Single_Instance_Of_Services()
        {
            var tb = new TectureBuilder();

            using (var tecture = tb.Build())
            {
                var s1 = tecture.Let <SaveFinallyService>();
                var s2 = tecture.Let <SaveFinallyService>();
                Assert.True(object.ReferenceEquals(s1, s2));
            }
        }
예제 #4
0
        public void Tecture_Calls_Dispose_On_All_Services_When_Being_Disposed_Itself()
        {
            var tb = new TectureBuilder();

            using (var tecture = tb.Build())
            {
                tecture.Let <DisposeService>().Action();
            }

            Assert.Equal(1, DisposeService.Disposed);
        }
예제 #5
0
        public void Service_Must_Contain_AtLeast_One_Private_Constructor()
        {
            var tb      = new TectureBuilder();
            var tecture = tb.Build();

            Assert.Throws <MissingMethodException>(() =>
            {
                tecture.Let <TestService1>().Action();
            });

            tecture.Let <TestService2>().Action();
        }
예제 #6
0
        public void Tecture_Calls_Init_Exactly_Once_For_Each_Service_In_Instance()
        {
            var tb = new TectureBuilder();

            using (var tecture = tb.Build())
            {
                tecture.Let <InitService>().Action();
                tecture.Let <InitService>().Action();
            }

            Assert.Equal(1, InitService.Initialized);
        }
        private ITecture Configure()
        {
            var tb = new TectureBuilder();

            CommandAspect = new Aspect101.Command();

            tb.WithChannel <Test>(x =>
            {
                x.ForCommand(CommandAspect);
                x.ForQuery(new Aspect101.Query());
            });
            tb.WithExceptionHandler(e => true);
            return(tb.Build());
        }
예제 #8
0
        public void General_Tecture_Setup_Test()
        {
            var tb = new TectureBuilder();

            tb.WithChannel <Test>(x =>
            {
                x.ForCommand(new Aspect101.Command());
                x.ForQuery(new Aspect101.Query());
            });

            var tecture = tb.Build();

            tecture.Let <Service>().Action();
            tecture.Save();
        }
예제 #9
0
        private TectureBuilder Configure(bool fake)
        {
            TectureBuilder tb = new TectureBuilder();

            tb.WithChannel <Db>(c =>
            {
                LazyDisposable <ToyFactoryDbContext> ld = fake
                    ? LazyDisposable <ToyFactoryDbContext> .Default()
                    : new LazyDisposable <ToyFactoryDbContext>(() => new ToyFactoryDbContext());

                c.UseEfCoreOrm(ld);
                c.UseEfCoreDirectSql(ld);
            });
            return(tb);
        }
        private TectureBuilder Configure(bool fake)
        {
            TectureBuilder tb = new TectureBuilder();

            tb.WithChannel <Db>(c =>
            {
                LazyDisposable <ToyFactoryDbContext> ld = fake
                    ? LazyDisposable <ToyFactoryDbContext> .Default()
                    : new LazyDisposable <ToyFactoryDbContext>(() => new ToyFactoryDbContext());

                c.UseEfCoreOrm(ld);
                c.UseEfCoreDirectSql(ld, new MariaInterpolation());
            });
            tb.WithChannel <Logic.Channels.System>(x => x.UseDateTime());
            return(tb);
        }
예제 #11
0
        public void Comment_Command_Works()
        {
            var tb      = new TectureBuilder();
            var tecture = tb.Build();

            tecture.BeginTrace();

            tecture.Let <Service>().Action();
            tecture.Save();

            var trace = tecture.EndTrace();

            Assert.Equal(5, trace.All.Count());
            var cmd = trace.All.FirstOrDefault() as Comment;

            Assert.NotNull(cmd);
        }
예제 #12
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddTransient <ToyFactoryDbContext>();
            services.AddTransient(sp =>
            {
                ILazyDisposable <ToyFactoryDbContext> ld = new LazyDisposable <ToyFactoryDbContext>(() => sp.GetService <ToyFactoryDbContext>());

                var tb = new TectureBuilder();
                tb.WithChannel <Db>(c =>
                {
                    c.UseEfCoreOrm(ld);
                    c.UseEfCoreDirectSql(ld);
                });

                return(tb.Build());
            });
        }
예제 #13
0
        public void Tecture_Returns_Specified_Query_Aspect_On_Aspect_Call()
        {
            var tb            = new TectureBuilder();
            var commandAspect = new Aspect101.Command();
            var queryAspect   = new Aspect101.Query();

            tb.WithChannel <Test>(x =>
            {
                x.ForCommand(commandAspect);
                x.ForQuery(queryAspect);
            });

            var tecture = tb.Build();

            Assert.Equal(commandAspect, tecture.Let <Service2>().GetTestCommandAspect());
            Assert.Equal(commandAspect, tecture.Let <Service2>().GetTestCommandAspect());

            Assert.Equal(queryAspect, tecture.Let <Service2>().GetTestQueryAspect());
            Assert.Equal(queryAspect, tecture.Let <Service2>().GetTestQueryAspect());
        }
예제 #14
0
        public void IoC_Resolver_Works_As_Expected()
        {
            var tb = new TectureBuilder();

            var dependencyMock = new Mock <TestService1.IDependency>();

            tb.WithIoc(x =>
            {
                if (x == typeof(TestService1.IDependency))
                {
                    return(dependencyMock.Object);
                }
                throw new XunitException("Invalid type provided for IoC call");
            });


            var tecture = tb.Build();

            tecture.Let <TestService1>().Action();

            dependencyMock.Verify(x => x.Action(), Times.Once);
        }
예제 #15
0
        public void Tecture_Calls_OnSave_Every_Save_And_Calls_Finally_When_SaveChain_Ends()
        {
            var tb = new TectureBuilder();
            SaveFinallyService sfs = null;

            using (var tecture = tb.Build())
            {
                sfs = tecture.Let <SaveFinallyService>();
                tecture.Let <SaveFinallyService>().Action();
                tecture.Save();

                tecture.Let <SaveFinallyService>().Action();
                tecture.Save();
            }

            Assert.Equal(4, sfs.Counter);
            Assert.Equal(2, sfs.SaveCount);
            Assert.Equal(2, sfs.FinallyCount);
            // and does not call async saves!
            Assert.Equal(0, sfs.SaveAsyncCount);
            Assert.Equal(0, sfs.FinallyAsyncCount);
        }
예제 #16
0
        public async Task Tecture_Invokes_Save_For_Commands_Enqueued_ASYNC()
        {
            var tb = new TectureBuilder();

            var commandAspect = new Aspect101.Command();

            tb.WithChannel <Test>(x =>
            {
                x.ForCommand(commandAspect);
                x.ForQuery(new Aspect101.Query());
            });

            var tecture = tb.Build();

            const string parameter = "AAA";

            tecture.Let <Service>().Action(parameter);
            await tecture.SaveAsync();

            Assert.NotNull(commandAspect.TestRunnerInstance);
            Assert.Single(commandAspect.TestRunnerInstance.CommandsRunAsync);
            Assert.Empty(commandAspect.TestRunnerInstance.CommandsRun);
            Assert.Equal(parameter, commandAspect.TestRunnerInstance.CommandsRunAsync[0].Payload);
        }
예제 #17
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddTransient <ToyFactoryDbContext>();
            services.AddTransient(sp =>
            {
                var ld = new LazyDisposable <ToyFactoryDbContext>(() =>
                {
                    var dc = sp.GetService <ToyFactoryDbContext>();
                    dc.ChangeTracker.AutoDetectChangesEnabled = false;
                    return(dc);
                });

                var tb = new TectureBuilder();

                tb.WithChannel <Db>(c =>
                {
                    c.UseEfCoreOrm(ld);
                    c.UseEfCoreDirectSql(ld);
                });

                return(tb.Build());
            });
        }
예제 #18
0
        public void Tecture_Tries_To_Find_Appropriate_Constructor_For_IoC()
        {
            {
                var tb = new TectureBuilder();
                var dependency1Mock = new Mock <TestService2.IDependency1>();
                tb.WithIoc(x =>
                {
                    if (x == typeof(TestService2.IDependency1))
                    {
                        return(dependency1Mock.Object);
                    }
                    throw new XunitException("Invalid type provided for IoC call");
                });
                var tecture = tb.Build();

                tecture.Let <TestService2>().Action();

                dependency1Mock.Verify(x => x.Action(), Times.Once);
            }

            {
                var tb = new TectureBuilder();
                var dependency2Mock = new Mock <TestService2.IDependency2>();
                tb.WithIoc(x =>
                {
                    if (x == typeof(TestService2.IDependency2))
                    {
                        return(dependency2Mock.Object);
                    }
                    throw new XunitException("Invalid type provided for IoC call");
                });
                var tecture = tb.Build();

                tecture.Let <TestService2>().Action();

                dependency2Mock.Verify(x => x.Action(), Times.Once);
            }

            {
                var tb = new TectureBuilder();
                var dependency1Mock = new Mock <TestService2.IDependency1>();
                var dependency2Mock = new Mock <TestService2.IDependency2>();
                tb.WithIoc(x =>
                {
                    if (x == typeof(TestService2.IDependency1))
                    {
                        return(dependency1Mock.Object);
                    }
                    if (x == typeof(TestService2.IDependency2))
                    {
                        return(dependency2Mock.Object);
                    }
                    throw new XunitException("Invalid type provided for IoC call");
                });
                var tecture = tb.Build();

                tecture.Let <TestService2>().Action();

                dependency1Mock.Verify(x => x.Action(), Times.Once);
                dependency2Mock.Verify(x => x.Action(), Times.Once);
            }
        }