diff --git a/interfaces-1.iml b/interfaces-1.iml
new file mode 100644
index 00000000..0ddf51c1
--- /dev/null
+++ b/interfaces-1.iml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/io/zipcoder/interfaces/ConcretePeople.java b/src/main/java/io/zipcoder/interfaces/ConcretePeople.java
new file mode 100644
index 00000000..3b0bf7cf
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/ConcretePeople.java
@@ -0,0 +1,12 @@
+package io.zipcoder.interfaces;
+
+public class ConcretePeople extends People {
+
+ public Person[] toArray() {
+ Person[] personArray = new Person[this.count()];
+ for (int i = 0; i < this.count(); i++) {
+ personArray[i] = this.personList.get(i);
+ }
+ return personArray;
+ }
+}
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..cfe86d18
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Educator.java
@@ -0,0 +1,30 @@
+package io.zipcoder.interfaces;
+
+public enum Educator implements Teacher {
+ INSTRUCTOR0(Long.valueOf(1), "instructor0"), INSTRUCTOR1(Long.valueOf(2), "instructor1"), INSTRUCTOR2(Long.valueOf(3), "instructor2"), INSTRUCTOR3(Long.valueOf(4), "instructor3"), INSTRUCTOR4(Long.valueOf(5), "instructor4");
+
+ private Instructor instructor;
+ private Double timeWorked = 0.0;
+
+ Educator (Long id, String name) {
+ this.instructor = new Instructor(id, name);
+ }
+
+ public void teach(Learner learner, Double numberOfHours) {
+ timeWorked += numberOfHours;
+ learner.learn(numberOfHours);
+ }
+
+ public void lecture(Learner[] learners, Double numberOfHours) {
+ Double numberOfHoursPerLearner = numberOfHours / learners.length;
+ for (Learner learner : learners) {
+ teach(learner, numberOfHoursPerLearner);
+ }
+ }
+
+ public Double getTimeWorked() {
+ return timeWorked;
+ }
+
+
+}
\ No newline at end of file
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..6a2f3ab2
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Instructor.java
@@ -0,0 +1,19 @@
+package io.zipcoder.interfaces;
+
+public class Instructor extends Person implements Teacher {
+
+ public Instructor(Long id, String name) {
+ super(id, name);
+
+ }
+ public void teach(Learner learner, Double numberOfHours) {
+ learner.learn(numberOfHours);
+ }
+
+ public void lecture(Learner[] learners, Double numberOfHours) {
+ Double numberOfHoursPerLearner = numberOfHours / learners.length;
+ for (Learner learner: learners) {
+ learner.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..eb6a4db4
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Instructors.java
@@ -0,0 +1,26 @@
+package io.zipcoder.interfaces;
+
+public class Instructors extends People {
+ private static final Instructors INSTANCE;
+
+ private Instructors() {}
+
+ public static Instructors getInstance() {
+ if (INSTANCE == null) {
+ INSTANCE.add(new Instructor(Long.valueOf(3), "Wes"));
+ }
+ return INSTANCE;
+ }
+
+ static {
+ INSTANCE = new Instructors();
+ for (int i = 0; i < 5; i++) {
+ INSTANCE.add(new Instructor(Long.valueOf(i+1), "instructor"+i));
+ }
+
+ }
+
+ public Instructor[] toArray() {
+ return 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..b58b3882
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Learner.java
@@ -0,0 +1,8 @@
+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..7fd63d7c
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/People.java
@@ -0,0 +1,67 @@
+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) {
+ this.personList.add(person);
+ }
+
+ public E findById(Long id) {
+ E target = null;
+ for (E person: this.personList) {
+ if (person.getId().equals(id)) {
+ target = person;
+ break;
+ }
+ }
+ return target;
+ }
+
+ public Boolean contains(E person) {
+ Boolean exists = false;
+ for (E eachPerson: this.personList) {
+ if (eachPerson.getName().equals(person.getName())
+ && eachPerson.getId().equals(person.getId())) {
+ exists = true;
+ break;
+ }
+ }
+ return exists;
+ }
+
+ public void remove(E person) {
+ if (this.contains(person)) {
+ this.personList.remove(person);
+ }
+ }
+
+ public void remove(Long id) {
+ E personToRemove = this.findById(id);
+ this.remove(personToRemove);
+ }
+
+ public void removeAll() {
+ this.personList = new ArrayList();
+ }
+
+ public Integer count() {
+ return this.personList.size();
+ }
+
+ public abstract E[] toArray();
+// Person[] personArray = new Person[this.count()];
+// for (int i = 0; i < this.count(); i++) {
+// personArray[i] = this.personList.get(i);
+// }
+// return personArray;
+// }
+
+ 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..f8bee5a0 100644
--- a/src/main/java/io/zipcoder/interfaces/Person.java
+++ b/src/main/java/io/zipcoder/interfaces/Person.java
@@ -1,5 +1,24 @@
package io.zipcoder.interfaces;
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 this.id;
+ }
+
+ public String getName() {
+ return this.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..1ad373d9
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Student.java
@@ -0,0 +1,18 @@
+package io.zipcoder.interfaces;
+
+public class Student extends Person implements Learner {
+ private Double totalStudyTime;
+
+ public Student(Long id, String name) {
+ super(id, name);
+ this.totalStudyTime = 0.0;
+ }
+
+ public void learn(Double numberOfHours) {
+ this.totalStudyTime += numberOfHours;
+ }
+
+ public Double getTotalStudyTime() {
+ return this.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..035e3b72
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Students.java
@@ -0,0 +1,25 @@
+package io.zipcoder.interfaces;
+
+public class Students extends People {
+ private static final Students INSTANCE;
+
+ private Students() {}
+
+ static Students getInstance() {
+ if (INSTANCE == null) {
+ INSTANCE.add(new Student(3L, "Wes"));
+ }
+ return INSTANCE;
+ }
+
+ static {
+ INSTANCE = new Students();
+ for (long i = 0; i < 35; i++) {
+ INSTANCE.add(new Student(i+1L, "student"+i));
+ }
+ }
+
+ public Student[] toArray() {
+ return personList.toArray(new Student[0]);
+ }
+}
\ No newline at end of file
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..fe62cb8c
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/Teacher.java
@@ -0,0 +1,6 @@
+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..29fc84ce
--- /dev/null
+++ b/src/main/java/io/zipcoder/interfaces/ZipCodeWilmington.java
@@ -0,0 +1,38 @@
+package io.zipcoder.interfaces;
+
+import java.util.LinkedHashMap;
+
+public class ZipCodeWilmington {
+ private static final ZipCodeWilmington INSTANCE = new ZipCodeWilmington();
+
+ private static final Students students = Students.getInstance();
+ private static final Instructors instructors = Instructors.getInstance();
+
+ public static ZipCodeWilmington getInstance() {
+ return INSTANCE;
+ }
+
+ public static void hostLecture (Teacher teacher, Double numberOfHours) {
+ teacher.lecture(students.toArray(), numberOfHours);
+ }
+
+ public static void hostLecture (Long id, Double numberOfHours) {
+ Teacher teacher = instructors.findById(id);
+
+ teacher.lecture(students.toArray(), numberOfHours);
+ }
+
+ public static LinkedHashMap getStudyMap() {
+ LinkedHashMap map = new LinkedHashMap();
+ for (Student student: students) {
+ map.put(student, student.getTotalStudyTime());
+ }
+ return map;
+ }
+
+// static {
+// INSTANCE = new ZipCodeWilmington();
+// students = Students.getInstance();
+// instructors = Instructors.getInstance();
+// }
+}
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..c2144041
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestEducator.java
@@ -0,0 +1,39 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class TestEducator {
+
+ @Test
+ public void testTeach() {
+ Student stu = new Student(Long.valueOf(56), "Stu");
+ Educator.INSTRUCTOR1.teach(stu, 5000.0);
+ Assert.assertEquals(stu.getTotalStudyTime(), Educator.INSTRUCTOR1.getTimeWorked(), 2);
+ }
+
+ @Test
+ public void testLecture() {
+ Student stu1 = new Student(Long.valueOf(344), "Stu");
+ Student stu3 = new Student(Long.valueOf(5623), "Stu");
+ Student stu2 = new Student(Long.valueOf(56123), "Stu");
+ Student[] stus = {stu1, stu2, stu3};
+ Educator.INSTRUCTOR2.lecture(stus, 6000.0);
+ Double expected = 2000.0;
+ for (Student stu : stus) {
+ Double actual = stu.getTotalStudyTime();
+ Assert.assertEquals(expected, actual, 2);
+ }
+ }
+
+ @Test
+ public void testGetTimeWorked() {
+ Student stu = new Student(Long.valueOf(333), "Stu");
+ Educator.INSTRUCTOR0.teach(stu, 5000.0);
+ Double actual = Educator.INSTRUCTOR0.getTimeWorked();
+ Double expected = 5000.0;
+ Assert.assertEquals(expected, actual, 2);
+ }
+}
\ No newline at end of file
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..9a8c22bc
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestInstructor.java
@@ -0,0 +1,42 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestInstructor {
+ @Test
+ public void testImplementation() {
+ Instructor instructor = new Instructor(Long.valueOf(3), "github");
+ Assert.assertTrue(instructor instanceof Teacher);
+ }
+
+ @Test
+ public void testInheritance() {
+ Instructor instructor = new Instructor(Long.valueOf(3), "github");
+ Assert.assertTrue(instructor instanceof Person);
+ }
+
+ @Test
+ public void testTeach() {
+ Instructor instructor = new Instructor(Long.valueOf(3), "github");
+ Student student1 = new Student(Long.valueOf(5), "Wes");
+ instructor.teach(student1, 45.4);
+ Double actual = student1.getTotalStudyTime();
+ Double expected = 45.4;
+ Assert.assertEquals(expected, actual, 2);
+ }
+
+ @Test
+ public void testLecture() {
+ Instructor instructor = new Instructor(Long.valueOf(3), "github");
+ Student student1 = new Student(Long.valueOf(5), "Wes");
+ Student student2 = new Student(Long.valueOf(8), "Table");
+ Student student3 = new Student(Long.valueOf(33), "Book");
+ Student[] students = {student1, student2, student3};
+
+ instructor.lecture(students, 48.0);
+ for (Student student: students) {
+ Assert.assertEquals(student.getTotalStudyTime(), 16.0, 2);
+ }
+ }
+}
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..e99b068b
--- /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 testSingleton() {
+// People people = new People();
+// for (int i = 0; i < 5; i++) {
+// people.add(new Student(Long.valueOf(i+1), "name"+i));
+// }
+ Instructors instructors = Instructors.getInstance();
+ Integer expected = 5;
+ Integer actual = instructors.count();
+ 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..d5a3c156
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestPeople.java
@@ -0,0 +1,69 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestPeople {
+ People people;
+ Person person1, person2, person3;
+
+ @Before
+ public void setUp() {
+ people = new ConcretePeople();
+ person1 = new Person(3L, "rake");
+ person2 = new Person(2L, "ferb");
+ person3 = new Person(5L, "jimothy");
+ people.add(person1);
+ people.add(person2);
+ }
+
+ @Test
+ public void testAdd1() {
+ people.add(person3);
+ Assert.assertTrue(people.contains(person3));
+ }
+
+ @Test
+ public void testAdd2() {
+ Person person4 = new Person(6L, "lump");
+ people.add(person4);
+ Assert.assertTrue(people.contains(person4));
+ }
+
+ @Test
+ public void testRemove() {
+ Assert.assertTrue(people.contains(person2));
+ people.remove(person2);
+ Assert.assertFalse(people.contains(person2));
+ }
+
+ @Test
+ public void testRemoveById() {
+ Assert.assertTrue(people.contains(person2));
+ people.remove(Long.valueOf(2));
+ Assert.assertFalse(people.contains(person2));
+ }
+
+ @Test
+ public void testRemoveAll() {
+ Assert.assertTrue(people.contains(person2));
+ people.removeAll();
+ Integer actual = people.count();
+ Integer expected = 0;
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testFindById() {
+ Person actual = people.findById(3L);
+ Person expected = person1;
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testToArray() {
+ Person[] personArr = people.toArray();
+ Assert.assertEquals(2, personArr.length);
+ }
+}
diff --git a/src/test/java/io/zipcoder/interfaces/TestPerson.java b/src/test/java/io/zipcoder/interfaces/TestPerson.java
index d64cd2f0..4459707b 100644
--- a/src/test/java/io/zipcoder/interfaces/TestPerson.java
+++ b/src/test/java/io/zipcoder/interfaces/TestPerson.java
@@ -1,5 +1,26 @@
package io.zipcoder.interfaces;
+import org.junit.Assert;
+import org.junit.Test;
+
public class TestPerson {
+ @Test
+ public void testConstructor() {
+ Long expectedId = Long.valueOf(5);
+ String expectedName = "Wes";
+ Person person = new Person(expectedId, expectedName);
+ Long actualId = person.getId();
+ String actualName = person.getName();
+ Assert.assertEquals(expectedId, actualId);
+ Assert.assertEquals(expectedName, actualName);
+ }
+ @Test
+ public void testSetName() {
+ Long expectedId = Long.valueOf(5);
+ String expectedName = "Wes";
+ Person person = new Person(expectedId, expectedName);
+ person.setName("newname");
+ Assert.assertEquals("newname", person.getName());
+ }
}
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..636a8790
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestStudent.java
@@ -0,0 +1,27 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestStudent {
+ @Test
+ public void testImplementation() {
+ Student student = new Student(Long.valueOf(4), "Wes");
+ Assert.assertTrue(student instanceof Learner);
+ }
+
+ @Test
+ public void testInheritance() {
+ Student student = new Student(Long.valueOf(4), "Wes");
+ Assert.assertTrue(student instanceof Person);
+ }
+
+ @Test
+ public void testLearn() {
+ Student student = new Student(Long.valueOf(4), "Wes");
+ student.learn(80.5);
+ Double actual = student.getTotalStudyTime();
+ Double expected = 80.5;
+ Assert.assertEquals(expected, actual);
+ }
+}
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..52415979
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestStudents.java
@@ -0,0 +1,14 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestStudents {
+ @Test
+ public void testSingleton() {
+ Students students = Students.getInstance();
+ Integer expected = 35;
+ Integer actual = students.count();
+ 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..86d5cc24
--- /dev/null
+++ b/src/test/java/io/zipcoder/interfaces/TestZipCodeWilmington.java
@@ -0,0 +1,110 @@
+package io.zipcoder.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Map;
+
+public class TestZipCodeWilmington {
+ @Test
+ public void testSingleton() {
+ Instructors.getInstance().findById(Long.valueOf(1));
+ ZipCodeWilmington.hostLecture(Long.valueOf(1), 350.0);
+ Map map = ZipCodeWilmington.getStudyMap();
+ StringBuilder output = new StringBuilder();
+ for (Student student: map.keySet()) {
+ output.append(String.format("%s\t%s\n",student.getName(), map.get(student)));
+ }
+ String actual = output.toString();
+ String expected = "student0\t10.0\n" +
+ "student1\t10.0\n" +
+ "student2\t10.0\n" +
+ "student3\t10.0\n" +
+ "student4\t10.0\n" +
+ "student5\t10.0\n" +
+ "student6\t10.0\n" +
+ "student7\t10.0\n" +
+ "student8\t10.0\n" +
+ "student9\t10.0\n" +
+ "student10\t10.0\n" +
+ "student11\t10.0\n" +
+ "student12\t10.0\n" +
+ "student13\t10.0\n" +
+ "student14\t10.0\n" +
+ "student15\t10.0\n" +
+ "student16\t10.0\n" +
+ "student17\t10.0\n" +
+ "student18\t10.0\n" +
+ "student19\t10.0\n" +
+ "student20\t10.0\n" +
+ "student21\t10.0\n" +
+ "student22\t10.0\n" +
+ "student23\t10.0\n" +
+ "student24\t10.0\n" +
+ "student25\t10.0\n" +
+ "student26\t10.0\n" +
+ "student27\t10.0\n" +
+ "student28\t10.0\n" +
+ "student29\t10.0\n" +
+ "student30\t10.0\n" +
+ "student31\t10.0\n" +
+ "student32\t10.0\n" +
+ "student33\t10.0\n" +
+ "student34\t10.0\n";
+ Assert.assertEquals(expected, actual);
+ ZipCodeWilmington.hostLecture(Long.valueOf(1), -350.0);
+
+ }
+
+ @Test
+ public void testHostLecture() {
+ Instructor instructor = Instructors.getInstance().findById(Long.valueOf(1));
+
+ ZipCodeWilmington.hostLecture(instructor, 350.0);
+
+ Map map = ZipCodeWilmington.getStudyMap();
+
+ StringBuilder output = new StringBuilder();
+ for (Student student: map.keySet()) {
+ output.append(String.format("%s\t%s\n",student.getName(), map.get(student)));
+ }
+ String actual = output.toString();
+ String expected = "student0\t10.0\n" +
+ "student1\t10.0\n" +
+ "student2\t10.0\n" +
+ "student3\t10.0\n" +
+ "student4\t10.0\n" +
+ "student5\t10.0\n" +
+ "student6\t10.0\n" +
+ "student7\t10.0\n" +
+ "student8\t10.0\n" +
+ "student9\t10.0\n" +
+ "student10\t10.0\n" +
+ "student11\t10.0\n" +
+ "student12\t10.0\n" +
+ "student13\t10.0\n" +
+ "student14\t10.0\n" +
+ "student15\t10.0\n" +
+ "student16\t10.0\n" +
+ "student17\t10.0\n" +
+ "student18\t10.0\n" +
+ "student19\t10.0\n" +
+ "student20\t10.0\n" +
+ "student21\t10.0\n" +
+ "student22\t10.0\n" +
+ "student23\t10.0\n" +
+ "student24\t10.0\n" +
+ "student25\t10.0\n" +
+ "student26\t10.0\n" +
+ "student27\t10.0\n" +
+ "student28\t10.0\n" +
+ "student29\t10.0\n" +
+ "student30\t10.0\n" +
+ "student31\t10.0\n" +
+ "student32\t10.0\n" +
+ "student33\t10.0\n" +
+ "student34\t10.0\n";
+ Assert.assertEquals(expected, actual);
+
+ }
+}