package lab11;

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

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * Sample JUnit tests for SpringCleaning. Notice that these tests are not
 * thorough; they are provided only as a starting point.
 *
 * @author
 * @version
 */
public class SpringCleaningTest {

    /**
     * Helper method for testing parseNumber.
     *
     * @param s the Integer to parse
     */
    private static void parseInteger(String s) {
        assertEquals(Integer.valueOf(s), SpringCleaning.parseNumber(s));
    }

    /**
     * Helper method for testing parseNumber.
     *
     * @param s the Double to parse
     */
    private static void parseDouble(String s) {
        assertEquals(Double.valueOf(s), SpringCleaning.parseNumber(s));
    }

    /**
     * Helper method for testing parseNumber.
     *
     * @param s the BigInteger to parse
     */
    private static void parseBigInt(String s) {
        assertEquals(new BigInteger(s), SpringCleaning.parseNumber(s));
    }

    /**
     * Tests the parseNumber method.
     */
    @Test
    public void testParseNumber() {
        parseInteger("159");
        parseDouble("3.14159");
        parseBigInt("12345678901234567890");
    }

    /**
     * Tests the extractAll method.
     */
    @Test
    public void testExtractAll() {

        // create input file
        String s = "Hello 159\n3.14159 is delicious\n12345678901234567890\n";
        try {
            PrintWriter out = new PrintWriter("test.in");
            out.print(s);
            out.close();
        } catch (FileNotFoundException e) {
            fail(e);
        }

        // create expected result
        ArrayList<Number> expect = new ArrayList<>();
        expect.add(Integer.valueOf("159"));
        expect.add(Double.valueOf("3.14159"));
        expect.add(new BigInteger("12345678901234567890"));

        // compare actual result
        try {
            ArrayList<Number> actual = SpringCleaning.extractAll("test.in");
            assertEquals(expect, actual);
        } catch (FileNotFoundException e) {
            fail(e);
        }
    }

    /**
     * Tests the formatAll method.
     */
    @Test
    public void testFormatAll() {

        // create test input
        ArrayList<Number> numbers = new ArrayList<>();
        numbers.add(Integer.valueOf("149159"));
        numbers.add(Double.valueOf("3.14159"));
        numbers.add(new BigInteger("12345678901234567890"));

        // create output file
        try {
            SpringCleaning.formatAll(numbers, "test.out");
        } catch (FileNotFoundException e) {
            fail(e);
        }

        // compare actual result
        try {
            Scanner in = new Scanner(new File("test.out"));
            assertEquals("149,159", in.nextLine());
            assertEquals("3.14", in.nextLine());
            assertEquals("12,345,678,901,234,567,890", in.nextLine());
            assertFalse(in.hasNext());
            in.close();
        } catch (FileNotFoundException e) {
            fail(e);
        }
    }

}
