TP8 - Q4

Programmation Avancée

Modérateur : Douin

aurelieng
Messages : 2
Inscription : 17 déc. 2018 2:24

TP8 - Q4

Message par aurelieng » 29 déc. 2018 18:55

Bonjour,

A la soumission de la question 4, je me retrouve avec 4 tests en échec sur 5, pour cause "d'erreur inattendue".
Pourtant quand je fais les tests locaux, tout se passe bien.

Y a t-il moyen d'avoir plus d'informations sur ces tests ?

Le résultat de la soumission :
Image

La validation des tests locaux :
Image

La classes de test :

Code : Tout sélectionner

package question4;

import java.io.*;
import java.net.*;

public class UpperCaseInputStreamTest extends junit.framework.TestCase{

    public void testAccès_README_TXT() {
        try {
            InputStream is = new BufferedInputStream( new FileInputStream(new File("question4/README.TXT")));
            int c = is.read();
            assertTrue(" erreur de lecture ???", c != -1);
            is.close();
        }
        catch(Exception e) {
            fail(" Erreur sur ce fichier : README.TXT ??? " + e.getMessage());
        }
    }

    public void testUpperCase_README_TXT() throws Exception {
        InputStream is = new UpperCaseInputStream(new BufferedInputStream( new FileInputStream(new File("question4/README.TXT"))));
        int c = is.read();
        while (c != -1) {
            assertTrue("erreur !, '" + Character.valueOf((char)c) + "' ne semble pas être une majuscule ...", Character.isUpperCase((char)c) || (char)c==' ');  
            c = is.read();
        }
        is.close();
    }

    public void testPushPackUpperCase_README_TXT() throws Exception { 
        PushbackInputStream is = new PushbackInputStream(new UpperCaseInputStream(new BufferedInputStream( new FileInputStream(new File("question4/README.TXT")))), 10);
        int i1 = is.read();
        int i2 = is.read();
        is.unread(i2);
        assertEquals(i2, is.read());
        is.unread(i2);
        is.unread(i1);
        assertEquals(i1, is.read());
        assertEquals(i2, is.read());
    }
}
Cordialement

Rodrigues_A
Messages : 52
Inscription : 25 sept. 2018 21:57

Re: TP8 - Q4

Message par Rodrigues_A » 30 déc. 2018 9:58

Bonjour,
Je suis dans le même cas que toi, pour les 2 tests de pushback et unread, je n'avais pas ces erreurs avant d'avoir redéfini la méthode public int read(byte[] b, int off, int len).
Chez moi aussi les tests locaux fonctionnent.
J'espère que cela pourra te donner un début de piste.
De mon coté je cherche où peut-être le problème car il ne me reste plus que 2 soumissions.
Bonne journée et tiens nous au courant si de ton coté le problème est résolu.
Anthony

Rodrigues_A
Messages : 52
Inscription : 25 sept. 2018 21:57

Re: TP8 - Q4

Message par Rodrigues_A » 30 déc. 2018 12:07

Re-bonjour,

Mes tests avances, je n'avais pas de problème en local, tes test passent également chez moi:
le test enrichi de bcp de System.out.println, coince au niveau du unread alors que le tien passe bien:

Code : Tout sélectionner

    public void testUpperCase_push_back()throws Exception{
        PushbackInputStream is = null;
        try{
            is = new PushbackInputStream(new UpperCaseInputStream( new BufferedInputStream( new FileInputStream(new File("question4/README.TXT")))));
            byte[] tab = new byte[10];
            System.out.println("1er read");
            is.read(tab,0,10);
            for(int i=0;i<tab.length;i++){
                     System.out.print((char)tab[i]);
            }
            System.out.println();
            System.out.println("read ok");
            assertTrue(" impossible de lire correctement", tab.length==10);
            System.out.println("1er unread");
            is.unread(tab);
              for(int i=0;i<tab.length;i++){
                     System.out.print((char)tab[i]);
            }    
            System.out.println();
            System.out.println("1er unread ok");           
            byte[] tab2 = new byte[15];
            System.out.println("2ème read");
            is.read(tab2,0,tab2.length);
            System.out.println("2ème unread");
            System.out.println("vérification: tab[0]=" + (char)tab[0]+ " tab2[0]="+ (char)tab2[0] + " égal?: "+  (tab[0] == tab2[0]));
            assertTrue(" unread(byte[] b) de PushbackInputStream ne semble pas fonctionner ???", tab[0] == tab2[0]);
            System.out.println((char)tab2[1]);
                   for(int i=0;i<tab2.length;i++){
                     System.out.println((char)tab2[i]);
                    }
            assertFalse(" encore un caractère en minucule ???", Character.isLowerCase(tab[1]));
        }catch(Exception e){
            fail(" exception inattendue !!!" + e.getMessage());
        }catch(Error error){
        }
    }
l'erreur que j'ai:
exception inattendue !!!Push back buffer is full
---
junit.framework.AssertionFailedError: exception inattendue !!!Push back buffer is full
at question4.UpperCaseInputStreamTest.testUpperCase_push_back(UpperCaseInputStreamTest.java:84)
J'espère que cela t'aidera, moi je coince là :-(.
bon courage,
Anthony

Rodrigues_A
Messages : 52
Inscription : 25 sept. 2018 21:57

Re: TP8 - Q4

Message par Rodrigues_A » 30 déc. 2018 12:44

Re-bonjour,
j'ai trouvé, pour l'erreur Push back buffer is full, je l'ai résolu avec :
is = new PushbackInputStream(new UpperCaseInputStream( new BufferedInputStream( new FileInputStream(new File("question4/README.TXT")))),10); et oui j'avais oublié de laisser ,10 lors de la redéfinition du chemin de mon fichier.
dans ma méthode public int read(byte[] b, int off, int len), j'avais laissé:
int i=is.read(b); au lieu de int i=is.read(b, off, len);

J'espère que mes erreurs te seront utiles, allez je file vers la Q3.

Bonne journée,

Anthony

aurelieng
Messages : 2
Inscription : 17 déc. 2018 2:24

Re: TP8 - Q4

Message par aurelieng » 30 déc. 2018 19:24

Merci pour les indications.

J'ai essayé de redéfinir la méthode public int read(byte[] b, int off, int len), sans succès pour ma part.
J'ai exactement les mêmes erreurs, qui ne sont pas du tout explicite : "erreur inattendue", ça n'aide pas beaucoup pour avancer.

Tant pis je vais rendre le devoir comme ça...

RENAUD
Messages : 101
Inscription : 21 sept. 2018 19:34

Re: TP8 - Q4

Message par RENAUD » 31 déc. 2018 2:21

Bonsoir
Je vous donne mon explication tout est passé chez moi à Jnews:
UpperCaseInputStream doit changer en majuscule mais c'est une classe qui n'existe pas dans le package java.IO
pour la question 4.1 :
Ce constructeur suffit:
// public UpperCaseInputStream(InputStream in)throws IOException {
// super(in);

// }
Pour read on recopie et adapte une des methodes les plus simple des classes je me suis basé sur InputStream et BufferIS vu que j'affecte à une variable InputStream et que mon paramètre est BufferIS tout ça par précaution :
/**
* Method Detail
* UpperCaseInputStream
*/
public int read() throws IOException {
int c = super.read();
if(c != -1){
return Character.toUpperCase((char)c);
}else{
return c;
}
}

public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}

public int read(byte[] b, int offset, int len) throws IOException {
int result = super.read(b, offset, len);
for (int i = offset; i < offset+result; i++) {
b = (byte)Character.toUpperCase((char)b);
}
return result;
}

