package org.gedcomx.rt;
import org.gedcomx.Gedcomx;
import org.gedcomx.agent.Agent;
import org.gedcomx.common.Note;
import org.gedcomx.common.URI;
import org.gedcomx.conclusion.*;
import org.gedcomx.source.SourceCitation;
import org.gedcomx.source.SourceDescription;
import org.gedcomx.source.SourceReference;
import org.testng.annotations.Test;
import java.util.ArrayList;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
public class GedcomxModelVisitorBaseTest {
@Test (expectedExceptions = NullPointerException.class)
public void testNullVisitor() throws Exception {
Gedcomx gedcomxDocument = new Gedcomx();
gedcomxDocument.accept(null);
}
@Test
public void testVisitGedcomx() throws Exception {
GedcomxModelVisitorBase visitor = new GedcomxModelVisitorBase();
assertNotNull(visitor.getContextStack());
assertEquals(visitor.getContextStack().size(), 0);
Gedcomx gedcomxDocument = new Gedcomx();
// visit empty document
gedcomxDocument.accept(visitor);
// re-visit document that now has empty lists (except for extension elements)
gedcomxDocument.setAgents(new ArrayList<Agent>());
gedcomxDocument.setDocuments(new ArrayList<Document>());
gedcomxDocument.setEvents(new ArrayList<Event>());
gedcomxDocument.setPersons(new ArrayList<Person>());
gedcomxDocument.setPlaces(new ArrayList<PlaceDescription>());
gedcomxDocument.setRelationships(new ArrayList<Relationship>());
gedcomxDocument.setSourceDescriptions(new ArrayList<SourceDescription>());
gedcomxDocument.addLink("junkRel", URI.create("urn:junkUri"));
gedcomxDocument.addExtensionElement("junkExtensionElement");
gedcomxDocument.accept(visitor);
// re-visit document that now has lists with null elements
gedcomxDocument.getAgents().add(null);
gedcomxDocument.getDocuments().add(null);
gedcomxDocument.getEvents().add(null);
gedcomxDocument.getPersons().add(null);
gedcomxDocument.getPlaces().add(null);
gedcomxDocument.getRelationships().add(null);
gedcomxDocument.getSourceDescriptions().add(null);
gedcomxDocument.accept(visitor);
// clear lists
gedcomxDocument.getAgents().clear();
gedcomxDocument.getDocuments().clear();
gedcomxDocument.getEvents().clear();
gedcomxDocument.getPersons().clear();
gedcomxDocument.getPlaces().clear();
gedcomxDocument.getRelationships().clear();
gedcomxDocument.getSourceDescriptions().clear();
// re-visit document that now has single element lists -- the elements are newly constructed and otherwise uninitialized
gedcomxDocument.getAgents().add(new Agent());
gedcomxDocument.getDocuments().add(new Document());
gedcomxDocument.getEvents().add(new Event());
gedcomxDocument.getPersons().add(new Person());
gedcomxDocument.getPlaces().add(new PlaceDescription());
gedcomxDocument.getRelationships().add(new Relationship());
gedcomxDocument.getSourceDescriptions().add(new SourceDescription());
gedcomxDocument.accept(visitor);
ArrayList<SourceReference> sourceReferences;
ArrayList<Note> notes;
// re-visit document but add empty source and notes lists
sourceReferences = new ArrayList<SourceReference>();
notes = new ArrayList<Note>();
gedcomxDocument.getDocuments().get(0).setSources(sourceReferences);
gedcomxDocument.getDocuments().get(0).setNotes(notes);
gedcomxDocument.getEvents().get(0).setSources(sourceReferences);
gedcomxDocument.getEvents().get(0).setNotes(notes);
gedcomxDocument.getPersons().get(0).setSources(sourceReferences);
gedcomxDocument.getPersons().get(0).setNotes(notes);
gedcomxDocument.getPlaces().get(0).setSources(sourceReferences);
gedcomxDocument.getPlaces().get(0).setNotes(notes);
gedcomxDocument.getRelationships().get(0).setSources(sourceReferences);
gedcomxDocument.getRelationships().get(0).setNotes(notes);
gedcomxDocument.getSourceDescriptions().get(0).setSources(sourceReferences);
gedcomxDocument.getSourceDescriptions().get(0).setNotes(notes);
gedcomxDocument.accept(visitor);
// re-visit document but source and note lists now has single element
sourceReferences.add(new SourceReference());
notes.add(new Note());
gedcomxDocument.accept(visitor);
// re-visit document with event now initialized with a date, place reference, and empty roles list
gedcomxDocument.getEvents().get(0).setDate(new Date());
gedcomxDocument.getEvents().get(0).setPlace(new PlaceReference());
gedcomxDocument.getEvents().get(0).setRoles(new ArrayList<EventRole>());
gedcomxDocument.accept(visitor);
// re-visit document with event now initialized with a date, place reference, and single element roles list
gedcomxDocument.getEvents().get(0).getRoles().add(new EventRole());
gedcomxDocument.accept(visitor);
// re-visit document, but source description now has an empty citation list
gedcomxDocument.getSourceDescriptions().get(0).setCitations(new ArrayList<SourceCitation>());
gedcomxDocument.accept(visitor);
// re-visit document, but source description now has a single-element citation list
gedcomxDocument.getSourceDescriptions().get(0).getCitations().add(new SourceCitation());
gedcomxDocument.accept(visitor);
ArrayList<Fact> facts;
ArrayList<Name> names;
// re-visit document, but initialize person (names, gender, facts) and relationship (facts)
names = new ArrayList<Name>();
facts = new ArrayList<Fact>();
gedcomxDocument.getPersons().get(0).setNames(names);
gedcomxDocument.getPersons().get(0).setGender(new Gender());
gedcomxDocument.getPersons().get(0).setFacts(facts);
gedcomxDocument.getRelationships().get(0).setFacts(facts);
gedcomxDocument.accept(visitor);
// re-visit document, now name and fact lists are single element lists
names.add(new Name());
facts.add(new Fact());
gedcomxDocument.accept(visitor);
// re-visit document, now name has empty name form list; and fact element date and place reference
names.get(0).setNameForms(new ArrayList<NameForm>());
facts.get(0).setDate(new Date());
facts.get(0).setPlace(new PlaceReference());
gedcomxDocument.accept(visitor);
// re-visit document, now name has single-element name form list -- name form is uninitialized
names.get(0).getNameForms().add(new NameForm());
gedcomxDocument.accept(visitor);
// re-visit document, now name form element has empty name part list
names.get(0).getNameForms().get(0).setParts(new ArrayList<NamePart>());
gedcomxDocument.accept(visitor);
// re-visit document, now name form element has single-element name part list
names.get(0).getNameForms().get(0).getParts().add(new NamePart());
gedcomxDocument.accept(visitor);
assertNotNull(visitor.getContextStack());
assertEquals(visitor.getContextStack().size(), 0);
}
}