IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Tester l'unicité d'une enum


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Points : 8 140
    Points
    8 140
    Par défaut Tester l'unicité d'une enum
    Bonjour à tous,

    J'aimerais réaliser un test unitaire pour valider l'ensemble de mes enums dans mon programme afin d'éviter qu'à l'intérieur d'une même enum, la même valeur apparaisse 2 fois.

    Certaines de mes enum sont numérotés manuellement et pour éviter toute erreur de développeur, il serait intéressant de les tester dans un test unitaire.

    La méthode simple et de créer un switch statement avec toutes les valeurs de chaque enum, si la valeur apparait 2 fois dans le switch, mon test unitaire aura une erreur à la compilation.

    Le soucis c'est que je ne veux pas à avoir à mettre à jour mon test unitaire à chaque fois que je rajoute une valeur à une de mes enums. Il serait donc bien de pouvoir automatiser la même routine où il suffirait de passer l'enum et le test serait fait pour toutes les valeurs contenues.

    Je me rappel avoir vu une technique sur internet pour le faire mais impossible de retrouver...

    Merci pour votre aide si vous avez une idée !

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par johnlamericain Voir le message
    Bonjour à tous,

    J'aimerais réaliser un test unitaire pour valider l'ensemble de mes enums dans mon programme afin d'éviter qu'à l'intérieur d'une même enum, la même valeur apparaisse 2 fois.
    Impossible. Une valeur d'énumération est forcément différentes de toutes les autres valeurs dans la même énumération. C'est comme ça, tu n'as donc pas besoin de le tester.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Points : 8 140
    Points
    8 140
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Impossible. Une valeur d'énumération est forcément différentes de toutes les autres valeurs dans la même énumération. C'est comme ça, tu n'as donc pas besoin de le tester.
    Tu veux dire que cela n'est pas possible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum Mode
    {
    	Mode_Selection = 1000,
    	Mode_Drag = 1000,
    	Mode_Slice = 2000
    };
    Je ne vois pas en quoi la spécification C++ l'empéche...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Voir l'exemple sur cette page.

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Avec ctags, tu extrais les nom de tous tes enums.
    Ensuite, pour chaque enum, tu testes les n*n(-1) combinaisons pour t'assurer qu'il n'y a pas d'égalité -- ou en itératif après un tri. Par habitude, je ferai ça en perl ou en viml.

    TU ? Nan, c'est un tâche de précompil ça.
    NB: ne pas donner de valeur aux énumérés est une excellente façon pour éviter tout soucis, ce que voulait dire Emmanuel je crois
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par johnlamericain Voir le message
    Tu veux dire que cela n'est pas possible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum Mode
    {
    	Mode_Selection = 1000,
    	Mode_Drag = 1000,
    	Mode_Slice = 2000
    };
    Je ne vois pas en quoi la spécification C++ l'empéche...
    Tu as raison, je me suis enflammé trop vite.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Points : 8 140
    Points
    8 140
    Par défaut
    Citation Envoyé par oodini Voir le message
    Voir l'exemple sur cette page.
    L'exemple sur cette page prouve que c'est possible d'avoir 2 valeurs mais ne m'aide pas sur mon problème. Mon enum contient des centaines de data type, je ne veux pas à avoir à updater un switch statement pour savoir si ça compile toujours.

    Citation Envoyé par Luc Hermitte Voir le message
    Avec ctags, tu extrais les nom de tous tes enums.
    Ensuite, pour chaque enum, tu testes les n*n(-1) combinaisons pour t'assurer qu'il n'y a pas d'égalité -- ou en itératif après un tri. Par habitude, je ferai ça en perl ou en viml.

    TU ? Nan, c'est un tâche de précompil ça.
    NB: ne pas donner de valeur aux énumérés est une excellente façon pour éviter tout soucis, ce que voulait dire Emmanuel je crois
    Est ce qu'il n'y aurait pas un moyen similaire en C++ ?

    J'aimerais bien que mon compilateur détecte cela mais comme c'est valide, aucune détection à la précompil, ou alors j'ai loupé quelque chose.

    Je suis d'accord qu'en général je ne mets pas de valeurs énumérés, mais je suis dans le cas de compatibilité de version entre des projets, si je rajoute une valeur au milieu de mon enum, je ne veux pas casser la compatibilité des projets de l'ancienne version en décalant toutes les enums...

    Mais une erreur humaine est si vite arrivé que je voudrais quand même pouvoir vérifier qu'il n'y a pas de doublon dans mon enum.

    Citation Envoyé par Emmanuel Deloget Voir le message
    Tu as raison, je me suis enflammé trop vite.
    Pas de soucis, il nous arrive à tous de nous tromper, moi le premier

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Il y a peut-être moyen de faire quelque chose avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_cast<Enum>(int pouet)
    , en incrémentant pouet, mais comme un enum peut avoir des "trous"...

    Quoique, en jouant avec sizeof() sur l'ensemble de l'enum, puis en accumulant les sizeof(), tu devrais déduire où t'arrêter dans ton incrémentation.

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    A mon avis, il va être temps de mettre en place cppcheck (ou autres outils d'analyse statique) Si cppcheck ne fait pas cette vérification, tu peux créer tes propres règles. Sinon d'autres outils font cette vérification (source)

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le compilo ne peut pas itérer sur les symboles. C'est pour cela qu'il faut passer par un outil externe qui analyse le code.
    Si je propose ctags, c'est parce que je sais qu'il est déjà capable d'extraire les énumérations d'un enum. Du coup, à partir de là, c'est un jeu d'enfants de finir le boulot dans le langage de script qui nous fait plaisir.

    Maintenant puisque qu'un organisme a décidé d'en faire une règle de qualité (merci gbdivers), il doit y avoir un ou deux outils qui sache déjà le gérer. Typiquement PClint[**], Understand C++ (à vérifier précisément, je sais qu'il font les règles MISRA, pour les CERT[*], j'en suis moins sûr, et je ne connais pas le recouvrement avec les règles MISRA)
    [*] Pour lequel il y a quelques bétises qui trainent -> https://www.securecoding.cert.org/co...pied+to+itself (compliant #1 qui ne devrait même pas être proposé)
    EDIT:
    [**] http://www.gimpel-online.com/MsgRef.html -> message #849
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    C'est une classe Qt?

  12. #12
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Points : 8 140
    Points
    8 140
    Par défaut
    Citation Envoyé par yan Voir le message
    C'est une classe Qt?
    Non, c'est juste des enums dans un fichier.

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par johnlamericain Voir le message
    Non, c'est juste des enums dans un fichier.
    Qt permet de parcourir les enum d'un QObject par introspection...
    A par un outils d'analyse statique; je n'ai pas d'idée :/

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Points : 120
    Points
    120
    Par défaut
    Bonjour

    une solution est possible avec les templates + preprocessor, mais ça demande une organisation de tes enums


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // MyEnumValues.h
    ENUM_VALUE(val1, 1)
    ENUM_VALUE(val2, 2)
    ENUM_VALUE(val3, 2)
    utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum MyEnum
    {
    #define ENUM_VALUE(a,b) a=b,
    #include "MyEnumValues.h"
    #undef ENUM_VALUE
    };
    vérification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<int value> class EnumValueChecker{};
    #define ENUM_VALUE(a,b) template<> class EnumValueChecker<b> {};
    #include "MyEnumValues.h"
    #undef ENUM_VALUE
    si une même valeur est utilisée plus d'une fois, tu auras cette erreur (VS2008) :
    1>d:\enumtt\MyEnumValues.h(3) : error C2766: explicit specialization; 'EnumValueChecker<2>' has already been defined
    1> d:\enumtt\MyEnumValues.h(2) : see previous definition of 'EnumValueChecker<2>'

Discussions similaires

  1. [Débutant] annotation dans le model pour tester l'unicité d'une valeur
    Par mannou87 dans le forum ASP.NET MVC
    Réponses: 9
    Dernier message: 29/05/2013, 17h31
  2. Réponses: 4
    Dernier message: 02/03/2009, 11h09
  3. [VB6] Tester via vb si une table existe
    Par ronald dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 17/04/2003, 16h59
  4. [web] tester la validiter d'une URL
    Par zebiloute dans le forum Web
    Réponses: 4
    Dernier message: 25/11/2002, 17h51
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo