@@ -202,14 +202,18 @@ def must_support_extensions
202202 def missing_extensions ( resources = [ ] )
203203 @missing_extensions ||=
204204 must_support_extensions . select do |extension_definition |
205+ expected_url = normalized_extension_url ( extension_definition [ :url ] )
206+
205207 resources . none? do |resource |
206208 path = extension_definition [ :path ]
207209
208210 if path == 'extension'
209- resource . extension . any? { |extension | extension . url == extension_definition [ :url ] }
211+ Array . wrap ( resource . extension ) . any? do |extension |
212+ normalized_extension_url ( extension . url ) == expected_url
213+ end
210214 else
211215 extension = find_a_value_at ( resource , path ) do |el |
212- el . url == extension_definition [ :url ]
216+ normalized_extension_url ( el . url ) == expected_url
213217 end
214218
215219 extension . present?
@@ -240,8 +244,9 @@ def resource_populates_element?(resource, element_definition)
240244
241245 ms_extension_urls = must_support_extensions . select { |ex | ex [ :path ] == "#{ path } .extension" }
242246 . map { |ex | ex [ :url ] }
247+ include_dar = normalized_extension_urls ( ms_extension_urls ) . include? ( FHIRResourceNavigation ::DAR_EXTENSION_URL )
243248
244- value_found = find_a_value_at ( resource , path ) do |potential_value |
249+ value_found = find_a_value_at ( resource , path , include_dar : ) do |potential_value |
245250 matching_without_extensions? ( potential_value , ms_extension_urls , element_definition [ :fixed_value ] )
246251 end
247252
@@ -257,8 +262,11 @@ def process_must_support_element_in_extension(resource, path)
257262 extension_name = extension_split . first
258263 extension_path = extension_split . last
259264
260- found_extension_url = must_support_extensions . find { |ex | ex [ :id ] . include? ( extension_name ) } [ :url ]
261- ms_element_extension = resource . extension . find { |ex | ex . url == found_extension_url }
265+ found_extension_url =
266+ normalized_extension_url ( must_support_extensions . find { |ex | ex [ :id ] . include? ( extension_name ) } [ :url ] )
267+ ms_element_extension = resource . extension . find do |extension |
268+ normalized_extension_url ( extension . url ) == found_extension_url
269+ end
262270
263271 if ms_element_extension . present?
264272 resource = ms_element_extension
@@ -269,17 +277,33 @@ def process_must_support_element_in_extension(resource, path)
269277 end
270278
271279 def matching_without_extensions? ( value , ms_extension_urls , fixed_value )
272- if value . instance_of? ( Inferno ::DSL ::PrimitiveType )
273- urls = value . extension &.map ( &:url )
274- has_ms_extension = ( urls & ms_extension_urls ) . present?
275- value = value . value
276- end
280+ has_ms_extension = must_support_extension_present? ( value , ms_extension_urls )
281+
282+ value = value . value if value . instance_of? ( Inferno ::DSL ::PrimitiveType )
277283
278284 return false unless has_ms_extension || value_without_extensions? ( value )
279285
280286 matches_fixed_value? ( value , fixed_value )
281287 end
282288
289+ def must_support_extension_present? ( value , ms_extension_urls )
290+ return false unless value . respond_to? ( :extension )
291+
292+ ( extension_urls ( value ) & normalized_extension_urls ( ms_extension_urls ) ) . present?
293+ end
294+
295+ def extension_urls ( value )
296+ Array . wrap ( value . extension ) . map { |extension | normalized_extension_url ( extension . url ) }
297+ end
298+
299+ def normalized_extension_urls ( urls )
300+ Array . wrap ( urls ) . map { |url | normalized_extension_url ( url ) }
301+ end
302+
303+ def normalized_extension_url ( url )
304+ url &.split ( '|' ) &.first
305+ end
306+
283307 def matches_fixed_value? ( value , fixed_value )
284308 fixed_value . blank? || value == fixed_value
285309 end
0 commit comments