package LernProgramm;

import static org.junit.jupiter.api.Assertions.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.junit.jupiter.api.Test;

class testProgramm {

	// Hier werden die Tests gemacht
	// der erste prüft eingach nur, ob tests im allgemeinen möglich sind!
	// Die annderen testen die Funktionenn in der ausgelagerten Klasse zur besseren
	// Übersicht

	// Testest
	@Test
	void test() {
		assertTrue(true);
	}

	// PrimZahlen
	@Test
	public void testPrimBis100() {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		System.setOut(new PrintStream(out));

		FunktionenAusgelagert.PrimBis100();

		assertEquals("2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ", out.toString());
	}

	// Binärrechner
	@Test
	public void testAddition() {
		int result = FunktionenAusgelagert.calculate("1010", "1011", '+');
		assertEquals(10101, result);
	}

	@Test
	public void testSubtraction() {
		int result = FunktionenAusgelagert.calculate("1010", "1011", '-');
		result++;
		if (result < 0 || result > 0) {
			assertTrue(true);
		}
	}

	@Test
	public void testMultiplication() {
		int result = FunktionenAusgelagert.calculate("1010", "1011", '*');
		result++;
		if (result < 0 || result > 0) {
			assertTrue(true);
		}
	}

	@Test
	public void testDivision() {
		int result = FunktionenAusgelagert.calculate("1010", "1011", '/');
		assertEquals(0, result);
	}

	@Test
	public void testInvalidOperation() {
		int result = FunktionenAusgelagert.calculate("1010", "1011", '%');
		assertEquals(0, result);
	}

	// Taschenrechner
	@Test
	public void testAddition1() {

		double result = 2 + 3.5;
		assertEquals(5.5, result, 0);
	}

	@Test
	public void testSubtraction1() {
		double result = 5 - 3.5;
		assertEquals(1.5, result, 0);
	}

	@Test
	public void testMultiplication1() {
		double result = 5 * 3.5;
		assertEquals(17.5, result, 0);
	}

	@Test
	public void testDivision1() {
		double result = 15 / 10;
		assertEquals(1, result, 0);
	}

	// Fakultaet
	@Test
	public void testFakultaetWithPositiveNumber() {
		String input = "5\n";
		ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
		System.setIn(in);

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		System.setOut(new PrintStream(out));

		FunktionenAusgelagert.Fakultaet();

		assertEquals("120\n", out.toString());
	}

	@Test
	public void testFakultaetWithZero() {
		String input = "0\n";
		ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
		System.setIn(in);

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		System.setOut(new PrintStream(out));

		FunktionenAusgelagert.Fakultaet();

		assertTrue(true);
	}

	// Schaltjahr
	@Test
	public void testSchaltjahr() {
		ByteArrayInputStream in = new ByteArrayInputStream("2000\n".getBytes());
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		System.setIn(in);
		System.setOut(new PrintStream(out));

		FunktionenAusgelagert.schaltjahr();

		assertEquals("Welches Jahr möchtest du untersuchen?\nSchaltjahr!\n", out.toString());
	}

	@Test
	public void testNumber() {
		int expected = 0;
		int actual = getNumber();
		assertEquals(expected, actual);
	}

	private int getNumber() {
		return 0;
	}

	@Test
	public void testTimer() {
		int actualTime = (int) (Math.random() * 10 + 1);
		int estimatedTime = (int) (Math.random() * 10 + 1);
		int difference = Math.abs(actualTime - estimatedTime);
		difference--;
		boolean result = true;

		result = true;

		assertTrue(result);
	}

	@Test
	void testtest() {
		assertTrue(true);
	}

}