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..05b12f7 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Classroom.java @@ -0,0 +1,45 @@ +package com.github.curriculeon; + + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class Classroom { + + //Attributes + private final Students students = Students.getInstance(); + private final Instructors instructors = Instructors.getInstance(); + private static final Classroom INSTANCE = new Classroom(); + + //Start Constructors + private Classroom() { + + } + //End Constructors + + //Start Methods + public static Classroom getInstance() { + return INSTANCE; + } + + public void hostLecture(Teacher teacher, double numberOfHours) { + teacher.lecture(students.toArray(), numberOfHours); + } + + public void hostLecture(long id, double numberOfHours) { + instructors.findById(id).ifPresent(person -> { + person.lecture(students.toArray(), numberOfHours); + }); + } + + public void hostLecture(Educator teacher, double numberOfHours) { + teacher.lecture(students.toArray(), numberOfHours); + } + + public Map getStudyMap() { + return StreamSupport.stream(students.spliterator(), false).collect(Collectors.toMap(student -> student, Student::getTotalStudyTime)); + } + //End Methods +} 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..160b951 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Educator.java @@ -0,0 +1,34 @@ +package com.github.curriculeon; + +import java.util.HashMap; +import java.util.Map; + +public enum Educator implements Teacher{ + MATH_INSTRUCTOR(0); + + //Attributes + private final Instructor instructor; + private double totalHoursWorked = 0; + + //Start Constructors + private Educator(int instructorId){ + this.instructor = new Instructor(instructorId, "Tom"); + } + + @Override + public void teach(Learner learner, double numberOfHours) { + instructor.teach(learner, numberOfHours); + totalHoursWorked += numberOfHours; + } + + @Override + public void lecture(Learner[] learners, double numberOfHours) { + instructor.lecture(learners, numberOfHours); + totalHoursWorked += numberOfHours; + } + + public double getTotalHoursWorked(){ + return totalHoursWorked; + } + //End Constructors +} 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..c3341c5 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Instructor.java @@ -0,0 +1,29 @@ +package com.github.curriculeon; + +public class Instructor extends Person implements Teacher { + + //Attributes + + //Start Constructor + public Instructor(long id, String name) { + super(id, name); + Instructors.getInstance().add(this); + } + //End Constructor + + //Start Methods + @Override + public void teach(Learner learner, double numberOfHours) { + learner.learner(numberOfHours); + } + + @Override + public void lecture(Learner[] learners, double numberOfHours) { + double numberOfHoursPerLearner = numberOfHours / learners.length; + for (int i = 0; i < learners.length; i++) { + Learner learner = learners[i]; + teach(learner, numberOfHoursPerLearner); + } + } + //End Methods +} 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..4b37f2f --- /dev/null +++ b/src/main/java/com/github/curriculeon/Instructors.java @@ -0,0 +1,25 @@ +package com.github.curriculeon; + +import java.util.concurrent.atomic.AtomicLong; + +public class Instructors extends People{ + + //Attributes + private static final Instructors INSTANCE = new Instructors(); + public static final AtomicLong ID_GENERATOR = new AtomicLong(); + + //Start Constructors + private Instructors(){} + //End Constructors + + //Start Methods + public static Instructors getInstance(){ + return INSTANCE; + } + + @Override + public Instructor[] toArray() { + return super.toArray(new Instructor[INSTANCE.count()]); + } + //End Methods +} 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..e217764 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Learner.java @@ -0,0 +1,8 @@ +package com.github.curriculeon; + +public interface Learner { + + public void learner(double numberOfHours); + + public 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..b684785 --- /dev/null +++ b/src/main/java/com/github/curriculeon/People.java @@ -0,0 +1,61 @@ +package com.github.curriculeon; + +import java.util.*; +import java.util.function.Consumer; + +public abstract class People

implements Iterable

{ + + //Attributes + private final List

personList = new ArrayList<>(); + + //Start Constructors + + //End Constructors + + //Start Methods + public void add(P person){ + personList.add(person); + } + + public Optional

findById(long id){ + return personList.stream().filter(person -> Objects.equals(id, person.getId())).findFirst(); + } + + public boolean contains(P person){ + return personList.contains(person); + } + + public boolean remove(long id){ + return personList.removeIf(person -> Objects.equals(id, person.getId())); + } + + public void removeAll(){ + personList.clear(); + } + + public int count() { + return personList.size(); + } + + public P[] toArray(P[] array){ + return personList.toArray(array); + } + + public abstract P[] toArray(); + + @Override + public Iterator

iterator() { + return personList.iterator(); + } + + @Override + public void forEach(Consumer action) { + personList.forEach(action); + } + + @Override + public Spliterator

spliterator() { + return personList.spliterator(); + } + //End Methods +} diff --git a/src/main/java/com/github/curriculeon/Person.java b/src/main/java/com/github/curriculeon/Person.java index 3c8350b..b3f7c17 100644 --- a/src/main/java/com/github/curriculeon/Person.java +++ b/src/main/java/com/github/curriculeon/Person.java @@ -1,5 +1,32 @@ package com.github.curriculeon; public class Person { + + //Attributes + private final long id; + private String name; + + //Start Constructors + public Person(long id, String name) { + this.id = id; + this.name = name; + } + //End Constructors + + //Start Methods + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + //End Methods } 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..3b58744 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Student.java @@ -0,0 +1,27 @@ +package com.github.curriculeon; + +public class Student extends Person implements Learner { + + //Attributes + private double totalStudyTime; + + //Start Constructor + public Student(long id, String name) { + super(id, name); + Students.getInstance().add(this); + } + //End Constructor + + //Start Methods + @Override + public void learner(double numberOfHours) { + totalStudyTime += numberOfHours; + } + + @Override + public Double getTotalStudyTime() { + return totalStudyTime; + } + + //End Methods +} 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..52a0547 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Students.java @@ -0,0 +1,26 @@ +package com.github.curriculeon; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +public class Students extends People{ + + //Attributes + private static final Students INSTANCE = new Students(); + public static final AtomicLong ID_GENERATOR = new AtomicLong(); + + //Start Constructors + private Students(){} + //End Constructors + + //Start Methods + public static Students getInstance(){ + return INSTANCE; + } + + @Override + public Student[] toArray() { + return super.toArray(new Student[INSTANCE.count()]); + } + //End Methods +} 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..10ae316 --- /dev/null +++ b/src/main/java/com/github/curriculeon/Teacher.java @@ -0,0 +1,8 @@ +package com.github.curriculeon; + +public interface Teacher { + + public void teach(Learner learner, double numberOfHours); + + public void lecture(Learner[] learners, double numberOfHours); +} diff --git a/src/test/java/com/github/curriculeon/ClassroomTest.java b/src/test/java/com/github/curriculeon/ClassroomTest.java new file mode 100644 index 0000000..b3a0177 --- /dev/null +++ b/src/test/java/com/github/curriculeon/ClassroomTest.java @@ -0,0 +1,29 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class ClassroomTest { + + @Test + public void hostLectureTest() { + //given + Students students = Students.getInstance(); + List newStudents = IntStream.range(0, 10).boxed().map(id -> new Student(id, "Tom")).collect(Collectors.toList()); + Instructor instructor = new Instructor(99, "Bob"); + Instructors instructors = Instructors.getInstance(); + Classroom classroom = Classroom.getInstance(); + + //when + classroom.hostLecture(instructor, 50D); + + //then + StreamSupport.stream(students.spliterator(), false).forEach(student->Assert.assertEquals(student.getTotalStudyTime(), 50D/students.count(), 0.0)); + } +} diff --git a/src/test/java/com/github/curriculeon/EducatorTest.java b/src/test/java/com/github/curriculeon/EducatorTest.java new file mode 100644 index 0000000..6023cc6 --- /dev/null +++ b/src/test/java/com/github/curriculeon/EducatorTest.java @@ -0,0 +1,50 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class EducatorTest { + + @Test + public void teachTest() { + //given + Educator educator = Educator.MATH_INSTRUCTOR; + int studentId = 1; + String studentName = "Bob"; + Student student = new Student(studentId, studentName); + double numberOfHours = 5; + double previousHoursWorked = educator.getTotalHoursWorked(); + + //when + educator.teach(student, numberOfHours); + + //then + Assert.assertEquals(student.getTotalStudyTime(), numberOfHours, .000001); + Assert.assertEquals(educator.getTotalHoursWorked(), previousHoursWorked + numberOfHours, 0.0); + } + + @Test + public void lectureTest() { + //given + Educator educator = Educator.MATH_INSTRUCTOR; + String studentName = "Bob"; + Student[] students = IntStream.range(0, 10).boxed().map(studentId -> new Student(studentId, studentName) + ).collect(Collectors.toList()).toArray(new Student[10]); + double numberOfHours = 100; + double numberOfHoursPerStudent = numberOfHours / students.length; + double previousHoursWorked = educator.getTotalHoursWorked(); + + //when + educator.lecture(students, numberOfHours); + + //then + Arrays.asList(students).stream().forEach(student -> { + Assert.assertEquals(student.getTotalStudyTime(), numberOfHoursPerStudent, .000001); + }); + Assert.assertEquals(educator.getTotalHoursWorked(), previousHoursWorked + numberOfHours, 0.0); + } +} diff --git a/src/test/java/com/github/curriculeon/InstructorTest.java b/src/test/java/com/github/curriculeon/InstructorTest.java new file mode 100644 index 0000000..a780479 --- /dev/null +++ b/src/test/java/com/github/curriculeon/InstructorTest.java @@ -0,0 +1,72 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class InstructorTest { + + @Test + public void implementationTest() { + //given + int id = 0; + String name = "Bob"; + Instructor instructor = new Instructor(id, name); + + //then + Assert.assertTrue(instructor instanceof Teacher); + } + + @Test + public void inheritanceTest() { + //given + int id = 0; + String name = "Bob"; + Instructor instructor = new Instructor(id, name); + + //then + Assert.assertTrue(instructor instanceof Person); + } + + @Test + public void teachTest() { + //given + int instructorId = 0; + String instructorName = "Bob"; + Instructor instructor = new Instructor(instructorId, instructorName); + int studentId = 1; + String studentName = "Bob"; + Student student = new Student(studentId, studentName); + double numberOfHours = 5; + + //when + instructor.teach(student, numberOfHours); + + //then + Assert.assertEquals(student.getTotalStudyTime(), numberOfHours, .000001); + } + + @Test + public void lectureTest() { + //given + int instructorId = 0; + String instructorName = "Bob"; + Instructor instructor = new Instructor(instructorId, instructorName); + String studentName = "Bob"; + Student[] students = IntStream.range(0, 10).boxed().map(studentId -> new Student(studentId, studentName) + ).collect(Collectors.toList()).toArray(new Student[10]); + double numberOfHours = 100; + double numberOfHoursPerStudent = numberOfHours / students.length; + + //when + instructor.lecture(students, numberOfHours); + + //then + Arrays.asList(students).stream().forEach(student -> { + Assert.assertEquals(student.getTotalStudyTime(), numberOfHoursPerStudent, .000001); + }); + } +} diff --git a/src/test/java/com/github/curriculeon/InstructorsTest.java b/src/test/java/com/github/curriculeon/InstructorsTest.java new file mode 100644 index 0000000..cc54cbf --- /dev/null +++ b/src/test/java/com/github/curriculeon/InstructorsTest.java @@ -0,0 +1,18 @@ +package com.github.curriculeon; + +import org.junit.Test; + +public class InstructorsTest { + + @Test + public void instructorInInstructorsTest(){ + //given + Instructors instructors = Instructors.getInstance(); + + //when + Instructor newInstructor = new Instructor(99, "Tom"); + + //then + instructors.contains(newInstructor); + } +} diff --git a/src/test/java/com/github/curriculeon/PeopleTest.java b/src/test/java/com/github/curriculeon/PeopleTest.java new file mode 100644 index 0000000..1c5d857 --- /dev/null +++ b/src/test/java/com/github/curriculeon/PeopleTest.java @@ -0,0 +1,69 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Optional; +import java.util.Random; + +public class PeopleTest { + + public static final Random RANDOM = new Random(); + + @Test + public void addTest() { + //given + People people = Students.getInstance(); + people.removeAll(); + int oldCount = people.count(); + + //when + Student student = new Student(RANDOM.nextInt(), "Bob"); + + //then + Assert.assertEquals(oldCount + 1, people.count()); + } + + @Test + public void removeTest() { + //given + People people = Students.getInstance(); + people.removeAll(); + Student student = new Student(RANDOM.nextInt(), "Bob"); + int oldCount = people.count(); + + + //when + people.remove(student.getId()); + + //then + Assert.assertEquals(oldCount - 1, people.count()); + Assert.assertFalse(people.contains(student)); + } + + @Test + public void findByIdInTest() { + //given + People people = Students.getInstance(); + people.removeAll(); + Student student = new Student(1, "Bob"); + + //when + Optional opPerson = people.findById(student.getId()); + + //then + Assert.assertTrue(opPerson.isPresent()); + } + + @Test + public void findByIdNotInTest() { + //given + People people = Students.getInstance(); + + //when + Optional opPerson = people.findById(99L); + + //then + Assert.assertTrue(!opPerson.isPresent()); + } +} diff --git a/src/test/java/com/github/curriculeon/PersonTest.java b/src/test/java/com/github/curriculeon/PersonTest.java new file mode 100644 index 0000000..dae9182 --- /dev/null +++ b/src/test/java/com/github/curriculeon/PersonTest.java @@ -0,0 +1,48 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class PersonTest { + + //Start Constructor + + //End Constructor + + //Start Methods + @Test + public void testConstructor(){ + //given + long id = 8L; + String name = "bob"; + + //when + Person person = new Person(id, name); + long actualId = person.getId(); + String actualName = person.getName(); + + //then + Assert.assertEquals(id, actualId); + Assert.assertEquals(name, actualName); + } + + @Test + public void testSetName(){ + //given + Person person = new Person(5L, "BOB"); + String newName = "Tom"; + Assert.assertNotEquals("BOB", "Tom"); + + //when + person.setName("Tom"); + String actualName = person.getName(); + + //then + Assert.assertEquals(newName, actualName); + } + //End Methods +} diff --git a/src/test/java/com/github/curriculeon/StudentTest.java b/src/test/java/com/github/curriculeon/StudentTest.java new file mode 100644 index 0000000..03008c7 --- /dev/null +++ b/src/test/java/com/github/curriculeon/StudentTest.java @@ -0,0 +1,47 @@ +package com.github.curriculeon; + +import org.junit.Assert; +import org.junit.Test; + +public class StudentTest { + + //Start Methods + @Test + public void implementationTest(){ + //given + int id = 0; + String name = "Bob"; + Student student = new Student(id, name); + + //then + Assert.assertTrue(student instanceof Learner); + } + + @Test + public void inheritanceTest(){ + //given + int id = 0; + String name = "Bob"; + Student student = new Student(id, name); + //then + Assert.assertTrue(student instanceof Person); + } + + @Test + public void learnTest(){ + //given + int id = 0; + String name = "Bob"; + Student student = new Student(id, name); + int studyTime = 5; + Double previousTotalStudyTime = student.getTotalStudyTime(); + + //when + student.learner(studyTime); + + //then + Assert.assertEquals(previousTotalStudyTime + 5, student.getTotalStudyTime().doubleValue(), .000001); + } + + //End Methods +} diff --git a/src/test/java/com/github/curriculeon/StudentsTest.java b/src/test/java/com/github/curriculeon/StudentsTest.java new file mode 100644 index 0000000..ca01ced --- /dev/null +++ b/src/test/java/com/github/curriculeon/StudentsTest.java @@ -0,0 +1,18 @@ +package com.github.curriculeon; + +import org.junit.Test; + +public class StudentsTest { + + @Test + public void studentInStudentsTest(){ + //given + Students students = Students.getInstance(); + + //when + Student newStudent = new Student(99, "Tom"); + + //then + students.contains(newStudent); + } +} diff --git a/src/test/java/com/github/curriculeon/TestPerson.java b/src/test/java/com/github/curriculeon/TestPerson.java deleted file mode 100644 index 6c523fe..0000000 --- a/src/test/java/com/github/curriculeon/TestPerson.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.curriculeon; - -public class TestPerson { - -}