teardown
subroutine test_suite_M_overload() use M_framework__verify, only : unit_check_start,unit_check,unit_check_done,unit_check_good,unit_check_bad,unit_check_msg use M_framework__verify, only : unit_check_level use M_framework__approx, only : almost !use M_compare_float_numbers, only : operator(.EqualTo.) implicit none character(len=:),allocatable :: cmd !! setup unit_check_level=5 if(command_argument_count().eq.0)then call test_boolean_equal() call test_boolean_notequal() call test_dble_s2v() call test_dbles_s2v() call test_int_s2v() call test_ints_s2v() call test_real_s2v() call test_reals_s2v() call test_sign() call test_oz() call test_zo() call test_ffmt() !$! call get_command(cmd,realloc=.true.) !$! cmd=cmd//' -x -y "hello there" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' !$! call execute_command_line(cmd) !$! else !$! call test_get_command() !$! call test_get_command_argument() endif !! teardown contains !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_ffmt() !use M_overload, only : operator(==) call unit_check_start('ffmt',' & & -description "convert intrinsic scalar value to a formatted string" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') ! add 0+ to avoid gfortran-11 bug !call unit_check( 'ffmt', 1234.fmt.'"[",i0,"]"' == '[1234]' ) !call unit_check( 'ffmt', '1234'.fmt.'"[",i0,"]"' == '[1234]' ) call unit_check_done('ffmt', msg='') end subroutine test_ffmt !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_oz() !use M_overload, only : operator(==) call unit_check_start('oz',' & & -description "convert logical expression to integer with 1 for TRUE" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') ! add 0+ to avoid gfortran-11 bug call unit_check('oz',oz(10 > 5).eq.1.and.oz( 10 < 5).eq.0) call unit_check('oz',all(oz([10 > 5, 10 < 5, 5 == 5, 5 < 5]) == [1,0,1,0]) , oz(10 > 5)+0,oz(10 < 5)+0,oz(5 == 5)+0,oz(5 < 5)+0 ) call unit_check_done('oz',msg='') end subroutine test_oz !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_zo() !use M_overload, only : operator(==) call unit_check_start('zo',' & & -description "convert logical expression to integer with 1 for TRUE" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') ! add 0+ to avoid gfortran-11 bug call unit_check('zo',zo(10 > 5).eq.0.and.zo( 10 < 5).eq.1) call unit_check('zo',all(zo([10 > 5, 10 < 5, 5 == 5, 5 < 5]) == [0,1,0,1]), zo(10 > 5)+0,zo(10 < 5)+0,zo(5 == 5)+0, zo(5 < 5)+0 ) call unit_check_done('zo',msg='') end subroutine test_zo !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_sign() !use M_overload, only : operator(==) call unit_check_start('sign',' & & -description "overload SIGN to take a single argument" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') ! add 0+ to avoid gfortran-11 bug call unit_check('sign',sign(10_int8).eq.1.and.sign(-10_int8).eq.-1,'sign(+-10_int8)',0+sign(10_int8),0+sign(-10_int8)) call unit_check('sign',sign(10_int16).eq.1.and.sign(-10_int16).eq.-1,'sign(+-10_int16)',0+sign(10_int16),0+sign(-10_int16)) call unit_check('sign',sign(10_int32).eq.1.and.sign(-10_int32).eq.-1,'sign(+-10_int32)',0+sign(10_int32),0+sign(-10_int32)) call unit_check('sign',sign(10_int64).eq.1.and.sign(-10_int64).eq.-1,'sign(+-10_int64)',0+sign(10_int64),0+sign(-10_int64)) call unit_check('sign',sign(10.0_real32).eq.1.and.sign(-10.0_real32).eq.-1,& & 'sign(+-10_real32)',0+sign(10.0_real32),0+sign(-10.0_real32)) call unit_check('sign',0+sign(10.0_real64).eq.1.and.sign(-10.0_real64).eq.-1,& & 'sign(+-10_real64)',0+sign(10.0_real64),0+sign(-10.0_real64)) call unit_check('sign',0+sign(10.0_real128).eq.1.and.0+sign(-10.0_real128).eq.-1,& & 'sign(+-10_real128)',0+sign(10.0_real128),0+sign(-10.0_real128)) call unit_check_done('sign',msg='') end subroutine test_sign !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_boolean_equal() !use M_overload, only : operator(==) call unit_check_start('boolean_equal',' & & -description "overload == to take LOGICAL arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') call unit_check('boolean_equal',.true. == .true. ,'== works like .eqv. for LOGICAL values') call unit_check_done('boolean_equal',msg='') end subroutine test_boolean_equal !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_boolean_notequal() !use M_overload, only : operator(/=) call unit_check_start('boolean_notequal',' & & -description "overload /= to take LOGICAL arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') call unit_check('boolean_notequal', (.true. /= .false. ),'/= works like .neqv. for LOGICAL values') call unit_check_done('boolean_notequal',msg='') end subroutine test_boolean_notequal !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_dble_s2v() !use M_overload, only : int, real, dble call unit_check_start('dble_s2v',' & & -description "overload dble() to take string arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') if(dble('0.3570726221234567').eq. 0.3570726221234567d0)then call unit_check_good('dble_s2v') ! string passed to dble ! elseif(dble('0.3570726221234567') .EqualTo. 0.3570726221234567d0 )then elseif(abs(dble('0.3570726221234567') - 0.3570726221234567d0 ).lt.2*epsilon(0.0d0))then call unit_check_good('dble_s2v') ! string passed to real but not exactly else call unit_check_bad('dble_s2v') ! returned value not equal to expected value endif end subroutine test_dble_s2v !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_dbles_s2v() doubleprecision,allocatable :: vals(:) call unit_check_start('dbles_s2v',' & & -description "overload dble() to take string arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') vals=dble(['10.0d0','20.0d0']) vals=vals-[10.0d0,20.0d0] if(all(vals.eq.0.0d0))then call unit_check_good('dbles_s2v') ! string passed to dble elseif(all(vals.lt.2*epsilon(0.0d0)))then call unit_check_good('dbles_s2v') ! string passed to real but not exactly else call unit_check_bad('dbles_s2v') ! returned value not equal to expected value endif !! ENCOUNTERS GFORTRAN 10.3.0 BUG !! if(all(abs(dble(['10.0d0','20.0d0']).eq.[10.0d0,20.0d0])))then !! call unit_check_good('dbles_s2v') ! string passed to dble !!! elseif(all(dble(['10.0d0','20.0d0']) .EqualTo. [10.0d0,20.0d0]))then !! elseif(all(abs(dble(['10.0d0','20.0d0']) - [10.0d0,20.0d0]).lt.2*epsilon(0.0d0)))then !! call unit_check_good('dbles_s2v') ! string passed to real but not exactly !! else !! call unit_check_bad('dbles_s2v') ! returned value not equal to expected value !! endif end subroutine test_dbles_s2v !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_int_s2v() call unit_check_start('int_s2v',' & & -description "overload INT() to take string arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') call unit_check('int_s2v',int('1234').eq.1234,'string passed to int') call unit_check_done('int_s2v',msg='') end subroutine test_int_s2v !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_ints_s2v() integer,allocatable :: ibug(:) call unit_check_start('ints_s2v',' & & -description "overload INT() to take string arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') !!if(all(int(['100','200']).eq. [100,200]))then ibug=int(['100','200']) if(all(ibug.eq. [100,200]))then call unit_check_good('ints_s2v') ! string passed to int else call unit_check_bad('ints_s2v') ! returned value not equal to expected value endif end subroutine test_ints_s2v !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_real_s2v() call unit_check_start('real_s2v','& & -description "overload REAL() to take string arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') if(REAL('0.357072622').eq. 0.357072622)then call unit_check_good('real_s2v') elseif(almost(real('0.357072622'), 0.357072622,7.0) )then call unit_check_good('real_s2v') ! string passed to real but not exactly else call unit_check_bad('real_s2v') ! returned value not equal to expected value endif end subroutine test_real_s2v !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT subroutine test_reals_s2v() real,allocatable :: rbug(:) call unit_check_start('reals_s2v','& & -description "overload REAL() to take string arguments" & & -section 3 & & -library libGPF & & -filename `pwd`/M_overload.FF & & -documentation y & & -prep y & & -ccall n & & -archive GPF.a & & ') rbug=real(['0.357072622','200.0 ']) if(all(rbug.eq. [0.357072622,200.0]))then call unit_check_good('reals_s2v') ! string passed to int ! elseif(all(real(['0.357072622','200.0 ']) .EqualTo. [0.357072622,200.0]))then elseif(all(abs(real(['0.357072622','200.0 ']) - [0.357072622,200.0]).lt.2*epsilon(0.0d0)))then call unit_check_good('reals_s2v') ! string passed to real but not exactly else call unit_check_bad('reals_s2v') ! returned value not equal to expected value endif end subroutine test_reals_s2v !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT !$!subroutine test_get_command() !$! call unit_check_start('get_command','& !$! & -description "overload GET_COMMAND() to take allocatable string" & !$! & -section 3 & !$! & -library libGPF & !$! & -filename `pwd`/M_overload.FF & !$! & -documentation y & !$! & -prep y & !$! & -ccall n & !$! & -archive GPF.a & !$! & ') !$! call unit_check_done('get_command',msg='') !$!end subroutine test_get_command !TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT !$!subroutine test_get_command_argument() !$!integer :: istat, ilen, i !$!character(len=:),allocatable :: argument, arguments !$!character(len=10) :: regular !$!integer,allocatable :: istats(:), ilens(:) !$!! assuming called with cmd//' -x -y "hello there" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' !$! call unit_check_start('get_command_argument','& !$! & -description "overload GET_command_argument() to take allocatable string" & !$! & -section 3 & !$! & -library libGPF & !$! & -filename `pwd`/M_overload.FF & !$! & -documentation y & !$! & -prep y & !$! & -ccall n & !$! & -archive GPF.a & !$! & ') !$! !$! ! unallocated allocatable variable and realloc=.true. !$! allocate(integer :: istats(0),ilens(0)) !$! arguments='' !$! do i=1, command_argument_count() !$! call get_command_argument(i, argument, length=ilen, status=istat, realloc=.true.) !$! istats=[istats,istat] !$! ilens=[ilens,ilen] !$! arguments=arguments//argument//' ' !$! enddo !$! write(*,*)'ISTATS=',istats !$! write(*,*)'ILENS=',ilens !$! write(*,*)'ARGUMENTS=',arguments !$! call unit_check('get_command_argument',all(istats.eq.0),'check if all status returns are zero') !$! call unit_check('get_command_argument',all(ilens.eq.[2,2,11,36]),'check lengths') !$! call unit_check('get_command_argument',arguments.eq.'-x -y hello there xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') !$! !$! ! allocated allocatable variable and realloc=.true. !$! if(allocated(istats))deallocate(istats) !$! if(allocated(ilens))deallocate(ilens) !$! if(allocated(argument))deallocate(argument) !$! allocate(integer :: istats(0),ilens(0)) !$! argument='12345678901234' !$! arguments='' !$! do i=1, command_argument_count() !$! call get_command_argument(i, argument, length=ilen, status=istat, realloc=.true.) !$! istats=[istats,istat] !$! ilens=[ilens,ilen] !$! arguments=arguments//argument//' ' !$! enddo !$! write(*,*)'ISTATS=',istats !$! write(*,*)'ILENS=',ilens !$! write(*,*)'ARGUMENTS=',arguments !$! call unit_check('get_command_argument',all(istats.eq.0),'check if all status returns are zero') !$! call unit_check('get_command_argument',all(ilens.eq.[2,2,11,36]),'check lengths') !$! call unit_check('get_command_argument',arguments.eq.'-x -y hello there xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') !$! !$! ! allocatable variable already allocated and no realloc=.true. !$! deallocate(istats,ilens,argument) !$! allocate(integer :: istats(0),ilens(0)) !$! arguments='' !$! allocate(character(len=10) :: argument) !$! do i=1, command_argument_count() !$! call get_command_argument(i, argument, length=ilen, status=istat) !$! istats=[istats,istat] !$! ilens=[ilens,ilen] !$! arguments=arguments//argument//' ' !$! enddo !$! write(*,*)'ISTATS=',istats !$! write(*,*)'ILENS=',ilens !$! write(*,*)'ARGUMENTS=',arguments !$! call unit_check('get_command_argument',all(istats.eq.[0,0,-1,-1]),'check if get truncations as expected') !$! call unit_check('get_command_argument',all(ilens.eq.[2,2,11,36]),'check lengths') !$! call unit_check('get_command_argument',arguments.eq.'-x -y hello ther xxxxxxxxxx') !$! !$! ! regular !$! deallocate(istats,ilens) !$! allocate(integer :: istats(0),ilens(0)) !$! arguments='' !$! do i=1, command_argument_count() !$! call get_command_argument(i, regular, length=ilen, status=istat) !$! istats=[istats,istat] !$! ilens=[ilens,ilen] !$! arguments=arguments//regular//' ' !$! enddo !$! write(*,*)'ISTATS=',istats !$! write(*,*)'ILENS=',ilens !$! write(*,*)'ARGUMENTS=',arguments !$! call unit_check('get_command_argument',all(istats.eq.[0,0,-1,-1]),'check if get truncations as expected') !$! call unit_check('get_command_argument',all(ilens.eq.[2,2,11,36]),'check lengths') !$! call unit_check('get_command_argument',arguments.eq.'-x -y hello ther xxxxxxxxxx') !$! !$! call unit_check_done('get_command_argument',msg='') !$!end subroutine test_get_command_argument !=================================================================================================================================== end subroutine test_suite_M_overload