Problem bei der Nachbarschafttest

Im Graph oder wo?

Im RL kannst du das vergessen, D hat ja noch nicht mal ein Impfregister 🤣
in Java das ist mein Code
class Field
{
/
* Die Dateinamen der Bodengitterelemente, die direkt mit einer
* Rotation 0 verwendet werden können. Der Index ergibt sich
* aus der Summe der folgenden Zahlen:
* 1: In Richtung 0 (+1, 0) gibt es eine Verbindung.
* 2: In Richtung 1 (0, +1) gibt es eine Verbindung.
* 4: In Richtung 2 (-1, 0) gibt es eine Verbindung.
* 8: In Richtung 3 (0, -1) gibt es eine Verbindung.
*/
private static final String[] NEIGHBORHOOD_TO_FILENAME = {
"grass",
"path-e-0",
"path-e-1",
"path-l-0",
"path-e-2",
"path-i-0",
"path-l-1",
"path-t-1",
"path-e-3",
"path-l-3",
"path-i-1",
"path-t-0",
"path-l-2",
"path-t-3",
"path-t-2",
"path-x"
};
char dieter[][];

/** Ein Testfall, der alle Nachbarschaften enthÃĪlt. */
static void test()
{
new GameObject.Canvas(5, 5, 96, 96);

// Einkommentieren, sobald Konstruktor vorhanden
new Field(new String[] {
"O-O-O-O ",
"| | ",
"O O-O-O O",
"| | | | |",
"O-O-O-O-O",
"| | | | |",
"O O-O-O O",
" | |",
"O-O-O-O-O"
});
}

public Field(String[]field){
dieter=new char[field.length][];
for(int x=0;x<field.length;x++){
dieter[x]=new char[field[x].length()];
for(int y=0; y<field[x].length();y++){
dieter[x][y]=field[x].charAt(y);
}


}
for(int y=0;y<dieter.length;y+=2){
for(int x=0;x<dieter[y].length;x+=2){

GameObject A = new GameObject(x/2,y/2,0,NEIGHBORHOOD_TO_FILENAME[getNeighborhood(x,y)]);
}

}
}

private char getCell(int x, int y){
try {
return dieter[x][y];
} catch(IndexOutOfBoundsException ex) {
return ' ';
}

}
private int getNeighborhood(int x, int y) {
int counter = 0;

if (getCell(x + 1, y) != ' ') counter += 1;
if (getCell(x, y + 1) != ' ') counter += 2;
if (getCell(x - 1, y) != ' ') counter += 4;
if (getCell(x, y -1) != ' ') counter += 8;

return counter;
}
}
 
Bitte Code-Tags verwenden (im Editor oben links auf </> klicken, dort den Code einfügen). Ggf. kannst Du Deinen Beitrag noch bearbeiten.

Die Frage ist: wie ist die Nachbarschaft definiert und was willst Du testen?
 
Bitte Code-Tags verwenden (im Editor oben links auf </> klicken, dort den Code einfügen). Ggf. kannst Du Deinen Beitrag noch bearbeiten.

Die Frage ist: wie ist die Nachbarschaft definiert und was willst Du testen?
Java:
Es wurde noch keine Unit-Tests für die Klasse Field implementiert. Dies soll
nun nachgeholt werden. Da sich hasNeighbor auf die eigentlich privaten Methoden getCell und
getNeighborhood abstützt, kann Field über das Zusammenspiel des Konstruktors mit hasNeighbor
vollständig getestet werden. Es braucht nicht getestet zu werden, ob der Konstruktor tatsächlich
die richtigen Grafiken erzeugt.       
    class Field
{
    /
     * Die Dateinamen der Bodengitterelemente, die direkt mit einer
     * Rotation 0 verwendet werden kÃķnnen. Der Index ergibt sich
     * aus der Summe der folgenden Zahlen:
     * 1: In Richtung 0 (+1, 0) gibt es eine Verbindung.
     * 2: In Richtung 1 (0, +1) gibt es eine Verbindung.
     * 4: In Richtung 2 (-1, 0) gibt es eine Verbindung.
     * 8: In Richtung 3 (0, -1) gibt es eine Verbindung.
     */
    private static final String[] NEIGHBORHOOD_TO_FILENAME = {
        "grass",
        "path-e-0",
        "path-e-1",
        "path-l-0",
        "path-e-2",
        "path-i-0",
        "path-l-1",
        "path-t-1",
        "path-e-3",
        "path-l-3",
        "path-i-1",
        "path-t-0",
        "path-l-2",
        "path-t-3",
        "path-t-2",
        "path-x"
    };
    char dieter[][];
    
