001package edu.pdx.cs.joy.family;
002
003import org.junit.jupiter.api.Assertions;
004
005import java.util.Calendar;
006import java.util.Date;
007import java.util.Iterator;
008
009import static org.junit.jupiter.api.Assertions.*;
010
011/**
012 * This is the abstract superclass of classes that test family tree
013 * classes.  It contains a number of helper methods.
014 */
015public abstract class FamilyTestCase {
016
017
018  /**
019   * Asserts that two <code>Person</code>s have the same contents
020   */
021  void assertEquals(Person p1, Person p2) {
022    if (p1 == null) {
023      assertNull(p2);
024      return;
025
026    } else if (p2 == null) {
027      assertNull(p1);
028      return;
029    }
030
031    assertNotNull(p1);
032    assertNotNull(p2);
033
034    Assertions.assertEquals(p1.getId(), p2.getId());
035    Assertions.assertEquals(p1.getGender(), p2.getGender());
036    Assertions.assertEquals(p1.getFirstName(), p2.getFirstName());
037    Assertions.assertEquals(p1.getMiddleName(), p2.getMiddleName());
038    Assertions.assertEquals(p1.getLastName(), p2.getLastName());
039    assertEquals(p1.getMother(), p2.getMother());
040    assertEquals(p1.getFather(), p2.getFather());
041    assertEquals(p1.getDateOfBirth(), p2.getDateOfBirth());
042    assertEquals(p1.getDateOfDeath(), p2.getDateOfDeath());
043
044    Assertions.assertEquals(p1.getMarriages().size(), p2.getMarriages().size());
045
046    Iterator<Marriage> iter1 = p1.getMarriages().iterator();
047    Iterator<Marriage> iter2 = p2.getMarriages().iterator();
048    while (iter1.hasNext() && iter2.hasNext()) {
049      assertEquals( iter1.next(), iter2.next() );
050    }
051
052  }
053
054  /**
055   * Asserts that two <code>Date</code> represent the same day
056   * (ignores times)
057   */
058  void assertEquals(Date d1, Date d2) {
059    if (d1 == null) {
060      assertNull(d2);
061      return;
062
063    } else if (d2 == null) {
064      assertNull(d1);
065      return;
066    }
067
068    Calendar c1 = Calendar.getInstance();
069    c1.setTime(d1);
070    Calendar c2 = Calendar.getInstance();
071    c2.setTime(d2);
072
073    Assertions.assertEquals(c1.get(Calendar.DAY_OF_YEAR),
074                 c2.get(Calendar.DAY_OF_YEAR));
075    Assertions.assertEquals(c1.get(Calendar.YEAR), c2.get(Calendar.YEAR));
076  }
077
078  /**
079   * Asserts that two <code>Marriage</code>s are the same
080   */
081  void assertEquals(Marriage m1, Marriage m2) {
082    if (m1 == null) {
083      assertNotNull(m2);
084      return;
085
086    } else if (m2 == null) {
087      assertNull(m1);
088      return;
089    }
090
091    // To avoid infinite recursion, we compare people using their ids
092    Assertions.assertEquals(m1.getHusband().getId(), m2.getHusband().getId());
093    Assertions.assertEquals(m1.getWife().getId(), m2.getWife().getId());
094    assertEquals(m1.getDate(), m2.getDate());
095    Assertions.assertEquals(m1.getLocation(), m2.getLocation());
096  }
097
098  /**
099   * Asserts that two <code>FamilyTree</code>s has the same contents
100   */
101  void assertEquals(FamilyTree tree1, FamilyTree tree2) {
102    Assertions.assertEquals(tree1.getPeople().size(), tree2.getPeople().size());
103
104      for ( Person person : tree1.getPeople() )
105      {
106          Person p2 = tree2.getPerson( person.getId() );
107          assertNotNull( p2 );
108          assertEquals( person, p2 );
109      }
110  }
111
112  /**
113   * Asserts that one String contains another
114   */
115  void assertContains(String container, String containee) {
116    assertTrue(container.indexOf(containee) != -1);
117  }
118
119  /**
120   * Asserts that one String contains another
121   */
122  void assertContains(String message, String container,
123                      String containee) {
124    assertTrue(container.indexOf(containee) != -1, message);
125  }
126
127}