From 1c339af3ab39c1571f3370266b4a5b21c9cafe55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=E2=89=A1ZRS?= <12814349+LZRS@users.noreply.github.com> Date: Wed, 23 Aug 2023 08:17:28 +0300 Subject: [PATCH 1/3] Add 'system' as part of unique Coding identifierString --- .../fhir/datacapture/extensions/MoreTypes.kt | 7 ++++++- .../factories/AutoCompleteViewHolderFactoryTest.kt | 13 +++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt index 116d72135c..5c4e60681c 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt @@ -67,7 +67,12 @@ fun Type.getValueAsString(context: Context): String = * may have similar display strings */ fun Type.identifierString(context: Context): String = - id ?: (this as? Coding)?.code ?: (this as? Reference)?.reference ?: displayString(context) + id + ?: (this as? Coding)?.let { + arrayOf("${it.system.orEmpty()}${it.version.orEmpty()}", it.code.orEmpty()) + .joinToString(if (it.hasSystem() && it.hasCode()) "|" else "") + } + ?: (this as? Reference)?.reference ?: displayString(context) private fun getDisplayString(type: Type, context: Context): String? = when (type) { diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/AutoCompleteViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/AutoCompleteViewHolderFactoryTest.kt index 1c9c7a527c..90e13feae4 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/AutoCompleteViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/AutoCompleteViewHolderFactoryTest.kt @@ -160,7 +160,13 @@ class AutoCompleteViewHolderFactoryTest { Coding().setCode("test1-code").setDisplay("Test Code").setId("test1-code") as Coding ), Questionnaire.QuestionnaireItemAnswerOptionComponent() - .setValue(Coding().setCode("test2-code").setDisplay("Test Code") as Coding) + .setValue( + Coding() + .setSystem("http://answers/test-codes") + .setVersion("1.0") + .setCode("test2-code") + .setDisplay("Test Code") as Coding + ) ) val fakeAnswerValueSetResolver = { uri: String -> @@ -189,7 +195,10 @@ class AutoCompleteViewHolderFactoryTest { QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { value = answers - .first { it.value.identifierString(parent.context) == "test2-code" } + .first { + it.value.identifierString(parent.context) == + "http://answers/test-codes1.0|test2-code" + } .valueCoding } ) From 0602ab3189a4c97b7a419c74710a3af76155d890 Mon Sep 17 00:00:00 2001 From: LZRS <12814349+LZRS@users.noreply.github.com> Date: Wed, 30 Aug 2023 23:43:26 +0300 Subject: [PATCH 2/3] Add identifierString tests to MoreTypesTest --- .../fhir/datacapture/extensions/MoreTypes.kt | 12 +++++---- .../datacapture/extensions/MoreTypesTest.kt | 25 ++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt index 5c4e60681c..6fd047b604 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt @@ -62,17 +62,19 @@ fun Type.displayString(context: Context): String = fun Type.getValueAsString(context: Context): String = getValueString(this) ?: context.getString(R.string.not_answered) -/* +/** * Returns the unique identifier of a [Type]. Used to differentiate between item answer options that * may have similar display strings */ fun Type.identifierString(context: Context): String = id - ?: (this as? Coding)?.let { - arrayOf("${it.system.orEmpty()}${it.version.orEmpty()}", it.code.orEmpty()) - .joinToString(if (it.hasSystem() && it.hasCode()) "|" else "") + ?: when (this) { + is Coding -> + arrayOf("${this.system.orEmpty()}${this.version.orEmpty()}", this.code.orEmpty()) + .joinToString(if (this.hasSystem() && this.hasCode()) "|" else "") + is Reference -> this.reference ?: displayString(context) + else -> displayString(context) } - ?: (this as? Reference)?.reference ?: displayString(context) private fun getDisplayString(type: Type, context: Context): String? = when (type) { diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt index ad0b11f2c3..b1a5bc9a31 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 Google LLC + * Copyright 2022-2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,9 @@ package com.google.android.fhir.datacapture.extensions +import android.app.Application import android.os.Build +import androidx.test.core.app.ApplicationProvider import ca.uhn.fhir.model.api.TemporalPrecisionEnum import com.google.common.truth.Truth.assertThat import java.time.Instant @@ -41,6 +43,7 @@ import org.hl7.fhir.r4.model.MarkdownType import org.hl7.fhir.r4.model.OidType import org.hl7.fhir.r4.model.PositiveIntType import org.hl7.fhir.r4.model.Quantity +import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.StringType import org.hl7.fhir.r4.model.TimeType import org.hl7.fhir.r4.model.Type @@ -57,6 +60,8 @@ import org.robolectric.annotation.Config @Config(sdk = [Build.VERSION_CODES.P]) class MoreTypesTest { + private val context = ApplicationProvider.getApplicationContext() + @Test fun instant_shouldReturnExpectedStringValue() { val value = @@ -199,6 +204,24 @@ class MoreTypesTest { assertThat(code.equalsDeep(CodeType("fakeCode"))).isTrue() } + @Test + fun `Coding should return identifierString containing system, version and code`() { + val coding = Coding("fakeSystem", "fakeCode", "fakeDisplay").apply { version = "2.0" } + assertThat(coding.identifierString(context)).isEqualTo("fakeSystem2.0|fakeCode") + } + + @Test + fun `Coding without system should return identifierString containing code`() { + val coding = Coding().apply { code = "fakeCode" } + assertThat(coding.identifierString(context)).isEqualTo("fakeCode") + } + + @Test + fun `Reference should return reference`() { + val reference = Reference().apply { reference = "fakeReference" } + assertThat(reference.identifierString(context)).isEqualTo("fakeReference") + } + @Test fun `should return calculated value for cqf expression`() { val today = LocalDate.now().toString() From f46b9e6345fbb03798a70f6b7fc34db186fbe0cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=E2=89=A1ZRS?= <12814349+LZRS@users.noreply.github.com> Date: Fri, 1 Sep 2023 11:12:25 +0300 Subject: [PATCH 3/3] Update MoreTypesTest with more identifierString tests --- .../fhir/datacapture/extensions/MoreTypes.kt | 2 +- .../datacapture/extensions/MoreTypesTest.kt | 44 +++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt index 6fd047b604..ef9d60bb65 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt @@ -71,7 +71,7 @@ fun Type.identifierString(context: Context): String = ?: when (this) { is Coding -> arrayOf("${this.system.orEmpty()}${this.version.orEmpty()}", this.code.orEmpty()) - .joinToString(if (this.hasSystem() && this.hasCode()) "|" else "") + .joinToString(if (this.hasSystem().or(this.hasVersion()) && this.hasCode()) "|" else "") is Reference -> this.reference ?: displayString(context) else -> displayString(context) } diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt index b1a5bc9a31..5ba118b134 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt @@ -205,19 +205,57 @@ class MoreTypesTest { } @Test - fun `Coding should return identifierString containing system, version and code`() { + fun `should return identifier string for coding containing system, version and code`() { val coding = Coding("fakeSystem", "fakeCode", "fakeDisplay").apply { version = "2.0" } assertThat(coding.identifierString(context)).isEqualTo("fakeSystem2.0|fakeCode") } @Test - fun `Coding without system should return identifierString containing code`() { + fun `should return identifier string for coding containing system and version`() { + val coding = + Coding().apply { + system = "fakeSystem" + version = "2.0" + } + assertThat(coding.identifierString(context)).isEqualTo("fakeSystem2.0") + } + + @Test + fun `should return identifier string for coding containing system and code`() { + val coding = Coding("fakeSystem", "fakeCode", "fakeDisplay") + assertThat(coding.identifierString(context)).isEqualTo("fakeSystem|fakeCode") + } + + @Test + fun `should return identifier string for coding containing only system`() { + val coding = Coding().apply { system = "fakeSystem" } + assertThat(coding.identifierString(context)).isEqualTo("fakeSystem") + } + + @Test + fun `should return identifier string for coding containing version and code`() { + val coding = + Coding().apply { + version = "2.0" + code = "fakeCode" + } + assertThat(coding.identifierString(context)).isEqualTo("2.0|fakeCode") + } + + @Test + fun `should return identifier string for coding containing only version`() { + val coding = Coding().apply { version = "2.0" } + assertThat(coding.identifierString(context)).isEqualTo("2.0") + } + + @Test + fun `should return identifier string for coding containing only code`() { val coding = Coding().apply { code = "fakeCode" } assertThat(coding.identifierString(context)).isEqualTo("fakeCode") } @Test - fun `Reference should return reference`() { + fun `should return identifier string for reference`() { val reference = Reference().apply { reference = "fakeReference" } assertThat(reference.identifierString(context)).isEqualTo("fakeReference") }