
Тюттерин_Яков_Z1411_Lab4
.pdf
package ru.guap.investor.writer.impl;
import ru.guap.investor.model.Bond; import ru.guap.investor.model.FileType;
import ru.guap.investor.model.InvestorPortfolio; import ru.guap.investor.model.Stock;
import ru.guap.investor.writer.FileWriter;
import java.io.BufferedWriter; import java.io.File;
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List;
public class FileWriterTxt implements FileWriter {
public static final String DELIMETER = ";";
@Override
public FileType getType() { return FileType.TXT;
}

@Override
public void write(InvestorPortfolio investorPortfolio) { String path = investorPortfolio.getPath();
try (BufferedWriter writer = new BufferedWriter(new java.io.FileWriter(path, false))) {
List<String> lines = parseToString(investorPortfolio); for (String line : lines) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static List<String> parseToString(InvestorPortfolio investorPortfolio) { List<String> result = new ArrayList<>();
result.add("type" + DELIMETER + "company" + DELIMETER + "cost"); for (Bond bond : investorPortfolio.getBonds()) {
String temp = bond.getClass().getSimpleName() + DELIMETER + bond.getCompany() + DELIMETER +
bond.getCost();
result.add(temp);
}
result.add("");
result.add("type" + DELIMETER + "company" + DELIMETER + "cost"); for (Stock stock : investorPortfolio.getStocks()) {
String temp = stock.getClass().getSimpleName() + DELIMETER + stock.getCompany() + DELIMETER +
stock.getCost();
result.add(temp);
}
return result;
}
}

package ru.guap.investor.writer;
import ru.guap.investor.model.FileType;
import ru.guap.investor.model.InvestorPortfolio;
public interface FileWriter { FileType getType();
void write(InvestorPortfolio investorPortfolio);
}
Структура пакетов:

Тесты:
package ru.guap.investor.model;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import ru.guap.investor.model.Bond;
import ru.guap.investor.model.InvestorPortfolio; import ru.guap.investor.model.Pair;
import ru.guap.investor.model.Stock;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class InvestorPortfolioTest {
private InvestorPortfolio investorPortfolio;
@BeforeEach
public void init() {
this.investorPortfolio = new InvestorPortfolio(null, null);
}
@Test
public void checkSumBounds() { for (int i = 0; i < 5; i++) {
investorPortfolio.addBound(new Bond("SBER", 100.5));
}
Pair pair = investorPortfolio.sumBonds(); assertEquals(502.5, pair.getSum()); assertEquals(5, pair.getCount());
}

@Test
public void checkSumStocks() { for (int i = 0; i < 5; i++) {
investorPortfolio.addStock(new Stock("SBER", 100.5));
}
Pair pair = investorPortfolio.sumStocks(); assertEquals(502.5, pair.getSum()); assertEquals(5, pair.getCount());
}
}
package ru.guap.investor.service;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; import ru.guap.investor.model.*;
import ru.guap.investor.reader.impl.FileReaderTxt; import ru.guap.investor.util.WithountBeforeEach; import ru.guap.investor.writer.impl.FileWriterTxt;
import java.io.IOException; import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class InvestorServiceTest {
private InvestorService investorService;
private static final String PATH = "resource/test_portfolio.txt";

@BeforeEach
public void init(final TestInfo info) { Optional<Method> testMethod = info.getTestMethod(); if (testMethod.isPresent()) {
if (testMethod.get().isAnnotationPresent(WithountBeforeEach.class)) { return;
}
}
investorService = new InvestorService(PATH, FileType.TXT);
}
@Test
public void checkSumAfterRecovery() { for (int i = 0; i < 6; i++) {
investorService.addBound(new Bond("SBER", 100.5));
}
for (int i = 0; i < 4; i++) { investorService.addStock(new Stock("SBER", 100.5));
}
Pair pair = investorService.getSum(Currency.RUBLES); assertEquals(1005.0, pair.getSum()); assertEquals(10, pair.getCount());
Pair sumStocks = investorService.getSumStocks(Currency.RUBLES); assertEquals(402.0, sumStocks.getSum());
assertEquals(4, sumStocks.getCount());
Pair pairDollar = investorService.getSum(Currency.DOLLAR); assertEquals(11.2, pairDollar.getSum());
Pair sumBonds = investorService.getSumBonds(Currency.RUBLES); assertEquals(603.0, sumBonds.getSum());
assertEquals(6, sumBonds.getCount());
}

@Test
@WithountBeforeEach
public void checkEqualsAfterRecovery() {
InvestorPortfolio investorPortfolio = new InvestorPortfolio(FileType.TXT, PATH); for (int i = 0; i < 6; i++) {
investorPortfolio.addBound(new Bond("SBER", 100.5));
}
for (int i = 0; i < 4; i++) { investorPortfolio.addStock(new Stock("SBER", 100.5));
}
new FileWriterTxt().write(investorPortfolio); assertEquals(investorPortfolio, new FileReaderTxt().read(PATH));
}
@AfterEach
public void destroy() throws IOException { Files.deleteIfExists(Path.of(PATH));
}
}
package ru.guap.investor.util;
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) public @interface WithountBeforeEach {
}

package ru.guap.investor.writer;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import ru.guap.investor.model.Bond; import ru.guap.investor.model.FileType;
import ru.guap.investor.model.InvestorPortfolio; import ru.guap.investor.model.Stock;
import ru.guap.investor.reader.impl.FileReaderJson; import ru.guap.investor.writer.impl.FileWriterJson;
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class FileWriterJsonTest {
private InvestorPortfolio investorPortfolio;
private static final String PATH = "resource/test_portfolio.json";
@BeforeEach
public void init() {
investorPortfolio = new InvestorPortfolio(FileType.JSON, PATH);
}

@Test
public void checkEqualsAfterRecovery() { for (int i = 0; i < 6; i++) {
investorPortfolio.addBound(new Bond("SBER", 100.5));
}
for (int i = 0; i < 4; i++) { investorPortfolio.addStock(new Stock("SBER", 100.5));
}
new FileWriterJson().write(investorPortfolio); assertEquals(investorPortfolio, new FileReaderJson().read(PATH));
}
@AfterEach
public void destroy() throws IOException { Files.deleteIfExists(Path.of(PATH));
}
}
Результат выполнения тестов: