public void Deve_ordenar_um_vetor_usando_bubbleSorte()
        {
            var vetor    = CollectionsUtils.GerarListaAleatoria(10, 1, 10);
            var esperado = vetor.ToList();

            esperado.Sort();

            BubbleSort.Execute(vetor);

            Assert.Equal(vetor, esperado.ToArray());
        }
Example #2
0
        /// <summary>
        /// Lance l'import.
        /// </summary>
        /// <param name="ShouldEraseBase"><c>true</c> si la base doit être supprimée avant l'import.</param>
        private async Task PerformImport(bool ShouldEraseBase)
        {
            var ChosenFilePath = PathChoosedFile.Text;

            if (ChosenFilePath.Length != 0)
            {
                try
                {
                    var Anomalies = new Dictionary <int, string>();
                    var ExistingArticlesCountByRef = new Dictionary <string, int>();
                    var ArticlesDtosRead           = new List <ArticlesDto>();

                    //On ne donne pas d'étape de chargement pour la lecture du fichier.
                    ImportProgress.Style = ProgressBarStyle.Marquee;
                    ImportProgress.MarqueeAnimationSpeed = 30;
                    ImportProgress.Maximum = 100;
                    StatusText.Text        = "Lecture du fichier en cours...";
                    ReadFile(ChosenFilePath, ExistingArticlesCountByRef, Anomalies, ArticlesDtosRead);

                    //Si des anomalies sont présentes dans le fichier on demande une confirmation.
                    if (Anomalies.Count > 0)
                    {
                        var AnomaliesErrors = new StringBuilder();
                        foreach (var Anomaly in Anomalies)
                        {
                            AnomaliesErrors.Append($" - Line {Anomaly.Key} : {Anomaly.Value}\n");
                        }
                        StatusText.Text = "Résolution des annomalies...";
                        var ConfirmResult = MessageBox.Show("Il y a " + Anomalies.Count +
                                                            " anomalies dans le fichier d'import, ces articles ne seront pas importés :\n" +
                                                            AnomaliesErrors + "\n Voulez vous annuler l'opération ?",
                                                            "Annomalies détéctées",
                                                            MessageBoxButtons.OKCancel);
                        if (ConfirmResult == DialogResult.Cancel)
                        {
                            StatusText.Text = "Import annulé";
                            DialogResult    = DialogResult.Cancel;
                            return;
                        }
                    }

                    //On remet la barre de chargement à 0 en mode pas à pas.
                    StatusText.Text        = "Calcul des données à créer...";
                    ImportProgress.Style   = ProgressBarStyle.Continuous;
                    ImportProgress.Maximum = ArticlesDtosRead.Count;
                    ImportProgress.Minimum = 0;
                    ImportProgress.Value   = 0;

                    //Les données à sauvegarder.
                    var NewBrands      = new Dictionary <string, Marques>();
                    var NewFamilies    = new Dictionary <string, Family>();
                    var NewSubFamilies = new Dictionary <string, SubFamily>();

                    //les articles à sauvegarder sous la forme de couple <reference, <Nouvelle donnée, doublon>>.
                    var NewArticles = new Dictionary <string, Pair <Articles, Articles> >();

                    //dédoublonnage étape 1 : doublon de familles / sous-familles et marques.
                    if (!ShouldEraseBase)
                    {
                        //comme la base n'a pas été encore touchée, on peut encore annuler.
                        if (FindDuplicates(ArticlesDtosRead, NewFamilies, NewBrands, NewSubFamilies))
                        {
                            return;
                        }
                    }

                    var ArticleNameSakeCount = 0;

                    //calcul des doublons d'articles
                    foreach (var ArticleDto in ArticlesDtosRead)
                    {
                        //barre de chargement.
                        ImportProgress.Value += 1;

                        Articles ArticleNameSake;
                        if (ShouldEraseBase)
                        {
                            ArticleNameSake = null;
                        }
                        else
                        {
                            ArticleNameSake = ArticleDao.GetArticleById(ArticleDto.ArticleRef);
                        }
                        if (ArticleNameSake != null)
                        {
                            ArticleNameSakeCount++;
                        }
                        NewArticles.Add(ArticleDto.ArticleRef, new Pair <Articles, Articles>(null, ArticleNameSake));
                    }

                    var NamesakeStrategyChosen = NamesakeStrategy.Ignore;

                    if (ShouldEraseBase)
                    {
                        DaoRegistry.GetInstance.ClearAll();
                    }
                    else
                    {
                        //S'il y a des doublons.
                        if (ArticleNameSakeCount > 0)
                        {
                            //on choisi la stratégie de dédoublonnage, comme la base n'a pas été encore touchée,
                            //c'est le dernier moment pour annuler.
                            if (ChooseNameSakeStategy(ArticleNameSakeCount, ref NamesakeStrategyChosen))
                            {
                                return;
                            }

                            // on onleve les doublons de la liste des articles à sauvegarder
                            if (NamesakeStrategyChosen == NamesakeStrategy.Ignore)
                            {
                                var KeysToRemove = new List <string>();
                                foreach (var ArticleNameSakePair in NewArticles)
                                {
                                    if (ArticleNameSakePair.Value.Second != null)
                                    {
                                        KeysToRemove.Add(ArticleNameSakePair.Key);
                                    }
                                }
                                foreach (var Key in KeysToRemove)
                                {
                                    NewArticles.Remove(Key);
                                }
                            }
                        }
                    }

                    foreach (var NewArticleRef in new List <string>(NewArticles.Keys))
                    {
                        var ArticlesDto = ArticlesDtosRead.Find(ArticleDto => ArticleDto.ArticleRef.Equals(NewArticleRef));
                        //résolution des dépendances des Marques.
                        var Marque = CollectionsUtils.GetOrCreate(NewBrands, ArticlesDto.BrandName,
                                                                  () => new Marques(null, ArticlesDto.BrandName));

                        //résolution des dépendances des Familles.
                        var Famille = CollectionsUtils.GetOrCreate(NewFamilies, ArticlesDto.FamilyName,
                                                                   () => new Family(null, ArticlesDto.FamilyName));

                        //résolution des dépendances des Sous-Familles.
                        var SousFamille = CollectionsUtils.GetOrCreate(NewSubFamilies, ArticlesDto.SubFamilyName,
                                                                       () => new SubFamily(null, Famille, ArticlesDto.SubFamilyName));
                        if (NewArticles.TryGetValue(NewArticleRef, out var ArticleNameSakePair))
                        {
                            ArticleNameSakePair.First = new Articles(ArticlesDto.ArticleRef, ArticlesDto.Description,
                                                                     SousFamille, Marque, ArticlesDto.Price, 0);
                        }
                    }

                    //On enregistre les données.
                    await SaveImportedData(NewBrands, NewFamilies, NewSubFamilies, NewArticles, NamesakeStrategyChosen);

                    StatusText.Text = "Import terminé";

                    //On affiche le rapport d'import.
                    MessageBox.Show("Import terminé :\n" +
                                    NewBrands.Values.Count + " nouvelles marques \n" +
                                    NewFamilies.Values.Count + " nouvelles familles \n" +
                                    NewSubFamilies.Values.Count + " nouvelles sous-familles\n" +
                                    NewArticles.Count + " nouveaux articles \n",
                                    "Import terminé avec succés.",
                                    MessageBoxButtons.OK);
                    DialogResult = DialogResult.OK;
                    Close();
                }
                catch (Exception Exception)
                {
                    Console.WriteLine(Exception.ToString());
                    MessageBox.Show(Exception.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Veuillez choisir un fichier", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }