subroutine test_parent_outer_items_created(this)
class(MpiTestMethod), intent(inout) :: this
integer :: status
type(ESMF_GridComp) :: outer_gc
type(MultiState) :: states
type(ESMF_Field) :: f
call setup(outer_gc, states, status)
@assert_that(status, is(0))
@assert_that(check(states, 'import', field_name='I_A1(1)'), is(0))
@assert_that(check(states, 'export', field_name='child_A/E_A1'), is(0))
@assert_that(check(states, 'export', field_name='child_A/Z_A1'), is(0))
@assert_that(check(states, 'export', field_name='child_B/E_B1'), is(0))
@assert_that(check(states, 'export', field_name='child_B/Z_B1'), is(5))
contains
integer function check(states, state_intent, field_name) result(status)
type(MultiState), intent(inout) :: states
character(*), intent(in) :: state_intent
character(*), intent(in) :: field_name
type(ESMF_Field) :: f
type(ESMF_State) :: state, substate
type(ESMF_StateItem_Flag) :: itemtype
integer :: idx
status = 1
call states%get_state(state, state_intent, rc=status)
if (status /= 0) then
status = 2
return
end if
idx = scan(field_name, '/')
select case (idx)
case (1:)
call ESMF_StateGet(state, field_name(:idx-1), substate, rc=status)
if (status /= 0) then
status = 7
return
end if
case (0)
substate = state
end select
call ESMF_StateGet(substate, field_name(idx+1:), itemtype, rc=status)
if (status /= 0) then
status = 4
return
end if
if (itemtype == ESMF_STATEITEM_NOTFOUND) then
status = 5
return
end if
! This interface allows ESMF to dive down substate, but the checks above do not.
call ESMF_StateGet(state, field_name, f, rc=status)
if (status /= 0) then
status = 3
return
end if
status = 0
end function check
end subroutine test_parent_outer_items_created