    /** Ein Testfall, der alle Nachbarschaften enthÃĪlt. */
    static void test()
    {
        new GameObject.Canvas(5, 5, 96, 96);

        // Einkommentieren, sobald Konstruktor vorhanden
        new Field(new String[] {
            "O-O-O-O  ",
            "|   |    ",
            "O O-O-O O",
            "| | | | |",
            "O-O-O-O-O",
            "| | | | |",
            "O O-O-O O",
            "    |   |",
            "O-O-O-O-O"
        });
    }
    
    public Field(String[]field){
    dieter=new char[field.length][];
    for(int x=0;x<field.length;x++){
        dieter[x]=new char[field[x].length()];
        for(int y=0; y<field[x].length();y++){
            dieter[x][y]=field[x].charAt(y);
        }
    
    
    }
    for(int y=0;y<dieter.length;y+=2){
        for(int x=0;x<dieter[y].length;x+=2){
            
            GameObject A = new GameObject(x/2,y/2,0,NEIGHBORHOOD_TO_FILENAME[getNeighborhood(x,y)]);
        }
    
    }
    }
    
    private char getCell(int x, int y){
    try {
            return dieter[x][y];
        } catch(IndexOutOfBoundsException ex) {
            return ' ';
        }
 
}
    private int getNeighborhood(int x, int y) {
        int counter = 0;

        if (getCell(x + 1, y) != ' ') counter += 1;
        if (getCell(x, y + 1) != ' ') counter += 2;
        if (getCell(x - 1, y) != ' ') counter += 4;
        if (getCell(x, y -1) != ' ') counter += 8;
      
        return counter;
}
}
 
OK, es geht also um Unit-Tests und die Frage ist, wie Du getNeighborhood testen kannst. Dazu bräuchtest Du noch nicht mal den Code, sondern die Spezifikation der Methode.

Im Endeffekt erzeugst Du ein neues Field-Objekt, gibst dabei ein Dir bekanntes Feld in Form eines Arrays mit. Da Du das Feld kennst, weißt Du natürlich auch, was getNeighborhood() für einen bestimmten Punkt im Feld liefern muss und nichts anderes testest Du eben ab.
 
Also wenn ich das richtig verstehe, dann soll die Methode hasNeighbor als Ergebnis haben, ob getNeighborhood > 0 liefert.

Der Unit-Test muss auf jeden Fall prüfen, ob das Ergebnis stimmt. Dazu musst du Fälle erstellen, in denen ein Nachbar vorhanden ist (am Besten in allen möglichen Variationen) und auch solche, wo es keine Nachbarn gibt.
 
Ich habe nicht ganz verstanden. Kann jemand mir genau sagen, was ich schreiben soll und wo ?
Nehmen wir mal an, Du hast eine Methode mit der Signatur int plus(int a, int b) und diese Methode soll die Summe von a und b liefern, sofern das Ergebnis in ein int passt, ansonsten eine ArithmeticException auslösen.

Jetzt kannst Du Dir Testfälle überlegen, hier also Belegungen von Parametern. Für jeden Testfall weißt Du ja, was als Ergebnis erwartet wird. Du könntest Dir also überlegen: plus(0,0) muss 0 liefern, plus(x, 0) natürlich x, genauso wie plus(0,x) für nicht-negative x und negative x. Du könntest positive Werte x,y addieren oder einen negativen Wert mit einem positiven und umgekehrt. Du könntest Integer.MAX_VALUE für den Parameter a und 1 für den Parameter b verwenden, um zu testen, ob die Exception ausgelöst wird. Du könntest Integer.MAX_VALUE für den Parameter a und 0 für den Parameter b verwenden, um zu testen, ob die Exception an dieser Grenze nicht ausgelöst wird usw.

Den Testfall "plus(0,0) muss 0 liefern" könnte man (sehr ausführlich) wie folgt implementieren:
Java:
int erwartetesErgebnis = 0;
int paramA =0;
int paramB = 0;
int tatsaechlichesErgebnis = plus(paramA, paramB);
if (tatsaechlichesErgebnis != erwartetesErgebnis) {
    System.err.printf("Test schlug fehl. plus(%d, %d); erwartetes Ergebnis %d, war jedoch %d%n", 
            paramA, paramB, erwartetesErgebnis, tatsaechlichesErgebnis);    
    System.exit(1);
}

Wenn Ihr JUnit verwendet (hier sehr kurz):
Java:
@Test
public void plusSoll0Liefern() {
    assertEquals(0, plus(0,0));
}
 

Zurück
Oben