Hallo! Ich habe mir diese Klasse Aufgabaut
Dazu habe ich diese Test Klasse aufgebaut um zu testen ob die methoden richtig funktionieren
Und ich hatte wie immer Probleme mit aufbauen von den Klassen aber jetzt passiert mir etwas wirklich kommisches und ich probiere schon seit Stunden lang es zu losen aber es geht nicht.Namlich ein Paar Methoden funktionieren ohne Problem (ich habe neben den methoden das kommentar "passt" dazu geschrieben).Die anderen Paar methoden funkioniren,im sinne der test zahlt als passed und IntelliJ sagt die methode passt aber die Konsole gibt mir diesen Error aus.
at.jku.ssw.queens.test.InvalidPositionException
at at.jku.ssw.queens.Queens.setQueen(Queens.java:46)
at at.jku.ssw.queens.test.QueensTest.testSetQueen(QueensTest.java:52)
Process finished with exit code 0
Also ich verstehe nicht warum das passiert,ich habe mir die methoden mehrmals angeschaut und ich sehe nicht was falsch daran ist.Habe neben den methoden ein kommentar geschrieben wo dieser Problem auftaucht.Und zum schluss habe ich in den letzten 2 methoden ein IndexOutOfBound exception was ich wirklich wirklich nicht verstehe weil die methode die mir diesen Error gibt,verwende ich in jeder andere methode und diese Tests und Methoden funktionieren ganz ok. Noch eine kleine erganzung zu den Exceptions.
InvalidPositionException: Soll dann geworfen werden wenn eine ungültige position übergeben wird (ungültig wenn checkCol und checkRow false zurückliefern)
InvalidMoveException: Soll dann geworfen werden wenn eine Position übergeben wird die schon besitzt ist(hasQueen züruckliefert)
Entschuldigen sie denn Langen Post und die mehrere Fragen,aber ich würde mich auf ein bisschen Hilfe freuen
Mfg
Java:
package at.jku.ssw.queens;
import at.jku.ssw.queens.test.InvalidMoveException;
import at.jku.ssw.queens.test.InvalidPositionException;
import at.jku.ssw.queens.test.QueensException;
import at.jku.ssw.queens.test.State;
public class Queens {
public static Queens create(int n) throws IllegalArgumentException {
if (n < 0) {
throw new IllegalArgumentException();
}
return new Queens(n);
}
// TODO: fields
private int board[][];
private int nOfQueens;
public Queens(int n) {
// TODO
this.board = new int [n][n];
this.nOfQueens = nOfQueens;
}
public int getSize() {
// TODO
return board.length;
}
public int getNQueens() {
// TODO
return nOfQueens;
}
//Hilfsmethoden
public boolean checkCol(char col) {
return col == 'A' || col == 'B' || col == 'C' || col == 'D' || col == 'E' || col == 'F' || col == 'G' || col == 'H';
}
//Hilfsmethoden
public boolean checkRow(int row) {
return row >= 1 && row <= board.length;
}
public State setQueen(int row, char col) throws QueensException {
// TODO
if (!checkRow(row) || !checkCol(col)) {
throw new InvalidPositionException();
} else if (hasQueen(row, col)) {
throw new InvalidMoveException();
} else if (checkRow(row) && checkCol(col)) {
board[row+1][col-65] = 'Q';
nOfQueens++;
}
return getGameState();
}
public State removeQueen(int row, char col) throws QueensException {
// TODO
if (!checkRow(row) || !checkCol(col)) {
throw new InvalidPositionException();
} else if (!hasQueen(row, col)) {
throw new InvalidMoveException();
} else if (hasQueen(row, col)) {
board[row+1][col-65] = 0;
nOfQueens--;
}
return getGameState();
}
public boolean hasQueen(int row, char col) throws InvalidPositionException {
// TODO
if (!checkRow(row) || !checkCol(col)) {
throw new InvalidPositionException();
} else
return board[row+1][col-65] == 'Q';
}
public State getGameState() {
int numberOfQueens = getNQueens();
if (numberOfQueens == getSize()) {
return State.COMPLETE;
} else if (numberOfQueens < getSize()) {
return State.INCOMPLETE;
}
return State.INVALID;
}
public void clear() {
// TODO
removeAll();
nOfQueens = 0;
}
public void removeAll() {
for(int row = 0; row < board.length; row++) {
for(int col = 0; col < board.length; col++) {
board[row][col] = 0;
}
}
}
}
Dazu habe ich diese Test Klasse aufgebaut um zu testen ob die methoden richtig funktionieren
Java:
package at.jku.ssw.queens.test;
import static org.junit.jupiter.api.Assertions.*;
import at.jku.ssw.queens.Queens;
import org.junit.jupiter.api.Test;
class QueensTest {
@Test
void testCreate() { //passt
assertNotNull(Queens.create(5));
assertThrows(IllegalArgumentException.class, () -> Queens.create(-1));
}
@Test
void testGetSize() { // passt
Queens queen = Queens.create(5);
assertEquals(queen.getSize(), 5);
}
@Test
void testgetNQueens() { // index 5 out of bound for lenght 5
Queens queen = Queens.create(5);
try {
queen.setQueen(2, 'B');
assertTrue(queen.hasQueen(2, 'B'));
queen.setQueen(3, 'C');
assertTrue(queen.hasQueen(3, 'C'));
queen.setQueen(1, 'E');
assertTrue(queen.hasQueen(1, 'E'));
queen.setQueen(4, 'F');
assertTrue(queen.hasQueen(4, 'F'));
queen.setQueen(5, 'H');
assertTrue(queen.hasQueen(5, 'H'));
} catch (QueensException e) {
e.printStackTrace();
}
assertEquals(5, queen.getNQueens());
}
@Test
void testSetQueen() { // Invalid exception
Queens queen = Queens.create(5);
assertThrows(InvalidPositionException.class, () -> queen.setQueen(-1, 'H'));
try {
queen.setQueen(1, 'A');
assertTrue(queen.hasQueen(1, 'A'));
queen.setQueen(8, 'H');
assertTrue(queen.hasQueen(8, 'H'));
} catch (QueensException e) {
e.printStackTrace();
}
}
@Test
void testRemoveQueen() { //passt
final Queens queen = Queens.create(5);
try {
queen.setQueen(1,'A');
} catch (QueensException e) {
e.printStackTrace();
}
try {
queen.removeQueen(1,'A');
} catch (QueensException e) {
e.printStackTrace();
fail();
}
}
@Test
void testhasQueen() { //passt
Queens queen = Queens.create(5);
try {
assertFalse(queen.hasQueen(2, 'B'));
try {
queen.setQueen(3,'A');
} catch (QueensException e) {
e.printStackTrace();
}
assertTrue((queen.hasQueen(3, 'A')));
}
catch (QueensException e) {
e.printStackTrace();
fail();
}
assertThrows(InvalidPositionException.class,() -> queen.hasQueen(2,'Y'));
}
@Test
void testGameState() { // index out of bound
Queens queen = Queens.create(5);
try {
queen.setQueen(1,'A');
} catch (QueensException e) {
e.printStackTrace();
}
try {
queen.setQueen(3,'C');
} catch (QueensException e) {
e.printStackTrace();
}
try {
queen.setQueen(2,'F');
} catch (QueensException e) {
e.printStackTrace();
}
assertEquals(State.INCOMPLETE,queen.getGameState());
try {
queen.setQueen(2, 'F');
} catch (QueensException e) {
e.printStackTrace();
}
assertEquals(State.INVALID,queen.getGameState());
}
@Test
void testClear() { //invalid exception
Queens queen = Queens.create(5);
try {
queen.setQueen(1,'B');
} catch (QueensException e) {
e.printStackTrace();
}
try {
queen.removeQueen(3,'A');
} catch (QueensException e) {
e.printStackTrace();
}
queen.clear();
assertEquals(0,queen.getNQueens());
}
}
Und ich hatte wie immer Probleme mit aufbauen von den Klassen aber jetzt passiert mir etwas wirklich kommisches und ich probiere schon seit Stunden lang es zu losen aber es geht nicht.Namlich ein Paar Methoden funktionieren ohne Problem (ich habe neben den methoden das kommentar "passt" dazu geschrieben).Die anderen Paar methoden funkioniren,im sinne der test zahlt als passed und IntelliJ sagt die methode passt aber die Konsole gibt mir diesen Error aus.
at.jku.ssw.queens.test.InvalidPositionException
at at.jku.ssw.queens.Queens.setQueen(Queens.java:46)
at at.jku.ssw.queens.test.QueensTest.testSetQueen(QueensTest.java:52)
Process finished with exit code 0
Also ich verstehe nicht warum das passiert,ich habe mir die methoden mehrmals angeschaut und ich sehe nicht was falsch daran ist.Habe neben den methoden ein kommentar geschrieben wo dieser Problem auftaucht.Und zum schluss habe ich in den letzten 2 methoden ein IndexOutOfBound exception was ich wirklich wirklich nicht verstehe weil die methode die mir diesen Error gibt,verwende ich in jeder andere methode und diese Tests und Methoden funktionieren ganz ok. Noch eine kleine erganzung zu den Exceptions.
InvalidPositionException: Soll dann geworfen werden wenn eine ungültige position übergeben wird (ungültig wenn checkCol und checkRow false zurückliefern)
InvalidMoveException: Soll dann geworfen werden wenn eine Position übergeben wird die schon besitzt ist(hasQueen züruckliefert)
Entschuldigen sie denn Langen Post und die mehrere Fragen,aber ich würde mich auf ein bisschen Hilfe freuen
Mfg