Compare commits
No commits in common. "34240b22dc6f335d41d741e76bd3130b223681e9" and "77a424767765c0169ff7e3a1313daecf2c9c2d1a" have entirely different histories.
34240b22dc
...
77a4247677
33
pom.xml
33
pom.xml
|
|
@ -21,31 +21,6 @@
|
||||||
<version>5.8.1</version>
|
<version>5.8.1</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.junit.jupiter</groupId>
|
|
||||||
<artifactId>junit-jupiter</artifactId>
|
|
||||||
<version>5.9.3</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.powermock</groupId>
|
|
||||||
<artifactId>powermock-module-junit4</artifactId>
|
|
||||||
<version>2.0.9</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.powermock</groupId>
|
|
||||||
<artifactId>powermock-api-mockito2</artifactId>
|
|
||||||
<version>2.0.9</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.powermock</groupId>
|
|
||||||
<artifactId>powermock-module-junit4-rule</artifactId>
|
|
||||||
<version>2.0.9</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-checkstyle-plugin -->
|
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-checkstyle-plugin -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
|
@ -53,14 +28,6 @@
|
||||||
<version>3.6.0</version>
|
<version>3.6.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mockito</groupId>
|
|
||||||
<artifactId>mockito-core</artifactId>
|
|
||||||
<version>5.15.2</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-javadoc-plugin -->
|
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-javadoc-plugin -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,10 @@ public class Facade {
|
||||||
return highscoreManager.getAverageTime(currentPuzzleName);
|
return highscoreManager.getAverageTime(currentPuzzleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCurrentPuzzleName() {
|
||||||
|
return currentPuzzleName;
|
||||||
|
}
|
||||||
|
|
||||||
public void saveCurrentPuzzleHighscoreToFile() throws IOException {
|
public void saveCurrentPuzzleHighscoreToFile() throws IOException {
|
||||||
if (currentPuzzleName == null) return;
|
if (currentPuzzleName == null) return;
|
||||||
String base = currentPuzzleName.replaceAll(".*/", "");
|
String base = currentPuzzleName.replaceAll(".*/", "");
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,16 @@ import java.util.Set;
|
||||||
public class GameView extends JFrame {
|
public class GameView extends JFrame {
|
||||||
|
|
||||||
private final Facade facade;
|
private final Facade facade;
|
||||||
SpielfeldGUI spielfeldGUI;
|
private SpielfeldGUI spielfeldGUI;
|
||||||
|
|
||||||
JComboBox<String> cbSpielfelder;
|
private JComboBox<String> cbSpielfelder;
|
||||||
JButton btnLoad;
|
private JButton btnLoad;
|
||||||
JButton btnRandom;
|
private JButton btnRandom;
|
||||||
JButton btnCheckSolution;
|
private JButton btnCheckSolution;
|
||||||
JButton btnShowSolution;
|
private JButton btnShowSolution;
|
||||||
JButton btnReset;
|
private JButton btnReset;
|
||||||
JLabel timeLabel;
|
private JLabel timeLabel;
|
||||||
Timer timer;
|
private Timer timer;
|
||||||
|
|
||||||
private final String[] spielfelder = {
|
private final String[] spielfelder = {
|
||||||
"4x4.csv",
|
"4x4.csv",
|
||||||
|
|
@ -98,7 +98,7 @@ public class GameView extends JFrame {
|
||||||
timer.start();
|
timer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ladeSpielfeld(String pfad) {
|
private void ladeSpielfeld(String pfad) {
|
||||||
try {
|
try {
|
||||||
facade.ladeSpielfeld(pfad);
|
facade.ladeSpielfeld(pfad);
|
||||||
facade.loadCurrentPuzzleHighscoreFromFile();
|
facade.loadCurrentPuzzleHighscoreFromFile();
|
||||||
|
|
@ -117,7 +117,7 @@ public class GameView extends JFrame {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkSolution() {
|
private void checkSolution() {
|
||||||
var blackCells = spielfeldGUI.getBlackCells();
|
var blackCells = spielfeldGUI.getBlackCells();
|
||||||
var solutionCoordinates = facade.getLoesungsKoordinaten();
|
var solutionCoordinates = facade.getLoesungsKoordinaten();
|
||||||
if (solutionCoordinates == null) {
|
if (solutionCoordinates == null) {
|
||||||
|
|
@ -201,7 +201,7 @@ public class GameView extends JFrame {
|
||||||
JOptionPane.showMessageDialog(this, sb.toString(), "Ergebnis", JOptionPane.INFORMATION_MESSAGE);
|
JOptionPane.showMessageDialog(this, sb.toString(), "Ergebnis", JOptionPane.INFORMATION_MESSAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean containsCell(List<int[]> blackCells, String sol) {
|
private boolean containsCell(List<int[]> blackCells, String sol) {
|
||||||
String[] parts = sol.split(",");
|
String[] parts = sol.split(",");
|
||||||
int rr = Integer.parseInt(parts[0]);
|
int rr = Integer.parseInt(parts[0]);
|
||||||
int cc = Integer.parseInt(parts[1]);
|
int cc = Integer.parseInt(parts[1]);
|
||||||
|
|
@ -213,7 +213,7 @@ public class GameView extends JFrame {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void showSolution() {
|
private void showSolution() {
|
||||||
var feld = facade.getAktuellesPuzzle();
|
var feld = facade.getAktuellesPuzzle();
|
||||||
if (feld == null) return;
|
if (feld == null) return;
|
||||||
spielfeldGUI.updateGrid(feld);
|
spielfeldGUI.updateGrid(feld);
|
||||||
|
|
@ -227,7 +227,7 @@ public class GameView extends JFrame {
|
||||||
spielfeldGUI.setAllNonBlackToWhite();
|
spielfeldGUI.setAllNonBlackToWhite();
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetField() {
|
private void resetField() {
|
||||||
var feld = facade.getAktuellesPuzzle();
|
var feld = facade.getAktuellesPuzzle();
|
||||||
if (feld != null) {
|
if (feld != null) {
|
||||||
spielfeldGUI.updateGrid(feld);
|
spielfeldGUI.updateGrid(feld);
|
||||||
|
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
package de.deversmann.domain;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
class CSVReaderTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testReadPuzzleWithSolutionRealData() throws IOException {
|
|
||||||
String csvContent = """
|
|
||||||
4,5,6,7
|
|
||||||
8,9,10,11
|
|
||||||
12,13,14,15
|
|
||||||
16,17,18,19
|
|
||||||
//Lösung
|
|
||||||
2,2
|
|
||||||
3,3
|
|
||||||
""";
|
|
||||||
Path tempFile = Files.createTempFile("realPuzzle", ".csv");
|
|
||||||
Files.writeString(tempFile, csvContent);
|
|
||||||
|
|
||||||
CSVReader reader = new CSVReader();
|
|
||||||
PuzzleData data = reader.readPuzzleWithSolution(tempFile.toString());
|
|
||||||
|
|
||||||
int[][] expectedPuzzle = {
|
|
||||||
{4, 5, 6, 7},
|
|
||||||
{8, 9, 10, 11},
|
|
||||||
{12, 13, 14, 15},
|
|
||||||
{16, 17, 18, 19}
|
|
||||||
};
|
|
||||||
assertArrayEquals(expectedPuzzle, data.getPuzzle());
|
|
||||||
assertEquals(2, data.getSolutionCoordinates().size());
|
|
||||||
assertArrayEquals(new int[]{2, 2}, data.getSolutionCoordinates().get(0));
|
|
||||||
assertArrayEquals(new int[]{3, 3}, data.getSolutionCoordinates().get(1));
|
|
||||||
|
|
||||||
Files.delete(tempFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testReadPuzzleWithInvalidData() throws IOException {
|
|
||||||
String csvContent = """
|
|
||||||
1,2,3
|
|
||||||
4,5
|
|
||||||
//Lösung
|
|
||||||
a,b
|
|
||||||
""";
|
|
||||||
Path tempFile = Files.createTempFile("invalidPuzzle", ".csv");
|
|
||||||
Files.writeString(tempFile, csvContent);
|
|
||||||
|
|
||||||
CSVReader reader = new CSVReader();
|
|
||||||
|
|
||||||
assertThrows(NumberFormatException.class, () -> reader.readPuzzleWithSolution(tempFile.toString()));
|
|
||||||
|
|
||||||
Files.delete(tempFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testReadPuzzleWithoutSolution() throws IOException {
|
|
||||||
String csvContent = """
|
|
||||||
1,2,3
|
|
||||||
4,5,6
|
|
||||||
7,8,9
|
|
||||||
""";
|
|
||||||
Path tempFile = Files.createTempFile("noSolutionPuzzle", ".csv");
|
|
||||||
Files.writeString(tempFile, csvContent);
|
|
||||||
|
|
||||||
CSVReader reader = new CSVReader();
|
|
||||||
PuzzleData data = reader.readPuzzleWithSolution(tempFile.toString());
|
|
||||||
|
|
||||||
assertNotNull(data.getPuzzle());
|
|
||||||
assertTrue(data.getSolutionCoordinates().isEmpty());
|
|
||||||
|
|
||||||
Files.delete(tempFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
package de.deversmann.domain;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
class HighscoreManagerTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testAddAndRetrieveHighscores() {
|
|
||||||
HighscoreManager manager = new HighscoreManager();
|
|
||||||
manager.addHighscore("Puzzle1", "Alice", 120, 2);
|
|
||||||
|
|
||||||
List<HighscoreEntry> highscores = manager.getHighscores("Puzzle1");
|
|
||||||
|
|
||||||
assertEquals(1, highscores.size());
|
|
||||||
assertEquals("Alice", highscores.get(0).getPlayerName());
|
|
||||||
assertEquals(120, highscores.get(0).getTimeSeconds());
|
|
||||||
assertEquals(2, highscores.get(0).getErrorCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testSaveAndLoadHighscores() throws IOException {
|
|
||||||
HighscoreManager manager = new HighscoreManager();
|
|
||||||
manager.addHighscore("Puzzle1", "Alice", 120, 2);
|
|
||||||
|
|
||||||
Path tempFile = Files.createTempFile("testHighscores", ".txt");
|
|
||||||
manager.saveSinglePuzzle("Puzzle1", tempFile.toString());
|
|
||||||
|
|
||||||
HighscoreManager newManager = new HighscoreManager();
|
|
||||||
newManager.loadSinglePuzzle("Puzzle1", tempFile.toString());
|
|
||||||
|
|
||||||
List<HighscoreEntry> highscores = newManager.getHighscores("Puzzle1");
|
|
||||||
|
|
||||||
assertEquals(1, highscores.size());
|
|
||||||
assertEquals("Alice", highscores.get(0).getPlayerName());
|
|
||||||
assertEquals(120, highscores.get(0).getTimeSeconds());
|
|
||||||
assertEquals(2, highscores.get(0).getErrorCount());
|
|
||||||
|
|
||||||
Files.delete(tempFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetAverageTimeNoEntries() {
|
|
||||||
HighscoreManager manager = new HighscoreManager();
|
|
||||||
double avgTime = manager.getAverageTime("Puzzle1");
|
|
||||||
|
|
||||||
assertEquals(-1, avgTime, "Average time should be -1 for no entries.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testLoadSinglePuzzleFileNotFound() {
|
|
||||||
HighscoreManager manager = new HighscoreManager();
|
|
||||||
|
|
||||||
assertDoesNotThrow(() -> manager.loadSinglePuzzle("Puzzle1", "nonexistent.txt"));
|
|
||||||
assertTrue(manager.getHighscores("Puzzle1").isEmpty());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
package de.deversmann.domain;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
class PuzzleDataTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetPuzzle() {
|
|
||||||
int[][] puzzle = {{1, 2}, {3, 4}};
|
|
||||||
List<int[]> solution = List.of(new int[]{1, 1}, new int[]{2, 2});
|
|
||||||
|
|
||||||
PuzzleData data = new PuzzleData(puzzle, solution);
|
|
||||||
|
|
||||||
assertArrayEquals(puzzle, data.getPuzzle());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetSolutionCoordinates() {
|
|
||||||
int[][] puzzle = {{1, 2}, {3, 4}};
|
|
||||||
List<int[]> solution = List.of(new int[]{1, 1}, new int[]{2, 2});
|
|
||||||
|
|
||||||
PuzzleData data = new PuzzleData(puzzle, solution);
|
|
||||||
|
|
||||||
assertEquals(solution, data.getSolutionCoordinates());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,153 +0,0 @@
|
||||||
package de.deversmann.facade;
|
|
||||||
|
|
||||||
import de.deversmann.domain.*;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
import org.powermock.api.mockito.PowerMockito;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
import static org.mockito.Mockito.*;
|
|
||||||
|
|
||||||
class FacadeTest {
|
|
||||||
|
|
||||||
private CSVReader csvReaderMock;
|
|
||||||
private HighscoreManager highscoreManagerMock;
|
|
||||||
private Zeiterfassung zeiterfassungMock;
|
|
||||||
private Facade facade;
|
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
void setup() throws Exception {
|
|
||||||
facade = new Facade();
|
|
||||||
|
|
||||||
csvReaderMock = mock(CSVReader.class);
|
|
||||||
highscoreManagerMock = mock(HighscoreManager.class);
|
|
||||||
zeiterfassungMock = mock(Zeiterfassung.class);
|
|
||||||
|
|
||||||
PowerMockito.field(Facade.class, "csvReader").set(facade, csvReaderMock);
|
|
||||||
PowerMockito.field(Facade.class, "highscoreManager").set(facade, highscoreManagerMock);
|
|
||||||
PowerMockito.field(Facade.class, "zeiterfassung").set(facade, zeiterfassungMock);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testLadeSpielfeldMitEchtenDaten() throws IOException {
|
|
||||||
PuzzleData puzzleData = new PuzzleData(new int[][]{{1, 2, 3, 4}}, List.of(new int[]{1, 1}));
|
|
||||||
when(csvReaderMock.readPuzzleWithSolution(anyString())).thenReturn(puzzleData);
|
|
||||||
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
|
|
||||||
assertNotNull(facade.getAktuellesPuzzle());
|
|
||||||
assertEquals(1, facade.getLoesungsKoordinaten().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testStopZeiterfassung() {
|
|
||||||
when(zeiterfassungMock.getElapsedTimeInSeconds()).thenReturn(42L);
|
|
||||||
|
|
||||||
long elapsedTime = facade.stopZeiterfassung();
|
|
||||||
|
|
||||||
verify(zeiterfassungMock, times(1)).stop();
|
|
||||||
assertEquals(42L, elapsedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetElapsedTimeSoFar() {
|
|
||||||
when(zeiterfassungMock.getElapsedTimeInSeconds()).thenReturn(15L);
|
|
||||||
|
|
||||||
long elapsedTime = facade.getElapsedTimeSoFar();
|
|
||||||
|
|
||||||
verify(zeiterfassungMock, times(1)).getElapsedTimeInSeconds();
|
|
||||||
assertEquals(15L, elapsedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testIncrementErrorCount() {
|
|
||||||
assertEquals(0, facade.getCurrentErrorCount());
|
|
||||||
|
|
||||||
facade.incrementErrorCount();
|
|
||||||
|
|
||||||
assertEquals(1, facade.getCurrentErrorCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testAddHighscoreForCurrentPuzzle() throws IOException {
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
|
|
||||||
facade.addHighscoreForCurrentPuzzle("Player1", 100L, 3);
|
|
||||||
|
|
||||||
verify(highscoreManagerMock, times(1))
|
|
||||||
.addHighscore(eq("test.csv"), eq("Player1"), eq(100L), eq(3));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetHighscoresForCurrentPuzzle() throws IOException {
|
|
||||||
when(highscoreManagerMock.getHighscores("test.csv"))
|
|
||||||
.thenReturn(List.of(new HighscoreEntry("Player1", 100L, 2)));
|
|
||||||
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
List<HighscoreEntry> highscores = facade.getHighscoresForCurrentPuzzle();
|
|
||||||
|
|
||||||
assertEquals(1, highscores.size());
|
|
||||||
assertEquals("Player1", highscores.get(0).getPlayerName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetAverageTimeForCurrentPuzzle() throws IOException {
|
|
||||||
when(highscoreManagerMock.getAverageTime("test.csv")).thenReturn(75.0);
|
|
||||||
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
double avgTime = facade.getAverageTimeForCurrentPuzzle();
|
|
||||||
|
|
||||||
assertEquals(75.0, avgTime, 0.01);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testSaveCurrentPuzzleHighscoreToFile() throws IOException {
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
|
|
||||||
facade.saveCurrentPuzzleHighscoreToFile();
|
|
||||||
|
|
||||||
verify(highscoreManagerMock, times(1))
|
|
||||||
.saveSinglePuzzle(eq("test.csv"), anyString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testLoadCurrentPuzzleHighscoreFromFile() throws IOException {
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
|
|
||||||
facade.loadCurrentPuzzleHighscoreFromFile();
|
|
||||||
|
|
||||||
verify(highscoreManagerMock, times(1))
|
|
||||||
.loadSinglePuzzle(eq("test.csv"), anyString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetAktuellesPuzzle() throws IOException {
|
|
||||||
PuzzleData puzzleData = new PuzzleData(new int[][]{{1, 2, 3, 4}}, List.of());
|
|
||||||
when(csvReaderMock.readPuzzleWithSolution(anyString())).thenReturn(puzzleData);
|
|
||||||
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
|
|
||||||
int[][] puzzle = facade.getAktuellesPuzzle();
|
|
||||||
|
|
||||||
assertNotNull(puzzle);
|
|
||||||
assertEquals(4, puzzle[0].length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetLoesungsKoordinaten() throws IOException {
|
|
||||||
PuzzleData puzzleData = new PuzzleData(new int[][]{{1, 2}}, List.of(new int[]{1, 1}));
|
|
||||||
when(csvReaderMock.readPuzzleWithSolution(anyString())).thenReturn(puzzleData);
|
|
||||||
|
|
||||||
facade.ladeSpielfeld("test.csv");
|
|
||||||
|
|
||||||
List<int[]> solutionCoordinates = facade.getLoesungsKoordinaten();
|
|
||||||
|
|
||||||
assertNotNull(solutionCoordinates);
|
|
||||||
assertEquals(1, solutionCoordinates.size());
|
|
||||||
assertArrayEquals(new int[]{1, 1}, solutionCoordinates.get(0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue