TestType.java

package org.matsim.episim.model.testing;


import org.matsim.episim.EpisimPerson;

/**
 * Type of tests that can be configured individually.
 */
public enum TestType {

	/**
	 * A rapid test.
	 */
	RAPID_TEST,

	/**
	 * Test based on polymerase chain reaction.
	 */
	PCR;


	/**
	 * Whether the test can detect a positive result correctly.
	 */
	public boolean canDetectPositive(EpisimPerson person, int day) {

		EpisimPerson.DiseaseStatus status = person.getDiseaseStatus();

		if (this == RAPID_TEST) {
			return (status == EpisimPerson.DiseaseStatus.contagious && person.daysSince(EpisimPerson.DiseaseStatus.contagious, day) >= 2) || status == EpisimPerson.DiseaseStatus.showingSymptoms;
		} else if (this == PCR) {
			return status == EpisimPerson.DiseaseStatus.contagious || status == EpisimPerson.DiseaseStatus.showingSymptoms ||
					(status == EpisimPerson.DiseaseStatus.infectedButNotContagious && person.daysSince(EpisimPerson.DiseaseStatus.infectedButNotContagious, day) >= 2);
		}

		throw new IllegalStateException("No testing procedure implemented.");
	}

	/**
	 * Whether the test should normally detect a negative result.
	 */
	public boolean shouldDetectNegative(EpisimPerson person, int day) {

		EpisimPerson.DiseaseStatus status = person.getDiseaseStatus();

		if (this == RAPID_TEST) {
			return (status == EpisimPerson.DiseaseStatus.contagious && person.daysSince(EpisimPerson.DiseaseStatus.contagious, day) < 1)  || status == EpisimPerson.DiseaseStatus.infectedButNotContagious
					|| status == EpisimPerson.DiseaseStatus.susceptible || status == EpisimPerson.DiseaseStatus.recovered;

		} else if (this == PCR) {
			return status == EpisimPerson.DiseaseStatus.susceptible || status == EpisimPerson.DiseaseStatus.recovered ||
					(status == EpisimPerson.DiseaseStatus.infectedButNotContagious && person.daysSince(EpisimPerson.DiseaseStatus.infectedButNotContagious, day) < 2);
		}

		throw new IllegalStateException("No testing procedure implemented.");
	}


}