Skip to content
Snippets Groups Projects
ClassStructureTest.java 3.56 KiB
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.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;

import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.junit.jupiter.api.Test;

import cz.vsb.fei.lab.App;
import cz.vsb.fei.lab.Score;
import cz.vsb.fei.lab.ScoreNotLoaded;

class ClassStructureTest {

	StructureHelper helper = new StructureHelper();
	private static String className = "Score";

	@Test
	void scoreExistenceTest() {
//		helper.classExist(className);
		Class<?> c = Score.class;// helper.getClass(className);
		helper.hasProperty(c, "name", String.class, false);
		helper.hasProperty(c, "points", int.class, false);
		helper.hasMethod(c, "generate", Score.class);
	}

	@Test
	void scoreNotLoadedExistenceTest() {
//		helper.classExist(className);
		Class<?> c = ScoreNotLoaded.class;// helper.getClass("ScoreNotLoaded");
		helper.hasProperty(c, "count", int.class, false);
		helper.hasExtends(c, Exception.class);
	}

	@Test
	void generateScoresTest() {
		App app = new App();
		assertTrue(app.generateScores(10).size() == 10);
	}

	@Test
	void loadScoresFromStreamTest() throws Exception {
		App app = new App();
		assertTrue(app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScore-ok.csv")))
				.size() > 1);
	}

	void loadScoresFromStreamExceptionTest() throws ScoreNotLoaded, IllegalAccessException, InvocationTargetException, NoSuchMethodException, SecurityException {
		App app = new App();
		try {
			app.loadScoresFromStream(new InputStreamReader(App.class.getResourceAsStream("/bestScores-err.csv")))
					.size();
			fail("Exception not throwen!");
		} catch (Exception e) {
			assertEquals(ScoreNotLoaded.class, e.getClass(), "Excpectin exception of type ScoreNotLoaded");
			ScoreNotLoaded ex = (ScoreNotLoaded) e;
			int count = (int)ScoreNotLoaded.class.getDeclaredMethod("getCount").invoke(ex);
			assertTrue(count > 0, "Info about already parsed line missing");
		}
	}

	void loadScoresTest() {
		App app = new App();
		app.loadScores();
	}

	void saveScoresTest() throws IOException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		App app = new App();
		app.saveScores(List.of(createScore("test", 1), createScore("test2", 15)), "test.csv");
		assertEquals(2, Files.lines(Paths.get("test.csv")).count(),
				"Expecting existent of file test.csv with 2 lines.");
	}

	private Score createScore(String name, int points) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Constructor constructor = Score.class.getConstructor(String.class, int.class);
		return (Score)constructor.newInstance(name, points);
	}
	void saveScoresDirsTest() throws IOException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		App app = new App();
		app.saveScores(List.of(createScore("test", 1), createScore("test2", 15)), "test/subtest/test.csv");
		assertEquals(2, Files.lines(Paths.get("test", "subtest", "test.csv")).count(),
				"Expecting existent of file test.csv with 2 lines.");
	}

}