diff --git a/README.md b/README.md index 9c54d970..e2832d37 100644 --- a/README.md +++ b/README.md @@ -12,16 +12,16 @@ ## Exercises -### Part One: The Test Driven Cycle (Red, Green, Refactor) +### Part One: The Test Driven Development Cycle (Red, Green, Refactor) -We will follow the best practices of TDD and we will create our tests first and write production code once we see the test fail. We will create a `Student` and a `StudentTest` class for a grades application, let's analyse the requirements for the `Student` class: +We will follow the best practices of TDD, and we will create our tests first and write production code once we see the test fail. We will create a `Student` and a `StudentTest` class for a grades application, before you start let's analyse the requirements for the `Student` class: - `id` should be a `long` number used to represent a "unique user" in our application. - `name` is a `String` that holds the name of the student. - `grades` is an `ArrayList` that contains a list of `Integer` numbers. -1. Create a new branch called `part-one` and read carefully the next instructions. -1. Create a `StudentTest.java` class file inside of `src/test/java` and remember to write the test before the actual production code. We will simulate the `C(reate) R(ead)` from the `CRUD` functionality in our grades application, you should be able to test and create the following requirements: +1. Create a new branch called `students-tests` and read carefully the next instructions. +1. Create a `StudentTest.java` class file inside of `src/test/java` (you might have to create these folders yourself) and remember to write the test before the actual production code. We will simulate the `C(reate) R(ead)` from the `CRUD` functionality in our grades application, you should be able to test and create the following requirements: - The `Student` class should have a constructor that sets both the name and id property, it initializes the grades property as an empty ArrayList. - The `Student` class should have the following methods: @@ -36,19 +36,25 @@ We will follow the best practices of TDD and we will create our tests first and public double getGradeAverage(); ``` 1. As always, commit and push all your changes once you're done. -_At the end of the exercise you will ended up with a `Student.java` and a `StudentTest.java` class._ +_At the end of the exercise you will end up with a `Student.java` and a `StudentTest.java` class._ + +#### Bonus + +- Go ahead and try to add the rest of the `CRUD` tests and functionality, write the methods for `updateGrade()` and `deleteGrade()` in the `Student` class. ### Part Two: Testing Legacy Code -Once you finished the `Student.java` class. +Once you are done with the `Student.java` class. -1. Checkout to the `part-two` branch, there you will find a `Cohort.java` class inside the `src/main/java` folder, this class has already a lot of methods to calculate the cohort average grade and add a student. Let's go ahead and make sure there's sufficient tests for this class to be deploy to production: +1. Checkout to the `cohorts-feature` branch, there you will find a `Cohort.java` class inside the `src/main/java` folder, this class has already a lot of methods to calculate the cohort average grade and add a student. Let's go ahead and make sure there's sufficient tests for this class to be deployed to production: -1. Create a test for each of the following concerns and code any extra tests as needed. - - A Cohort instance always have students before being used. - - A Cohort instance can add a `Student` to the `List` of students. - - A Cohort instance can get the list of students. +1. Start by creating a new branch called: `cohorts-tests`. +1. Then create a `CohortTest` class and build a test for each of the following requirements: + - A `Cohort` instance can add a `Student` to the `List` of students. + - A `Cohort` instance can get the current `List` of students. + - A `Cohort` instance can get the average, and it's being calculated correctly. +1. Go back to the `StudentTest` class and refactor the code to avoid any repetition in the test cases, the use of the `@Before` annotation will be useful to achieve this, do the same with this new `CohortTest` class if you find any code repetition as well. -### Bonus +#### Bonus -- Go ahead and try to add the rest of the `CRUD` tests and functionality, write the methods for `updateGrade()` and `deleteGrade()` in the `Student` class. \ No newline at end of file +- Follow the TDD cycle and create a new feature to find students by their ID like: `findStudentById(long id)` in the `Cohort` class, remember to create the tests first before any production code. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 195435a0..32cc2565 100644 --- a/pom.xml +++ b/pom.xml @@ -7,18 +7,10 @@ junit-tests tests 1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 11 - 11 - - - - + + 11 + 11 + diff --git a/src/main/java/Cohort.java b/src/main/java/Cohort.java new file mode 100644 index 00000000..4baa092f --- /dev/null +++ b/src/main/java/Cohort.java @@ -0,0 +1,27 @@ +import java.util.ArrayList; +import java.util.List; + +public class Cohort { + + private List students; + + public Cohort() { + this.students = new ArrayList<>(); + } + + public double getCohortAverage() { + double avg = 0; + for (Student student: this.getStudents()) { + avg += student.getGradeAverage(); + } + return avg / this.getStudents().size(); + } + + public void addStudent(Student student){ + students.add(student); + } + + public List getStudents() { + return students; + } +} \ No newline at end of file diff --git a/src/main/java/Student.java b/src/main/java/Student.java new file mode 100644 index 00000000..507d664c --- /dev/null +++ b/src/main/java/Student.java @@ -0,0 +1,38 @@ +import java.util.ArrayList; + +public class Student { + + private long id; + private String name; + private ArrayList grades; + + public Student(long id, String name) { + this.id = id; + this.name = name; + this.grades = new ArrayList<>(); + } + + public long getId() { + return this.id; + } + + public String getName() { + return this.name; + } + + public ArrayList getGrades() { + return this.grades; + } + + public void addGrade(int grade) { + this.grades.add(grade); + } + + public double getGradeAverage() { + double sum = 0; + for (int grade: this.grades) { + sum += grade; + } + return sum / this.grades.size() ; + } +} diff --git a/src/test/java/CohortTest.java b/src/test/java/CohortTest.java new file mode 100644 index 00000000..d11b44eb --- /dev/null +++ b/src/test/java/CohortTest.java @@ -0,0 +1,35 @@ +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class CohortTest { + Cohort venus; + @Before + public void init() { + venus = new Cohort(); + Student Cody = new Student(1, "Cody"); + venus.addStudent(Cody); + Cody.addGrade(85); + Cody.addGrade(90); + Student DocRob = new Student(2, "DocRob"); + venus.addStudent(DocRob); + DocRob.addGrade(88); + DocRob.addGrade(97); + } + @Test + public void testStudentAdd() { + assertEquals(2, venus.getStudents().size()); + } + + @Test + public void testGetCurrentList() { + assertNotNull(venus.getStudents()); + } + + @Test + public void testGetAverage() { + assertEquals(90.0,venus.getCohortAverage(),2); + } +} diff --git a/src/test/java/StudentTest.java b/src/test/java/StudentTest.java new file mode 100644 index 00000000..a3cfb11f --- /dev/null +++ b/src/test/java/StudentTest.java @@ -0,0 +1,41 @@ +import org.junit.Test; + +import java.util.ArrayList; + +import static org.junit.Assert.*; + +public class StudentTest { + @Test + public void testCreateStudent(){ + Student fer = new Student(1L, "fer"); + Student ryan = null; + assertNull(ryan); + assertNotNull(fer); + } + + @Test + public void testStudentFields(){ + Student fer = new Student(1L, "fer"); + assertSame(1L, fer.getId()); + assertSame("fer", fer.getName()); + assertSame(0, fer.getGrades().size()); + } + + + @Test + public void testAddGrade(){ + Student fer = new Student(1L, "fer"); + fer.addGrade(100); + assertSame(100, fer.getGrades().get(0)); + fer.addGrade(80); + assertSame(80, fer.getGrades().get(1)); + } + + @Test + public void testAverageGrade(){ + Student fer = new Student(1L, "fer"); + fer.addGrade(100); + fer.addGrade(80); + assertEquals(90, fer.getGradeAverage(), 0); + } +} \ No newline at end of file