Commit 856c35d

mo <mo.khan@gmail.com>
2019-05-25 21:27:51
start assignment 2
1 parent 46f6829
doc/assignment_1.pdf
Binary file
doc/assignment_2-9feb2016.pdf
Binary file
doc/gitlab-ci.png
Binary file
src/Q1/AddressBook.java
@@ -1,383 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: AddressBook.java
- *
- * @description Represents a contact from an address book.
- * @author: mo khan Student ID: 3431709
- * @date May 6, 2019
- * @version 1.0
- */
-package Q1;
-
-import java.util.Objects;
-import java.util.Scanner;
-
-public class AddressBook implements Comparable<AddressBook> {
-  private String businessPhone;
-  private String cellPhone;
-  private String facebookId;
-  private String firstName = "";
-  private String homeAddress;
-  private String homePhone;
-  private String lastName = "";
-  private String middleName = "";
-  private String personalWebSite;
-  private String skypeId;
-
-  /** Create a new instance of class AddressBook. Initialize all fields to a blank string. */
-  public AddressBook() {
-    this("");
-  }
-
-  /**
-   * Create a new instance of class AddressBook. Initialize the firstName and set all other fields
-   * to a blank string.
-   *
-   * @param firstName the first name for the contact.
-   */
-  public AddressBook(String firstName) {
-    this(firstName, "", "");
-  }
-
-  /**
-   * Create a new instance of class AddressBook. Initialize the first name, middle name and last
-   * name. Set all other fields to a blank string.
-   *
-   * @param firstName the first name of the contact.
-   * @param middleName the middle name of the contact.
-   * @param lastName the last name of the contact.
-   */
-  public AddressBook(String firstName, String middleName, String lastName) {
-    this(firstName, middleName, lastName, "", "", "", "", "", "", "");
-  }
-
-  /**
-   * Create a new instance of class AddressBook. Initialize the first name, middle name, last name,
-   * business phone number, cell phone number, Facebook Id, home address, home phone number,
-   * personal website and Skype Id of the contact.
-   *
-   * @param firstName the first name of the contact.
-   * @param middleName the middle name of the contact.
-   * @param lastName the last name of the contact.
-   * @param businessPhone the phone number of the contact.
-   * @param cellPhone the cell phone number of the contact.
-   * @param facebookId the Facebook Id of the contact.
-   * @param homeAddress the home address of the contact.
-   * @param homePhone the home phone number of the contact.
-   * @param personalWebSite the website of the contact.
-   * @param skypeId the Skype Id of the contact.
-   */
-  public AddressBook(
-      String firstName,
-      String middleName,
-      String lastName,
-      String businessPhone,
-      String cellPhone,
-      String facebookId,
-      String homeAddress,
-      String homePhone,
-      String personalWebSite,
-      String skypeId) {
-    this.businessPhone = businessPhone;
-    this.cellPhone = cellPhone;
-    this.facebookId = facebookId;
-    this.firstName = firstName;
-    this.homeAddress = homeAddress;
-    this.homePhone = homePhone;
-    this.lastName = lastName;
-    this.middleName = middleName;
-    this.personalWebSite = personalWebSite;
-    this.skypeId = skypeId;
-  }
-
-  /**
-   * Returns the business phone number.
-   *
-   * @return the business phone number.
-   */
-  public String getBusinessPhone() {
-    return this.businessPhone;
-  }
-
-  /**
-   * Returns the cell phone number.
-   *
-   * @return the cell phone number.
-   */
-  public String getCellPhone() {
-    return this.cellPhone;
-  }
-
-  /**
-   * Returns the Facebook Id.
-   *
-   * @return the Facebook Id
-   */
-  public String getFacebookId() {
-    return this.facebookId;
-  }
-
-  /**
-   * Returns the first name.
-   *
-   * @return the first name
-   */
-  public String getFirstName() {
-    return this.firstName;
-  }
-
-  /**
-   * Returns the home address.
-   *
-   * @return the home address
-   */
-  public String getHomeAddress() {
-    return this.homeAddress;
-  }
-
-  /**
-   * Returns the home phone number.
-   *
-   * @return the phone number
-   */
-  public String getHomePhone() {
-    return this.homePhone;
-  }
-
-  /**
-   * Returns the last name.
-   *
-   * @return the last name
-   */
-  public String getLastName() {
-    return this.lastName;
-  }
-
-  /**
-   * Returns the middle name.
-   *
-   * @return the middle name
-   */
-  public String getMiddleName() {
-    return this.middleName;
-  }
-
-  /**
-   * Returns the personal website.
-   *
-   * @return the website name
-   */
-  public String getPersonalWebSite() {
-    return this.personalWebSite;
-  }
-
-  /**
-   * Returns the Skype Id.
-   *
-   * @return the skype id
-   */
-  public String getSkypeId() {
-    return this.skypeId;
-  }
-
-  /**
-   * Sets the business phone number.
-   *
-   * @param value The new phone number.
-   */
-  public void setBusinessPhone(String value) {
-    this.businessPhone = value;
-  }
-
-  /**
-   * Sets the cell phone number.
-   *
-   * @param value The new cell phone number.
-   */
-  public void setCellPhone(String value) {
-    this.cellPhone = value;
-  }
-
-  /**
-   * Sets the Facebook Id.
-   *
-   * @param value The new Facebook id.
-   */
-  public void setFacebookId(String value) {
-    this.facebookId = value;
-  }
-
-  /**
-   * Sets the first name.
-   *
-   * @param name the new first name.
-   */
-  public void setFirstName(String name) {
-    this.firstName = name;
-  }
-
-  /**
-   * Sets the home address.
-   *
-   * @param address new home address.
-   */
-  public void setHomeAddress(String address) {
-    this.homeAddress = address;
-  }
-
-  /**
-   * Sets the home phone number.
-   *
-   * @param value the new home phone number.
-   */
-  public void setHomePhone(String value) {
-    this.homePhone = value;
-  }
-
-  /**
-   * Sets the last name.
-   *
-   * @param name the last name.
-   */
-  public void setLastName(String name) {
-    this.lastName = name;
-  }
-
-  /**
-   * Sets the middle name.
-   *
-   * @param name the middle name.
-   */
-  public void setMiddleName(String name) {
-    this.middleName = name;
-  }
-
-  /**
-   * Sets the personal website.
-   *
-   * @param value the personal website
-   */
-  public void setPersonalWebSite(String value) {
-    this.personalWebSite = value;
-  }
-
-  /**
-   * Sets the Skype Id.
-   *
-   * @param value the Skype Id.
-   */
-  public void setSkypeId(String value) {
-    this.skypeId = value;
-  }
-
-  /**
-   * Converts a name to an Address Book.
-   *
-   * @param name the name to parse.
-   * @return an AddressBook instance.
-   */
-  public static AddressBook parseFrom(String name) {
-    String[] parts = name.split(" ");
-
-    switch (parts.length) {
-      case 1:
-        return new AddressBook(parts[0]);
-      case 2:
-        return new AddressBook(parts[0], "", parts[1]);
-      case 3:
-        return new AddressBook(parts[0], parts[1], parts[2]);
-      default:
-        return new AddressBook();
-    }
-  }
-
-  /**
-   * Compares name1 with name2 and returns a string representation. Returns a negative value if
-   * name1 is less than name2. Returns a positive value if name1 is greater than name2. Returns a
-   * zero if name1 is equal to name2.
-   *
-   * @param name1 first name
-   * @param name2 second name
-   * @return string version of -1, 0, 1
-   */
-  public static String compareNames(String name1, String name2) {
-    return Integer.toString(parseFrom(name1).compareTo(parseFrom(name2)));
-  }
-
-  /**
-   * Compares one address book with another. Returns a negative value if this is less than other.
-   * Returns a positive value if this is greater than other. Returns a zero if this is equal to
-   * other.
-   *
-   * @param other The other address book to compare to.
-   */
-  public int compareTo(AddressBook other) {
-    return this.firstName.compareTo(other.firstName)
-        + this.middleName.compareTo(other.middleName)
-        + this.lastName.compareTo(other.lastName);
-  }
-
-  /**
-   * Overrides equals to check for value equality instead of reference equality.
-   *
-   * @param o The other item to check against.
-   * @return true if values match, otherwise false.
-   */
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (!(o instanceof AddressBook)) return false;
-    AddressBook that = (AddressBook) o;
-    return Objects.equals(businessPhone, that.businessPhone)
-        && Objects.equals(cellPhone, that.cellPhone)
-        && Objects.equals(facebookId, that.facebookId)
-        && Objects.equals(firstName, that.firstName)
-        && Objects.equals(homeAddress, that.homeAddress)
-        && Objects.equals(homePhone, that.homePhone)
-        && Objects.equals(lastName, that.lastName)
-        && Objects.equals(middleName, that.middleName)
-        && Objects.equals(personalWebSite, that.personalWebSite)
-        && Objects.equals(skypeId, that.skypeId);
-  }
-
-  /**
-   * Overrides hashCode to ensure instances that are equal by value equate to the same hash code for
-   * hash key computations.
-   *
-   * @return The hash code
-   */
-  @Override
-  public int hashCode() {
-    return Objects.hash(
-        businessPhone,
-        cellPhone,
-        facebookId,
-        firstName,
-        homeAddress,
-        homePhone,
-        lastName,
-        middleName,
-        personalWebSite,
-        skypeId);
-  }
-
-  /**
-   * Overrides toString to return the first name of the contact.
-   *
-   * @return the first name of the contact.
-   */
-  @Override
-  public String toString() {
-    return this.firstName;
-  }
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-    System.out.print("Please enter first name: ");
-    String first = in.next();
-
-    System.out.print("Please enter second name: ");
-    String second = in.next();
-
-    System.out.println("The comparison result is " + AddressBook.compareNames(first, second));
-  }
-}
src/Q1/AddressBookTest.java
@@ -1,93 +0,0 @@
-package ca.mokhan.test;
-
-import Q1.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class AddressBookTest extends TestCase {
-  private AddressBook subject;
-
-  public AddressBookTest(String testName) {
-    super(testName);
-    this.subject = new AddressBook();
-  }
-
-  public static Test suite() {
-    return new TestSuite(AddressBookTest.class);
-  }
-
-  public void testFirstName() {
-    subject.setFirstName("mo");
-    assertEquals(subject.getFirstName(), "mo");
-  }
-
-  public void testMiddleName() {
-    subject.setMiddleName("tsuyoshi");
-    assertEquals(subject.getMiddleName(), "tsuyoshi");
-  }
-
-  public void testLastName() {
-    subject.setLastName("garrett");
-    assertEquals(subject.getLastName(), "garrett");
-  }
-
-  public void testHomeAddress() {
-    subject.setHomeAddress("1 University Dr, Athabasca, AB T9S 3A3");
-    assertEquals(subject.getHomeAddress(), "1 University Dr, Athabasca, AB T9S 3A3");
-  }
-
-  public void testBusinessPhone() {
-    subject.setBusinessPhone("1-800-788-9041");
-    assertEquals(subject.getBusinessPhone(), "1-800-788-9041");
-  }
-
-  public void testHomePhone() {
-    subject.setHomePhone("1-800-788-9041");
-    assertEquals(subject.getHomePhone(), "1-800-788-9041");
-  }
-
-  public void testCellPhone() {
-    subject.setCellPhone("1-800-788-9041");
-    assertEquals(subject.getCellPhone(), "1-800-788-9041");
-  }
-
-  public void testSkypeId() {
-    subject.setSkypeId("1-800-788-9041");
-    assertEquals(subject.getSkypeId(), "1-800-788-9041");
-  }
-
-  public void testFacebookId() {
-    subject.setFacebookId("1-800-788-9041");
-    assertEquals(subject.getFacebookId(), "1-800-788-9041");
-  }
-
-  public void testPersonalWebsite() {
-    subject.setPersonalWebSite("https://www.mokhan.ca/");
-    assertEquals(subject.getPersonalWebSite(), "https://www.mokhan.ca/");
-  }
-
-  public void testCompareNames() {
-    assertTrue(
-        Integer.parseInt(AddressBook.compareNames("Tsuyoshi M. Garret", "Takashi Shirogane")) > 0);
-    assertTrue(
-        Integer.parseInt(AddressBook.compareNames("Takashi Shirogane", "Tsuyoshi M. Garret")) < 0);
-    assertTrue(
-        Integer.parseInt(AddressBook.compareNames("Tsuyoshi Garret", "Tsuyoshi Garret")) == 0);
-  }
-
-  public void testCompareTo() {
-    AddressBook hunk = new AddressBook();
-    hunk.setFirstName("Tsuyoshi");
-    hunk.setLastName("Garrett");
-
-    AddressBook shiro = new AddressBook();
-    shiro.setFirstName("Takashi");
-    shiro.setLastName("Shirogane");
-
-    assertTrue(hunk.compareTo(shiro) > 0);
-    assertTrue(shiro.compareTo(hunk) < 0);
-    assertTrue(hunk.compareTo(hunk) == 0);
-    assertTrue(shiro.compareTo(shiro) == 0);
-  }
-}
src/Q1/README.md
@@ -1,230 +1,10 @@
-Learning Profile for Assignment #1, And Question #1
+Learning Profile for Assignment #2, And Question #1
 
 Name: Mo Khan
 Student ID: 3431709
 
 1. Problem Statement:
-
-Create a class named AddressBook that has the following field names:
-
-* firstName
-* middleName
-* lastName
-* homeAddress
-* businessPhone
-* homePhone
-* cellphone
-* skypeId
-* facebookId
-* personalWebSite
-
-Use appropriate data types to store the values for these fields in AddressBook objects.
-Create appropriate get and set methods to retrieve and assign values to these names.
-For example `getMiddleName(viveAddressBook)` should return the middle name of the person `Vive`.
-Similarly, `vive.setPersonalWebsite(url)` should set the personal website of the person `Vive` to the specified URL object.
-Using the get and set methods, create a comparison method `compareNames(name1, name2)` that compares the first, middle, and last names of strings name1 and name2.
-Assume that name1 and name2 follow the following format: "FirstName M. LastName".
-
-Test your program for correct, partially correct (e.g., name string without the middleName),
-and incorrect inputs (e.g., phone number containing special characters).
-
-
 2. Description of the Code: 
-
-I solved this exercise by installing `maven` and `junit`. Then I started
-implementing the `AddressBook` API one method at a time.
-
-I had trouble understanding the `compareNames` API because it was
-non-intuitive to me. I have previously worked with `C#` and am familiar
-with the `IComparer<T>` interface so I looked for the equivalent in
-Java. I found the `Comparable<T>` interface and chose to implement that.
-
-The `Comparable<T>` interface requires implementers to implement a
-method named `compareTo` that returns an integer value. This interface
-is used for sorting.
-
-Instead of trying to interpret how the `compareNames` method is supposed
-to behave, I chose to delegate to `compareTo` and return the string
-representation of the integer value.
-
-I also chose to override equality for this object to use `value`
-equality instead of `reference` equality.
-
-For code style I chose to use the [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html). I used a maven plugin to auto format the code to abide by the style guide each time I ran the tests.
-
 3. Errors and Warnings:
-
-I practice test driven development. So I always focus on writing a
-failing test first. This allows me to make sure that I see the intended
-failure in my test before implementing the required code to make it
-pass. It also helps me design the API of my software from the
-perspective of the client code that would use my software. The design
-benefits of test driven development were not as useful here, since the
-design of the API was provided to us in the assignment.
-
-Here's an example of a failure that occurred when I wrote the test first
-before implementing the required interface.
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 8 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 4 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO] -------------------------------------------------------------
-[ERROR] COMPILATION ERROR :
-[INFO] -------------------------------------------------------------
-[ERROR] /Users/mokha/development/gh/comp-268/src/Q1/AddressBookTest.java:[21,12] cannot find symbol
-  symbol:   method setFirstName(java.lang.String)
-  location: variable subject of type Q1.AddressBook
-[ERROR] /Users/mokha/development/gh/comp-268/src/Q1/AddressBookTest.java:[81,9] cannot find symbol
-  symbol:   method setFirstName(java.lang.String)
-  location: variable hunk of type Q1.AddressBook
-[ERROR] /Users/mokha/development/gh/comp-268/src/Q1/AddressBookTest.java:[85,10] cannot find symbol
-  symbol:   method setFirstName(java.lang.String)
-  location: variable shiro of type Q1.AddressBook
-[INFO] 3 errors
-[INFO] -------------------------------------------------------------
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD FAILURE
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  1.759 s
-[INFO] Finished at: 2019-05-13T19:55:36-06:00
-[INFO] ------------------------------------------------------------------------
-[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project assignment1: Compilation failure: Compilation failure:
-[ERROR] /Users/mokha/development/gh/comp-268/src/Q1/AddressBookTest.java:[21,12] cannot find symbol
-[ERROR]   symbol:   method setFirstName(java.lang.String)
-[ERROR]   location: variable subject of type Q1.AddressBook
-[ERROR] /Users/mokha/development/gh/comp-268/src/Q1/AddressBookTest.java:[81,9] cannot find symbol
-[ERROR]   symbol:   method setFirstName(java.lang.String)
-[ERROR]   location: variable hunk of type Q1.AddressBook
-[ERROR] /Users/mokha/development/gh/comp-268/src/Q1/AddressBookTest.java:[85,10] cannot find symbol
-[ERROR]   symbol:   method setFirstName(java.lang.String)
-[ERROR]   location: variable shiro of type Q1.AddressBook
-[ERROR] -> [Help 1]
-[ERROR]
-[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
-[ERROR] Re-run Maven using the -X switch to enable full debug logging.
-[ERROR]
-[ERROR] For more information about the errors and possible solutions, please read the following articles:
-[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
-```
-
-Here is the output after fixing the failing test:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 8 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 4 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 4 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.01 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-
-Results :
-
-Tests run: 13, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.552 s
-[INFO] Finished at: 2019-05-13T19:56:21-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
 4. Sample Input and Output:
-
-The test cases are described in `AddressBookTest.java`.
-
 5. Discussion:
-
-When I look at the design for the `AddressBook` class there are a few
-things that come to mind.
-
-1. The name `AddressBook` is a poor choice for a name. This object does
-   not represent an address book but rather a single contact in an
-   address book. I would split this class into two. One class named
-   `Contact` that represents the individual details for a contact in the
-   address book and a class named `AddressBook` that acts as the
-   aggregate root for contacts.
-2. This is more of a comment on Java than the API design, but `Java`
-   properties seem to requires A LOT of ceremony.
-
-For example in `Ruby` you can define a property/attribute very
-succinctly.
-
-```ruby
-class Contact
-  attr_accessor :first_name
-end
-```
-
-C# also has a nice shorthand for this. C# also allows specifying
-different access control for the getter and setter.
-
-```csharp
-public class Contact {
-  public string FirstName { get; set; }
-}
-```
-
-Finally the `Java` version requires much more ceremony.
-
-```java
-public class Contact {
-  private String firstName;
-
-  public String getFirstName() {
-    return this.firstName;
-  }
-
-  public void setFirstName(String firstName) {
-    this.firstName = firstName;
-  }
-}
-```
src/Q1/ReversedSentence.java
@@ -0,0 +1,5 @@
+package Q1;
+
+public class ReversedSentence {
+  public static void main(String[] args) {}
+}
src/Q1/ReversedSentenceTest.java
@@ -0,0 +1,20 @@
+package ca.mokhan.test;
+
+import Q1.*;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class ReversedSentenceTest extends TestCase {
+  public ReversedSentenceTest(String testName) {
+    super(testName);
+  }
+
+  public static Test suite() {
+    return new TestSuite(ReversedSentenceTest.class);
+  }
+
+  public void testTruthy() {
+    assertEquals(true, true);
+  }
+}
src/Q10/README.md
@@ -1,170 +0,0 @@
-Learning Profile for Assignment #1, And Question #2
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Modify the following program to the specifications given below:
-
-* I. Add a new status `SingleParent` where the tax is computed as a SINGLE but with a further reduction of $5000 per child.
-* II. Add a new tax condition - if the income is greater than $249,999 for SINGLE, then add a tax of 25% on income amount above $150,000; if the income is greater than $349,999 for MARRIED, then add a tax of 35% on income amount above $200,000.
-* III. Unknown status - if the status doesn't belong to `SINGLE` or `MARRIED` or `SINGLE_PARENT`, then compute a 33% tax on the income.
-
-```java
-import java.util.Scanner;
-
-public class TaxReturn {
-  public TaxReturn(double anIncome, int aStatus) {
-    income = anIncome;
-    status = aStatus;
-  }
-
-  public double getTax() {
-    double tax = 0;
-    if (status == SINGLE) {
-      if (income <= SINGLE_BRACKET1) tax = RATE1 * income;
-      else if (income <= SINGLE_BRACKET2)
-        tax = RATE1 * SINGLE_BRACKET1 + RATE2 * (income - SINGLE_BRACKET1);
-      else
-        tax =
-            RATE1 * SINGLE_BRACKET1
-                + RATE2 * (SINGLE_BRACKET2 - SINGLE_BRACKET1)
-                + RATE3 * (income - SINGLE_BRACKET2);
-    } else {
-      if (income <= MARRIED_BRACKET1) tax = RATE1 * income;
-      else if (income <= MARRIED_BRACKET2)
-        tax = RATE1 * MARRIED_BRACKET1 + RATE2 * (income - MARRIED_BRACKET1);
-      else
-        tax =
-            RATE1 * MARRIED_BRACKET1
-                + RATE2 * (MARRIED_BRACKET2 - MARRIED_BRACKET1)
-                + RATE3 * (income - MARRIED_BRACKET2);
-    }
-    return tax;
-  }
-
-  public static final int SINGLE = 1;
-  public static final int MARRIED = 2;
-  private static final double RATE1 = 0.15;
-  private static final double RATE2 = 0.28;
-  private static final double RATE3 = 0.31;
-  private static final double SINGLE_BRACKET1 = 21450;
-  private static final double SINGLE_BRACKET2 = 51900;
-  private static final double MARRIED_BRACKET1 = 35800;
-  private static final double MARRIED_BRACKET2 = 86500;
-  private double income;
-  private int status;
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-    System.out.print("Please enter your income: ");
-    double income = in.nextDouble();
-    System.out.print("Enter S (single) or M (married): ");
-    String input = in.next();
-    int status = 0;
-    if (input.equalsIgnoreCase("S")) status = TaxReturn.SINGLE;
-    else if (input.equalsIgnoreCase("M")) status = TaxReturn.MARRIED;
-    else {
-      System.out.println("Bad input.");
-      return;
-    }
-    TaxReturn aTaxReturn = new TaxReturn(income, status);
-    System.out.println("The tax is " + aTaxReturn.getTax());
-  }
-}
-```
-
-2. Description of the Code: 
-
-I started by adding tests for the existing code. By adding test coverage
-for the existing code, this makes it possible to add new features
-without breaking old features.
-
-I chose to decrease the taxable income in the constructor if the person
-is single.
-
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 48 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.871 s
-[INFO] Finished at: 2019-05-13T20:07:42-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-4. Sample Input and Output:
-
-Test cases are defined in `TaxReturnTest.java`.
-
-5. Discussion:
-
-There is a lot of conditional logic in `getTax()`. I considered
-[Refactor conditional with polymorphism](https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html)
-but decided not to make this change.
src/Q10/TaxReturn.java
@@ -1,120 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: TaxReturn.java
- *
- * @description Represents a contact from an address book.
- * @author: mo khan Student ID: 3431709
- * @date May 6, 2019
- * @version 1.0
- */
-package Q10;
-
-import java.util.Scanner;
-
-public class TaxReturn {
-  private double income;
-  private int status;
-  private int children;
-
-  /**
-   * Constructs a TaxReturn object for a given income and marital status, and computes the tax.
-   *
-   * @param income the taxpayer income
-   * @param status either SINGLE or MARRIED
-   */
-  public TaxReturn(double income, int status) {
-    this(income, status, 0);
-  }
-
-  /**
-   * Constructs a TaxReturn object for a given income and marital status and, and # of children.
-   *
-   * @param income the taxpayer income
-   * @param status either SINGLE or MARRIED
-   * @param children the number of children
-   */
-  public TaxReturn(double income, int status, int children) {
-    this.income = income;
-    this.status = status;
-    this.children = children;
-    if (this.isSingle()) this.income -= children * 5000;
-  }
-
-  /**
-   * Returns the calculated taxes to pay.
-   *
-   * @return the amount of tax to pay.
-   */
-  public double getTax() {
-    double tax = 0;
-
-    if (isSingle()) {
-      if (income <= SINGLE_BRACKET1) tax = RATE1 * income;
-      else if (income <= SINGLE_BRACKET2)
-        tax = RATE1 * SINGLE_BRACKET1 + RATE2 * (income - SINGLE_BRACKET1);
-      else
-        tax =
-            RATE1 * SINGLE_BRACKET1
-                + RATE2 * (SINGLE_BRACKET2 - SINGLE_BRACKET1)
-                + RATE3 * (income - SINGLE_BRACKET2);
-
-      if (income > 249999.0) tax += (income - 150000) * 0.25;
-    } else if (isMarried()) {
-      if (income <= MARRIED_BRACKET1) tax = RATE1 * income;
-      else if (income <= MARRIED_BRACKET2)
-        tax = RATE1 * MARRIED_BRACKET1 + RATE2 * (income - MARRIED_BRACKET1);
-      else
-        tax =
-            RATE1 * MARRIED_BRACKET1
-                + RATE2 * (MARRIED_BRACKET2 - MARRIED_BRACKET1)
-                + RATE3 * (income - MARRIED_BRACKET2);
-
-      if (income > 349999.0) tax += (income - 200000) * 0.35;
-    } else {
-      tax = income * 0.33;
-    }
-    return tax;
-  }
-
-  public static final int SINGLE = 1;
-  public static final int MARRIED = 2;
-
-  public static final double RATE1 = 0.15;
-  public static final double RATE2 = 0.28;
-  public static final double RATE3 = 0.31;
-
-  public static final double SINGLE_BRACKET1 = 21450;
-  public static final double SINGLE_BRACKET2 = 51900;
-
-  public static final double MARRIED_BRACKET1 = 35800;
-  public static final double MARRIED_BRACKET2 = 86500;
-
-  private boolean isSingle() {
-    return this.status == SINGLE;
-  }
-
-  private boolean isMarried() {
-    return this.status == MARRIED;
-  }
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-    System.out.print("Please enter your income: ");
-    double income = in.nextDouble();
-
-    System.out.print("Enter S (single) or M (married): ");
-    String input = in.next();
-    int status = 0;
-
-    if (input.equalsIgnoreCase("S")) status = TaxReturn.SINGLE;
-    else if (input.equalsIgnoreCase("M")) status = TaxReturn.MARRIED;
-    else {
-      System.out.println("Bad input.");
-      return;
-    }
-    System.out.print("Enter # of children: ");
-    int children = in.nextInt();
-
-    TaxReturn aTaxReturn = new TaxReturn(income, status, children);
-    System.out.println("The tax is " + aTaxReturn.getTax());
-  }
-}
src/Q10/TaxReturnTest.java
@@ -1,91 +0,0 @@
-package ca.mokhan.test;
-
-import Q10.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class TaxReturnTest extends TestCase {
-  public TaxReturnTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(TaxReturnTest.class);
-  }
-
-  public void test_SINGLE_BRACKET1() {
-    TaxReturn subject = new TaxReturn(TaxReturn.SINGLE_BRACKET1 - 0.01, TaxReturn.SINGLE);
-    assertEquals(3217.4985, subject.getTax());
-  }
-
-  public void test_SINGLE_BRACKET1_1_CHILD() {
-    TaxReturn subject = new TaxReturn(TaxReturn.SINGLE_BRACKET1 - 0.01, TaxReturn.SINGLE, 1);
-    assertEquals(2467.4985, subject.getTax());
-  }
-
-  public void test_SINGLE_BRACKET1_2_CHILDREN() {
-    TaxReturn subject = new TaxReturn(TaxReturn.SINGLE_BRACKET1 - 0.01, TaxReturn.SINGLE, 2);
-    assertEquals(1717.4985000000001, subject.getTax());
-  }
-
-  public void test_SINGLE_BRACKET1_3_CHILDREN() {
-    TaxReturn subject = new TaxReturn(TaxReturn.SINGLE_BRACKET1 - 0.01, TaxReturn.SINGLE, 3);
-    assertEquals(967.4985000000001, subject.getTax());
-  }
-
-  public void test_SINGLE_BRACKET2() {
-    TaxReturn subject = new TaxReturn(TaxReturn.SINGLE_BRACKET2 - 0.01, TaxReturn.SINGLE);
-    assertEquals(11743.4972, subject.getTax());
-  }
-
-  public void test_SINGLE_BRACKET3() {
-    TaxReturn subject = new TaxReturn(TaxReturn.SINGLE_BRACKET2 + 0.01, TaxReturn.SINGLE);
-    assertEquals(11743.5031, subject.getTax());
-  }
-
-  // if the income is greater than $249,999 for SINGLE, then add a tax of 25% on income amount above
-  // $150,000;
-  public void test_SINGLE_Income_Greater_Than_250K() {
-    // $0 - $21450: 0.15% = $3,217.5
-    // $21450 - $51900: 0.28% = $8,526.0
-    // $51900 - $250,000: 0.31% = $61411.0
-    // $150,000 - $250,000: 0.25% = $25,000.0
-    // total: $98,154.50
-
-    TaxReturn subject = new TaxReturn(250000, TaxReturn.SINGLE);
-    assertEquals(98154.50, subject.getTax());
-  }
-
-  public void test_MARRIED_BRACKET1() {
-    TaxReturn subject = new TaxReturn(TaxReturn.MARRIED_BRACKET1 - 0.01, TaxReturn.MARRIED);
-    assertEquals(5369.9985, subject.getTax());
-  }
-
-  public void test_MARRIED_BRACKET2() {
-    TaxReturn subject = new TaxReturn(TaxReturn.MARRIED_BRACKET2 - 0.01, TaxReturn.MARRIED);
-    assertEquals(19565.997200000005, subject.getTax());
-  }
-
-  public void test_MARRIED_BRACKET3() {
-    TaxReturn subject = new TaxReturn(TaxReturn.MARRIED_BRACKET2 + 0.01, TaxReturn.MARRIED);
-    assertEquals(19566.003099999998, subject.getTax());
-  }
-
-  // if the income is greater than $349,999 for MARRIED, then add a tax of 35% on income amount
-  // above $200,000.
-  public void test_MARRIED_Income_Greater_Than_350K() {
-    // $0 - $35,800: 0.15% = $5,370.0
-    // $35,800 - $86,500: 0.28% = $14196.000000000002
-    // $86,500 - $350,000: 0.31% = $81685.0
-    // $200,000 - $350,000: 0.35% = $52500.0
-    // total: $153,751.0
-    TaxReturn subject = new TaxReturn(350000, TaxReturn.MARRIED);
-    assertEquals(153751.0, subject.getTax());
-  }
-
-  public void test_UNKNOWN_status_Should_tax_at_33_percent() {
-    TaxReturn subject = new TaxReturn(100000, 3);
-    assertEquals(33000.0, subject.getTax());
-  }
-}
src/Q2/BonusOnSavings.java
@@ -1,101 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: BonusOnSavings.java
- *
- * @description Represents an object that can compute a bonus based on the amount an employee saves.
- * @author: mo khan Student ID: 3431709
- * @date May 7, 2019
- * @version 1.0
- */
-package Q2;
-
-import java.util.Scanner;
-
-public class BonusOnSavings {
-  double annualRate = 0.0;
-  double quarterlyRate = 0.0;
-
-  /** Constructs a BonusOnSavings with a default quarterly rate of 3% and annual rate of 5%. */
-  public BonusOnSavings() {
-    this(0.03, 0.05);
-  }
-
-  /**
-   * Constructs a BonusOnSavings object for a given income and marital status, and computes the tax.
-   *
-   * @param quarterlyRate the quarterly rate to apply.
-   * @param annualRate the annual rate to apply.
-   */
-  public BonusOnSavings(double quarterlyRate, double annualRate) {
-    this.quarterlyRate = quarterlyRate;
-    this.annualRate = annualRate;
-  }
-
-  /**
-   * Computes the bonus based on the target monthly commitment and the actual quarterly
-   * contributions.
-   *
-   * @param monthlyCommitment the target monthly commitment for each month.
-   * @param q1 the actual contribution for the first quarter.
-   * @param q2 the actual contribution for the second quarter.
-   * @param q3 the actual contribution for the third quarter.
-   * @param q4 the actual contribution for the fourth quarter.
-   * @return the calculated bonus amount for the year.
-   */
-  public double computeBonus(double monthlyCommitment, double q1, double q2, double q3, double q4) {
-    double quarterlyTarget = monthlyCommitment * 3;
-    double annualTarget = monthlyCommitment * 12;
-
-    return this.quarterlyBonus(quarterlyTarget, q1)
-        + this.quarterlyBonus(quarterlyTarget, q2)
-        + this.quarterlyBonus(quarterlyTarget, q3)
-        + this.quarterlyBonus(quarterlyTarget, q4)
-        + this.annualBonus(annualTarget, q1 + q2 + q3 + q4);
-  }
-
-  /**
-   * Computes the quarterly bonus for a given target and actual contribution amount.
-   *
-   * @param target the target quarterly contribution amount for this employee.
-   * @param actual the actual quarterly contribution amount for this employee.
-   * @return the calculated quarterly bonus
-   */
-  private double quarterlyBonus(double target, double actual) {
-    return (actual >= target) ? actual * this.quarterlyRate : 0.0;
-  }
-
-  /**
-   * Calculates the annual bonus amount for the target annual contribution and the actual
-   * contribution.
-   *
-   * @param target the target annual contribution
-   * @param actual the actual contribution amount for the year
-   * @return the calculated annual bonus
-   */
-  private double annualBonus(double target, double actual) {
-    if (actual < target) return 0.0;
-
-    return (actual * this.annualRate) + ((actual - target) * 0.25);
-  }
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-    System.out.print("Please enter your target monthly contribution: ");
-    double monthlyCommitment = in.nextDouble();
-
-    System.out.print("Please enter Q1 contributions: ");
-    double q1 = in.nextDouble();
-
-    System.out.print("Please enter Q2 contributions: ");
-    double q2 = in.nextDouble();
-
-    System.out.print("Please enter Q3 contributions: ");
-    double q3 = in.nextDouble();
-
-    System.out.print("Please enter Q4 contributions: ");
-    double q4 = in.nextDouble();
-
-    double bonus = new BonusOnSavings().computeBonus(monthlyCommitment, q1, q2, q3, q4);
-
-    System.out.println("The calculated bonus is " + bonus);
-  }
-}
src/Q2/BonusOnSavingsTest.java
@@ -1,27 +0,0 @@
-package ca.mokhan.test;
-
-import Q2.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class BonusOnSavingsTest extends TestCase {
-  private BonusOnSavings subject;
-
-  public BonusOnSavingsTest(String testName) {
-    super(testName);
-    this.subject = new BonusOnSavings();
-  }
-
-  public static Test suite() {
-    return new TestSuite(BonusOnSavingsTest.class);
-  }
-
-  public void testComputeBonusEmployeeOne() {
-    assertEquals(1650.00, subject.computeBonus(2000, 5000, 7000, 4000, 8000));
-  }
-
-  public void testComputeBonusEmployeeTwo() {
-    assertEquals(4680.00, subject.computeBonus(3000, 6000, 9000, 10000, 17000));
-  }
-}
src/Q2/README.md
@@ -1,171 +0,0 @@
-Learning Profile for Assignment #1, And Question #2
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Space Inc. will give a quarterly and annual bonus to its employees only if the savings of the quarter and/or
-the year are greater than or equal to quarterly minimum (monthly commitment x 3) and/or the annual minimum (monthly commitment x 12) amount, respectively.
-
-The quarterly bonus is 3% of eligible quarterly savings, and the annual bonus is 5% of annual savings if eligible.
-If the annual savings exceeds the committed amount by at least 25%, Space Inc. matches the additional savings (25% or above) as part of the annual bonus.
-
-I. An employee has committed to save $2000 per month.
-
-Her quarterly savings are as follows:
-
-* Q1 – $5000
-* Q2 – $7000
-* Q3 – $4000
-* Q4 – $8000
-
-II. Another employee has committed to save $3000 per month.
-His quarterly savings are as follows:
-
-* Q1 – $6000
-* Q2 – $9000
-* Q3 – $10000
-* Q4 – $17000
-
-Write a program to compute the total bonus amount earned by these two employees in the year.
-
-2. Description of the Code:
-
-I created a class that implemented the interface described in the
-assignment. To calculate the bonus for the year I created a method
-called `quarterlyBonus` to calculate the bonus for each month. I also
-created a method called `annualBonus` to calculate the additional bonus
-for the annual target. Then I summed the quarterly bonuses with the
-annual bonus to calculate the final bonus amount.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 48 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.871 s
-[INFO] Finished at: 2019-05-13T20:07:42-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-
-4. Sample Input and Output:
-[Provide some test cases with sample input and output of your program.]
-
-The test cases can be found in `BonusOnSavingsTest.java`.
-
-5. Discussion:
-
-I manually calculated the expected bonuses to make sure that I
-understood the problem and how to calculate a result.
-
-Employee 1
-
-Her quarterly savings are as follows:
-
-* Q1 – $5000
-* Q2 – $7000
-* Q3 – $4000
-* Q4 – $8000
-
-Quarterly minimum: $6,000
-Annual minimum: $24,000
-
-* Q1: Does not meet quarterly minimum.
-* Q2: Exceeds quarterly minimum. $7000 * 3% = $210
-* Q3: Does not meet quarterly minimum
-* Q4: Exceeds quarterly minimum. $8000 * 3% = $240.
-* Y1: $24,000.00 meets the annual minimum. $24,000.00 * 5% = $1,200.00
-
-Total bonus: 210 + 240 + 1200 = $1,650.00
-
-Employee 2
-
-* Q1 – $6000
-* Q2 – $9000
-* Q3 – $10000
-* Q4 – $17000
-
-Quarterly min: $9000.00
-Annual min: $36,000.00
-
-* Q1: does not meet quarterly min.
-* Q2: $9,000 * 3% = $270.00
-* Q3: $10,000 * 3% = $300.00
-* Q4: $17,000 * 3% = $510.00
-* Y1: $42,000.00 saved. $42,000.00 * 5% = $2,100.00
-
-42,000 - 36,000 = $6,000 * 25% = $1,500.00
-
-Total: $270.00 + $300.00 + $510.00 + $2,100.00 + $1,500.00
-$4,680.00
-
-Then I started by writing tests to reproduce the expected results. Once
-I had a working test, I began to implment the code to make the test
-pass. After I got the tests passing I started to refactor the code by
-extracting methods.
src/Q3/CartesianCoordinateSystem.java
@@ -1,46 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: CartesianCoordinateSystem.java
- *
- * @description Represents an object that can calculate the distance between two points on a
- *     cartesian plain
- * @author: mo khan Student ID: 3431709
- * @date May 7, 2019
- * @version 1.0
- */
-package Q3;
-
-import java.util.Scanner;
-
-public class CartesianCoordinateSystem {
-  /**
-   * Calculate the distance between two points.
-   *
-   * @param x1 x coordinate for the first point.
-   * @param y1 y coordinate for the first point.
-   * @param x2 x coordinate for the second point.
-   * @param y2 y coordinate for the second point.
-   * @return the distance between the two points
-   */
-  public double calculateDistance(double x1, double y1, double x2, double y2) {
-    return Math.round(Math.pow(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2), 0.5) * 100) / 100.0;
-  }
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-
-    System.out.print("Please enter X1: ");
-    double x1 = in.nextDouble();
-
-    System.out.print("Please enter Y1 contributions: ");
-    double y1 = in.nextDouble();
-
-    System.out.print("Please enter X2 contributions: ");
-    double x2 = in.nextDouble();
-
-    System.out.print("Please enter Y2 contributions: ");
-    double y2 = in.nextDouble();
-
-    CartesianCoordinateSystem cartesian = new CartesianCoordinateSystem();
-    System.out.println("The distance is " + cartesian.calculateDistance(x1, y1, x2, y2));
-  }
-}
src/Q3/CartesianCoordinateSystemTest.java
@@ -1,23 +0,0 @@
-package ca.mokhan.test;
-
-import Q3.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class CartesianCoordinateSystemTest extends TestCase {
-  private CartesianCoordinateSystem subject;
-
-  public CartesianCoordinateSystemTest(String testName) {
-    super(testName);
-    this.subject = new CartesianCoordinateSystem();
-  }
-
-  public static Test suite() {
-    return new TestSuite(CartesianCoordinateSystemTest.class);
-  }
-
-  public void testDistanceBetweenPoints() {
-    assertEquals(7.28, subject.calculateDistance(-2, -3, -4, 4));
-  }
-}
src/Q3/README.md
@@ -1,101 +0,0 @@
-Learning Profile for Assignment #1, And Question #3
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Write a program that prompts the user to enter two points `(x1, y1)` and `(x2, y2)`.
-Calculate and display the distance between the two points using the formula below.
-Round the answer up to 2 decimal points.
-You can use `Math.pow(a,0.5)` to compute the square root of an expression.
-`Math.pow()` returns a double.
-
-For example, the distance between the points (−2, −3) and (−4, 4) is approximately 7.28, as shown below.
-
-2. Description of the Code: 
-
-[Briefly describe how you solved the problem in your code. You should include short description of classes, methods, and variables (if necessary) that you used in your code.]
-
-I took the example described in the problem statement and converted it
-to a junit test. Then I implemented the `calculateDistance` interface.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 48 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.899 s
-[INFO] Finished at: 2019-05-13T21:15:06-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-4. Sample Input and Output:
-
-Tests are available in `CartesianCoordinateSystemTest.java`.
-
-5. Discussion:
src/Q4/BanffMarathonRunner.java
@@ -1,148 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: BanffMarathonRunner.java
- *
- * @description Represents a marathon runner
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q4;
-
-import Q1.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public class BanffMarathonRunner extends AddressBook {
-  private int time;
-  private int years;
-
-  /**
-   * Constructs a BanffMarathonRunner object.
-   *
-   * @param firstName the first name of the runner
-   * @param lastName the last name of the runner
-   * @param time the time it took the runner to complete the marathon
-   * @param years the number of years they participated
-   */
-  public BanffMarathonRunner(String firstName, String lastName, int time, int years) {
-    super(firstName, "", lastName);
-    this.time = time;
-    this.years = years;
-  }
-
-  /**
-   * Performs a comparison of this runner with another based on the time it took them to complete
-   * the marathon. Because java generics does not allow implementing a generic interface with
-   * different type parameters, this code assumes the AddressBook is an instance of a Runner.
-   *
-   * @param other the other runner to compare against
-   * @return a negative integer, zero, or a positive integer as the first argument is less than,
-   *     equal to, or greater than the second.
-   */
-  public int compareTo(AddressBook other) {
-    BanffMarathonRunner runner = (BanffMarathonRunner) other;
-    return Integer.compare(this.time, runner.time);
-  }
-
-  /**
-   * Return the time take to complete the race.
-   *
-   * @return the time taken to complete the race
-   */
-  public int getTime() {
-    return this.time;
-  }
-
-  /**
-   * Returns a string representation of the runner.
-   *
-   * @return The first name + the # of years that they participated.
-   */
-  @Override
-  public String toString() {
-    return super.getFirstName() + " " + this.years;
-  }
-
-  /**
-   * Sorts the list of runners based on time, then returns the fastest runner.
-   *
-   * @param runners the list of runners.
-   * @return the fastest runner
-   */
-  public static BanffMarathonRunner getFastestRunner(BanffMarathonRunner[] runners) {
-    Arrays.sort(runners);
-    return runners[0];
-  }
-
-  /**
-   * Sorts the list of runners based on time, then returns the second fastest runner.
-   *
-   * @param runners the list of runners.
-   * @return the second fastest runner
-   */
-  public static BanffMarathonRunner getSecondFastestRunner(BanffMarathonRunner[] runners) {
-    Arrays.sort(runners);
-    return runners[1];
-  }
-
-  /**
-   * Calculates the average time that it took the runners to complete the marathon.
-   *
-   * @param runners the array of runners.
-   * @return the average time taken to complete the marathon
-   */
-  public static int getAverageTime(BanffMarathonRunner[] runners) {
-    int sum = 0;
-    for (BanffMarathonRunner runner : runners) sum += runner.time;
-    return sum / runners.length;
-  }
-
-  /**
-   * Returns the runners that finished the marathon in above or equal to average time.
-   *
-   * @param runners the list of runners
-   * @return the list of runners that finished the marathon in above average time.
-   */
-  public static String getAboveAverageRunners(BanffMarathonRunner[] runners) {
-    int average = getAverageTime(runners);
-    ArrayList<String> winners = new ArrayList<String>();
-
-    for (BanffMarathonRunner runner : runners)
-      if (runner.time <= average) winners.add(runner.toString());
-
-    return String.join(System.lineSeparator(), winners);
-  }
-
-  public static void main(String[] args) {
-    BanffMarathonRunner[] runners = {
-      new BanffMarathonRunner("Elena", "Brandon", 341, 1),
-      new BanffMarathonRunner("Thomas", "Molson", 273, 2),
-      new BanffMarathonRunner("Hamilton", "Winn", 278, 5),
-      new BanffMarathonRunner("Suzie", "Sarandin", 329, 7),
-      new BanffMarathonRunner("Philip", "Winne", 445, 9),
-      new BanffMarathonRunner("Alex", "Trebok", 275, 3),
-      new BanffMarathonRunner("Emma", "Pivoto", 275, 4),
-      new BanffMarathonRunner("John", "Lenthen", 243, 1),
-      new BanffMarathonRunner("James", "Lean", 334, 1),
-      new BanffMarathonRunner("Jane", "Ostin", 412, 1),
-      new BanffMarathonRunner("Emily", "Car", 393, 4),
-      new BanffMarathonRunner("Daniel", "Hamshire", 299, 4),
-      new BanffMarathonRunner("Neda", "Bazdar", 343, 3),
-      new BanffMarathonRunner("Aaron", "Smith", 317, 6),
-      new BanffMarathonRunner("Kate", "Hen", 265, 8)
-    };
-
-    BanffMarathonRunner fastestRunner = BanffMarathonRunner.getFastestRunner(runners);
-    System.out.println(fastestRunner.getFirstName());
-    System.out.println(fastestRunner.getHomeAddress());
-    System.out.println(fastestRunner.getTime());
-
-    BanffMarathonRunner secondFastestRunner = BanffMarathonRunner.getSecondFastestRunner(runners);
-    System.out.println(secondFastestRunner.getFirstName());
-    System.out.println(secondFastestRunner.getHomeAddress());
-    System.out.println(secondFastestRunner.getTime());
-    System.out.println(secondFastestRunner.getTime() - fastestRunner.getTime());
-
-    System.out.print(BanffMarathonRunner.getAboveAverageRunners(runners));
-  }
-}
src/Q4/BanffMarathonRunnerTest.java
@@ -1,63 +0,0 @@
-package ca.mokhan.test;
-
-import Q4.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class BanffMarathonRunnerTest extends TestCase {
-  private BanffMarathonRunner john = new BanffMarathonRunner("John", "Lenthen", 243, 1);
-  private BanffMarathonRunner kate = new BanffMarathonRunner("Kate", "Hen", 265, 8);
-  private BanffMarathonRunner[] runners = {
-    new BanffMarathonRunner("Elena", "Brandon", 341, 1),
-    new BanffMarathonRunner("Thomas", "Molson", 273, 2),
-    new BanffMarathonRunner("Hamilton", "Winn", 278, 5),
-    new BanffMarathonRunner("Suzie", "Sarandin", 329, 7),
-    new BanffMarathonRunner("Philip", "Winne", 445, 9),
-    new BanffMarathonRunner("Alex", "Trebok", 275, 3),
-    new BanffMarathonRunner("Emma", "Pivoto", 275, 4),
-    this.john,
-    new BanffMarathonRunner("James", "Lean", 334, 1),
-    new BanffMarathonRunner("Jane", "Ostin", 412, 1),
-    new BanffMarathonRunner("Emily", "Car", 393, 4),
-    new BanffMarathonRunner("Daniel", "Hamshire", 299, 4),
-    new BanffMarathonRunner("Neda", "Bazdar", 343, 3),
-    new BanffMarathonRunner("Aaron", "Smith", 317, 6),
-    this.kate
-  };
-
-  public BanffMarathonRunnerTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(BanffMarathonRunnerTest.class);
-  }
-
-  public void testGetFastestRunner() {
-    assertEquals(this.john, BanffMarathonRunner.getFastestRunner(this.runners));
-  }
-
-  public void testGetSecondFastestRunner() {
-    assertEquals(this.kate, BanffMarathonRunner.getSecondFastestRunner(this.runners));
-  }
-
-  public void testGetAverageTime() {
-    assertEquals(321, BanffMarathonRunner.getAverageTime(this.runners));
-  }
-
-  public void testGetAboveAverageRunners() {
-    String expected =
-        String.join(
-            System.lineSeparator(),
-            "Thomas 2",
-            "Hamilton 5",
-            "Alex 3",
-            "Emma 4",
-            "John 1",
-            "Daniel 4",
-            "Aaron 6",
-            "Kate 8");
-    assertEquals(expected, BanffMarathonRunner.getAboveAverageRunners(this.runners));
-  }
-}
src/Q4/README.md
@@ -1,140 +0,0 @@
-Learning Profile for Assignment #1, And Question #4
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-A group of AU friends decide to run the Banff, Alberta, Marathon.
-Their names, times (marathon completion time in minutes), and number of years participated are given below:
-
-| id  | Name | time (mins) | years |
-| --- | --- | --- | --- |
-| 1 | Elena Brandon | 341 | 1 |
-| 2 | Thomas Molson | 273 | 2 |
-| 3 | Hamilton Winn | 278 | 5 |
-| 4 | Suzie Sarandin | 329 | 7 |
-| 5 | Philip Winne | 445 | 9 |
-| 6 | Alex Trebok | 275 | 3 |
-| 7 | Emma Pivoto | 275 | 4 |
-| 8 | John Lenthen | 243 | 1 |
-| 9 | James Lean | 334 | 1 |
-| 10 | Jane Ostin | 412 | 1 |
-| 11 | Emily Car | 393 | 4 |
-| 12 | Daniel Hamshire | 299 | 4 |
-| 13 | Neda Bazdar | 343 | 3 |
-| 14 | Aaron Smith | 317 | 6 |
-| 15 | Kate Hen | 265 | 8|
-
-Extend the AddressBook class from Problem 1 to store the additional data.
-Now, write a method to find the fastest runner.
-Print the name, address, and his/her time (in minutes) on three separate lines.
-Find the second fastest runner.
-Print the name, address, his/her time (in minutes), and the difference in time with the fastest runner.
-Compute the average time of completion taken by these runners.
-Finally, print the name and number of years participated for each runner if the runner’s time of completion is equal to or better than the average time of completion.
-
-2. Description of the Code: 
-
-[Briefly describe how you solved the problem in your code. You should include short description of classes, methods, and variables (if necessary) that you used in your code.]
-
-I followed the instructions in the assignment and created a class the
-inherits from `AddressBook`. The sub class has a single constructor that
-chains to the super class constructor.
-
-I did an override of the `Comparable<AddressBook>` interface to compare
-using the runners time instead of the default comparison from the base
-class.
-
-Java's implementation of generics doesn't allow a class to
-implement the same generic interface using a different type parameter.
-So I had to downcast the `AddressBook` to a `BanffMarathonRunner`. The
-`compareTo` implementation in the subclass always assums that it is
-being compared to another `BanffMarathonRunner`.
-
-Sorting arrays becomes very using after implementing the `Comparable<T>`
-interface.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 46 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.05 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.893 s
-[INFO] Finished at: 2019-05-13T21:20:12-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-
-4. Sample Input and Output:
-
-Tests are available in `BanffMarathonRunnerTest.java`.
-
-5. Discussion:
-
-The implementation of `getAboveAverageRunners` assumes that `better`
-is less than or equal to the average time taken by all runners.
src/Q5/EmployeeSavings.java
@@ -1,184 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: EmployeeSavings.java
- *
- * @description Represents an employee savings account.
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q5;
-
-import Q1.*;
-import java.util.ArrayList;
-import java.util.Currency;
-import java.util.Locale;
-import java.util.Random;
-
-public class EmployeeSavings extends AddressBook {
-  private double accountValue;
-  private double[] monthlyInterests;
-  private double[] monthlySavings;
-  private double monthlyContribution;
-  public static final double ANNUAL_INTEREST_RATE = 0.05;
-
-  /**
-   * Constructs an EmployeeSavings object with a randomly generated monthly contribution.
-   *
-   * @param firstName the first name of the runner
-   * @param lastName the last name of the runner
-   */
-  public EmployeeSavings(String firstName, String lastName) {
-    this(firstName, lastName, new Random().nextInt(800 - 100) + 100.0);
-  }
-
-  /**
-   * Constructs an EmployeeSavings object
-   *
-   * @param firstName the first name of the runner
-   * @param lastName the last name of the runner
-   * @param monthlyContribution the monthly contribution to the savings account
-   */
-  public EmployeeSavings(String firstName, String lastName, double monthlyContribution) {
-    super(firstName, "", lastName);
-    this.monthlyContribution = monthlyContribution;
-    this.accountValue = predictBalanceAfterMonths(12);
-  }
-
-  /**
-   * Constructs an EmployeeSavings object
-   *
-   * @param firstName the first name of the runner
-   * @param lastName the last name of the runner
-   * @param d1 unknown
-   * @param d2 unknown
-   */
-  public EmployeeSavings(String firstName, String lastName, double[] d1, double[] d2) {
-    super(firstName, "", lastName);
-  }
-
-  /**
-   * Return the predicted value of the account after 12 months.
-   *
-   * @return the predicted account value after 12 months
-   */
-  public double getAccountValue() {
-    return this.accountValue;
-  }
-
-  /**
-   * Return an array of the predicted interest earned for each month in the upcoming year.
-   *
-   * @return the predicted interest earned for each month
-   */
-  public double[] getMonthlyInterests() {
-    return this.monthlyInterests;
-  }
-
-  /**
-   * Return an array of the predicted monthly savings earned for each month in the upcoming year.
-   *
-   * @return the predicted monthly savings earned for each month
-   */
-  public double[] getMonthlySavings() {
-    return this.monthlySavings;
-  }
-
-  /**
-   * Return an array of the predicted interest earned for each month in the upcoming year.
-   *
-   * @return the predicted interest earned for each month
-   */
-  public double[] calculateInterests() {
-    this.monthlyInterests = new double[12];
-    for (int i = 1; i <= 12; i++) this.monthlyInterests[i - 1] = predictInterestAfterMonths(i);
-    return this.monthlyInterests;
-  }
-
-  /**
-   * Return an array of the predicted monthly savings earned for each month in the upcoming year.
-   *
-   * @return the predicted monthly savings earned for each month
-   */
-  public double[] generateMonthlySavings() {
-    this.monthlySavings = new double[12];
-    for (int i = 1; i <= 12; i++) this.monthlySavings[i - 1] = predictBalanceAfterMonths(i);
-    return this.monthlySavings;
-  }
-
-  /**
-   * Predicts the balance of an accounts after n months.
-   *
-   * @param months The # of months from now to predict a balance for.
-   * @return the predicted balance
-   */
-  public double predictBalanceAfterMonths(int months) {
-    double monthlyRate = ANNUAL_INTEREST_RATE / 12.0;
-    double balance = 0;
-
-    for (int i = 0; i < months; i++)
-      balance = (balance + this.monthlyContribution) * (1 + monthlyRate);
-
-    return Math.round(balance * 1000) / 1000.0;
-  }
-
-  /**
-   * Predicts the interest of an accounts after n months.
-   *
-   * @param months The # of months from now to predict the interest for.
-   * @return the predicted interest
-   */
-  public double predictInterestAfterMonths(int months) {
-    double totalBalance = predictBalanceAfterMonths(months);
-    double totalContributions = (months * this.monthlyContribution);
-
-    return Math.round((totalBalance - totalContributions) * 1000) / 1000.0;
-  }
-
-  /**
-   * Generates a report that can be printed to the console.
-   *
-   * @param accounts the list of accounts to print a statement for
-   * @return a string that represents a report for the accounts given.
-   */
-  public static String getReport(EmployeeSavings[] accounts) {
-    ArrayList<String> statement = new ArrayList<String>();
-
-    for (EmployeeSavings account : accounts) statement.add(account.toString());
-
-    return String.join(System.lineSeparator(), statement);
-  }
-
-  /**
-   * Returns The first name, and predicted account balance after 12 months.
-   *
-   * @return a string that represents a summary for an account.
-   */
-  @Override
-  public String toString() {
-    Currency currency = Currency.getInstance(Locale.getDefault());
-    return String.format(
-        "%s %s%.2f", super.getFirstName(), currency.getSymbol(), this.getAccountValue());
-  }
-
-  public static void main(String[] args) {
-    EmployeeSavings[] accounts = {
-      new EmployeeSavings("Elena", "Brandon"),
-      new EmployeeSavings("Thomas", "Molson"),
-      new EmployeeSavings("Hamilton", "Winn"),
-      new EmployeeSavings("Suzie", "Sarandin"),
-      new EmployeeSavings("Philip", "Winne"),
-      new EmployeeSavings("Alex", "Trebok"),
-      new EmployeeSavings("Emma", "Pivoto"),
-      new EmployeeSavings("John", "Lenthen"),
-      new EmployeeSavings("James", "Lean"),
-      new EmployeeSavings("Jane", "Ostin"),
-      new EmployeeSavings("Emily", "Car"),
-      new EmployeeSavings("Daniel", "Hamshire"),
-      new EmployeeSavings("Neda", "Bazdar"),
-      new EmployeeSavings("Aaron", "Smith"),
-      new EmployeeSavings("Kate", "Hen")
-    };
-
-    System.out.print(EmployeeSavings.getReport(accounts));
-  }
-}
src/Q5/EmployeeSavingsTest.java
@@ -1,84 +0,0 @@
-package ca.mokhan.test;
-
-import Q5.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class EmployeeSavingsTest extends TestCase {
-  private EmployeeSavings subject;
-
-  public EmployeeSavingsTest(String testName) {
-    super(testName);
-    double monthlyContribution = 100.00;
-    this.subject = new EmployeeSavings("Tsuyoshi", "Garrett", monthlyContribution);
-  }
-
-  public static Test suite() {
-    return new TestSuite(EmployeeSavingsTest.class);
-  }
-
-  public void testPredictSavingsAfter1Month() {
-    // Bankers rounding rules would round this amount down to $100.41
-    // the $0.007 would go to the bank.
-    assertEquals(100.417, subject.predictBalanceAfterMonths(1));
-    assertEquals(201.252, subject.predictBalanceAfterMonths(2));
-    assertEquals(302.507, subject.predictBalanceAfterMonths(3));
-  }
-
-  public void testPredictInterestAfter1Month() {
-    // Bankers rounding rules would round this amount down to $100.41
-    // the $0.007 would go to the bank.
-    assertEquals(0.417, subject.predictInterestAfterMonths(1));
-    assertEquals(1.252, subject.predictInterestAfterMonths(2));
-    assertEquals(2.507, subject.predictInterestAfterMonths(3));
-  }
-
-  public void testGetAccountValue() {
-    assertEquals(subject.predictBalanceAfterMonths(12), subject.getAccountValue());
-  }
-
-  public void testCalculateInterests() {
-    assertEquals(0.417, subject.calculateInterests()[0]);
-    assertEquals(1.252, subject.calculateInterests()[1]);
-    assertEquals(2.507, subject.calculateInterests()[2]);
-    assertEquals(4.184, subject.calculateInterests()[3]);
-    assertEquals(6.285, subject.calculateInterests()[4]);
-    assertEquals(8.811, subject.calculateInterests()[5]);
-    assertEquals(11.764, subject.calculateInterests()[6]);
-    assertEquals(15.147, subject.calculateInterests()[7]);
-    assertEquals(18.96, subject.calculateInterests()[8]);
-    assertEquals(23.206, subject.calculateInterests()[9]);
-    assertEquals(27.886, subject.calculateInterests()[10]);
-    assertEquals(33.002, subject.calculateInterests()[11]);
-  }
-
-  public void testGenerateMonthlySavings() {
-    assertEquals(100.417, subject.generateMonthlySavings()[0]);
-    assertEquals(201.252, subject.generateMonthlySavings()[1]);
-    assertEquals(302.507, subject.generateMonthlySavings()[2]);
-  }
-
-  public void testGetReport() {
-    EmployeeSavings[] accounts =
-        new EmployeeSavings[] {
-          new EmployeeSavings("Elena", "Brandon"),
-          new EmployeeSavings("Thomas", "Molson"),
-          new EmployeeSavings("Hamilton", "Winn"),
-          new EmployeeSavings("Suzie", "Sarandin"),
-          new EmployeeSavings("Philip", "Winne"),
-          new EmployeeSavings("Alex", "Trebok"),
-          new EmployeeSavings("Emma", "Pivoto"),
-          new EmployeeSavings("John", "Lenthen"),
-          new EmployeeSavings("James", "Lean"),
-          new EmployeeSavings("Jane", "Ostin"),
-          new EmployeeSavings("Emily", "Car"),
-          new EmployeeSavings("Daniel", "Hamshire"),
-          new EmployeeSavings("Neda", "Bazdar"),
-          new EmployeeSavings("Aaron", "Smith"),
-          new EmployeeSavings("Kate", "Hen")
-        };
-    String report = EmployeeSavings.getReport(accounts);
-    for (EmployeeSavings account : accounts) assertTrue(report.contains(account.getFirstName()));
-  }
-}
src/Q5/README.md
@@ -1,119 +0,0 @@
-Learning Profile for Assignment #1, And Question #5
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Solve the following problem using a program:
-Suppose you save $100 each month into a savings account with an annual interest rate of 5%.
-Thus, the monthly interest rate is 0.05/12 = 0.00417.
-After the first month, the value in the account becomes 100 * (1 + 0.00417) = 100.417
-After the second month, the value in the account becomes (100 + 100.417) * (1 + 0.00417) = 201.252
-And after the third month, the value in the account becomes (100 + 201.252) * (1 + 0.00417) = 302.507
-... and so on.
-
-Write a program that randomly generates monthly savings amounts for the 15 runners in Problem 4.
-Each monthly saving should be in the range of $100 to $800.
-Extend the AddressBook class to store the monthly savings generated by the random number generator.
-Then, display the final account value for each of the 15 runners.
-
-
-2. Description of the Code: 
-
-I created a constructor overload that accepts the `monthlyContribution`
-as a parameter. This made it easier to write unit tests rather than
-depend on random monthlyContributions. The constructor that accepts a
-`firstName` and `lastName` will generate a random `monthlyContribution`
-and chain to the overloaded constructor.
-
-I had no idea what `d1` and `d2` means, so I didn't use those
-parameters.
-
-I designed this class so that you could predict the future value for `n`
-months from now. I did assign the `accountValue` to a prediction of 12
-months from now. I would have preferred to implement an interface that
-didn't require private instance variables and rather depend on
-calculations on the fly but I did my best to bride the requirements with
-my own preferences.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 47 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  3.620 s
-[INFO] Finished at: 2019-05-13T21:26:40-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-4. Sample Input and Output:
-[Provide some test cases with sample input and output of your program.]
-
-Tests are available in `EmployeeSavingsTest.java`.
-
-5. Discussion:
src/Q6/README.md
@@ -1,124 +0,0 @@
-Learning Profile for Assignment #1, And Question #6
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-"The Pythagorean Theorem relates the lengths of the three sides of any right triangle.
-The legs of a right triangle (the two sides of the triangle that meet at the right angle)
-are customarily labelled as having lengths "a" and "b", and the hypotenuse
-(the long side of the triangle, opposite the right angle) is labelled as having length "c".
-The lengths are related by the following equation: a^2 + b^2 = c^2."
-– http://www.purplemath.com/modules/pythagthm.htm
-
-This equation allows you to find the length of a side of a right triangle when they’ve given you the lengths for the other two sides,
-and, going in the other direction, allows you to determine if a triangle is a right triangle when they’ve given you the lengths for all three sides.
-This equation can alternatively be written as c = sqrt of (a^2+b^2).
-You can find the square root of a number by calling the standard function Math.sqrt.
-
-For example, the statement `double y = Math.sqrt(x)` sets `y` to the square root of `x`.
-
-I. Given the right triangles described below, write a program to compute the lengths of the remaining sides using a program.
-a. a=48, c=80  b = 64
-b. a=84, c=91  b = 35
-
-```text
-  a^2 + b^2 = c^2
-  b^2 = c^2 - a^2
-  b = sqrt(c^2 - a^2)
-```
-
-II. Determine if the following triangles are right-angled triangles:
-a. a=45, b=55, c=75
-b. a=28, b=45, c=53
-
-2. Description of the Code: 
-
-The `Triangle` class accepts the length of size `A`, `B`, and `C` in the
-constructor. I used the constant `Triangle.NULL` to represent a null
-value, to indicate which side needed to be calculated.
-
-I assumed only side `B` needed to be calculated based on the problem
-description but could have also checked side `A` or `C`.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 47 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  3.620 s
-[INFO] Finished at: 2019-05-13T21:26:40-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-4. Sample Input and Output:
-[Provide some test cases with sample input and output of your program.]
-
-Tests are available in `TriangleTest.java`.
-
-5. Discussion:
src/Q6/Triangle.java
@@ -1,66 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: Triangle.java
- *
- * @description Represents a Triangle
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q6;
-
-public class Triangle {
-  public static double NULL = 0.0;
-  private double a, b, c;
-
-  /**
-   * Constructs a Triangle
-   *
-   * @param a the length of side A
-   * @param b the length of side B
-   * @param c the length of side C
-   */
-  public Triangle(double a, double b, double c) {
-    this.a = a;
-    this.b = b;
-    this.c = c;
-  }
-
-  /** @return the length of side A */
-  public double getA() {
-    return this.a;
-  }
-
-  /** @return the length of side B */
-  public double getB() {
-    if (this.b == NULL) this.b = Math.sqrt(Math.pow(this.getC(), 2) - Math.pow(this.getA(), 2));
-    return this.b;
-  }
-
-  /** @return the length of side C */
-  public double getC() {
-    return this.c;
-  }
-
-  /**
-   * Determines if the triangle is a right angle triangle.
-   *
-   * @return boolean to indicate if the triangle is a right angle triangle
-   */
-  public boolean isRightTriangle() {
-    return Math.pow(this.getA(), 2) + Math.pow(this.getB(), 2) == Math.pow(this.getC(), 2);
-  }
-
-  /** @return a string with the length of each side */
-  @Override
-  public String toString() {
-    return String.format("A: %f, B: %f, C: %f", this.getA(), this.getB(), this.getC());
-  }
-
-  public static void main(String[] args) {
-    System.out.println(new Triangle(48, Triangle.NULL, 80).toString());
-    System.out.println(new Triangle(84, Triangle.NULL, 91).toString());
-
-    System.out.println(new Triangle(45, 55, 75).isRightTriangle());
-    System.out.println(new Triangle(28, 45, 53).isRightTriangle());
-  }
-}
src/Q6/TriangleTest.java
@@ -1,26 +0,0 @@
-package ca.mokhan.test;
-
-import Q6.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class TriangleTest extends TestCase {
-  public TriangleTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(TriangleTest.class);
-  }
-
-  public void testIsRightTriangle() {
-    assertFalse(new Triangle(45.0, 55.0, 75.0).isRightTriangle());
-    assertTrue(new Triangle(28.0, 45.0, 53.0).isRightTriangle());
-  }
-
-  public void testGetB() {
-    assertEquals(64.0, new Triangle(48.0, Triangle.NULL, 80.0).getB());
-    assertEquals(35.0, new Triangle(84.0, Triangle.NULL, 91.0).getB());
-  }
-}
src/Q7/HailstoneSequence.java
@@ -1,50 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: HailstoneSequence.java
- *
- * @description Represents a hailstone sequence
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q7;
-
-import java.util.ArrayList;
-import java.util.Scanner;
-
-public class HailstoneSequence {
-  /**
-   * Returns a hailstone sequence using the seed provided.
-   *
-   * @param n the seed value for the hailstone sequence
-   * @return a list of integers that represents the hailstone sequence.
-   */
-  public static ArrayList<Integer> getHailstoneSequence(int n) {
-    return getHailstoneSequence(n, new ArrayList<Integer>());
-  }
-
-  /**
-   * Appends to the hailstone sequence starting from the seed value provided.
-   *
-   * @param n the seed value for the hailstone sequence
-   * @param items the list of items to append the next set of hailstone sequence to.
-   * @return a list of integers that represents the hailstone sequence.
-   */
-  public static ArrayList<Integer> getHailstoneSequence(int n, ArrayList<Integer> items) {
-    items.add(n);
-
-    if (n == 1) return items;
-    else if (n % 2 == 0) return getHailstoneSequence(n / 2, items);
-    else return getHailstoneSequence((n * 3) + 1, items);
-  }
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-
-    System.out.print("Please enter seed for hailstone sequence: ");
-    ArrayList<Integer> sequence = HailstoneSequence.getHailstoneSequence(in.nextInt());
-    for (Integer i : sequence) System.out.println(i);
-
-    for (Integer i : sequence) System.out.print("-");
-    System.out.println();
-  }
-}
src/Q7/HailstoneSequenceTest.java
@@ -1,40 +0,0 @@
-package ca.mokhan.test;
-
-import Q7.*;
-import java.util.ArrayList;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class HailstoneSequenceTest extends TestCase {
-  public HailstoneSequenceTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(HailstoneSequenceTest.class);
-  }
-
-  public void testGetHailstoneSequence() {
-    ArrayList<Integer> results = HailstoneSequence.getHailstoneSequence(15);
-
-    assertTrue(15 == results.get(0));
-    assertTrue(46 == results.get(1));
-    assertTrue(23 == results.get(2));
-    assertTrue(70 == results.get(3));
-    assertTrue(35 == results.get(4));
-    assertTrue(106 == results.get(5));
-    assertTrue(53 == results.get(6));
-    assertTrue(160 == results.get(7));
-    assertTrue(80 == results.get(8));
-    assertTrue(40 == results.get(9));
-    assertTrue(20 == results.get(10));
-    assertTrue(10 == results.get(11));
-    assertTrue(5 == results.get(12));
-    assertTrue(16 == results.get(13));
-    assertTrue(8 == results.get(14));
-    assertTrue(4 == results.get(15));
-    assertTrue(2 == results.get(16));
-    assertTrue(1 == results.get(17));
-  }
-}
src/Q7/README.md
@@ -1,135 +0,0 @@
-Learning Profile for Assignment #1, And Question #7
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Douglas Hofstadter’s Pulitzer-prize-winning book Gödel, Escher, Bach contains many interesting mathematical puzzles.
-
-In Chapter XII, Hofstadter mentions a wonderful problem that is well within the scope of the control statements in Java.
-
-The problem can be expressed as follows:
-
-* Pick some positive integer and call it n.
-* If n is even, divide it by two.
-* If n is odd, multiply it by three and add one.
-Continue this process until n is equal to 1.
-
-Hofstadter illustrates this process with the following example, 
-starting with the number n = 15:
-15 is odd, so I make 3n+1: 46 
-46 is even, so I take half: 23
-23 is odd, so I make 3n+1: 70
-70 is even, so I take half: 35
-35 is odd, so I make 3n+1: 106
-106 is even, so I take half: 53
-53 is odd, so I make 3n+1: 160
-160 is even, so I take half: 80
-80 is even, so I take half: 40
-40 is even, so I take half: 20
-20 is even, so I take half: 10
-10 is even, so I take half: 5
-5 is odd, so I make 3n+1: 16
-16 is even, so I take half: 8
-8 is even, so I take half: 4
-4 is even, so I take half: 2
-2 is even, so I take half: 1
-
-As you can see from this example, the numbers go up and down, but eventually—at least for all numbers that have ever been tried—come down to end in 1.
-In some respects, this process is reminiscent of the formation of hailstones,
-which get carried upward by the winds over and over again before they finally descend to the ground.
-Because of this analogy, this sequence of numbers is usually called the Hailstone sequence,
-although it goes by many other names as well.
-
-Write a program that reads in a number from the user and then displays the Hailstone sequence for that number,
-followed by a line showing the number of steps taken to reach 1.
-
-2. Description of the Code: 
-
-My first implementation of this algorithm used an iterative approach. I
-later changed it to use a recursive approach because I felt the code was
-a little bit easier to read and blowing the stack or performance wasn't
-a big concern for this exercise.
-
-The base case for the recursion is `n == 1`.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 48 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.05 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.02 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.912 s
-[INFO] Finished at: 2019-05-13T21:33:23-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-4. Sample Input and Output:
-
-Tests can be found in `HailstoneSequenceTest.java`.
-
-5. Discussion:
src/Q8/Candidate.java
@@ -1,147 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: Candidate.java
- *
- * @description Represents a candidate
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q8;
-
-import Q1.*;
-import java.util.ArrayList;
-import java.util.Scanner;
-
-public class Candidate extends AddressBook {
-  private double grade = 0.0;
-  private Communication communication;
-  private boolean isInnovative;
-  private double regulatoryCapability;
-
-  /**
-   * Constructs a Candidate object.
-   *
-   * @param firstName the first name of the runner
-   * @param lastName the last name of the runner
-   * @param grade the grade for the candidate
-   * @param communication the level of communication
-   * @param isInnovative specifies if the candidate is innovative.
-   * @param regulatoryCapability specifies the candidates level of regulatory capability
-   */
-  public Candidate(
-      String firstName,
-      String lastName,
-      double grade,
-      String communication,
-      boolean isInnovative,
-      double regulatoryCapability) {
-    super(firstName, "", lastName);
-    this.grade = grade;
-    this.setCommunication(communication);
-    this.isInnovative = isInnovative;
-    this.regulatoryCapability = regulatoryCapability;
-  }
-
-  /** @return the candidates innovativeness. */
-  public boolean isInnovative() {
-    return this.isInnovative;
-  }
-
-  /** @return the candidates grade. */
-  public double getGrade() {
-    return this.grade;
-  }
-
-  /** @return the candidates regulatory capability */
-  public double getRegulation() {
-    return this.regulatoryCapability;
-  }
-
-  /** @return the candidates communication ability */
-  public String getCommunication() {
-    return this.communication.toString();
-  }
-
-  /**
-   * Sets the candidate communication level.
-   *
-   * @param communication the candidates communication ability
-   */
-  public void setCommunication(String communication) {
-    this.communication = Communication.findBy(communication);
-  }
-
-  /**
-   * Sets the candidate grade level.
-   *
-   * @param grade the candidates grade
-   */
-  public void setGrade(double grade) {
-    this.grade = grade;
-  }
-
-  /**
-   * Sets the candidate innovation level.
-   *
-   * @param innovation the candidates innovation ability
-   */
-  public void setInnovation(boolean innovation) {
-    this.isInnovative = innovation;
-  }
-
-  /**
-   * Sets the candidate regulatory capability level.
-   *
-   * @param regulatoryCapability the candidates regulatory capability
-   */
-  public void setRegulation(double regulatoryCapability) {
-    this.regulatoryCapability = regulatoryCapability;
-  }
-
-  /** @return true if the candidate is eligible for a position at the company. */
-  public boolean isEligible() {
-    if (this.grade >= 85.0) {
-      return this.communication.isAtLeast(Communication.Average) || this.isInnovative();
-    } else {
-      return (this.regulatoryCapability >= 0.5
-          && this.communication.isAtLeast(Communication.Average));
-    }
-  }
-
-  /**
-   * @param candidates the list of candidates to check for qualifications
-   * @return a list of candidates that are eligible for employment at the company.
-   */
-  public static ArrayList<Candidate> getEligibleCandidates(Candidate[] candidates) {
-    ArrayList<Candidate> eligible = new ArrayList<Candidate>();
-
-    for (Candidate candidate : candidates) if (candidate.isEligible()) eligible.add(candidate);
-
-    return eligible;
-  }
-
-  public static void main(String[] args) {
-    Scanner in = new Scanner(System.in);
-
-    Candidate[] candidates = {
-      new Candidate("Elena", "Brandon", 82.30, "poor", true, 0.5),
-      new Candidate("Thomas", "Molson", 85.10, "poor", false, 1.0),
-      new Candidate("Hamilton", "Winn", 77.77, "average", false, 0.8),
-      new Candidate("Suzie", "Sarandin", 69.93, "average", false, 0.0),
-      new Candidate("Philip", "Winne", 93.03, "average", true, 1.0),
-      new Candidate("Alex", "Trebok", 88.61, "poor", true, 0.7),
-      new Candidate("Emma", "Pivoto", 55.99, "excellent", false, 0.8),
-      new Candidate("John", "Lenthen", 87.49, "excellent", true, 0.9),
-      new Candidate("James", "Lean", 88.00, "excellent", false, 0.5),
-      new Candidate("Jane", "Ostin", 91.20, "average", true, 0.6),
-      new Candidate("Emily", "Car", 66.79, "excellent", false, 0.3),
-      new Candidate("Daniel", "Hamshire", 76.65, "average", true, 0.2),
-      new Candidate("Neda", "Bazdar", 55.89, "excellent", true, 0.5),
-      new Candidate("Aaron", "Smith", 90.01, "excellent", false, 0.3),
-      new Candidate("Kate", "Hen", 87.9, "poor", false, 0.8)
-    };
-
-    for (Candidate candidate : Candidate.getEligibleCandidates(candidates))
-      System.out.println(candidate);
-  }
-}
src/Q8/CandidateTest.java
@@ -1,63 +0,0 @@
-package ca.mokhan.test;
-
-import Q8.*;
-import java.util.ArrayList;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class CandidateTest extends TestCase {
-  private Candidate[] candidates = {
-    new Candidate("Elena", "Brandon", 82.30, "poor", true, 0.5),
-    new Candidate("Thomas", "Molson", 85.10, "poor", false, 1.0),
-    new Candidate("Hamilton", "Winn", 77.77, "average", false, 0.8),
-    new Candidate("Suzie", "Sarandin", 69.93, "average", false, 0.0),
-    new Candidate("Philip", "Winne", 93.03, "average", true, 1.0),
-    new Candidate("Alex", "Trebok", 88.61, "poor", true, 0.7),
-    new Candidate("Emma", "Pivoto", 55.99, "excellent", false, 0.8),
-    new Candidate("John", "Lenthen", 87.49, "excellent", true, 0.9),
-    new Candidate("James", "Lean", 88.00, "excellent", false, 0.5),
-    new Candidate("Jane", "Ostin", 91.20, "average", true, 0.6),
-    new Candidate("Emily", "Car", 66.79, "excellent", false, 0.3),
-    new Candidate("Daniel", "Hamshire", 76.65, "average", true, 0.2),
-    new Candidate("Neda", "Bazdar", 55.89, "excellent", true, 0.5),
-    new Candidate("Aaron", "Smith", 90.01, "excellent", false, 0.3),
-    new Candidate("Kate", "Hen", 87.9, "poor", false, 0.8)
-  };
-
-  public CandidateTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(CandidateTest.class);
-  }
-
-  public void testGetEligibleCandidates() {
-    ArrayList<Candidate> eligibleCandidates = Candidate.getEligibleCandidates(this.candidates);
-    for (String expected :
-        new String[] {
-          "Hamilton", "Philip", "Alex", "Emma", "John", "James", "Jane", "Neda", "Aaron"
-        }) {
-      assertNotNull(
-          eligibleCandidates.stream()
-              .filter(x -> expected.equals(x.getFirstName()))
-              .findAny()
-              .orElse(null));
-    }
-  }
-
-  public void testIsElligibleWithGreaterThanRequiredGrade() {
-    assertTrue(new Candidate("Tsuyoshi", "Garrett", 85.0, "excellent", false, 0.0).isEligible());
-  }
-
-  public void testIsElligibleWithLessThanRequiredGrade() {
-    assertFalse(new Candidate("Tsuyoshi", "Garrett", 84.9, "average", false, 0.0).isEligible());
-    assertTrue(new Candidate("Tsuyoshi", "Garrett", 84.9, "average", false, 0.5).isEligible());
-  }
-
-  public void testIsElligibleWithPoorCommunication() {
-    assertTrue(new Candidate("Tsuyoshi", "Garrett", 85.0, "poor", true, 0.0).isEligible());
-    assertFalse(new Candidate("Tsuyoshi", "Garrett", 85.0, "poor", false, 0.0).isEligible());
-  }
-}
src/Q8/Communication.java
@@ -1,76 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: Communication.java
- *
- * @description Represents a candidates communication ability.
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q8;
-
-public class Communication implements Comparable<Communication> {
-  private String name;
-  private Integer ranking;
-
-  /**
-   * Constructs a Communication object.
-   *
-   * @param name the name of the communication level
-   * @param ranking the ranking of the communication level.
-   */
-  public Communication(String name, Integer ranking) {
-    this.name = name;
-    this.ranking = ranking;
-  }
-
-  /**
-   * Compares one communication level with another.
-   *
-   * @param other the other communication level to compare against
-   * @return a negative integer, zero, or a positive integer as this object is less than, equal to,
-   *     or greater than the specified object.
-   */
-  public int compareTo(Communication other) {
-    return this.ranking.compareTo(other.ranking);
-  }
-
-  /**
-   * Compares one communication level with another.
-   *
-   * @param other the other communication level to compare against
-   * @return true if this communication level is equal to or better than the other.
-   */
-  public boolean isAtLeast(Communication other) {
-    return this.compareTo(other) >= 0;
-  }
-
-  /**
-   * The string representation of the candidate.
-   *
-   * @return the name of the candidate
-   */
-  @Override
-  public String toString() {
-    return this.name;
-  }
-
-  public static final Communication Poor = new Communication("poor", 0);
-  public static final Communication Average = new Communication("average", 1);
-  public static final Communication Excellent = new Communication("excellent", 2);
-
-  /**
-   * @param name of the communication level to find.
-   * @return the Communication level matching the name
-   */
-  public static Communication findBy(String name) {
-    switch (name) {
-      case "poor":
-        return Communication.Poor;
-      case "average":
-        return Communication.Average;
-      case "excellent":
-        return Communication.Excellent;
-    }
-    throw new IllegalArgumentException("Unknown communication type");
-  }
-}
src/Q8/CommunicationTest.java
@@ -1,44 +0,0 @@
-package ca.mokhan.test;
-
-import Q8.*;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class CommunicationTest extends TestCase {
-  public CommunicationTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(CommunicationTest.class);
-  }
-
-  public void testCompareTo() {
-    assertEquals(-1, Communication.Poor.compareTo(Communication.Average));
-    assertEquals(-1, Communication.Poor.compareTo(Communication.Excellent));
-    assertEquals(0, Communication.Poor.compareTo(Communication.Poor));
-
-    assertEquals(-1, Communication.Average.compareTo(Communication.Excellent));
-    assertEquals(1, Communication.Average.compareTo(Communication.Poor));
-    assertEquals(0, Communication.Average.compareTo(Communication.Average));
-
-    assertEquals(1, Communication.Excellent.compareTo(Communication.Average));
-    assertEquals(1, Communication.Excellent.compareTo(Communication.Poor));
-    assertEquals(0, Communication.Excellent.compareTo(Communication.Excellent));
-  }
-
-  public void testIsAtLeast() {
-    assertFalse(Communication.Poor.isAtLeast(Communication.Average));
-    assertFalse(Communication.Poor.isAtLeast(Communication.Excellent));
-    assertTrue(Communication.Poor.isAtLeast(Communication.Poor));
-
-    assertFalse(Communication.Average.isAtLeast(Communication.Excellent));
-    assertTrue(Communication.Average.isAtLeast(Communication.Poor));
-    assertTrue(Communication.Average.isAtLeast(Communication.Average));
-
-    assertTrue(Communication.Excellent.isAtLeast(Communication.Average));
-    assertTrue(Communication.Excellent.isAtLeast(Communication.Poor));
-    assertTrue(Communication.Excellent.isAtLeast(Communication.Excellent));
-  }
-}
src/Q8/README.md
@@ -1,121 +0,0 @@
-Learning Profile for Assignment #1, And Question #8
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Google Inc. is looking to recruit three of the Boston runners.
-
-The criteria for selection are as follows:
-
-* I. Average final marks in bachelor’s degree (store up to 2 decimal places).
-  The fifteen candidates have the following grades: 82.30%, 85.10%, 77.77%, 69.93%, 93.03%, 88.61%, 55.99%, 87.49%, 88.00%, 91.20%, 66.79%, 76.65%, 55.89%, 90.01%, and 87.9%.
-* II. Ability to communicate as one of the three values – "excellent", "average", and "poor".
-  The fifteen candidates have the following ability to communicate, respectively: poor, poor, average, average, average, poor, excellent, excellent, excellent, average, excellent, average, excellent, excellent, poor.
-* III. Innovation as one of the two values – "brilliant" and "average" (store as a Boolean; brilliant = true and average = false).
-  The fifteen candidates have the following innovative abilities: brilliant, average, average, average, brilliant, brilliant, average, brilliant, average, brilliant, average, brilliant, brilliant, average, average.
-* IV. Ability to regulate one’s own skill as a probability value between 0 and 1.0 – 1.0 implies excellent regulatory capabilities and 0.0 implies no skills to regulate (store as a double).
-  The fifteen candidates have the following regulatory abilities: 0.5, 1.0, 0.8, 0.0, 1.0, 0.7, 0.8, 0.9, 0.5, 0.6, 0.3, 0.2, 0.5, 0.3, 0.8.
-
-Store these values for the fifteen candidates in an extended AddressBook class.
-
-In general, Google will not consider a candidate with average marks of less than 85%.
-
-Google will consider a candidate with average marks of less than 85% only if the candidate at least has 0.5 regulatory abilities and at least 'average' ability to communicate.
-
-Google will only consider a candidate with poor communication ability if the candidate has a 'brilliant' innovation capability.
-
-Write a program that will help Google to programmatically determine eligibility of the fifteen candidates for these positions, and print the output on the console.
-
-2. Description of the Code: 
-
-I created two classes to solve this problem. The first class is the
-`Candidate` class and the second is the `Communication` class. I used
-the `Communication` class to control sort order and precedence of one
-communication level with another using the `Comparable<T>` interface.
-
-In the `Candidate` class I created a method called `isEligible` that
-calculates if the candidate is eligible for a position at the company.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 47 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.02 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.907 s
-[INFO] Finished at: 2019-05-13T21:37:20-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-
-4. Sample Input and Output:
-
-Tests are available in `CandidateTest.java` and `CommunicationTest.java`.
-
-
-5. Discussion:
src/Q9/Number.java
@@ -1,91 +0,0 @@
-/**
- * Assignment 1, COMP268 Class: Number.java
- *
- * @description Provides static methods for operating on numeric values.
- * @author: mo khan Student ID: 3431709
- * @date May 8, 2019
- * @version 1.0
- */
-package Q9;
-
-import java.util.ArrayList;
-
-public class Number {
-  /**
-   * Checks to see if a number is divisible by 5.
-   *
-   * @param n the number to check for divisibility
-   * @return true if the number is evenly divisible by 5
-   */
-  public static boolean isDivisibleBy5(int n) {
-    return isDivisibleBy(n, 5);
-  }
-
-  /**
-   * Checks to see if a number is divisible by 7
-   *
-   * @param n the number to check for divisibility
-   * @return true if the number is evenly divisible by 7
-   */
-  public static boolean isDivisibleBy7(int n) {
-    return isDivisibleBy(n, 7);
-  }
-
-  /**
-   * Checks if a number is odd
-   *
-   * @param n the number to check
-   * @return true if the number is an odd number.
-   */
-  public static boolean isOdd(int n) {
-    return !isDivisibleBy(n, 2);
-  }
-
-  /**
-   * Checks if a number is prime. This is naive implementation of the prime number check that will
-   * blow the stack for any sufficiently large number.
-   *
-   * @param n the number to check
-   * @return true if the number is a prime number
-   */
-  public static boolean isPrime(int n) {
-    if (n <= 1) return false;
-
-    for (int i = n - 1; i > 1; i--) if (isDivisibleBy(n, i)) return false;
-
-    return true;
-  }
-
-  /**
-   * Checks to see if a number is divisible by denominator
-   *
-   * @param n the number to check for divisibility
-   * @param denominator the number to see if n is evenly divisible by
-   * @return true if the number is evenly divisible by denominator
-   */
-  public static boolean isDivisibleBy(int n, int denominator) {
-    return n % denominator == 0;
-  }
-
-  /** @return a list of strings for each number between 0 and 113 */
-  public static ArrayList<String> iterate() {
-    ArrayList<String> items = new ArrayList<String>();
-    ArrayList<String> row = new ArrayList<String>();
-    for (Integer i = 0; i < 113; i++) {
-      row.clear();
-      row.add(String.format("%d", i));
-
-      if (isOdd(i)) row.add(String.format("%d is odd", i));
-      if (isDivisibleBy5(i)) row.add("hi five");
-      if (isDivisibleBy7(i + (i + 1))) row.add("wow");
-      if (isPrime(i)) row.add("prime");
-
-      items.add(String.join(",", row));
-    }
-    return items;
-  }
-
-  public static void main(String[] args) {
-    for (String item : Number.iterate()) System.out.println(item);
-  }
-}
src/Q9/NumberTest.java
@@ -1,59 +0,0 @@
-package ca.mokhan.test;
-
-import Q9.Number;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class NumberTest extends TestCase {
-  public NumberTest(String testName) {
-    super(testName);
-  }
-
-  public static Test suite() {
-    return new TestSuite(NumberTest.class);
-  }
-
-  public void testIsDivisibleBy5() {
-    for (int i = 0; i < 113; i++)
-      if (i % 5 == 0) assertTrue(Number.isDivisibleBy5(i));
-      else assertFalse(Number.isDivisibleBy5(i));
-  }
-
-  public void testIsDivisibleBy7() {
-    for (int i = 0; i < 113; i++)
-      if (i % 7 == 0) assertTrue(Number.isDivisibleBy7(i));
-      else assertFalse(Number.isDivisibleBy7(i));
-  }
-
-  public void testIsOdd() {
-    for (int i = 0; i < 113; i++)
-      if (i % 2 == 0) assertFalse(Number.isOdd(i));
-      else assertTrue(Number.isOdd(i));
-  }
-
-  public void testIsPrime() {
-    List<Integer> primes =
-        Arrays.asList(
-            new Integer[] {
-              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, 101, 103, 107, 109, 113
-            });
-
-    for (Integer i = 0; i < 113; i++)
-      if (primes.contains(i)) assertTrue(Number.isPrime(i));
-      else assertFalse(Number.isPrime(i));
-  }
-
-  public void testIterate() {
-    ArrayList<String> results = Number.iterate();
-    assertTrue(results.contains("0,hi five"));
-    assertTrue(results.contains("1,1 is odd"));
-    assertTrue(results.contains("2,prime"));
-    assertTrue(results.contains("3,3 is odd,wow,prime"));
-    assertTrue(results.contains("4"));
-  }
-}
src/Q9/README.md
@@ -1,107 +0,0 @@
-Learning Profile for Assignment #1, And Question #9
-
-Name: Mo Khan
-Student ID: 3431709
-
-1. Problem Statement:
-
-Write a program that iterates through numbers from 0 to 113 using a loop.
-Print the numbers, one number per line.
-As you print each number, say x, also print the following when appropriate, separated by commas:
-
-If the number is odd, print “x is odd”
-If the number is divisible by 5, print “hi five”
-If the total of a number (x) and its subsequent number (x+1) is a value divisible by 7, print “wow”
-If the number is prime, print “prime”.
-
-2. Description of the Code: 
-
-Most of the methods implemented required some for of modulus division. I
-was able to extract a method called `isDivisibleBy` that I was able to
-reuse quite a bit.
-
-3. Errors and Warnings:
-
-```bash
-モ mvn test
-[INFO] Scanning for projects...
-[INFO]
-[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
-[INFO] Building assignment1 1.0-SNAPSHOT
-[INFO] --------------------------------[ jar ]---------------------------------
-[INFO]
-[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
-[INFO] Processed 48 files (0 reformatted).
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
-[INFO]
-[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
-[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
-[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
-[INFO]
-[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
-[INFO] Changes detected - recompiling the module!
-[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
-[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
-[INFO]
-[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
-[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running ca.mokhan.comp268.AppTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
-Running ca.mokhan.test.CandidateTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec
-Running ca.mokhan.test.NumberTest
-Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.023 sec
-Running ca.mokhan.test.EmployeeSavingsTest
-Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec
-Running ca.mokhan.test.CartesianCoordinateSystemTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.CommunicationTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TaxReturnTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.BanffMarathonRunnerTest
-Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.AddressBookTest
-Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.TriangleTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
-Running ca.mokhan.test.BonusOnSavingsTest
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-Running ca.mokhan.test.HailstoneSequenceTest
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
-
-Results :
-
-Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time:  2.844 s
-[INFO] Finished at: 2019-05-13T21:40:21-06:00
-[INFO] ------------------------------------------------------------------------
-```
-
-
-4. Sample Input and Output:
-[Provide some test cases with sample input and output of your program.]
-
-Tests are available in `NumberTest.java`.
-
-5. Discussion:
-
-The implementation of the `isPrime` method is very naive and will work
-for small values of `n`. It uses a brute force approach without any form
-of memoization.
.gitignore
@@ -5,3 +5,4 @@ target
 yarn-error.log
 /node_modules/
 *.pdf
+pkg
pom.xml
@@ -1,10 +1,10 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>ca.mokhan.comp268</groupId>
-  <artifactId>assignment1</artifactId>
+  <artifactId>assignment2</artifactId>
   <packaging>jar</packaging>
   <version>1.0-SNAPSHOT</version>
-  <name>assignment1</name>
+  <name>assignment2</name>
   <url>http://maven.apache.org</url>
   <dependencies>
     <dependency>
Rakefile
@@ -1,39 +1,29 @@
-desc "Generate documentation"
-task :doc do
-  sh 'mvn javadoc:javadoc'
-  Dir["src/**/*.md"].each do |file|
-    sh "mdpdf #{file}"
-  end
-  sh "mdpdf README.md"
-end
+require 'date'
+require 'rake/packagetask'
 
-desc "Run tests"
-task :test do
-  sh 'mvn test'
+Rake::PackageTask.new("comp-268-2", DateTime.now.strftime("%y%m").to_i) do |package|
+  package.need_tar_gz = true
+  package.package_files.add([
+    'README.pdf',
+    'src/**/*',
+    'tmp/.keep',
+  ])
 end
 
-desc "Package assignment"
-task package: [:test, :doc] do
-  sh 'rm -fr tmp/assignment1/'
-  sh 'mkdir -p tmp/assignment1/'
-  sh 'cp -r README.* tmp/assignment1/'
-  sh 'cp -r src/ tmp/assignment1'
-  sh 'rm tmp/assignment1/App*.java'
-  sh 'rm tmp/assignment1/README.*'
-  sh 'cp tmp/assignment1/Q1/AddressBook.java tmp/assignment1/Q4/'
-  sh 'cp tmp/assignment1/Q1/AddressBook.java tmp/assignment1/Q5/'
-  sh 'cp tmp/assignment1/Q1/AddressBook.java tmp/assignment1/Q8/'
-  sh 'cp -r doc/ tmp/assignment1/doc'
-  sh 'cp -r target/site/apidocs/ tmp/assignment1/doc'
-  sh "sed -i '' '/package Q.*;/d' tmp/assignment1/Q*/*.java"
-  sh "sed -i '' '/import Q.*;/d' tmp/assignment1/Q*/*.java"
-  sh 'cd tmp/ && zip -r assignment1.zip assignment1'
+task(:pdf) do
+  Dir["src/**/*.md"].each do |file|
+    sh "node ./node_modules/.bin/mdpdf #{file}"
+  end
+  sh 'node ./node_modules/.bin/mdpdf README.md'
 end
 
-desc "Run the program"
+task(:clean) { sh 'rm -fr pkg target' }
+task(:test) { sh 'mvn test' }
+task(doc: [:pdf]) { sh 'mvn javadoc:javadoc' }
+task publish: [:clean, :test, :doc, :repackage]
 task :run do
   sh "mvn package"
-  sh "java -cp target/assignment1*.jar ca.mokhan.comp268.App"
+  sh "java -cp target/assignment2*.jar ca.mokhan.comp268.App"
 end
 
-task default: [:test]
+task default: [:publish]