# CISC181 S2015 Lab8

### Preliminaries

- Make a new project with
*n*= 8 (following these instructions) - Name your main class "Lab8" (when creating a new module in the instructions above, in the
*Java class name*field)

### Instructions

In this lab you will develop a public **Fraction** class (in `Fraction.java`) with the arithmetic and output functionality listed below. However, you are also required to use a "test-driven development" approach based on unit testing. Thus, as you start to implement the methods below, you must also create a public **FractionTest** class (in `FractionTest.java`) which contains a suite of unit tests (aka methods) to test `Fraction` thoroughly.

#### Fraction

`Fraction` must have two private ints: `numerator` and `denominator`. If any arguments to the functions below have denominators with 0 value and a non-zero numerator, you must throw an `IllegalArgumentException` ("0 / 0" should be treated here as "0" and so not illegal). `Fraction` should also implement the `Comparable` interface. Here are other the public methods that Fraction must implement:

- A two-parameter constructor that initializes the numerator and denominator
- Accessor methods
`int getNumerator()`and`int getDenominator()` -
`void reduce()`: Reduces numerator and denominator to lowest terms. For example, "2 / 4" -> "1 / 2", or "10 / 15" -> "2 / 3". You may look up pseudocode for how to reduce factors. -
`String toString()`: Returns the fraction as a string, written as "numerator / denominator" -- e.g. "1 / 4", or "3 / 5". It should**always**be reduced first. If the numerator is 0, just return "0". If the denominator is 1, just return the numerator -- e.g. "5 / 1" -> "5". -
`void add(Fraction f)`: Add another fraction f to this one -
`void subtract(Fraction f)`: Subtract another fraction f from this one -
`void multiply(Fraction f)`: Multiply this fraction by another fraction f -
`void divide(Fraction f)`: Divide this fraction by another fraction f

#### FractionTest

`FractionTest` must have tests that cover every method above, with multiple "normal" and "border" cases as input, including `compareTo()` as implied by `Fraction's` implementation of the `Comparable` interface. You should also test that denominator = 0 exceptions are also thrown as specified.

Each test method should have the following form: "`void xNTest() { ... }`", such as "`add1Test()`" or "`division2Test()`", etc. Each test method should make at least one `Fraction` object, set some values, perform an operation or more, and test whether the correct output was obtained.

To declare that a test has been failed, define a new class (in `FractionTest.java` but outside of `FractionTest`) called `FractionException` derived from `Exception`. It should have a constructor that takes a String. Throw an instance of `FractionException` in test method `xNTest()` constructed with the message string "Failed xNTest()" IF AND ONLY IF A TEST IS FAILED.

Finally, make a `run()` method in `FractionTest` which calls all of your unit test methods. There should be *at a minimum* 20+ tests to get decent coverage of `Fraction's` functionality.

#### main()

This is all your `main()` in `Lab8.java` should contain:

FractionTest fracTest = new FractionTest(); try { fracTest.run(); } catch (FractionException fe) { System.out.println(fe.getMessage()); }

### Submission

Submit your `Fraction.java` and `FractionTest.java` on Sakai (be sure to add your name and section number to both). Do NOT submit `Lab8.java`.