/* A buggy version of Primes to exercise GJDB on. */

import org.junit.Test;
import static org.junit.Assert.*;

/** Program for printing prime numbers.
 *  @author P. N. Hilfinger
 */
public class Primes {
    /** Print all primes up to ARGS[0] (interpreted as an
     *  integer), 10 to a line. */
    public static void main(String[] args) {
        printPrimes(Integer.parseInt(args[1]));
    }

    /** Return true iff X is prime. */
    public static boolean isPrime(int x) {
        if (x <= 1)
            return false;
        else
            return !isDivisible(x, 2);
    }

    /** True iff X is divisible by 
     *  some number >=K and < X, 
     *  given K > 1. */
    private static boolean isDivisible(int x, int k) {
        if (k > x)  
            return false;
        else if (x % k == 0)
            return true;
        else 
            return isDivisible(x, k+1);
    }

    /** Print all primes up to and including LIMIT, 10 to
     *  a line. */
    public static void printPrimes(int limit) {
        int np;
        np = 0;
        for (int p = 2; p <= limit; p += 1) {
            if (isPrime(p)) {
                System.out.print(p + " ");
                np += 1;
                if (np % 10 == 0)
                    System.out.println();
            }
        }
        if (np % 10 != 0)
            System.out.println();
    }

    /** Sample data for testIsPrime. */
    private static final int SAMPLE_PRIMES[] = { 
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 1021
    };

    /** Sample data for testIsComposite. */
    private static final int SAMPLE_COMPOSITES[] = {
        4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28,
        30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50 
    };

    @Test
    public void testIsPrime() {
        for (int p : SAMPLE_PRIMES) {
            assertTrue(p + " should be prime.", isPrime(p));
        }
    }

    @Test
    public void testIsComposite() {
        for (int p : SAMPLE_COMPOSITES) {
            assertFalse(p + " should be composite", isPrime(p));
        }
    }

}
