Ejemplo n.º 1
0
 public void Inicializar()
 {
     nbIdContador  = 0;
     oidCronograma = Guid.NewGuid();
     tarefas       = new BindingList <CronogramaTarefaGridItem>();
     gerenciador   = new GerenciadorComandos(tarefas);
     CriarTarefas();
 }
Ejemplo n.º 2
0
        public void DeveManterAsOrdensDeAtualizacaoDasTarefasImpactadas()
        {
            /*
             * tarefa 1 movida para posicao 7   * tarefa 2 movida para posicao 9
             * Impactadas                      *Impactadas
             * * * * * *                       * * * * * *
             * 2 -> 1  *                       * 3 -> 1  *
             * 3 -> 2  *                       * 4 -> 2  *
             * 4 -> 3  *                       * 5 -> 3  *
             * 5 -> 4  *                       * 6 -> 4  *
             * 6 -> 5  *                       * 7 -> 5  *
             * 7 -> 6  *                       * 1 -> 6  *
             * 1 -> 7  *                       * 8 -> 7  *
             * * * * * *                       * 9 -> 8  *
             * 8 -> 8                          * 2 -> 9  *
             * 9 -> 9                          * * * * * *
             * 10 -> 10                        * 10 -> 10
             */

            Mock <GerenciadorComandos> gerenciadorMock = new Mock <GerenciadorComandos>(tarefas)
            {
                CallBase = true
            };

            gerenciadorMock.Setup(o => o.CriarTarefaMovida(It.IsAny <Guid>(), It.IsAny <Int16>(),
                                                           It.IsAny <Int16>(), It.IsAny <Dictionary <string, short> >())).Callback(() =>
            {
                if (Thread.CurrentThread.Name == "execucao1")
                {
                    Thread.Sleep(400);
                }
            }).Returns <Guid, Int16, Int16, Dictionary <string, short> >((oidCronogramaTarefaMovida, posicaoInicial, posicaoFinal, tarefasImpactadas) => {
                TarefaMovida t = new TarefaMovida(oidCronogramaTarefaMovida, posicaoInicial, posicaoFinal, tarefasImpactadas);
                return(t);
            });
            gerenciador = gerenciadorMock.Object;

            CronogramaTarefaGridItem tarefa1                     = tarefas[0];
            CronogramaTarefaGridItem tarefa2                     = tarefas[1];
            DateTime dataAtualizacao1                            = DateTime.Now;
            DateTime dataAtualizacao2                            = DateTime.Now.AddSeconds(1);
            CronogramaTarefaGridItem        tarefaFinal1         = tarefas[6];
            CronogramaTarefaGridItem        tarefaFinal2         = tarefas[8];
            Dictionary <string, short>      impactadas1          = new Dictionary <string, short>();
            Dictionary <string, short>      impactadas2          = new Dictionary <string, short>();
            List <CronogramaTarefaGridItem> copiaListaOriginal   = new List <CronogramaTarefaGridItem>(tarefas.Select(o => ClonarTarefa(o)));
            List <CronogramaTarefaGridItem> tarefasOrdemEsperada = new List <CronogramaTarefaGridItem>(tarefas.Select(o => ClonarTarefa(o)));

            tarefasOrdemEsperada[0].NbID = 6;
            tarefasOrdemEsperada[1].NbID = 9;
            tarefasOrdemEsperada[2].NbID = 1;
            tarefasOrdemEsperada[3].NbID = 2;
            tarefasOrdemEsperada[4].NbID = 3;
            tarefasOrdemEsperada[5].NbID = 4;
            tarefasOrdemEsperada[6].NbID = 5;
            tarefasOrdemEsperada[7].NbID = 7;
            tarefasOrdemEsperada[8].NbID = 8;
            tarefasOrdemEsperada[9].NbID = 10;

            // tarefa 1 movida para posicao 7
            impactadas1.Add(tarefas[1].OidCronogramaTarefa.ToString(), (short)tarefas[0].NbID);
            impactadas1.Add(tarefas[2].OidCronogramaTarefa.ToString(), (short)tarefas[1].NbID);
            impactadas1.Add(tarefas[3].OidCronogramaTarefa.ToString(), (short)tarefas[2].NbID);
            impactadas1.Add(tarefas[4].OidCronogramaTarefa.ToString(), (short)tarefas[3].NbID);
            impactadas1.Add(tarefas[5].OidCronogramaTarefa.ToString(), (short)tarefas[4].NbID);
            impactadas1.Add(tarefas[6].OidCronogramaTarefa.ToString(), (short)tarefas[5].NbID);
            impactadas1.Add(tarefas[0].OidCronogramaTarefa.ToString(), (short)tarefas[6].NbID);

            //tarefa 2 movida para posicao 9
            impactadas2.Add(tarefas[2].OidCronogramaTarefa.ToString(), (short)tarefas[0].NbID);
            impactadas2.Add(tarefas[3].OidCronogramaTarefa.ToString(), (short)tarefas[1].NbID);
            impactadas2.Add(tarefas[4].OidCronogramaTarefa.ToString(), (short)tarefas[2].NbID);
            impactadas2.Add(tarefas[5].OidCronogramaTarefa.ToString(), (short)tarefas[3].NbID);
            impactadas2.Add(tarefas[6].OidCronogramaTarefa.ToString(), (short)tarefas[4].NbID);
            impactadas2.Add(tarefas[0].OidCronogramaTarefa.ToString(), (short)tarefas[5].NbID);
            impactadas2.Add(tarefas[7].OidCronogramaTarefa.ToString(), (short)tarefas[6].NbID);
            impactadas2.Add(tarefas[8].OidCronogramaTarefa.ToString(), (short)tarefas[7].NbID);
            impactadas2.Add(tarefas[1].OidCronogramaTarefa.ToString(), (short)tarefas[8].NbID);

            Thread t1 = new Thread(() =>
            {
                gerenciador.CriarComandoMovimentarTarefa(tarefa1.OidCronogramaTarefa, (short)tarefa1.NbID, (short)tarefaFinal1.NbID, impactadas1, dataAtualizacao1);
            })
            {
                Name = "execucao1"
            };

            Thread t2 = new Thread(() =>
            {
                gerenciador.CriarComandoMovimentarTarefa(tarefa2.OidCronogramaTarefa, (short)tarefa1.NbID, (short)tarefaFinal2.NbID, impactadas2, dataAtualizacao2);
            })
            {
                Name = "execucao2"
            };

            t1.Start();
            Thread.Sleep(100);
            t2.Start();
            gerenciador.CriarComandoMovimentarTarefa(tarefa1.OidCronogramaTarefa, (short)tarefa1.NbID, (short)tarefaFinal1.NbID, impactadas1, dataAtualizacao1);
            gerenciador.CriarComandoMovimentarTarefa(tarefa2.OidCronogramaTarefa, (short)tarefa2.NbID, (short)tarefaFinal2.NbID, impactadas2, dataAtualizacao2);

            Dictionary <string, short> ordenacaoEsperada = tarefasOrdemEsperada.ToDictionary(o => o.OidCronogramaTarefa.ToString(), o => (short)o.NbID);

            gerenciador.ExecutarComandosPendentes();
            Dictionary <string, short> ordenacaoAtualTarefas = tarefas.ToDictionary(o => o.OidCronogramaTarefa.ToString(), o => (short)o.NbID);
            int contagemNBids = ordenacaoAtualTarefas.Select(o => o.Value).Distinct().Count();

            ControleDeEsperaUtil.AguardarAte(() =>
            {
                return(contagemNBids == tarefas.Count && (t1.ThreadState == ThreadState.Stopped && t2.ThreadState == ThreadState.Stopped));
            }, 3);
            Assert.AreEqual(tarefas.Count, contagemNBids, "Não deveria possuir nenhum numero repetido");
            CollectionAssert.AreEquivalent(ordenacaoEsperada, ordenacaoAtualTarefas, "As tarefas deveriam se encontrar na ordem esperada");
        }