program ESMF_InfoDescribeUTest
use ESMF_TestMod ! test methods
use ESMF_UtilTypesMod ! ESMF utility types
use ESMF
implicit none
!----------------------------------------------------------------------------
! The following line turns the CVS identifier string into a printable variable.
character(*), parameter :: version = '$Id$'
!----------------------------------------------------------------------------
! individual test failure message
character(ESMF_MAXSTR) :: failMsg
character(ESMF_MAXSTR) :: name
! cumulative result: count failures; no failures equals "all pass"
integer :: result = 0, count
integer :: rc, petCount, localPet, n
type(ESMF_VM) :: vm
type(ESMF_InfoDescribe) :: eidesc_create_destroy, eidesc_create_info, eidesc_create_info2, &
eidesc_create_background, eidesc_double_init, eidesc_mesh
logical :: isPresent
type(ESMF_Mesh) :: mesh
type(ESMF_Info) :: infoh, infoh2, infoFromGeom
character(:), allocatable :: actual, actualFromGeom
type(ESMF_Geom) :: geom
!----------------------------------------------------------------------------
call ESMF_TestStart(ESMF_SRCLINE, rc=rc) ! calls ESMF_Initialize() internally
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!----------------------------------------------------------------------------
call ESMF_VMGetCurrent(vm, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_VMGet(vm, petCount=petCount, localPet=localPet, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!----------------------------------------------------------------------------
!NEX_UTest
write(name, *) "No double initialization"
write(failMsg, *) "Did not throw error"
rc = ESMF_FAILURE
call eidesc_double_init%Initialize(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call eidesc_double_init%Initialize(rc=rc)
call ESMF_Test((rc/=ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
!----------------------------------------------------------------------------
!NEX_UTest
write(name, *) "Initialize/Destroy"
write(failMsg, *) "Did not sync successfully"
rc = ESMF_FAILURE
call eidesc_create_destroy%Initialize(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call eidesc_create_destroy%Destroy(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_Test((rc==ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
!----------------------------------------------------------------------------
!NEX_UTest
write(name, *) "Initialize behavior"
write(failMsg, *) "Did not behave"
rc = ESMF_FAILURE
call eidesc_create_info%Initialize(createInfo=.true., addBaseAddress=.true., rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_InfoSet(eidesc_create_info%info, "a", 1, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call eidesc_create_info2%Initialize(createInfo=.true., rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_InfoSet(eidesc_create_info2%info, "b", 2, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
isPresent = ESMF_InfoIsPresent(eidesc_create_info%info, "b", rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_Test(((isPresent .eqv. .false.) .and. &
(eidesc_create_info2%addBaseAddress .eqv. .false.)), &
name, failMsg, result, ESMF_SRCLINE)
call eidesc_create_info%Destroy(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call eidesc_create_info2%Destroy(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!----------------------------------------------------------------------------
!NEX_UTest
write(name, *) "Mesh is enabled"
write(failMsg, *) "Did not succeed"
rc = ESMF_FAILURE
call eidesc_mesh%Initialize(createInfo=.true., addBaseAddress=.true., rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
mesh = ESMF_MeshEmptyCreate(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_InfoGetFromHost(mesh, infoh, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_InfoSet(infoh, "special", "mesh attribute", rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call eidesc_mesh%Update(mesh, "", rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
infoh2 = eidesc_mesh%GetInfo(mesh, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_InfoGetCharAlloc(infoh2, "special", actual, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_Test((eidesc_mesh%curr_base_is_valid .and. actual=="mesh attribute"), &
name, failMsg, result, ESMF_SRCLINE)
! Don't destroy here because used in next test
! call eidesc_mesh%Destroy(rc=rc)
! if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!------------------------------------------------------------------------------
!----------------------------------------------------------------------------
!NEX_UTest
write(name, *) "Test getting info from ESMF_Geom"
write(failMsg, *) "Did not succeed"
rc = ESMF_FAILURE
! Create ESMF_Geom
geom=ESMF_GeomCreate(mesh, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
! Get info from geom
call ESMF_InfoGetFromHost(geom, infoFromGeom, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
! Get string from info to make sure it's the same as mesh above
call ESMF_InfoGetCharAlloc(infoFromGeom, "special", actualFromGeom, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
! Test that it looks like the above which was retrieved directly through the mesh
call ESMF_Test((actualFromGeom=="mesh attribute"), name, failMsg, result, ESMF_SRCLINE)
! Now destroy
call eidesc_mesh%Destroy(rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!------------------------------------------------------------------------------
call ESMF_TestEnd(ESMF_SRCLINE) ! calls ESMF_Finalize() internally
end program ESMF_InfoDescribeUTest