public void SeRealizarConsulta1000VezesUtilizandoVarioDeveTrazerResultadoTodasAsVezes()
        {
            var contexto = ContextoHelper.Criar();
            var buscador = contexto.Buscar <ObjetoDeTestes>();

            for (int n = 0; n < 1000; n++)
            {
                var config = buscador.CriarQuery()
                             .DefinirLimite(1)
                             .AdicionarCondicao(s => s.Nome).Igual("Teste A");
                ObjetoDeTestes objeto = null;
                foreach (var item in buscador.Varios(config))
                {
                    objeto = item;
                }

                objeto
                .Should()
                .NotBeNull();

                objeto.Codigo
                .Should()
                .Be(1);
            }
        }
        public void SeConsultarOrdenandoECarregandoPropriedadesDeveCarregarPropriedadesCorretamente()
        {
            var contexto = ContextoHelper.Criar();
            var buscador = contexto.Buscar <ObjetoDeTestes>();

            var config = buscador.CriarQuery()
                         .CarregarPropriedade(o => o.Filhos)
                         .AdicionarCondicao(o => o.Codigo).Entre(1, 2)
                         .AdicionarOrdem(o => o.Codigo);

            var objetos = buscador.Varios(config).ToList();

            objetos.Count
            .Should()
            .Be(2);

            objetos[0].Codigo
            .Should()
            .Be(1);

            objetos[0].Filhos.Count
            .Should()
            .Be(3, "porque deve existir 3 filhos pro primeiro objeto!");

            objetos[1].Codigo
            .Should()
            .Be(2);

            objetos[1].Filhos.Count
            .Should()
            .Be(2, "porque deve existir 2 filhos pro segundo objeto!");
        }
        public void SeConsultarVariosObjetosCarregandoPropriedadePaiDeveTrazerCorretamente()
        {
            var contexto = ContextoHelper.Criar();
            var buscador = contexto.Buscar <FilhoDoObjetoDeTestes>();

            var config = buscador.CriarQuery()
                         .CarregarPropriedade(o => o.Netos)
                         .CarregarPropriedade(o => o.Pai)
                         .AdicionarCondicao(o => o.Id).Entre(4, 5);

            var objetos = buscador.Varios(config).ToList();

            objetos.Count
            .Should()
            .Be(2);

            objetos[0].Pai
            .Should()
            .NotBeNull("porque o pai de indice zero deve ser carregado!");

            objetos[0].Pai.Nome
            .Should()
            .Be("Teste B");

            objetos[1].Netos.Count
            .Should()
            .Be(1, "porque deve existir 1 filho pro segundo objeto!");
        }
        public void SeGerarUmVolumeGrandeDeRegistrosNaoDeveGerarErro()
        {
            var contexto    = ContextoHelper.Criar();
            var repositorio = contexto.Repositorio <ObjetoDeTestes>();

            repositorio.DesativarValidacoes();
            repositorio.SalvarFilhos = false;

            for (int i = 0; i < 1000000; i++)
            {
                var objeto = repositorio.Criar();
                objeto.Codigo = (i + 1) * 2000;
                objeto.Nome   = "Registro " + objeto.Codigo.ToString();
                if (objeto.Nome.Length % 3 == 0)
                {
                    objeto.Nome += "!";
                }
                objeto.Duplo    = objeto.Codigo / 100.0 + 0.1;
                objeto.Decimal  = objeto.Codigo / 200.0M + 0.2M;
                objeto.Logico   = (i % 2 == 0);
                objeto.DataHora = DateTime.Now;
                repositorio.Inserir(objeto);
            }

            // contexto.Salvar();
        }
        public void SeRealizarConsultaDeUmObjeto10000VezesUtilizandoConsultarDeveDurarMenosQueCincoSegundos()
        {
            var tempo = new Stopwatch();

            tempo.Start();

            Parallel.For(0, 10_000, n =>
            {
                using (var contexto = ContextoHelper.Criar())
                {
                    var repositorio = contexto.Repositorio <ObjetoDeTestes>();
                    var objeto      = repositorio.Consultar(1);

                    objeto
                    .Should()
                    .NotBeNull();

                    objeto.Codigo
                    .Should()
                    .Be(1);
                }
            });

            tempo.Stop();
            tempo.ElapsedMilliseconds
            .Should()
            .BeLessOrEqualTo(1000 * 5);
        }
        public void SeRealizarConsultaScalar100MilVezesUtilizandoConsultarDeveDurarMenosQueCincoSegundos()
        {
            var tempo = new Stopwatch();

            tempo.Start();

            Parallel.For(0, 100_000, n =>
            {
                using (var contexto = ContextoHelper.Criar())
                {
                    var repositorio = contexto.Repositorio <ObjetoDeTestes>();
                    var consulta    = repositorio.Buscar.CriarQuery();
                    consulta.AdicionarCondicao(o => o.Codigo).Igual(1);
                    consulta.AdicionarResultado(o => o.Nome);
                    var objeto = repositorio.Buscar.Scalar(consulta);

                    objeto
                    .Should()
                    .NotBeNull();

                    objeto
                    .Should()
                    .Be("Teste A");
                }
            });

            tempo.Stop();
            tempo.ElapsedMilliseconds
            .Should()
            .BeLessOrEqualTo(1000 * 5);
        }
        public void SeAcessarRepositorioDezMilhoesDeVezesDeveRetornarRepositorioValido()
        {
            var contexto = ContextoHelper.Criar();

            contexto.Repositorio <NetoDoObjetoDeTestes>();
            contexto.Repositorio <FilhoDoObjetoDeTestes>();
            contexto.Repositorio <FilhoMistoDoObjetoDeTestes>();
            var primeiraInstancia = contexto.Repositorio <ObjetoDeTestes>();

            for (int i = 0; i < 10_000_000; i++)
            {
                var repositorio = contexto.Repositorio <ObjetoDeTestes>();
                repositorio
                .Should()
                .Be(primeiraInstancia);
            }
        }
        public void SeRealizarConsulta1000VezesUtilizandoConsultarDeveTrazerResultadoTodasAsVezes()
        {
            var contexto    = ContextoHelper.Criar();
            var repositorio = contexto.Repositorio <ObjetoDeTestes>();

            for (int n = 0; n < 1000; n++)
            {
                ObjetoDeTestes objeto = repositorio.Consultar(1);

                objeto
                .Should()
                .NotBeNull();

                objeto.Codigo
                .Should()
                .Be(1);
            }
        }
        public void SeRealizarConsulta1000VezesUtilizandoUmDeveTrazerResultadoTodasAsVezes()
        {
            var contexto = ContextoHelper.Criar();
            var buscador = contexto.Buscar <ObjetoDeTestes>();

            for (int n = 0; n < 1000; n++)
            {
                var config = buscador.CriarQuery()
                             .AdicionarCondicao(s => s.Nome).Igual("Teste A");
                var objeto = buscador.Um(config);
                objeto
                .Should()
                .NotBeNull();

                objeto.Codigo
                .Should()
                .Be(1);
            }
        }