Skip to content
Snippets Groups Projects
Commit ff16d383 authored by jez04's avatar jez04
Browse files

feat: :tada: solution

parent bb8a2af6
Branches
No related merge requests found
package cz.vsb.fei.lab; package cz.vsb.fei.lab;
import java.io.BufferedReader;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader; import java.io.Reader;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
...@@ -18,57 +26,83 @@ public class App { ...@@ -18,57 +26,83 @@ public class App {
log.info("Launching Java application."); log.info("Launching Java application.");
App app = new App(); App app = new App();
app.printScores(app.loadScores()); app.printScores(app.loadScores());
/*použijte metody generateScores, saveScores (i pro soubor s adresářem) List<Score> scores = app.generateScores(200);
* A pro soubory bestScore-ok.csv a bestScores-err.csv využijte metodu app.saveScores(scores, "test.csv");
* App.class.getResourceAsStream a loadScoresFromStream*/ app.saveScores(scores, "test/test.csv");
//TODO try {
app.printScores(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScore-ok.csv"))));
app.printScores(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv"))));
} catch (ScoreNotLoaded e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
/*zajistěte aby metoda vytvořila kolekci objektů Score dle daného počtu*/
public List<Score> generateScores(int count) { public List<Score> generateScores(int count) {
//TODO List<Score> scores = new ArrayList<Score>();
return null; for (int i = 0; i < count; i++) {
scores.add(Score.generate());
}
return scores;
} }
/*zajistěte aby se daná kolekce zapsala do souboru ve formátu csv (hodnoty jsou oddělené středníkem nebo čárkou) public void saveScores(List<Score> scores, String file) throws FileNotFoundException {
* Zajistěte aby se v případě potřeby vytvořili i adresáře uvedené v názvu souboru*/ Paths.get(file).toAbsolutePath().getParent().toFile().mkdirs();
public void saveScores(List<Score> scores, String file) { try (PrintWriter printWriter = new PrintWriter(file)) {
//TODO for (Score score : scores) {
printWriter.format("%s;%d%n", score.getName(), score.getPoints());
}
}
} }
/*Zajistěte aby metoda vypsala kolekci do konzole*/
public void printScores(List<Score> scores) { public void printScores(List<Score> scores) {
//TODO for (Score score : scores) {
System.out.println(score);
}
} }
/*zajistěte aby metoda načetla score ze souboru bestScores.csv
* pomocí metody loadScoresFromFile
* případnou vyjímku odchťte a vypište ji do konzole.
* Metoda v tomto případě bude vracet prázdnou kolekci.
* Otestujte chování metody v případě nenexistujícího souboru.*/
public List<Score> loadScores() { public List<Score> loadScores() {
//TODO try {
return null; List<Score> scores = loadScoresFromFile("bestScores.csv");
return scores;
} catch (ScoreNotLoaded e) {
System.out.println("Exception \"" + e.getMessage() + "\". alreaded loaded scores:" + e.getCount());
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return Collections.emptyList();
} }
/*Pro daný soubor vytvořte Reader a s využitím metody loadScoresFromStream public List<Score> loadScoresFromFile(String filename) throws ScoreNotLoaded, FileNotFoundException, IOException {
* načtěte score. Odchyťte vyjímku ScoreNotLoaded vytvořte novou stejného typu, try (Reader inputReader = new FileReader(filename)) {
* ale to message přidejte název souboru jehož načítání selhalo. return loadScoresFromStream(inputReader);
* Ostatní vyjímky předejte výše*/ } catch (ScoreNotLoaded e) {
public List<Score> loadScoresFromFile(String filename) { throw new ScoreNotLoaded("Info about scores from file " + filename + "cannot be loaded.", e.getCount(), e);
//TODO }
return null;
} }
/*Proveďte samotné načtení dat z Readru. Počítejte počet načtených score. public List<Score> loadScoresFromStream(Reader inputReader) throws ScoreNotLoaded {
*Pokud řádek obsahuje neplatný počet bodů (NomberFormatException) přeskočte ho a pouze do konzoli vypište int count = 0;
*informaci o přeskočení řádku. try (BufferedReader bufferedReader = new BufferedReader(inputReader)) {
*V případě jakékoliv jiné chyby/vyjímky (Exception) vytvořte vyjímku ScoreNotLoaded, String line;
*která bude obsahovat i počet již načtených řádků*/ List<Score> scores = new ArrayList<>();
public List<Score> loadScoresFromStream(Reader inputReader) { while ((line = bufferedReader.readLine()) != null) {
//TODO String[] parts = line.split(";");
return null; try {
scores.add(new Score(parts[0], Integer.parseInt(parts[1])));
count++;
} catch (NumberFormatException e) {
System.out.println(
String.format("WARNING: Cannot parse points for player %s. Value: %s", parts[0], parts[1]));
}
}
return scores;
} catch (Exception e) {
throw new ScoreNotLoaded("Info about scores cannot be loaded.", count, e);
}
} }
} }
\ No newline at end of file
...@@ -2,12 +2,37 @@ package cz.vsb.fei.lab; ...@@ -2,12 +2,37 @@ package cz.vsb.fei.lab;
public class Score { public class Score {
/*doplňte třídu tak aby měla dva parametry: private String name;
* name typu string private int points;
* points typu int
* Přidejte get/set metody pro oba parametry public Score(String name, int points) {
* překryjte metodu toString this.name = name;
* vytvořte statickou metodu generate, která vygeneruje náhodné score s využitím metody Utilities.getRandomNick*/ this.points = points;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPoints() {
return points;
}
public void setPoints(int points) {
this.points = points;
}
public static Score generate() {
return new Score(Utilities.getRandomNick(), Utilities.RANDOM.nextInt(20, 300));
}
@Override
public String toString() {
return "Score [name=" + name + ", points=" + points + "]";
}
//TODO
} }
package cz.vsb.fei.lab; package cz.vsb.fei.lab;
public class ScoreNotLoaded { public class ScoreNotLoaded extends Exception {
/*Zajistěte aby třída byla vyjímka s konstruktorem se třemi parametry:
* message typu string private static final long serialVersionUID = -3234631445203246158L;
* count typu int
* ex tybu Throwable
* parametry message a ex využijte pro volání konstruktoru předka*/
//TODO private int count;
public ScoreNotLoaded(String message, int count) {
super(message);
this.count = count;
}
public ScoreNotLoaded(String message, int count, Throwable cause) {
super(message, cause);
this.count = count;
}
public int getCount() {
return count;
}
} }
...@@ -4,7 +4,7 @@ import java.util.Random; ...@@ -4,7 +4,7 @@ import java.util.Random;
public class Utilities { public class Utilities {
public static final Random RANDOM = new Random(); public static final Random RANDOM = new Random();
public static final String[] nicks = { "CyberSurfer", "PixelPioneer", "SocialSavvy", "DigitalDynamo", "ByteBuddy", "InstaGuru", public static final String[] niks = { "CyberSurfer", "PixelPioneer", "SocialSavvy", "DigitalDynamo", "ByteBuddy", "InstaGuru",
"TikTokTornado", "SnapMaster", "TweetTrendsetter", "ChatChampion", "HashtagHero", "EmojiEnthusiast", "TikTokTornado", "SnapMaster", "TweetTrendsetter", "ChatChampion", "HashtagHero", "EmojiEnthusiast",
"StoryStylist", "SelfieStar", "FilterFanatic", "VlogVirtuoso", "Memelord", "InfluencerInsider", "StoryStylist", "SelfieStar", "FilterFanatic", "VlogVirtuoso", "Memelord", "InfluencerInsider",
"StreamSupreme", "GeekyGizmo", "CodeCommander", "JavaJuggernaut", "ByteNinja", "SyntaxSamurai", "StreamSupreme", "GeekyGizmo", "CodeCommander", "JavaJuggernaut", "ByteNinja", "SyntaxSamurai",
...@@ -23,6 +23,6 @@ public class Utilities { ...@@ -23,6 +23,6 @@ public class Utilities {
"CloudConqueror", "EchoExplorer", "FunctionFanatic", "RobotRanger" }; "CloudConqueror", "EchoExplorer", "FunctionFanatic", "RobotRanger" };
public static String getRandomNick() { public static String getRandomNick() {
return nicks[RANDOM.nextInt(nicks.length)]; return niks[RANDOM.nextInt(niks.length)];
} }
} }
package jez04.structure.test; package jez04.structure.test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
...@@ -43,19 +42,14 @@ class ClassStructureTest { ...@@ -43,19 +42,14 @@ class ClassStructureTest {
assertTrue(app.generateScores(10).size() == 10); assertTrue(app.generateScores(10).size() == 10);
} }
@Test @Test
void loadScoresFromStreamTest() throws Exception { void loadScoresFromStreamTest() throws ScoreNotLoaded {
App app = new App(); App app = new App();
assertTrue(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScore-ok.csv"))).size() > 1); assertTrue(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScore-ok.csv"))).size() > 1);
} }
void loadScoresFromStreamExceptionTest() throws Exception { void loadScoresFromStreamExceptionTest() throws ScoreNotLoaded {
App app = new App(); App app = new App();
try { assertThrows(ScoreNotLoaded.class, () -> app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv"))).size() );
app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv"))).size();
fail("Exception not throwen");
} catch (Exception e) {
assertEquals(e.getClass(), ScoreNotLoaded.class, "Expected exception of type ScoreNotLoaded");
}
} }
void loadScoresTest() { void loadScoresTest() {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment