diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..26d33521
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 00000000..e37052f0
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 00000000..63e90019
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 00000000..712ab9d9
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml
new file mode 100644
index 00000000..d4110417
--- /dev/null
+++ b/.idea/libraries/Maven__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 00000000..f58bbc11
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 00000000..c25c320e
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 00000000..711b3a53
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 00000000..e96534fb
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 00000000..94a25f7f
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interfaces-1.iml b/interfaces-1.iml
new file mode 100644
index 00000000..cba8d6b0
--- /dev/null
+++ b/interfaces-1.iml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f0effe12..b69da293 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,6 +5,18 @@
io.zipcoder
interfaces-1
0.0.1-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 15
+ 15
+
+
+
+
jar
interfaces-1
diff --git a/src/main/java/io/zipcoder/interfaces/Educator.java b/src/main/java/io/zipcoder/interfaces/Educator.java
new file mode 100644
index 00000000..cd8654c2
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Educator.java
@@ -0,0 +1,33 @@
+package io.zipcoder.interfaces;
+
+public enum Educator implements Teacher{
+
+ LEON (new Instructor(1L, "Leon")),
+ DOLIO (new Instructor(2L, "Dolio")),
+ DAN (new Instructor(3L, "Dan")),
+ KRIS (new Instructor(4L, "Kris"));
+
+ private final Instructor instructor;
+ double timeWorked;
+
+ Educator(Instructor instructor) {
+ this.instructor = instructor;
+ }
+
+ @Override
+ public void teach(Learner learner, double numberOfHours) {
+ this.instructor.teach(learner, numberOfHours);
+ timeWorked += numberOfHours;
+ }
+
+ @Override
+ public void lecture(Learner[] learners, double numberOfHours) {
+ Students students = Students.getInstance();
+ this.instructor.lecture(learners, numberOfHours);
+ timeWorked += numberOfHours / students.personList.size();
+ }
+
+ public double getTimeWorked() {
+ return timeWorked;
+ }
+}
diff --git a/src/main/java/io/zipcoder/interfaces/Instructor.java b/src/main/java/io/zipcoder/interfaces/Instructor.java
new file mode 100644
index 00000000..45b1db33
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Instructor.java
@@ -0,0 +1,24 @@
+package io.zipcoder.interfaces;
+
+public class Instructor extends Person implements Teacher{
+
+ Learner[] learners;
+ double numberOfHoursPerLearner;
+
+ 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) {
+ numberOfHoursPerLearner = numberOfHours / learners.length;
+ for(Learner element : learners) {
+ element.learn(numberOfHoursPerLearner);
+ }
+ }
+}
diff --git a/src/main/java/io/zipcoder/interfaces/Instructors.java b/src/main/java/io/zipcoder/interfaces/Instructors.java
new file mode 100644
index 00000000..947685cb
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Instructors.java
@@ -0,0 +1,20 @@
+package io.zipcoder.interfaces;
+
+public class Instructors extends People {
+
+ private static final Instructors INSTANCE = new Instructors();
+
+ private Instructors() {
+ this.add(new Instructor(1L, "Leon"));
+ this.add(new Instructor(2L, "Dolio"));
+ this.add(new Instructor(3L, "Dan"));
+ this.add(new Instructor(4L, "Kris"));
+ }
+
+ public static Instructors getInstance() { return INSTANCE; }
+
+ @Override
+ public Instructor[] getArray() {
+ return super.personList.toArray(new Instructor[0]);
+ }
+}
diff --git a/src/main/java/io/zipcoder/interfaces/Learner.java b/src/main/java/io/zipcoder/interfaces/Learner.java
new file mode 100644
index 00000000..3cce0328
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Learner.java
@@ -0,0 +1,9 @@
+package io.zipcoder.interfaces;
+
+public interface Learner {
+
+ void learn(double numberOfHours);
+
+ Double getTotalStudyTime();
+
+}
diff --git a/src/main/java/io/zipcoder/interfaces/People.java b/src/main/java/io/zipcoder/interfaces/People.java
new file mode 100644
index 00000000..26201ecd
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/People.java
@@ -0,0 +1,53 @@
+package io.zipcoder.interfaces;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public abstract class People implements Iterable{
+
+ List personList = new ArrayList<>();
+
+ public void add(E person) {
+ personList.add(person);
+ }
+
+ public E findByID(Long id) {
+ for (E person : personList)
+ if (person.getId() == (id))
+ return person;
+ return null;
+ }
+
+ public boolean contains(E person) {
+ if(personList.contains(person))
+ return true;
+ return false;
+ }
+
+ public void remove(E person) {
+ if(contains(person)) {
+ personList.remove(person);
+ }
+ }
+
+ public void removeById(Long id) {
+ E person = findByID(id);
+ remove(person);
+ }
+
+ public void removeAll() {
+ personList.clear();
+ }
+
+ public Integer count() {
+ return personList.size();
+ }
+
+ public abstract E[] getArray();
+
+ public Iterator iterator() {
+ return personList.iterator();
+ }
+
+}
diff --git a/src/main/java/io/zipcoder/interfaces/Person.java b/src/main/java/io/zipcoder/interfaces/Person.java
index fc6a3ffe..f19516df 100644
--- a/src/main/java/io/zipcoder/interfaces/Person.java
+++ b/src/main/java/io/zipcoder/interfaces/Person.java
@@ -2,4 +2,25 @@
public class Person {
+ private final long id;
+ private 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/io/zipcoder/interfaces/Student.java b/src/main/java/io/zipcoder/interfaces/Student.java
new file mode 100644
index 00000000..26f7cf9d
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Student.java
@@ -0,0 +1,21 @@
+package io.zipcoder.interfaces;
+
+public class Student extends Person implements Learner{
+
+ private double totalStudyTime = 0.0;
+
+ public Student(long id, String name) {
+ super(id, name);
+ }
+
+ @Override
+ public void learn(double numberOfHours) {
+
+ totalStudyTime = getTotalStudyTime() + numberOfHours;
+ }
+
+ @Override
+ public Double getTotalStudyTime() {
+ return totalStudyTime;
+ }
+}
diff --git a/src/main/java/io/zipcoder/interfaces/Students.java b/src/main/java/io/zipcoder/interfaces/Students.java
new file mode 100644
index 00000000..c6e0c2bd
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Students.java
@@ -0,0 +1,20 @@
+package io.zipcoder.interfaces;
+
+public class Students extends People{
+
+ private static final Students INSTANCE = new Students();
+
+ private Students() {
+ this.add(new Student(1L, "Jen"));
+ this.add(new Student(2L, "Dee"));
+ this.add(new Student(3L, "Zach"));
+ this.add(new Student(5L, "Nick"));
+ }
+
+ public static Students getInstance() { return INSTANCE; }
+
+ @Override
+ public Student[] getArray() {
+ return super.personList.toArray(new Student[0]);
+ }
+}
diff --git a/src/main/java/io/zipcoder/interfaces/Teacher.java b/src/main/java/io/zipcoder/interfaces/Teacher.java
new file mode 100644
index 00000000..fad489d6
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Teacher.java
@@ -0,0 +1,9 @@
+package io.zipcoder.interfaces;
+
+public interface Teacher {
+
+ void teach(Learner learner, double numberOfHours);
+
+ void lecture(Learner[] learners, double numberOfHours);
+
+}
diff --git a/src/main/java/io/zipcoder/interfaces/ZipCodeWilmington.java b/src/main/java/io/zipcoder/interfaces/ZipCodeWilmington.java
new file mode 100644
index 00000000..c5048569
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/ZipCodeWilmington.java
@@ -0,0 +1,30 @@
+package io.zipcoder.interfaces;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ZipCodeWilmington{
+
+ INSTANCE;
+ Students classroom = Students.getInstance();
+ Instructors instructors = Instructors.getInstance();
+
+ public void hostLecture(Teacher teacher, double numberOfHours) {
+ teacher.lecture(classroom.getArray(), numberOfHours);
+ }
+
+ public void hostLecture(long id, double numberOfHours) {
+ Teacher teacher = instructors.findByID(id);
+ hostLecture(teacher, numberOfHours);
+ }
+
+ public Map getStudyMap() {
+ Map studyMap = new HashMap<>();
+ for(Student student : classroom) {
+ studyMap.put(student, student.getTotalStudyTime());
+ }
+ return studyMap;
+ }
+
+
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestEducator.java b/src/test/java/io/zipcoder/interfaces/TestEducator.java
new file mode 100644
index 00000000..dd859629
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestEducator.java
@@ -0,0 +1,58 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestEducator {
+
+ @Test
+ public void testImplementation() {
+ Educator educator = Educator.LEON;
+ Assert.assertTrue(educator instanceof Teacher);
+ }
+
+ @Test
+ public void testTeach() {
+ //given
+ Educator educator = Educator.LEON;
+ double numberOfHours = 6.0;
+ Learner learner = new Student(0, "Stephen");
+ //when
+ educator.teach(learner, numberOfHours);
+ double actualLearnerHours = learner.getTotalStudyTime();
+ double actualTimeWorked = educator.getTimeWorked();
+ //then
+ Assert.assertEquals(numberOfHours, actualLearnerHours, 0.0);
+ Assert.assertEquals(numberOfHours, actualTimeWorked, 0.0);
+ }
+
+ @Test
+ public void testLecture() {
+ //given
+ Educator educator = Educator.LEON;
+ Students students = Students.getInstance();
+ double numberOfHours = 20.0;
+ double expected = 5.0;
+ //when
+ educator.lecture(students.getArray(), numberOfHours);
+ double actualStudentHoursLearned = students.findByID(1L).getTotalStudyTime();
+ double actualTimeWorked = educator.getTimeWorked();
+ //then
+ Assert.assertEquals(expected, actualStudentHoursLearned, 0.001);
+ Assert.assertEquals(expected, actualTimeWorked, 0.001);
+ }
+
+ @Test
+ public void testGetHoursWorked() {
+ //given
+ Educator educator = Educator.DOLIO;
+ double expected = 5.0;
+ Students students = Students.getInstance();
+ //when
+ educator.teach(students.findByID(1L), expected);
+ double actual = educator.getTimeWorked();
+ //then
+ Assert.assertEquals(expected, actual, 0.01);
+ }
+
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestInstructor.java b/src/test/java/io/zipcoder/interfaces/TestInstructor.java
new file mode 100644
index 00000000..d0b803b1
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestInstructor.java
@@ -0,0 +1,54 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestInstructor {
+
+ @Test
+ public void testImplementation() {
+ Instructor instructor = new Instructor(0, "Kyle");
+ Assert.assertTrue(instructor instanceof Teacher);
+ }
+
+ @Test
+ public void testInheritance() {
+ Instructor instructor = new Instructor(0, "Liz");
+ Assert.assertTrue(instructor instanceof Person);
+ }
+
+ @Test
+ public void testTeach() {
+ //given
+ double expected = 8.0;
+ Instructor instructor = new Instructor(0, "Leon");
+ Learner learner = new Student(0, "Stephen");
+ //when
+ instructor.teach(learner, 8.0);
+ double actual = learner.getTotalStudyTime();
+ //then
+ Assert.assertEquals(expected, actual, 0.001);
+ }
+
+ @Test
+ public void testLecture() {
+ //given
+ double expected1 = 5.0;
+ double expected2 = 5.0;
+ double expected3 = 5.0;
+ Learner learner1 = new Student(0, "Sabrina");
+ Learner learner2 = new Student(1, "Nicolette");
+ Learner learner3 = new Student(2, "Jason");
+ //when
+ Instructor instructor = new Instructor(0, "Ted");
+ Learner[] learners = new Learner[]{learner1, learner2, learner3};
+ instructor.lecture(learners, 15);
+ double actual1 = learner1.getTotalStudyTime();
+ double actual2 = learner2.getTotalStudyTime();
+ double actual3 = learner3.getTotalStudyTime();
+ //then
+ Assert.assertEquals(expected1, actual1, 0.001);
+ Assert.assertEquals(expected2, actual2, 0.001);
+ Assert.assertEquals(expected3, actual3, 0.001);
+ }
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestInstructors.java b/src/test/java/io/zipcoder/interfaces/TestInstructors.java
new file mode 100644
index 00000000..cabda83a
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestInstructors.java
@@ -0,0 +1,18 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestInstructors {
+
+ @Test
+ public void testInstance() {
+ //given
+ int expected = 4;
+ Instructors instance = Instructors.getInstance();
+ //when
+ int actual = instance.personList.size();
+ //then
+ Assert.assertEquals(expected, actual);
+ }
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestPeople.java b/src/test/java/io/zipcoder/interfaces/TestPeople.java
new file mode 100644
index 00000000..d90f346f
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestPeople.java
@@ -0,0 +1,41 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestPeople {
+
+ People people = Students.getInstance();
+
+ @Test
+ public void testAdd() {
+ //given
+ Person person = new Person(0L, "Bo");
+ //when
+ people.add(person);
+ //then
+ Assert.assertTrue(people.contains(person));
+ }
+
+ @Test
+ public void testRemove() {
+ //given
+ Person person = new Person(0L, "Bo");
+ //when
+ people.add(person);
+ people.remove(person);
+ //then
+ Assert.assertFalse(people.contains(person));
+ }
+
+ @Test
+ public void testFindById() {
+ //given
+ Person person = new Person(6L, "Stewart");
+ //when
+ people.add(person);
+ Person actual = people.findByID(6L);
+ //then
+ Assert.assertEquals(person, actual);
+ }
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestPerson.java b/src/test/java/io/zipcoder/interfaces/TestPerson.java
index d64cd2f0..706eaff9 100644
--- a/src/test/java/io/zipcoder/interfaces/TestPerson.java
+++ b/src/test/java/io/zipcoder/interfaces/TestPerson.java
@@ -1,5 +1,33 @@
package io.zipcoder.interfaces;
+import org.junit.Assert;
+import org.junit.Test;
+
public class TestPerson {
+ @Test
+ public void testConstructor() {
+ //given
+ long expectedId = 0;
+ String expectedName = "Tyler";
+ //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 = "Stephen";
+ //when
+ Person person = new Person(0, expectedName);
+ String actualName = person.getName();
+ //then
+ Assert.assertEquals(expectedName, actualName);
+ }
+
}
diff --git a/src/test/java/io/zipcoder/interfaces/TestStudent.java b/src/test/java/io/zipcoder/interfaces/TestStudent.java
new file mode 100644
index 00000000..79c44437
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestStudent.java
@@ -0,0 +1,34 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+public class TestStudent {
+
+ @Test
+ public void testInstanceOfLearner() {
+ Student student = new Student(0, "Jackson");
+ assertTrue(student instanceof Learner);
+ }
+
+ @Test
+ public void testInstanceOfPerson() {
+ Student student = new Student(0, "Ryland");
+ assertTrue(student instanceof Person);
+ }
+
+ @Test
+ public void testLearn() {
+ //given
+ double expected = 3.5;
+ Student student = new Student(0, "Candace");
+ //when
+ student.learn(3.5);
+ double actual = student.getTotalStudyTime();
+ //then
+ Assert.assertEquals(expected, actual, 0.001);
+
+ }
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestStudents.java b/src/test/java/io/zipcoder/interfaces/TestStudents.java
new file mode 100644
index 00000000..9fe3b94e
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestStudents.java
@@ -0,0 +1,18 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestStudents {
+
+ @Test
+ public void testInstance() {
+ //given
+ int expected = 4;
+ Students instance = Students.getInstance();
+ //when
+ int actual = instance.personList.size();
+ //then
+ Assert.assertEquals(expected, actual);
+ }
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestZipCodeWilmington.java b/src/test/java/io/zipcoder/interfaces/TestZipCodeWilmington.java
new file mode 100644
index 00000000..f848556e
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestZipCodeWilmington.java
@@ -0,0 +1,35 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestZipCodeWilmington {
+
+ @Test
+ public void testHostLecture() {
+ //given
+ long id = 1L;
+ double numberOfHours = 20.0;
+ Double expected = 5.0;
+ Students students = Students.getInstance();
+ //when
+ ZipCodeWilmington.INSTANCE.hostLecture(id, numberOfHours);
+ Double actual = ZipCodeWilmington.INSTANCE.getStudyMap().get(students.findByID(1L));
+ //then
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testHostLectureUsingEducator() {
+ //given
+ Educator educator = Educator.DAN;
+ double numberOfHours = 20.0;
+ Double expected = 5.0;
+ Students students = Students.getInstance();
+ //when
+ ZipCodeWilmington.INSTANCE.hostLecture(educator, numberOfHours);
+ Double actual = ZipCodeWilmington.INSTANCE.getStudyMap().get(students.findByID(1L));
+ //then
+ Assert.assertEquals(expected, actual);
+ }
+}