From 5fe81c2be588ceed10f099358299c8f7292ab90d Mon Sep 17 00:00:00 2001 From: = Date: Mon, 25 May 2026 19:53:06 +0200 Subject: [PATCH] Feat: Renamed File Parser to File Manager, and File Converter to File Parser --- .../ntnu/idi/idatt2003/g40/mappe/Main.java | 6 +- .../g40/mappe/service/FileConverter.java | 93 -------- .../g40/mappe/service/FileManager.java | 187 ++++++++++++++++ .../g40/mappe/service/FileParser.java | 204 +++++------------- .../g40/mappe/service/package-info.java | 2 +- .../g40/mappe/service/FileConverterTest.java | 72 ------- .../g40/mappe/service/FileManagerTest.java | 60 ++++++ .../g40/mappe/service/FileParserTest.java | 82 ++++--- 8 files changed, 353 insertions(+), 353 deletions(-) delete mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverter.java create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManager.java delete mode 100644 src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverterTest.java create mode 100644 src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManagerTest.java diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java index 3caea4b..dd5a61d 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java @@ -3,8 +3,8 @@ import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange; import edu.ntnu.idi.idatt2003.g40.mappe.model.Player; import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock; -import edu.ntnu.idi.idatt2003.g40.mappe.service.FileConverter; import edu.ntnu.idi.idatt2003.g40.mappe.service.FileParser; +import edu.ntnu.idi.idatt2003.g40.mappe.service.FileManager; import edu.ntnu.idi.idatt2003.g40.mappe.service.SaveGameService; import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventManager; import edu.ntnu.idi.idatt2003.g40.mappe.utils.ConfigValues; @@ -86,9 +86,9 @@ public void start(final Stage stage) throws Exception { ViewManager viewManager = new ViewManager(stage, eventManager); List stocksInFile; - FileParser parser1 = new FileParser("/sp500.csv"); + FileManager parser1 = new FileManager("/sp500.csv"); - FileConverter converter1 = new FileConverter(); + FileParser converter1 = new FileParser(); stocksInFile = converter1.getStocksFromStrings(parser1.readFile()); Exchange exchange = new Exchange("Exchange", stocksInFile); diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverter.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverter.java deleted file mode 100644 index 397328d..0000000 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverter.java +++ /dev/null @@ -1,93 +0,0 @@ -package edu.ntnu.idi.idatt2003.g40.mappe.service; - -import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -/** - * Converts stock objects to/from string format for file handling. - * - *

Responsibilities:

- * - * - *

Used with {@link FileParser}

- * - * @see FileParser - * @author tohja - * @version 1.0.0 - * */ -public class FileConverter { - - /** - * Turns a list of valid string representations - * of stock objects to a list of stock objects. - * - * @param validStocks list of string elements properly - * representing stock objects. - * - * @return {@link List} - * - * @throws IllegalArgumentException if stock object(s) cannot be converted, - * or if list is null/empty. - * - * */ - public List getStocksFromStrings(final List validStocks) - throws IllegalArgumentException { - if (validStocks == null || validStocks.isEmpty()) { - throw new IllegalArgumentException("Empty or null stock list!"); - } else { - List stocksFromFile = new ArrayList<>(); - List stockSymbols = new ArrayList<>(); - - validStocks.forEach(s -> { - String[] lineElements = s.split(","); - String stockSymbol = lineElements[0].trim(); - String stockName = lineElements[1].trim(); - BigDecimal stockPrice = new BigDecimal(lineElements[2].trim()); - - try { - Stock stockObject = new Stock(stockSymbol, stockName, stockPrice); - if (!stockSymbols.contains(stockSymbol)) { - stockSymbols.add(stockSymbol); - stocksFromFile.add(stockObject); - } - } catch (IllegalArgumentException e) { - System.err.println("(" + s + ") is not a valid stock! Skipping..."); - } - - }); - return stocksFromFile; - } - } - - /** - * Converts a list of stocks to string representations of that stock. - * - *

format: SYMBOL, NAME, PRICE

- * - * @param stocks a list of {@link Stock} objects. - * - * @return a list of string representation of the stock objects. - * - * @throws IllegalArgumentException if stocks is empty or null. - * */ - public List stocksToStrings(final List stocks) { - if (stocks == null || stocks.isEmpty()) { - throw new IllegalArgumentException("Empty or null stock list!"); - } else { - ArrayList stringList = new ArrayList<>(); - stocks.forEach(s -> - stringList.add(s.getSymbol().trim() + "," + s.getCompany().trim() - + "," + s.getSalesPrice().toString()) - ); - return stringList; - } - } -} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManager.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManager.java new file mode 100644 index 0000000..cd674cd --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManager.java @@ -0,0 +1,187 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service; + +import java.io.*; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.List; +import java.util.function.Predicate; + +/** + * Class used to parse (filter) valid stocks from a .txt file. + * + *

Responsibilities:

+ *
    + *
  • Read file and return a filtered list of string elements, + * where each element represents a valid stock line.
  • + * + *
  • Write a list of string representations of stock objects + * to file, each stock separated by a line.
  • + *
+ * + *

Used with {@link FileParser}

+ * + * @see FileParser + * @author tohja + * @version 1.0.0 + * */ +public class FileManager { + + /** The path name this parser is using.*/ + private final String pathName; + + /** + * Rule set for validating lines and strings. + * + *

Uses predicates.

+ * */ + private enum ParserRuleSet { + + /** + * Rule for whether string is empty or not. + * */ + NOT_EMPTY(s -> !s.trim().isEmpty()), + + /** + * Rule for if string is comment or not. + * */ + NOT_COMMENT(s -> !s.startsWith("#")), + + /** + * Rule for if line is in valid format. + * */ + VALID_FORMAT(NOT_EMPTY.rule.and(NOT_COMMENT.rule)), + + /** + * Rule for if string is considered a valid company symbol. + * */ + VALID_CODE(s -> s.matches("[A-Z]{4}")), + + /** + * Rule for if string is a valid company name. + * */ + VALID_NAME(s -> s.matches(".*")), + + /** + * Rule for if string can be parsed to a {@link BigDecimal} object. + * */ + CAN_PARSE_TO_BIG_DECIMAL(s -> { + try { + new BigDecimal(s); + return true; + } catch (NumberFormatException e) { + return false; + } + }), + + /** + * Rule for if string is in a valid price format. + * */ + VALID_PRICE_FORMAT(s -> s.matches("[^a-zA-Z]+")), + + /** + * Rule for if string is a valid price. + * */ + VALID_PRICE(VALID_PRICE_FORMAT.rule.and(CAN_PARSE_TO_BIG_DECIMAL.rule)); + + /** + * The constants' rules as predicates with input of type string. + * */ + private final Predicate rule; + + ParserRuleSet(final Predicate rule) { + this.rule = rule; + } + } + + /** + * Constructor. + * + * @param pathName the file path name to read. + * */ + public FileManager(final String pathName) { + this.pathName = pathName; + } + + /** + * Reads the file and returns a list element of all valid stocks as strings. + * + *

Uses {@link BufferedReader} for opening a file stream.

+ * + * @return {@link List} object of all valid stock strings in file. + * + * @throws IOException if path cannot be read. + * + * @see Path + * */ + + public List readFile() throws IOException { + try (InputStream inputStream = getClass().getResourceAsStream(pathName); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + + List allLines = bufferedReader.readAllLines(); + List readableLines = + allLines.stream() + .filter(ParserRuleSet.VALID_FORMAT.rule).toList(); + + // Valid lines (following the correct regular expressions) + return readableLines.stream().filter(s -> { + String[] parts = s.trim().split(","); + + if (parts.length != 3) { + return false; + } + + boolean validCode = ParserRuleSet + .VALID_CODE.rule.test(parts[0].trim()); + + boolean validName = ParserRuleSet + .VALID_NAME.rule.test(parts[1].trim()); + + boolean validPrice = ParserRuleSet + .VALID_PRICE.rule.test(parts[2].trim()); + + return validCode && validName && validPrice; + }).toList(); + + } catch (IOException e) { + throw new IOException("File parser could not parse file!"); + } + } + + /** + * Writes a given lists of stocks to the file. + * + *

Uses {@link BufferedWriter}.

+ * + * @param stringList list of strings representing stocks in the format + * SYMBOL, NAME, PRICE + * + * @throws IOException if writing process throws error. + * */ + public void writeStocksToFile(final List stringList) + throws IllegalArgumentException, IOException { + if (stringList == null || stringList.isEmpty()) { + throw new IllegalArgumentException("Empty or null list of stocks!"); + } else { + Path path = Paths.get(pathName); + + try (BufferedWriter writer = Files.newBufferedWriter(path, + StandardOpenOption.CREATE, + StandardOpenOption.APPEND)) { + + writer.newLine(); + + for (String line : stringList) { + writer.write(line); + writer.newLine(); + } + } catch (IOException e) { + throw new IOException("Error during buffered write", e); + } + } + } +} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParser.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParser.java index 481d423..c621a47 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParser.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParser.java @@ -1,187 +1,93 @@ package edu.ntnu.idi.idatt2003.g40.mappe.service; -import java.io.*; +import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock; import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.List; -import java.util.function.Predicate; /** - * Class used to parse (filter) valid stocks from a .txt file. + * Converts stock objects to/from string format for file handling. * *

Responsibilities:

*
    - *
  • Read file and return a filtered list of string elements, - * where each element represents a valid stock line.
  • + *
  • Turn a valid list of stock string elements to a + * list of {@link Stock} objects.
  • * - *
  • Write a list of string representations of stock objects - * to file, each stock separated by a line.
  • + *
  • Turn a list of stock objects to a + * list of string elements.
  • *
* - *

Used with {@link FileConverter}

+ *

Used with {@link FileManager}

* - * @see FileConverter + * @see FileManager * @author tohja * @version 1.0.0 * */ public class FileParser { - /** The path name this parser is using.*/ - private final String pathName; - - /** - * Rule set for validating lines and strings. - * - *

Uses predicates.

- * */ - private enum ParserRuleSet { - - /** - * Rule for whether string is empty or not. - * */ - NOT_EMPTY(s -> !s.trim().isEmpty()), - - /** - * Rule for if string is comment or not. - * */ - NOT_COMMENT(s -> !s.startsWith("#")), - - /** - * Rule for if line is in valid format. - * */ - VALID_FORMAT(NOT_EMPTY.rule.and(NOT_COMMENT.rule)), - - /** - * Rule for if string is considered a valid company symbol. - * */ - VALID_CODE(s -> s.matches("[A-Z]{4}")), - - /** - * Rule for if string is a valid company name. - * */ - VALID_NAME(s -> s.matches(".*")), - - /** - * Rule for if string can be parsed to a {@link BigDecimal} object. - * */ - CAN_PARSE_TO_BIG_DECIMAL(s -> { - try { - new BigDecimal(s); - return true; - } catch (NumberFormatException e) { - return false; - } - }), - - /** - * Rule for if string is in a valid price format. - * */ - VALID_PRICE_FORMAT(s -> s.matches("[^a-zA-Z]+")), - - /** - * Rule for if string is a valid price. - * */ - VALID_PRICE(VALID_PRICE_FORMAT.rule.and(CAN_PARSE_TO_BIG_DECIMAL.rule)); - - /** - * The constants' rules as predicates with input of type string. - * */ - private final Predicate rule; - - ParserRuleSet(final Predicate rule) { - this.rule = rule; - } - } - - /** - * Constructor. - * - * @param pathName the file path name to read. - * */ - public FileParser(final String pathName) { - this.pathName = pathName; - } - /** - * Reads the file and returns a list element of all valid stocks as strings. + * Turns a list of valid string representations + * of stock objects to a list of stock objects. * - *

Uses {@link BufferedReader} for opening a file stream.

+ * @param validStocks list of string elements properly + * representing stock objects. * - * @return {@link List} object of all valid stock strings in file. + * @return {@link List} * - * @throws IOException if path cannot be read. + * @throws IllegalArgumentException if stock object(s) cannot be converted, + * or if list is null/empty. * - * @see Path * */ - - public List readFile() throws IOException { - try (InputStream inputStream = getClass().getResourceAsStream(pathName); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { - - List allLines = bufferedReader.readAllLines(); - List readableLines = - allLines.stream() - .filter(ParserRuleSet.VALID_FORMAT.rule).toList(); - - // Valid lines (following the correct regular expressions) - return readableLines.stream().filter(s -> { - String[] parts = s.trim().split(","); - - if (parts.length != 3) { - return false; + public List getStocksFromStrings(final List validStocks) + throws IllegalArgumentException { + if (validStocks == null || validStocks.isEmpty()) { + throw new IllegalArgumentException("Empty or null stock list!"); + } else { + List stocksFromFile = new ArrayList<>(); + List stockSymbols = new ArrayList<>(); + + validStocks.forEach(s -> { + String[] lineElements = s.split(","); + String stockSymbol = lineElements[0].trim(); + String stockName = lineElements[1].trim(); + BigDecimal stockPrice = new BigDecimal(lineElements[2].trim()); + + try { + Stock stockObject = new Stock(stockSymbol, stockName, stockPrice); + if (!stockSymbols.contains(stockSymbol)) { + stockSymbols.add(stockSymbol); + stocksFromFile.add(stockObject); + } + } catch (IllegalArgumentException e) { + System.err.println("(" + s + ") is not a valid stock! Skipping..."); } - boolean validCode = ParserRuleSet - .VALID_CODE.rule.test(parts[0].trim()); - - boolean validName = ParserRuleSet - .VALID_NAME.rule.test(parts[1].trim()); - - boolean validPrice = ParserRuleSet - .VALID_PRICE.rule.test(parts[2].trim()); - - return validCode && validName && validPrice; - }).toList(); - - } catch (IOException e) { - throw new IOException("File parser could not parse file!"); + }); + return stocksFromFile; } } /** - * Writes a given lists of stocks to the file. + * Converts a list of stocks to string representations of that stock. + * + *

format: SYMBOL, NAME, PRICE

* - *

Uses {@link BufferedWriter}.

+ * @param stocks a list of {@link Stock} objects. * - * @param stringList list of strings representing stocks in the format - * SYMBOL, NAME, PRICE + * @return a list of string representation of the stock objects. * - * @throws IOException if writing process throws error. + * @throws IllegalArgumentException if stocks is empty or null. * */ - public void writeStocksToFile(final List stringList) - throws IllegalArgumentException, IOException { - if (stringList == null || stringList.isEmpty()) { - throw new IllegalArgumentException("Empty or null list of stocks!"); + public List stocksToStrings(final List stocks) { + if (stocks == null || stocks.isEmpty()) { + throw new IllegalArgumentException("Empty or null stock list!"); } else { - Path path = Paths.get(pathName); - - try (BufferedWriter writer = Files.newBufferedWriter(path, - StandardOpenOption.CREATE, - StandardOpenOption.APPEND)) { - - writer.newLine(); - - for (String line : stringList) { - writer.write(line); - writer.newLine(); - } - } catch (IOException e) { - throw new IOException("Error during buffered write", e); - } + ArrayList stringList = new ArrayList<>(); + stocks.forEach(s -> + stringList.add(s.getSymbol().trim() + "," + s.getCompany().trim() + + "," + s.getSalesPrice().toString()) + ); + return stringList; } } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/package-info.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/package-info.java index 633c60a..9a013e4 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/package-info.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/package-info.java @@ -1,5 +1,5 @@ /** * Contains classes providing modular functionality to the application, - * such as the {@link edu.ntnu.idi.idatt2003.g40.mappe.service.FileConverter}. + * such as the {@link edu.ntnu.idi.idatt2003.g40.mappe.service.FileParser}. * */ package edu.ntnu.idi.idatt2003.g40.mappe.service; diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverterTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverterTest.java deleted file mode 100644 index 5cb5444..0000000 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileConverterTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package edu.ntnu.idi.idatt2003.g40.mappe.service; - -import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -class FileConverterTest { - - private FileConverter converter; - - private String validStockAsString1; - private String validStockAsString2; - private String validStockAsString3; - private ArrayList allStocks; - private String invalidStockAsString1; - - @BeforeEach - void setUp() { - validStockAsString1 = "AAPL, Apple inc., 251.42"; - validStockAsString2 = "NVID, Nvidia corp., 100.25"; - validStockAsString3 = "SAMS, Samsung corporation, 103.21"; - - invalidStockAsString1 = "INVALID, This stock has an invalid code!, 100.21"; - - allStocks = new ArrayList<>(); - - allStocks.add(validStockAsString1); - allStocks.add(validStockAsString2); - allStocks.add(validStockAsString3); - allStocks.add(invalidStockAsString1); - - converter = new FileConverter(); - } - - @Test - void converter_returns_valid_stock_apple() { - - boolean stockIncluded = false; - - List stocksFromConverter = converter.getStocksFromStrings(allStocks); - - for (Stock s : stocksFromConverter) { - if (s.getSymbol().equals("AAPL")) { - stockIncluded = true; - break; - } - } - - Assertions.assertTrue(stockIncluded); - } - - @Test - void converter_ignores_invalid_stock_representation() { - - boolean stockIncluded = false; - - List stocksFromConverter = converter.getStocksFromStrings(allStocks); - - for (Stock s : stocksFromConverter) { - if (s.getSymbol().equals("INVALID")) { - stockIncluded = true; - break; - } - } - - Assertions.assertFalse(stockIncluded); - } -} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManagerTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManagerTest.java new file mode 100644 index 0000000..49dbd7e --- /dev/null +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileManagerTest.java @@ -0,0 +1,60 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class FileManagerTest { + + private final String testStockDataPath = "/testStockData.txt"; + + private final String absoluteTestStockDataPath = "src/main/resources/testStockData.txt"; + FileManager fileManager; + + private final String validStockFromFile = "NVID, Nvidida Corporation, 241.591"; + + private final String invalidStockFromFile = "COOLI, This is a cool name, 252.2"; + + private final String commentFromFile = "#Above me are some valid formats."; + + private List allLines = new ArrayList<>(); + + private List validStocks = new ArrayList<>(); + + @BeforeEach + void setUp() throws Exception { + fileManager = new FileManager(testStockDataPath); + Path path = Paths.get(absoluteTestStockDataPath); + allLines = Files.readAllLines(path); + try { + validStocks = fileManager.readFile(); + } catch (Exception _) { + throw new Exception("Test failed"); + } + } + + @Test + void parser_gets_valid_stock_from_file() { + assertTrue(allLines.contains(validStockFromFile)); + assertTrue(validStocks.contains(validStockFromFile)); + } + + @Test + void parser_skips_comments_from_file() { + assertTrue(allLines.contains(commentFromFile)); + assertFalse(validStocks.contains(commentFromFile)); + } + + @Test + void parser_skips_invalid_stock_from_file() { + assertTrue(allLines.contains(invalidStockFromFile)); + assertFalse(validStocks.contains(invalidStockFromFile)); + } +} \ No newline at end of file diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParserTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParserTest.java index 7d87b1a..fb59fc6 100644 --- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParserTest.java +++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/FileParserTest.java @@ -1,60 +1,72 @@ package edu.ntnu.idi.idatt2003.g40.mappe.service; +import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - class FileParserTest { - private final String testStockDataPath = "/testStockData.txt"; - - private final String absoluteTestStockDataPath = "src/main/resources/testStockData.txt"; - FileParser fileParser; + private FileParser converter; - private final String validStockFromFile = "NVID, Nvidida Corporation, 241.591"; + private String validStockAsString1; + private String validStockAsString2; + private String validStockAsString3; + private ArrayList allStocks; + private String invalidStockAsString1; - private final String invalidStockFromFile = "COOLI, This is a cool name, 252.2"; + @BeforeEach + void setUp() { + validStockAsString1 = "AAPL, Apple inc., 251.42"; + validStockAsString2 = "NVID, Nvidia corp., 100.25"; + validStockAsString3 = "SAMS, Samsung corporation, 103.21"; - private final String commentFromFile = "#Above me are some valid formats."; + invalidStockAsString1 = "INVALID, This stock has an invalid code!, 100.21"; - private List allLines = new ArrayList<>(); + allStocks = new ArrayList<>(); - private List validStocks = new ArrayList<>(); + allStocks.add(validStockAsString1); + allStocks.add(validStockAsString2); + allStocks.add(validStockAsString3); + allStocks.add(invalidStockAsString1); - @BeforeEach - void setUp() throws Exception { - fileParser = new FileParser(testStockDataPath); - Path path = Paths.get(absoluteTestStockDataPath); - allLines = Files.readAllLines(path); - try { - validStocks = fileParser.readFile(); - } catch (Exception _) { - throw new Exception("Test failed"); - } + converter = new FileParser(); } @Test - void parser_gets_valid_stock_from_file() { - assertTrue(allLines.contains(validStockFromFile)); - assertTrue(validStocks.contains(validStockFromFile)); - } + void converter_returns_valid_stock_apple() { - @Test - void parser_skips_comments_from_file() { - assertTrue(allLines.contains(commentFromFile)); - assertFalse(validStocks.contains(commentFromFile)); + boolean stockIncluded = false; + + List stocksFromConverter = converter.getStocksFromStrings(allStocks); + + for (Stock s : stocksFromConverter) { + if (s.getSymbol().equals("AAPL")) { + stockIncluded = true; + break; + } + } + + Assertions.assertTrue(stockIncluded); } @Test - void parser_skips_invalid_stock_from_file() { - assertTrue(allLines.contains(invalidStockFromFile)); - assertFalse(validStocks.contains(invalidStockFromFile)); + void converter_ignores_invalid_stock_representation() { + + boolean stockIncluded = false; + + List stocksFromConverter = converter.getStocksFromStrings(allStocks); + + for (Stock s : stocksFromConverter) { + if (s.getSymbol().equals("INVALID")) { + stockIncluded = true; + break; + } + } + + Assertions.assertFalse(stockIncluded); } } \ No newline at end of file