Pour "Push back buffer is full"
Tu l'as déjà lu entièrement le stream entier dans la premiere boucle j'ai eu ce casse tête
la solution est de repositionner le fichier stream au début j'ai mis du temps à trouver je ne sais plus où ?
// fis=new FileInputStream(new File(PATH+"/"+"README.TXT"));
// fis.getChannel().position(0);

Enfin pour la question 4.2
Le traitement va être fait par PushbackIS entierement donc il a besoin en paramètre un stream qu'il peut gérer donc après avoir essayer plein de choses : redéfinir un nouveau unread(), read() dans UppercaseIS mais ça ne fonctionnait pas bien j'ai juste copié le constructeur PushbackIS pour UpperCase comme ça il sera bien passé en paramètre:

static String PATH ="C:/Users/Programmation/Desktop/NFP121/TP/MESTP/tp8/question4";
private static int DEFAULT_BUFFER_SIZE = 8192;
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
/**
* The pushback buffer.
* @since JDK1.1
*/
protected byte[] buf;
/**
* The position within the pushback buffer from which the next byte will
* be read. When the buffer is empty, <code>pos</code> is equal to
* <code>buf.length</code>; when the buffer is full, <code>pos</code> is
* equal to zero.
*
* @since JDK1.1
*/
protected int pos;

// public UpperCaseInputStream(InputStream in)throws IOException {
// super(in);
// }

public UpperCaseInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
//this(in,1);
}
public UpperCaseInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("size <= 0");
}
this.buf = new byte[size];
this.pos = size;
}


Et pour les tests pour PushbackIS c'est presque le même que pour UppercaseIS
public void testPushPackUpperCase_README_TXT() throws Exception{
// à terminer
//fail(" à terminer !!!");

try {
UpperCaseInputStream ucis = new UpperCaseInputStream(new BufferedInputStream( new FileInputStream(new File(PATH+"/"+"README.TXT")))); // déclaration à décorer ....
PushbackInputStream pis = new PushbackInputStream(ucis);

byte byteData ;

while ((byteData = (byte)pis.read()) != -1) {
char tmp=(char) byteData;
assertTrue(
"erreur !, '" + Character.valueOf((char)byteData) + "' ne semble pas être une majuscule ...",
Character.isUpperCase((char)byteData) || (char)byteData==' '
);
pis.unread(byteData);
// Reread the byte we unread
byteData = (byte) pis.read();
assertTrue(
"erreur !, '" + Character.valueOf((char)byteData) + "' ne semble pas être répété ...",
tmp==(char) byteData
);
}
} catch (Exception e2) {
e2.printStackTrace();
}

}

Mon test ne fait que répéter/relire/se repositionner à l'indice du dernier byte du buf que j'ai sauvé et je le compare dans l'assert.
D'ailleurs this.buf = new byte[size]; this.pos = size; est inutile je pense dans UppercaseIS vu que c'est Pushback qui fait le boulot !
Voilà moi ça passe de mon coté et je montre que j'ai compris enfin j'espère (pas encore été noté) !
Bon réveillon :)

rousset
Messages : 50
Inscription : 30 sept. 2018 9:23

Re: TP8 - Q4

Message par rousset » 31 déc. 2018 12:15

aurelieng a écrit :
29 déc. 2018 18:55
Bonjour,

A la soumission de la question 4, je me retrouve avec 4 tests en échec sur 5, pour cause "d'erreur inattendue".
Pourtant quand je fais les tests locaux, tout se passe bien.

Y a t-il moyen d'avoir plus d'informations sur ces tests ?

Le résultat de la soumission :
Image
(....)
Cordialement
Bonjour,
Je vois ton message tardivement.
Les 4 erreurs que tu as sont celles que j'avais obtenues initialement : en gros, sauf erreur de ma part, apparemment tu as 2 stream indépendants au lieu d'en avoir un. Peut être que tu ne remontes pas à la classe mère l'instance du stream (désolé je fais avec mes mots), ou peut être que tu ne lis pas avec la méthode read de UpperCaseInputStream.
public class UpperCaseInputStream extends FilterInputStream //normal on dérive de FilterInputStream, rien de particulier
{
public UpperCaseInputStream(InputStream is) { super(is);}
public int read() throws IOException { //A moins de vouloir tester une autre méthode read, celle-ci suffit
int c = super.read();
return (c != -1 ? Character.toUpperCase((char)c) : c);
}
public int read(byte[] b, int off, int len) throws IOException{ //je la laisse juste parce que j'ai fait un autre test avec lecture d'un buffer d'octets
int c = super.read(b, off,len);
for(int i = off; i<len; i++)
{ b[ i ] = (byte)Character.toUpperCase((char)b[ i ]); }
return c;
}
}

Ce qui donne en tests.
public void testUpperCase_README_TXT() throws Exception{
InputStream is = new UpperCaseInputStream(new FileInputStream(new File("README.TXT")));
int c = is.read();
while( c != -1){
assertTrue("erreur !, '" + Character.valueOf((char)c) + "' ne semble pas être une majuscule ...",
Character.isUpperCase((char)c) || (char)c==' ');
c = is.read();
}
is.close();
}

public void autreTestUpperCase_README_TXT() throws Exception{
InputStream is = new UpperCaseInputStream(new FileInputStream(new File("README.TXT")));
int nbOctets = Math.round(new File("README.TXT").length());
byte[] tabOctets = new byte[nbOctets];
is.read(tabOctets,0,nbOctets);
for(int i =0;i<nbOctets;i++)
{
assertTrue("erreur !, '" + Character.valueOf((char)tabOctets) + "' ne semble pas être une majuscule ...",
Character.isUpperCase((char)tabOctets) || (char)tabOctets==' ');
}
is.close();
}

J'espère que ça servira à quelque chose.
Cordialement.
Nicolas
Dernière édition par rousset le 06 janv. 2019 14:18, édité 1 fois.

RENAUD
Messages : 101
Inscription : 21 sept. 2018 19:34

Re: TP8 - Q4

Message par RENAUD » 31 déc. 2018 14:20

quand j'ai commenté mais j'ai oublié effectivement FilterInputStream.

je ne crois pas que ce soit crucial pour read() de faire super.read() si on redéfinit correctement read() dans UppercaseIS.
par contre InputStream is comme paramètre peut poser problème car si on redéfinit mal read() ou d'autres méthodes.

en fait on utilise read() et Inputstream de Filter... avec super.read() et super(is).
on fait juste un traitement sur une valeur particulière et effectivement read(byte[] b, int off, int len) fait un traitement complet il me semble que ça m'a posé des soucis avec les autres méthodes de la classe mere si c'est mal redéfinit.

pour le stream personnellement je n'ai toujours pas bien compris le comportement avec reset() et close(), je pensais que reset() suffirait mais même en faisant deux traitements différents sur deux instances par ex :
InputStream is = new UpperCaseInputStream(new FileInputStream(new File("README.TXT")));
InputStream is2 = new UpperCaseInputStream(new FileInputStream(new File("README.TXT")));
le deuxième ne passe plus. mais si je fais aucun close() avec ou sans reset. comme si au niveau os le système pointait à la fin du fichier même pour le deuxième. je n'ai toujours pas compris alors la véritable utilité de reset().
A ce niveau j'aimerais bien un avis.

Mais c'est pour ça que j'ai commenté quand j'ai vu les deux boucles for du test d'Anthony et je ne pense que ça a voir avec les erreurs jnews de aurelie à moins que jnews passe le premier mais pas le deuxieme mais je ne pense pas que ce soit ça.
C'est plus pour moi is.unread(i2) et is.unread(i1) et i2 qui revient à 1 et i1 qui était au premier et reviens à 0 ! c'est lire le flux deux fois dont l'un est au début étrange que le test passe d'ailleurs !

Répondre