diff --git a/src/main/java/com/github/curriculeon/Classroom.java b/src/main/java/com/github/curriculeon/Classroom.java new file mode 100644 index 0000000..77158bd --- /dev/null +++ b/src/main/java/com/github/curriculeon/Classroom.java @@ -0,0 +1,30 @@ +package com.github.curriculeon; + +import java.util.HashMap; +import java.util.Map; + +public enum Classroom { + INSTANCE; + + private Students students = Students.getInstance(); + private Instructors instructors = Instructors.getInstance(); + + public void hostLecture(Teacher teacher, double numberOfHours){ + Student[] studentArray = students.toArray(); + teacher.lecture(studentArray, numberOfHours); + } + + public void hostLecture(Long id, double numberOfHours){ + Teacher teacher = Instructors.getInstance().findById(id); + hostLecture(teacher, numberOfHours); + } + + public Map getStudyMap() { + Map map = new HashMap<>(); + for(Student student : Students.getInstance().toArray()){ + double numberOfHours = student.getTotalStudyTime(); + map.put(student, numberOfHours); + } + return map; + } +} diff --git a/src/main/java/com/github/curriculeon/Educator.java b/src/main/java/com/github/curriculeon/Educator.java new file mode 100644 index 0000000..8d19c84 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Educator.java @@ -0,0 +1,29 @@ +package com.github.curriculeon; + +public enum Educator implements Teacher{ + LEON, + HUNTER; + + + private double timeWorked; + + @Override + public void teach(Learner learner, double numberOfHours) { + getTeacher().teach(learner, numberOfHours); + timeWorked += numberOfHours; + } + + @Override + public void lecture(Learner[] learners, double numberOfHours) { + getTeacher().lecture(learners, numberOfHours); + timeWorked += numberOfHours; + } + + public double getTimeWorked(){ + return timeWorked; + } + + private Teacher getTeacher() { + return Instructors.getInstance().findByName(name().toUpperCase()); + } +} diff --git a/src/main/java/com/github/curriculeon/Instructor.java b/src/main/java/com/github/curriculeon/Instructor.java new file mode 100644 index 0000000..fb665a9 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Instructor.java @@ -0,0 +1,21 @@ +package com.github.curriculeon; + +public class Instructor extends Person implements Teacher { + + public Instructor(Long id, String name) { + super(id, name); + } + + @Override + public void teach(Learner learner, double numberOfHours) { + learner.learn(numberOfHours); + } + + @Override + public void lecture(Learner[] learners, double numberOfHours) { + double numberOfHoursPerLearner = numberOfHours / learners.length; + for (Learner learner:learners) { + teach(learner, numberOfHoursPerLearner); + } + } +} diff --git a/src/main/java/com/github/curriculeon/Instructors.java b/src/main/java/com/github/curriculeon/Instructors.java new file mode 100644 index 0000000..acb94e6 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Instructors.java @@ -0,0 +1,20 @@ +package com.github.curriculeon; + +public final class Instructors extends People { + + private static final Instructors INSTANCE = new Instructors(); + + private Instructors(){ + this.add(new Instructor(1L, "LEON")); + this.add(new Instructor(2L, "HUNTER")); + } + + public static Instructors getInstance() { + return INSTANCE; + } + + @Override + public Instructor[] toArray() { + return this.list.toArray(new Instructor[0]); + } +} diff --git a/src/main/java/com/github/curriculeon/Learner.java b/src/main/java/com/github/curriculeon/Learner.java new file mode 100644 index 0000000..c934c30 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Learner.java @@ -0,0 +1,7 @@ +package com.github.curriculeon; + +public interface Learner { + void learn(double numberOfHours); + + double getTotalStudyTime(); +} diff --git a/src/main/java/com/github/curriculeon/People.java b/src/main/java/com/github/curriculeon/People.java new file mode 100644 index 0000000..024b0d6 --- /dev/null +++ b/src/main/java/com/github/curriculeon/People.java @@ -0,0 +1,60 @@ +package com.github.curriculeon; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +abstract public class People implements Iterable { + + protected List list = new ArrayList<>(); + + public void add(PersonType person){ + list.add(person); + } + + public PersonType findById(Long id){ + for (PersonType person: list) { + if(person.getId() == id){ + return person; + } + } + return null; + } + + public PersonType findByName(String name) { + for(PersonType person : list) { + if(Objects.requireNonNull(name).equals(person.getName())) { + return person; + } + } + return null; + } + + public boolean contains(PersonType person){ + return list.contains(person); + } + + public void remove(PersonType person){ + list.remove(person); + } + + public void remove(Long id){ + remove(findById(id)); + } + + public void removeAll(){ + list.clear(); + } + + public int count(){ + return list.size(); + } + + abstract public PersonType[] toArray(); + + @Override + public Iterator iterator() { + return list.iterator(); + } +} diff --git a/src/main/java/com/github/curriculeon/Person.java b/src/main/java/com/github/curriculeon/Person.java index 3c8350b..c11b62c 100644 --- a/src/main/java/com/github/curriculeon/Person.java +++ b/src/main/java/com/github/curriculeon/Person.java @@ -1,5 +1,25 @@ package com.github.curriculeon; public class Person { + final Long id; + String name; + + public Person(Long id, String name) { + this.id = id; + + this.name = name; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/src/main/java/com/github/curriculeon/Student.java b/src/main/java/com/github/curriculeon/Student.java new file mode 100644 index 0000000..7a1104b --- /dev/null +++ b/src/main/java/com/github/curriculeon/Student.java @@ -0,0 +1,20 @@ +package com.github.curriculeon; + +public class Student extends Person implements Learner { + + double totalStudyTime; + + public Student(Long id, String name) { + super(id, name); + } + + @Override + public void learn(double numberOfHours) { + this.totalStudyTime += numberOfHours; + } + + @Override + public double getTotalStudyTime() { + return totalStudyTime; + } +} diff --git a/src/main/java/com/github/curriculeon/Students.java b/src/main/java/com/github/curriculeon/Students.java new file mode 100644 index 0000000..71898b6 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Students.java @@ -0,0 +1,21 @@ +package com.github.curriculeon; + +public final class Students extends People { + + private static Students INSTANCE = new Students(); + + private Students(){ + this.add(new Student(1L, "Jarek")); + this.add(new Student(2L, "Mary")); + this.add(new Student(3L, "Andrew")); + } + + public static Students getInstance(){ + return INSTANCE; + } + + @Override + public Student[] toArray() { + return this.list.toArray(new Student[0]); + } +} diff --git a/src/main/java/com/github/curriculeon/Teacher.java b/src/main/java/com/github/curriculeon/Teacher.java new file mode 100644 index 0000000..5555723 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Teacher.java @@ -0,0 +1,8 @@ +package com.github.curriculeon; + +public interface Teacher { + void teach(Learner learner, double numberOfHours); + + void lecture(Learner[] learners, double numberOfHours); + +} diff --git a/src/test/java/com/github/curriculeon/TestClassroom.java b/src/test/java/com/github/curriculeon/TestClassroom.java new file mode 100644 index 0000000..63bde03 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestClassroom.java @@ -0,0 +1,41 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Map; + +public class TestClassroom { + public void testHostLecture(Teacher teacher) { + //given + Classroom classroom = Classroom.INSTANCE; + double numberOfHours = Students.getInstance().count(); + double hoursPerStudent = numberOfHours / Students.getInstance().count(); + Map preStudyMap = classroom.getStudyMap(); + + //when + classroom.hostLecture(teacher, numberOfHours); + Map postStudyMap = classroom.getStudyMap(); + + for(Map.Entry entry : preStudyMap.entrySet()){ + Student student = entry.getKey(); + double preStudyTime = entry.getValue(); + double actualStudyTime = postStudyMap.get(student); + double expectedStudyTime = preStudyTime + hoursPerStudent; + + //then + Assert.assertEquals(expectedStudyTime, actualStudyTime, 0.001); + } + + + } + @Test + public void testHostLectureEducator() { + testHostLecture(Educator.LEON); + } + + @Test + public void testHostLectureInstructor(){ + testHostLecture(Instructors.getInstance().findById(1L)); + } +} diff --git a/src/test/java/com/github/curriculeon/TestEducator.java b/src/test/java/com/github/curriculeon/TestEducator.java new file mode 100644 index 0000000..73764e4 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestEducator.java @@ -0,0 +1,65 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +public class TestEducator { + + @Test + public void testImplementation(){ + Educator educator = Educator.LEON; + + boolean isTeacher = educator instanceof Teacher; + + Assert.assertTrue(isTeacher); + } + + @Test + public void testTeach(){ + Educator educator = Educator.LEON; + Student student = new Student(null, null); + double preStudyTime = student.getTotalStudyTime(); + double preWorkTime = educator.getTimeWorked(); + double lectureTime = 10.0; + double expectedStudyTime = preStudyTime + lectureTime; + double expectedWorkTime = preWorkTime + lectureTime; + + educator.teach(student, lectureTime); + double actualStudyTime = student.getTotalStudyTime(); + double actualWorkTime = educator.getTimeWorked(); + + Assert.assertEquals(expectedStudyTime, actualStudyTime, 0.001); + Assert.assertEquals(expectedWorkTime, actualWorkTime, 0.001); + + } + + @Test + public void testLecture(){ + /*Student student1 = new Student(null, null); + Student student2 = new Student(null, null); + Student student3 = new Student(null, null); + Student student4 = new Student(null, null); + Student[] students = new Student[]{student1, student2, student3, student4};*/ + //SEE ALSO: Implementation in TestInstructor + Student[] students = Students.getInstance().toArray(); + Educator educator = Educator.HUNTER; + double lectureTime = students.length; + double preWorkTime = educator.getTimeWorked(); + double expectedStudyTime = lectureTime/ students.length; + double expectedWorkTime = preWorkTime + lectureTime; + for(Student student : students){ + Assert.assertNotEquals(expectedStudyTime, student.getTotalStudyTime()); + } + + educator.lecture(students, lectureTime); + double actualWorkTime = educator.getTimeWorked(); + for(Student student : students) { + double actualStudyTime = student.getTotalStudyTime(); + + //then + Assert.assertEquals(expectedStudyTime, actualStudyTime, 0.001); + } + + Assert.assertEquals(expectedWorkTime, actualWorkTime, 0.001); + } +} diff --git a/src/test/java/com/github/curriculeon/TestInstructor.java b/src/test/java/com/github/curriculeon/TestInstructor.java new file mode 100644 index 0000000..3c20489 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestInstructor.java @@ -0,0 +1,73 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +public class TestInstructor { + + @Test + public void testImplementation(){ + //given + Instructor instructor = new Instructor(null, null); + + //when + boolean isTeacher = instructor instanceof Teacher; + + //then + Assert.assertTrue(isTeacher); + } + + @Test + public void testInheritance(){ + //given + Instructor instructor = new Instructor(null, null); + + //when + boolean isPerson = instructor instanceof Person; + + //then + Assert.assertTrue(isPerson); + } + + @Test + public void testTeach(){ + //given + Student student = new Student(null, null); + Instructor instructor = new Instructor(null, null); + double preStudyTime = student.getTotalStudyTime(); + double lectureTime = 10.0; + double expectedStudyTime = preStudyTime + lectureTime; + + //when + instructor.teach(student, lectureTime); + double actualStudyTime = student.getTotalStudyTime(); + + //then + Assert.assertEquals(expectedStudyTime, actualStudyTime, 0.001); + } + + @Test + public void testLecture(){ + //given + Student student1 = new Student(null, null); + Student student2 = new Student(null, null); + Student student3 = new Student(null, null); + Student student4 = new Student(null, null); + Student[] students = new Student[]{student1, student2, student3, student4}; + Instructor instructor = new Instructor(null, null); + double lectureTime = students.length; + double expectedStudyTime = lectureTime/ students.length; + for(Student student : students){ + Assert.assertNotEquals(expectedStudyTime, student.getTotalStudyTime()); + } + + //when + instructor.lecture(students, lectureTime); + for(Student student : students) { + double actualStudyTime = student.getTotalStudyTime(); + + //then + Assert.assertEquals(expectedStudyTime, actualStudyTime, 0.001); + } + } +} diff --git a/src/test/java/com/github/curriculeon/TestInstructors.java b/src/test/java/com/github/curriculeon/TestInstructors.java new file mode 100644 index 0000000..8a50691 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestInstructors.java @@ -0,0 +1,29 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class TestInstructors { + + @Test + public void testConstructor(){ + //given + String[] expectedNames = "Leon,Hunter".split(","); + + //when + List nameList = Arrays + .stream(Instructors.getInstance().toArray()) + .map(instructor -> instructor.getName()) + .collect(Collectors.toList()); + + //then + for(String expectedName : expectedNames){ + Assert.assertTrue(nameList.contains(expectedName)); + } + + } +} diff --git a/src/test/java/com/github/curriculeon/TestPeople.java b/src/test/java/com/github/curriculeon/TestPeople.java new file mode 100644 index 0000000..d198230 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestPeople.java @@ -0,0 +1,71 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +public class TestPeople { + + @Test + public void testAdd() { + //given + People people = Instructors.getInstance(); + Instructor person = new Instructor(null, null); + Assert.assertFalse(people.contains(person)); + + //when + people.add(person); + + //then + Assert.assertTrue(people.contains(person)); + } + + @Test + public void testRemove() { + //given + People people = Students.getInstance(); + Student person = new Student(null, null); + people.add(person); + Assert.assertTrue(people.contains(person)); + + //when + people.remove(person); + + //then + Assert.assertFalse(people.contains(person)); + + } + + @Test + public void testRemoveById() { + //given + Long id = Long.MAX_VALUE; + People people = Instructors.getInstance(); + Instructor person = new Instructor(id, null); + people.add(person); + Assert.assertTrue(people.contains(person)); + + //when + people.remove(id); + + //then + Assert.assertFalse(people.contains(person)); + + } + + @Test + public void testFindById() { + //given + Long id = Long.MAX_VALUE; + People people = Students.getInstance(); + Student expectedPerson = new Student(id, null); + people.add(expectedPerson); + Assert.assertTrue(people.contains(expectedPerson)); + + //when + Person actualPerson = people.findById(id); + + //then + Assert.assertEquals(expectedPerson, actualPerson); + + } +} diff --git a/src/test/java/com/github/curriculeon/TestPerson.java b/src/test/java/com/github/curriculeon/TestPerson.java index 6c523fe..f20be18 100644 --- a/src/test/java/com/github/curriculeon/TestPerson.java +++ b/src/test/java/com/github/curriculeon/TestPerson.java @@ -1,5 +1,38 @@ package com.github.curriculeon; +import org.junit.Assert; +import org.junit.Test; + public class TestPerson { + @Test + public void testConstructor(){ + //given + Long expectedId = 10L; + String expectedName = "Leon"; + + //when + Person person = new Person(expectedId, expectedName); + Long actualId = person.getId(); + String actualName = person.getName(); + + //then + Assert.assertEquals(expectedId, actualId); + Assert.assertEquals(expectedName, actualName); + } + + @Test + public void testSetName(){ + //given + String expectedName = "Leon"; + Person person = new Person(null, null); + Assert.assertNotEquals(expectedName, person.getName()); + + //when - the method that we are actually testing + person.setName(expectedName); + String actualName = person.getName(); + + //then + Assert.assertEquals(expectedName, actualName); + } } diff --git a/src/test/java/com/github/curriculeon/TestStudent.java b/src/test/java/com/github/curriculeon/TestStudent.java new file mode 100644 index 0000000..f383c26 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestStudent.java @@ -0,0 +1,47 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +public class TestStudent { + + @Test + public void testImplementation(){ + //given + Student student = new Student(null, null); + + //when + boolean isLearner = student instanceof Learner; + + //then + Assert.assertTrue(isLearner); + } + + @Test + public void testInheritance(){ + //given + Student student = new Student(null, null); + + //when + boolean isPerson = student instanceof Person; + + //then + Assert.assertTrue(isPerson); + } + + @Test + public void testLearn(){ + //given + Student student = new Student(null, null); + double preStudyTime = student.getTotalStudyTime(); + double numberOfHours = 100.0; + double expectedTotalStudyTime = preStudyTime + numberOfHours; + + //when + student.learn(numberOfHours); + + //then + Assert.assertEquals(expectedTotalStudyTime, student.getTotalStudyTime(), 0.001); + + } +} diff --git a/src/test/java/com/github/curriculeon/TestStudents.java b/src/test/java/com/github/curriculeon/TestStudents.java new file mode 100644 index 0000000..b803809 --- /dev/null +++ b/src/test/java/com/github/curriculeon/TestStudents.java @@ -0,0 +1,29 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class TestStudents { + + @Test + public void testConstructor() { + //given + String[] expectedNames = "Jarek,Andrew,Mary".split(","); + + //when + List nameList = Arrays + .stream(Students.getInstance().toArray()) + .map(student -> student.getName()) + .collect(Collectors.toList()); + + //then + for(String expectedName : expectedNames){ + Assert.assertTrue(nameList.contains(expectedName)); + } + + } +}