package ca.uhn.fhir.model.dstu2; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Date; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.SerializationUtils; import org.hl7.fhir.instance.model.api.IBaseResource; import org.junit.AfterClass; import org.junit.Test; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.model.dstu2.composite.AddressDt; import ca.uhn.fhir.model.dstu2.composite.HumanNameDt; import ca.uhn.fhir.model.dstu2.composite.IdentifierDt; import ca.uhn.fhir.model.dstu2.resource.Bundle; import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.valueset.AdministrativeGenderEnum; import ca.uhn.fhir.model.dstu2.valueset.IdentifierTypeCodesEnum; import ca.uhn.fhir.model.dstu2.valueset.MaritalStatusCodesEnum; import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.util.TestUtil; public class ModelSerializationDstu2Test { private static FhirContext ourCtx = FhirContext.forDstu2(); @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); } /** * Verify that MaritalStatusCodeEnum (and, by extension, BoundCodeableConcepts in general) are serializable. Author: Nick Peterson (nrpeterson@gmail.com) */ @Test public void testBoundCodeableConceptSerialization() { MaritalStatusCodesEnum maritalStatus = MaritalStatusCodesEnum.M; byte[] bytes = SerializationUtils.serialize(maritalStatus); assertTrue(bytes.length > 0); MaritalStatusCodesEnum deserialized = SerializationUtils.deserialize(bytes); assertEquals(maritalStatus.getCode(), deserialized.getCode()); assertEquals(maritalStatus.getSystem(), deserialized.getSystem()); } @Test public void testBoundCodeSerialization() { Patient p = new Patient(); p.setGender(AdministrativeGenderEnum.MALE); IdentifierDt identifier = p.addIdentifier(); identifier.setType(IdentifierTypeCodesEnum.DL); Patient out = testIsSerializable(p); /* * Make sure the binder still works for Code */ assertEquals(AdministrativeGenderEnum.MALE, out.getGenderElement().getValueAsEnum()); out.getGenderElement().setValue("female"); assertEquals(AdministrativeGenderEnum.FEMALE, out.getGenderElement().getValueAsEnum()); assertEquals(IdentifierTypeCodesEnum.DL, out.getIdentifier().get(0).getType().getValueAsEnum().iterator().next()); out.getIdentifier().get(0).getType().setValueAsEnum(IdentifierTypeCodesEnum.MR); assertEquals("MR", out.getIdentifier().get(0).getType().getCoding().get(0).getCode()); assertEquals("http://hl7.org/fhir/v2/0203", out.getIdentifier().get(0).getType().getCoding().get(0).getSystem()); } @SuppressWarnings("unchecked") private <T extends IBaseResource> T testIsSerializable(T theObject) { byte[] bytes = SerializationUtils.serialize(theObject); assertTrue(bytes.length > 0); IBaseResource obj = SerializationUtils.deserialize(bytes); assertTrue(obj != null); IParser p = ourCtx.newXmlParser().setPrettyPrint(true); assertEquals(p.encodeResourceToString(theObject), p.encodeResourceToString(obj)); return (T) obj; } @Test public void testSerialization() throws Exception { String input = IOUtils.toString(ModelSerializationDstu2Test.class.getResourceAsStream("/diagnosticreport-examples-lab-text(72ac8493-52ac-41bd-8d5d-7258c289b5ea).xml")); Bundle parsed = ourCtx.newXmlParser().parseResource(Bundle.class, input); testIsSerializable(parsed); } /** * Contributed by Travis from iSalus */ @Test public void testSerialization2() { Patient patient = new Patient().addName(new HumanNameDt().addGiven("George").addFamily("Washington")).addName(new HumanNameDt().addGiven("George2").addFamily("Washington2")) .addAddress(new AddressDt().addLine("line 1").addLine("line 2").setCity("city").setState("UT")) .addAddress(new AddressDt().addLine("line 1b").addLine("line 2b").setCity("cityb").setState("UT")).setBirthDate(new Date(), TemporalPrecisionEnum.DAY); testIsSerializable(patient); } }