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-teststests1.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..9b8eb9c3
--- /dev/null
+++ b/src/main/java/Cohort.java
@@ -0,0 +1,36 @@
+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;
+ }
+
+ public Student findStudentById(long id) {
+ for (Student student : students) {
+ if (student.getId() == id) {
+ return student;
+ }
+ }
+ return null;
+ }
+}
\ 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..dd6c5a3a
--- /dev/null
+++ b/src/test/java/CohortTest.java
@@ -0,0 +1,81 @@
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CohortTest {
+ private Cohort cohort;
+ private List students;
+
+ @Before
+ public void setup() {
+ cohort = new Cohort();
+ students = new ArrayList<>();
+ }
+
+ @Test
+ public void testAndStudent() {
+ Student student1 = new Student(1, "John");
+ cohort.addStudent(student1);
+ students.add(student1);
+
+ assertEquals(students, cohort.getStudents());
+
+ Student student2 = new Student(2, "Julie");
+ cohort.addStudent(student2);
+ students.add(student2);
+
+ assertEquals(students, cohort.getStudents());
+ }
+
+ @Test
+ public void testGetStudents() {
+ assertEquals(new ArrayList(), cohort.getStudents());
+
+ Student student = new Student(1, "John");
+ cohort.addStudent(student);
+ students.add(student);
+
+ assertEquals(students, cohort.getStudents());
+ }
+
+ @Test
+ public void testGetCohortAverage() {
+ Student student1 = new Student(1, "John");
+ student1.addGrade(80);
+ student1.addGrade(90);
+ cohort.addStudent(student1);
+
+ Student student2 = new Student(1, "Julie");
+ student2.addGrade(70);
+ student2.addGrade(85);
+ cohort.addStudent(student2);
+
+ double expectedAverage = (80.0 + 90.0 + 70.0 + 85.0) / 4.0;
+ assertEquals(expectedAverage, cohort.getCohortAverage(), 0.001);
+ }
+
+ @Test
+ public void testFindStudentById_ExistingStudent() {
+ Student student1 = new Student(1, "John");
+ Student student2 = new Student(2, "Julie");
+ Student student3 = new Student(3, "Alex");
+
+ cohort.addStudent(student1);
+ cohort.addStudent(student2);
+ cohort.addStudent(student3);
+
+ assertEquals(student2, cohort.findStudentById(2));
+ }
+
+ @Test
+ public void testFindStudentById_NonexistentStudent() {
+ Student student1 = new Student(1, "John");
+ Student student2 = new Student(2, "Julie");
+ cohort.addStudent(student1);
+ cohort.addStudent(student2);
+
+ assertNull(cohort.findStudentById(3));
+ }
+}
diff --git a/src/test/java/StudentTest.java b/src/test/java/StudentTest.java
new file mode 100644
index 00000000..b3998f35
--- /dev/null
+++ b/src/test/java/StudentTest.java
@@ -0,0 +1,38 @@
+import org.junit.Test;
+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