diff --git a/src/main/java/millions/controller/StockInformationReader.java b/src/main/java/millions/controller/StockInformationReader.java deleted file mode 100644 index 0e98210..0000000 --- a/src/main/java/millions/controller/StockInformationReader.java +++ /dev/null @@ -1,40 +0,0 @@ -package millions.controller; - -import millions.model.Stock; - -import java.io.*; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - - -public class StockInformationReader { - private final File file; - - public StockInformationReader(File file) { - this.file = file; - } - - public List readFile() { - List stocks = new ArrayList<>(); - try (Reader reader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(reader)) { - List lines = bufferedReader.readAllLines(); - for (String line : lines) { - // Skips comment and blank lines - if ( !(line.startsWith("#") || line.isEmpty()) ) { - String[] data = line.split(","); - // Ensures only fields of the correct length are read - if (data.length == 3) { - String symbol = data[0]; - String company = data[1]; - BigDecimal price = new BigDecimal(data[2]); - stocks.add(new Stock(symbol, company, price)); - } - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return stocks; - } -} \ No newline at end of file diff --git a/src/main/java/millions/controller/StockInformationWriter.java b/src/main/java/millions/controller/StockInformationWriter.java deleted file mode 100644 index 692bc75..0000000 --- a/src/main/java/millions/controller/StockInformationWriter.java +++ /dev/null @@ -1,34 +0,0 @@ -package millions.controller; - -import millions.model.Stock; - -import java.io.*; -import java.util.List; - -public class StockInformationWriter { - private final List stocks; - private final File destinationFile; - - public StockInformationWriter(List stocks, File destinationFile) { - this.stocks = stocks; - this.destinationFile = destinationFile; - } - - public void write() { - StringBuilder builder = new StringBuilder(); - for (Stock stock : stocks) { - builder.append(stock.getSymbol()); - builder.append(","); - builder.append(stock.getCompany()); - builder.append(","); - // Unsure if price history or just latest price should be saved - builder.append(stock.getSalesPrice().toPlainString()); - builder.append("\n"); - } - try (FileWriter writer = new FileWriter(destinationFile); BufferedWriter bufferedWriter = new BufferedWriter(writer)) { - bufferedWriter.write(builder.toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java new file mode 100644 index 0000000..5a0cee0 --- /dev/null +++ b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java @@ -0,0 +1,42 @@ +package millions.controller.fileIO; + +import millions.model.Stock; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class CSVStockFileParser { + private List lines; + + public CSVStockFileParser(List lines) { + if (verifyCSV(lines)) { + this.lines = lines; + } + else { + // throw file format error + } + } + + // returns true if all entries have exactly 3 data points + public boolean verifyCSV(List lines) { + return lines.stream() + .filter(l -> !(l.startsWith("#") || l.isBlank())) + .noneMatch(l -> l.split(",").length != 3); + + } + + public List parse() { + List stocks = new ArrayList<>(); + lines.stream() + .filter(l -> !((l.startsWith("#") || l.isBlank()))) + .forEach(l -> { + String[] split = l.split(","); + String symbol = split[0]; + String company = split[1]; + BigDecimal price = new BigDecimal(split[2]); + stocks.add(new Stock(symbol, company, price)); + }); + return stocks; + } +} diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java b/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java new file mode 100644 index 0000000..463ea04 --- /dev/null +++ b/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java @@ -0,0 +1,43 @@ +package millions.controller.fileIO; + +import millions.model.Stock; + +import java.io.BufferedWriter; +import java.io.*; +import java.nio.file.Path; +import java.util.List; + +//TODO: Validation of data before writing +public class CSVStockFileWriter implements StockFileWriter { + private final List stocks; + private String finalString; + + public CSVStockFileWriter(List stocks) { + this.stocks = stocks; + } + + @Override + public void formatString() { + StringBuilder builder = new StringBuilder(); + stocks.forEach(stock -> { + builder.append(stock.getSymbol()); + builder.append(","); + builder.append(stock.getCompany()); + builder.append(","); + builder.append(stock.getSalesPrice().toString()); + builder.append("\n"); + }); + this.finalString = builder.toString(); + } + + @Override + public boolean write(Path path){ + try (FileWriter fw = new FileWriter(path.toString()); BufferedWriter writer = new BufferedWriter(fw);) { + this.formatString(); + writer.write(finalString); + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } +} diff --git a/src/main/java/millions/controller/fileIO/StockFileReader.java b/src/main/java/millions/controller/fileIO/StockFileReader.java new file mode 100644 index 0000000..22852cf --- /dev/null +++ b/src/main/java/millions/controller/fileIO/StockFileReader.java @@ -0,0 +1,26 @@ +package millions.controller.fileIO; + +import java.io.*; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + + +public class StockFileReader { + private final Path filePath; + + public StockFileReader(Path path) { + this.filePath = path; + } + + public List readFile() { + File file = new File(filePath.toString()); + List lines = new ArrayList<>(); + try (Reader reader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(reader)) { + lines = bufferedReader.readAllLines(); + } catch (IOException e) { + e.printStackTrace(); + } + return lines; + } +} \ No newline at end of file diff --git a/src/main/java/millions/controller/fileIO/StockFileWriter.java b/src/main/java/millions/controller/fileIO/StockFileWriter.java new file mode 100644 index 0000000..32a8e13 --- /dev/null +++ b/src/main/java/millions/controller/fileIO/StockFileWriter.java @@ -0,0 +1,8 @@ +package millions.controller.fileIO; + +import java.nio.file.Path; + +public interface StockFileWriter { + public void formatString(); + public boolean write(Path path); +} diff --git a/src/main/java/millions/model/Stock.java b/src/main/java/millions/model/Stock.java index feff8bb..2a67d74 100644 --- a/src/main/java/millions/model/Stock.java +++ b/src/main/java/millions/model/Stock.java @@ -73,4 +73,9 @@ public BigDecimal getLatestPriceChange() { return currentPrice.subtract(lastPrice); } + + @Override + public String toString() { + return "Stock [symbol: " + symbol + ", company: " + company + ", prices: " + prices + "]"; + } } diff --git a/src/test/java/millions/CSVStockFileParserTest.java b/src/test/java/millions/CSVStockFileParserTest.java new file mode 100644 index 0000000..8cb459b --- /dev/null +++ b/src/test/java/millions/CSVStockFileParserTest.java @@ -0,0 +1,41 @@ +package millions; + +import millions.controller.fileIO.CSVStockFileParser; +import millions.controller.fileIO.StockFileReader; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CSVStockFileParserTest { + @TempDir + static Path tempDir; + + static Path sharedFile; + + @BeforeAll + public static void setUpTestFile() throws Exception { + sharedFile = Files.createFile(tempDir.resolve("file.csv")); + String string = "# Top 500 US Stocks by Market Cap\n"; + string += "# Ticker,Name,Price\n"; + string += "\n"; + string += "NVDA,Nvidia,191.27\n"; + string += "AAPL,Apple Inc.,276.43\n"; + string += "MSFT,Microsoft,404.68\n"; + Files.writeString(sharedFile, string); + } + + @Test + public void parseStockFileTest(){ + StockFileReader stockFileReader = new StockFileReader(sharedFile); + + CSVStockFileParser parser = new CSVStockFileParser(stockFileReader.readFile()); + assertEquals(3, parser.parse().size()); + } +} diff --git a/src/test/java/millions/CSVStockFileWriterTest.java b/src/test/java/millions/CSVStockFileWriterTest.java new file mode 100644 index 0000000..6765f7a --- /dev/null +++ b/src/test/java/millions/CSVStockFileWriterTest.java @@ -0,0 +1,43 @@ +package millions; + +import millions.controller.fileIO.CSVStockFileWriter; +import millions.controller.fileIO.StockFileReader; +import millions.model.Stock; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.math.BigDecimal; +import java.nio.file.Path; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CSVStockFileWriterTest { + @TempDir + static Path tempDir; + + List stocks; + + @BeforeEach + void setup() { + Stock s1 = new Stock("PEAR", "Pear Inc.", BigDecimal.valueOf(300)); + Stock s2 = new Stock("DOGL", "DOOGLE Inc.", BigDecimal.valueOf(200.00)); + Stock s3 = new Stock("MSFT", "EpsteinSoft Inc.", BigDecimal.valueOf(0.02)); + + this.stocks = List.of(s1, s2, s3); + } + + @Test + public void testWrite() { + for(Stock stock : this.stocks) { + System.out.println(stock.toString()); + } + CSVStockFileWriter csvStockFileWriter = new CSVStockFileWriter(stocks); + csvStockFileWriter.write(tempDir.resolve("stocks.csv")); + + StockFileReader stockFileReader = new StockFileReader(tempDir.resolve("stocks.csv")); + assertEquals(3, stockFileReader.readFile().size()); + } +} diff --git a/src/test/java/millions/StockFileReaderTest.java b/src/test/java/millions/StockFileReaderTest.java new file mode 100644 index 0000000..bfb9a8d --- /dev/null +++ b/src/test/java/millions/StockFileReaderTest.java @@ -0,0 +1,35 @@ +package millions; + +import millions.controller.fileIO.StockFileReader; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StockFileReaderTest { + @TempDir + static Path tempDir; + + static Path sharedFile; + @BeforeAll + public static void setUpTestFile() throws Exception { + sharedFile = Files.createFile(tempDir.resolve("file.csv")); + String string = "# Top 500 US Stocks by Market Cap\n"; + string += "# Ticker,Name,Price\n"; + string += "\n"; + string += "NVDA,Nvidia,191.27\n"; + string += "AAPL,Apple Inc.,276.43\n"; + string += "MSFT,Microsoft,404.68\n"; + Files.writeString(sharedFile, string); + } + + @Test + public void testReadStockFile() { + StockFileReader stockFileReader = new StockFileReader(sharedFile); + assertEquals(6, stockFileReader.readFile().size()); + } +}