pmd-fortran: externalize test source file

This commit is contained in:
Andreas Dangel
2016-12-02 09:29:14 +01:00
parent c2467b683f
commit 2d314fde90
2 changed files with 173 additions and 128 deletions

View File

@ -5,11 +5,12 @@
package net.sourceforge.pmd.cpd;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.testframework.AbstractTokenizerTest;
/**
@ -20,134 +21,14 @@ public class FortranTokenizerTest extends AbstractTokenizerTest {
@Before
@Override
public void buildTokenizer() {
public void buildTokenizer() throws IOException {
this.tokenizer = new FortranTokenizer();
this.sourceCode = new SourceCode(new SourceCode.StringCodeLoader(this.getSampleCode(), "sample.for"));
}
@Override
public String getSampleCode() {
return " options/extend_source" + PMD.EOL + " program tp3" + PMD.EOL + " implicit none"
+ PMD.EOL + "" + PMD.EOL
+ "! Ce programme va demander la saisie de la commande, puis on va separer les differentes" + PMD.EOL
+ "!parties de la chaine en plusieurs variables, ensuite selon l'action demandee on appelera le"
+ PMD.EOL + "!sous programme correspondant." + PMD.EOL + "" + PMD.EOL + " character*60 COMMANDE"
+ PMD.EOL + " integer*4 IOS," + PMD.EOL + " 1 COMPTEUR," + PMD.EOL
+ " 1 SORTIE," + PMD.EOL + " 1 ERRONE," + PMD.EOL + " 1 CONF,"
+ PMD.EOL + " 1 POSITION_ESPACE," + PMD.EOL + " 1 DEBUT_MOT," + PMD.EOL
+ " 1 FIN_MOT," + PMD.EOL + " 1 NB_MOTS," + PMD.EOL
+ " 1 NB_MOTS_MAX," + PMD.EOL + " 1 FIN_CHAINE," + PMD.EOL
+ " 1 TROUVER_FIN," + PMD.EOL + " 1 NUM_CARACTERE," + PMD.EOL
+ " 1 ACTION," + PMD.EOL + " 1 PREMIERE_LETTRE," + PMD.EOL
+ " 1 DERNIERE_LETTRE," + PMD.EOL + " 1 INTERVALLE_MAJ_MIN," + PMD.EOL
+ " 1 APRES_MAJ," + PMD.EOL + " 1 TAILLE_COLONNE," + PMD.EOL
+ " 1 TAILLE_LIGNE," + PMD.EOL + " 1 LIGNES_DESC" + PMD.EOL + "" + PMD.EOL
+ " parameter(NB_MOTS_MAX = 9) !une saisie correcte ne contient pas plus de 8 mots, si" + PMD.EOL
+ "!elle en contient 9, alors la saisie sera jugee incorrecte." + PMD.EOL
+ " parameter(ERRONE = 1)" + PMD.EOL + " parameter(SORTIE = - 1)" + PMD.EOL
+ " parameter(ACTION = 1) !il s'agit du 1er mot de la chaine de caracteres" + PMD.EOL
+ " parameter(PREMIERE_LETTRE = 1) !correspond a la 1ere lettre d'un mot" + PMD.EOL
+ " parameter(DERNIERE_LETTRE = 18) !correspond a la derniere lettre d'un mot" + PMD.EOL
+ " parameter(INTERVALLE_MAJ_MIN = 32) !nombre separant un meme caractere" + PMD.EOL
+ "!minuscule de son majuscule" + PMD.EOL
+ " parameter(APRES_MAJ = 96) !correspond au dernier caractere avant les MIN" + PMD.EOL
+ " parameter(TAILLE_COLONNE = 7)" + PMD.EOL + " parameter(TAILLE_LIGNE = 12)" + PMD.EOL
+ " parameter(LIGNES_DESC = 11)" + PMD.EOL + "" + PMD.EOL
+ " character*19 N(TAILLE_COLONNE,TAILLE_LIGNE)" + PMD.EOL
+ " character*19 MOTS_COMMANDE(NB_MOTS_MAX)" + PMD.EOL + " character*60 DESC(LIGNES_DESC)"
+ PMD.EOL + "" + PMD.EOL + " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' -----------------------------------------------------'" + PMD.EOL
+ " write(*,*) ' | Bonjour, et bienvenue dans le programme DASHBOARD |'" + PMD.EOL
+ " write(*,*) ' -----------------------------------------------------'" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL + " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' Voici un rappel des fonctions disponibles pour ce DASHBOARD : '" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' _ TASK pour creer une tache (ex : TASK IDTACHE CIBLE AUTEUR)'" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' _ SHOW pour voir la description (ex : SHOW IDTACHE)'" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' _ REMOVE pour enlever une tache (ex : REMOVE IDTACHE)'" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' _ CLEAR pour effacer le DASHBOARD (ex : CLEAR)'" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) ' _ CANCEL, DONE, TODO pour modifier lHEREetat de la tache (ex : DONE IDTACHE)'"
+ PMD.EOL + " write(*,*) ' '" + PMD.EOL + "" + PMD.EOL
+ "! La boucle de sortie pour quitter si l'on appuie sur F10" + PMD.EOL
+ " do while (IOS .ne. SORTIE)" + PMD.EOL + "" + PMD.EOL
+ "! Initialisons les variables, afin de ne pas garder les anciennes valeurs pour chaque variable."
+ PMD.EOL + " POSITION_ESPACE = 0" + PMD.EOL + " DEBUT_MOT = 0" + PMD.EOL
+ " FIN_MOT = 0" + PMD.EOL + " NB_MOTS = 0" + PMD.EOL
+ " FIN_CHAINE = 0" + PMD.EOL + "" + PMD.EOL
+ "! Initialisons aussi le tableau des MOTS_COMMANDE" + PMD.EOL
+ " do COMPTEUR = ACTION, NB_MOTS_MAX" + PMD.EOL
+ " MOTS_COMMANDE (COMPTEUR) = ' '" + PMD.EOL + " end do" + PMD.EOL
+ "" + PMD.EOL + "! Appelons le sous prgramme qui gere la saisie de la commande et aussi la sortie, si "
+ PMD.EOL + "!l'utilisateur le demande" + PMD.EOL + " call SAISIE(COMMANDE, IOS)"
+ PMD.EOL + "" + PMD.EOL + " if (IOS .eq. 0) then" + PMD.EOL + "" + PMD.EOL
+ "! Trouvons la fin de la chaine" + PMD.EOL
+ " FIN_CHAINE = TROUVER_FIN (COMMANDE)" + PMD.EOL
+ " COMPTEUR = 1" + PMD.EOL
+ " do while (POSITION_ESPACE .lt. FIN_CHAINE .and. NB_MOTS .lt. NB_MOTS_MAX)"
+ PMD.EOL + " DEBUT_MOT = POSITION_ESPACE + 1" + PMD.EOL + "" + PMD.EOL
+ "! Decoupons les mots" + PMD.EOL
+ " POSITION_ESPACE = POSITION_ESPACE + index (COMMANDE (DEBUT_MOT:), ' ')"
+ PMD.EOL + " FIN_MOT = POSITION_ESPACE - 1" + PMD.EOL + "" + PMD.EOL
+ "! Ensuite on les enregistre dans MOTS_COMMANDE" + PMD.EOL
+ " MOTS_COMMANDE (COMPTEUR) = COMMANDE (DEBUT_MOT : FIN_MOT)" + PMD.EOL
+ "" + PMD.EOL + "! Comptons les mots" + PMD.EOL
+ " if (MOTS_COMMANDE (COMPTEUR) .ne. ' ') then" + PMD.EOL
+ " NB_MOTS = NB_MOTS + 1" + PMD.EOL
+ " COMPTEUR = COMPTEUR + 1" + PMD.EOL
+ " end if" + PMD.EOL + " end do" + PMD.EOL + ""
+ PMD.EOL + "! Le programme ne doit pas tenir compte de la casse, ainsi peu importe la maniere"
+ PMD.EOL + "!dont est ecrit le mot, il sera mis en majuscule" + PMD.EOL
+ " do COMPTEUR = 1, NB_MOTS" + PMD.EOL
+ " do NUM_CARACTERE = PREMIERE_LETTRE, DERNIERE_LETTRE" + PMD.EOL
+ " if (ichar(MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE))"
+ PMD.EOL + " 1 .gt. APRES_MAJ) then" + PMD.EOL
+ " MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE) ="
+ PMD.EOL
+ " 1 char(ichar(MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE)) - INTERVALLE_MAJ_MIN)"
+ PMD.EOL + " end if" + PMD.EOL
+ " end do" + PMD.EOL + " end do" + PMD.EOL + ""
+ PMD.EOL + "!! Affichons les mots (provisoire)" + PMD.EOL
+ "!! do COMPTEUR = 1, NB_MOTS" + PMD.EOL
+ "!! write(*,*) COMPTEUR, ': ', MOTS_COMMANDE (COMPTEUR)" + PMD.EOL
+ "!! end do" + PMD.EOL + "!!" + PMD.EOL
+ "!! Testons si le mot est bien en majuscule (etape provisoire)" + PMD.EOL
+ "!! write(*,*) MOTS_COMMANDE (ACTION), ': voila lHEREaction'" + PMD.EOL + ""
+ PMD.EOL + "" + PMD.EOL + "! Si la commande contient plus de 8 mots, on demande de recommencer"
+ PMD.EOL + "" + PMD.EOL + " if (NB_MOTS .eq. NB_MOTS_MAX) then" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) 'ERR> Trop de mot, veuillez ressaisir'" + PMD.EOL
+ " else" + PMD.EOL + "" + PMD.EOL
+ "! Maintenant, en fonction du premier mot entre, on va appeler le sous programme correspondant"
+ PMD.EOL + " if (MOTS_COMMANDE (ACTION) .eq. 'TASK') then" + PMD.EOL
+ " call TACHE(MOTS_COMMANDE, DESC, N)" + PMD.EOL
+ " else if (MOTS_COMMANDE (ACTION) .eq. 'SHOW') then" + PMD.EOL
+ "! write(*,*) 'on appelle le sous prgrm SHOW'" + PMD.EOL
+ " call SHOW(MOTS_COMMANDE, N)" + PMD.EOL
+ " else if (MOTS_COMMANDE (ACTION) .eq. 'REMOVE') then" + PMD.EOL
+ "! write(*,*) 'on appelle le sous prgrm REMOVE'" + PMD.EOL
+ " call REMOVE(MOTS_COMMANDE, DESC, N)" + PMD.EOL
+ " else if (MOTS_COMMANDE (ACTION) .eq. 'CLEAR') then" + PMD.EOL
+ "! write(*,*) 'on appelle le sous prgrm CLEAR'" + PMD.EOL
+ " call CLEAR(MOTS_COMMANDE, N)" + PMD.EOL
+ " else if (MOTS_COMMANDE (ACTION) .eq. 'CANCEL') then" + PMD.EOL
+ "! write(*,*) 'on appelle le sous prgrm CANCEL'" + PMD.EOL
+ " call CANCEL(MOTS_COMMANDE, N)" + PMD.EOL
+ " else if (MOTS_COMMANDE (ACTION) .eq. 'DONE') then" + PMD.EOL
+ "! write(*,*) 'on appelle le sous prgrm DONE'" + PMD.EOL
+ " call DONE(MOTS_COMMANDE, N)" + PMD.EOL
+ " else if (MOTS_COMMANDE (ACTION) .eq. 'TODO') then" + PMD.EOL
+ "! write(*,*) 'on appelle le sous prgrm TODO'" + PMD.EOL
+ " call TODO(MOTS_COMMANDE, N)" + PMD.EOL
+ " else" + PMD.EOL
+ " write(*,*) ' '" + PMD.EOL
+ " write(*,*) 'L''action suivante n''a pas ete'," + PMD.EOL
+ " 1 ' comprise: ', MOTS_COMMANDE (ACTION)" + PMD.EOL + " end if"
+ PMD.EOL + " end if" + PMD.EOL + " end if" + PMD.EOL
+ " end do" + PMD.EOL + " end" + PMD.EOL;
public String getSampleCode() throws IOException {
return IOUtils.toString(FortranTokenizerTest.class.getResourceAsStream("sample.for"), StandardCharsets.UTF_8);
}
@Test
@ -155,8 +36,4 @@ public class FortranTokenizerTest extends AbstractTokenizerTest {
this.expectedTokenCount = 434;
super.tokenizeTest();
}
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(FortranTokenizerTest.class);
}
}

View File

@ -0,0 +1,168 @@
options/extend_source
program tp3
implicit none
! Ce programme va demander la saisie de la commande, puis on va separer les differentes
!parties de la chaine en plusieurs variables, ensuite selon l'action demandee on appelera le
!sous programme correspondant.
character*60 COMMANDE
integer*4 IOS,
1 COMPTEUR,
1 SORTIE,
1 ERRONE,
1 CONF,
1 POSITION_ESPACE,
1 DEBUT_MOT,
1 FIN_MOT,
1 NB_MOTS,
1 NB_MOTS_MAX,
1 FIN_CHAINE,
1 TROUVER_FIN,
1 NUM_CARACTERE,
1 ACTION,
1 PREMIERE_LETTRE,
1 DERNIERE_LETTRE,
1 INTERVALLE_MAJ_MIN,
1 APRES_MAJ,
1 TAILLE_COLONNE,
1 TAILLE_LIGNE,
1 LIGNES_DESC
parameter(NB_MOTS_MAX = 9) !une saisie correcte ne contient pas plus de 8 mots, si
!elle en contient 9, alors la saisie sera jugee incorrecte.
parameter(ERRONE = 1)
parameter(SORTIE = - 1)
parameter(ACTION = 1) !il s'agit du 1er mot de la chaine de caracteres
parameter(PREMIERE_LETTRE = 1) !correspond a la 1ere lettre d'un mot
parameter(DERNIERE_LETTRE = 18) !correspond a la derniere lettre d'un mot
parameter(INTERVALLE_MAJ_MIN = 32) !nombre separant un meme caractere
!minuscule de son majuscule
parameter(APRES_MAJ = 96) !correspond au dernier caractere avant les MIN
parameter(TAILLE_COLONNE = 7)
parameter(TAILLE_LIGNE = 12)
parameter(LIGNES_DESC = 11)
character*19 N(TAILLE_COLONNE,TAILLE_LIGNE)
character*19 MOTS_COMMANDE(NB_MOTS_MAX)
character*60 DESC(LIGNES_DESC)
write(*,*) ' '
write(*,*) ' -----------------------------------------------------'
write(*,*) ' | Bonjour, et bienvenue dans le programme DASHBOARD |'
write(*,*) ' -----------------------------------------------------'
write(*,*) ' '
write(*,*) ' '
write(*,*) ' Voici un rappel des fonctions disponibles pour ce DASHBOARD : '
write(*,*) ' '
write(*,*) ' _ TASK pour creer une tache (ex : TASK IDTACHE CIBLE AUTEUR)'
write(*,*) ' '
write(*,*) ' _ SHOW pour voir la description (ex : SHOW IDTACHE)'
write(*,*) ' '
write(*,*) ' _ REMOVE pour enlever une tache (ex : REMOVE IDTACHE)'
write(*,*) ' '
write(*,*) ' _ CLEAR pour effacer le DASHBOARD (ex : CLEAR)'
write(*,*) ' '
write(*,*) ' _ CANCEL, DONE, TODO pour modifier lHEREetat de la tache (ex : DONE IDTACHE)'
write(*,*) ' '
! La boucle de sortie pour quitter si l'on appuie sur F10
do while (IOS .ne. SORTIE)
! Initialisons les variables, afin de ne pas garder les anciennes valeurs pour chaque variable.
POSITION_ESPACE = 0
DEBUT_MOT = 0
FIN_MOT = 0
NB_MOTS = 0
FIN_CHAINE = 0
! Initialisons aussi le tableau des MOTS_COMMANDE
do COMPTEUR = ACTION, NB_MOTS_MAX
MOTS_COMMANDE (COMPTEUR) = ' '
end do
! Appelons le sous prgramme qui gere la saisie de la commande et aussi la sortie, si
!l'utilisateur le demande
call SAISIE(COMMANDE, IOS)
if (IOS .eq. 0) then
! Trouvons la fin de la chaine
FIN_CHAINE = TROUVER_FIN (COMMANDE)
COMPTEUR = 1
do while (POSITION_ESPACE .lt. FIN_CHAINE .and. NB_MOTS .lt. NB_MOTS_MAX)
DEBUT_MOT = POSITION_ESPACE + 1
! Decoupons les mots
POSITION_ESPACE = POSITION_ESPACE + index (COMMANDE (DEBUT_MOT:), ' ')
FIN_MOT = POSITION_ESPACE - 1
! Ensuite on les enregistre dans MOTS_COMMANDE
MOTS_COMMANDE (COMPTEUR) = COMMANDE (DEBUT_MOT : FIN_MOT)
! Comptons les mots
if (MOTS_COMMANDE (COMPTEUR) .ne. ' ') then
NB_MOTS = NB_MOTS + 1
COMPTEUR = COMPTEUR + 1
end if
end do
! Le programme ne doit pas tenir compte de la casse, ainsi peu importe la maniere
!dont est ecrit le mot, il sera mis en majuscule
do COMPTEUR = 1, NB_MOTS
do NUM_CARACTERE = PREMIERE_LETTRE, DERNIERE_LETTRE
if (ichar(MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE))
1 .gt. APRES_MAJ) then
MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE) =
1 char(ichar(MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE)) - INTERVALLE_MAJ_MIN)
end if
end do
end do
!! Affichons les mots (provisoire)
!! do COMPTEUR = 1, NB_MOTS
!! write(*,*) COMPTEUR, ': ', MOTS_COMMANDE (COMPTEUR)
!! end do
!!
!! Testons si le mot est bien en majuscule (etape provisoire)
!! write(*,*) MOTS_COMMANDE (ACTION), ': voila lHEREaction'
! Si la commande contient plus de 8 mots, on demande de recommencer
if (NB_MOTS .eq. NB_MOTS_MAX) then
write(*,*) ' '
write(*,*) 'ERR> Trop de mot, veuillez ressaisir'
else
! Maintenant, en fonction du premier mot entre, on va appeler le sous programme correspondant
if (MOTS_COMMANDE (ACTION) .eq. 'TASK') then
call TACHE(MOTS_COMMANDE, DESC, N)
else if (MOTS_COMMANDE (ACTION) .eq. 'SHOW') then
! write(*,*) 'on appelle le sous prgrm SHOW'
call SHOW(MOTS_COMMANDE, N)
else if (MOTS_COMMANDE (ACTION) .eq. 'REMOVE') then
! write(*,*) 'on appelle le sous prgrm REMOVE'
call REMOVE(MOTS_COMMANDE, DESC, N)
else if (MOTS_COMMANDE (ACTION) .eq. 'CLEAR') then
! write(*,*) 'on appelle le sous prgrm CLEAR'
call CLEAR(MOTS_COMMANDE, N)
else if (MOTS_COMMANDE (ACTION) .eq. 'CANCEL') then
! write(*,*) 'on appelle le sous prgrm CANCEL'
call CANCEL(MOTS_COMMANDE, N)
else if (MOTS_COMMANDE (ACTION) .eq. 'DONE') then
! write(*,*) 'on appelle le sous prgrm DONE'
call DONE(MOTS_COMMANDE, N)
else if (MOTS_COMMANDE (ACTION) .eq. 'TODO') then
! write(*,*) 'on appelle le sous prgrm TODO'
call TODO(MOTS_COMMANDE, N)
else
write(*,*) ' '
write(*,*) 'L''action suivante n''a pas ete',
1 ' comprise: ', MOTS_COMMANDE (ACTION)
end if
end if
end if
end do
end