From 1d230e58111fe1129ec655253ed9a3ac379c2a9a Mon Sep 17 00:00:00 2001 From: Edward Hartnett <38856240+edwardhartnett@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:17:26 -0700 Subject: [PATCH] more testing for gbytec subroutines (#602) --- src/g2_gbytesc.F90 | 4 +- tests/test_gbytec.F90 | 142 +++++++++++++++++++++++++++++++++--------- 2 files changed, 116 insertions(+), 30 deletions(-) diff --git a/src/g2_gbytesc.F90 b/src/g2_gbytesc.F90 index 4c76cf29..de841bd0 100644 --- a/src/g2_gbytesc.F90 +++ b/src/g2_gbytesc.F90 @@ -11,7 +11,7 @@ !> has more elements, use g2_sbytesc(). !> !> @param[in] in Array input. -!> @param[out] iout Unpacked array output. +!> @param[inout] iout Unpacked array output. !> @param[in] iskip Initial number of bits to skip. !> @param[in] nbits Number of bits of each integer in IN to take. !> @@ -32,7 +32,7 @@ end subroutine g2_gbytec !> This should be used when input array IN has only one element. If IN !> has more elements, use G2_SBYTESC(). !> -!> @param[out] out packed array output +!> @param[inout] out packed array output !> @param[in] in unpacked array input !> @param[in] iskip initial number of bits to skip !> @param[in] nbits Number of bits of each integer in OUT to fill. diff --git a/tests/test_gbytec.F90 b/tests/test_gbytec.F90 index cfb49fb0..6064e2e2 100644 --- a/tests/test_gbytec.F90 +++ b/tests/test_gbytec.F90 @@ -11,6 +11,9 @@ program test_gbytec character*1 :: out5(5) character*1 :: out8(8) character*1 :: out10(10) + character*1 :: out16(16) + character*1 :: out32(32) + integer :: in4(4), in1(1) integer, parameter :: n = 1 integer :: in(n) real :: r_in(n) @@ -24,16 +27,22 @@ program test_gbytec integer :: nskip = 0 integer :: i integer :: num + integer(kind = 4) :: in44(4), in44_1(4) + integer(kind = 8) :: in8(1), in8_1(1), in84(4), in84_1(4) - print *, 'Testing g2_gbytesc.f subroutines.' + print *, 'Testing g2_gbytesc.F90 subroutines.' - print *, 'Testing g2_sbytec()...' + print *, ' testing g2_sbytec()...' in(1) = 3 out(1) = char(0) call g2_sbytec(out, in, iskip, nbits) if (ichar(out(1)) .ne. in(1)) stop 10 - print *, 'Testing g2_sbytesc()...' + print *, ' testing g2_gbytec()...' + call g2_gbytec(out, in, iskip, nbits) + if (ichar(out(1)) .ne. in(1)) stop 11 + + print *, ' testing g2_sbytesc()...' in(1) = 3 out(1) = char(0) call g2_sbytesc(out, in, iskip, nbits, nskip, n) @@ -41,7 +50,7 @@ program test_gbytec ! This will pack the numbers 1 and 2 into the first two chars of the ! buffer. The rest of the output buffer will remain zeros. - print *, 'Testing g2_sbytesc() packing 2 values...' + print *, ' testing g2_sbytesc() packing 2 values...' in2(1) = 1 in2(2) = 2 do i = 1, 8 @@ -58,7 +67,7 @@ program test_gbytec end do ! Now pack 5 values into the 5 character array out5. - print *, 'Testing g2_sbytesc() packing 5 values...' + print *, ' testing g2_sbytesc() packing 5 values...' in5(1) = 1 in5(2) = 2 in5(3) = 3 @@ -76,7 +85,7 @@ program test_gbytec ! Now pack 5 values into the 10 character array out10. Skip every ! other byte in the output. - print *, 'Testing g2_sbytesc() packing 5 values, skipping every other byte...' + print *, ' testing g2_sbytesc() packing 5 values, skipping every other byte...' nbits = 8 nskip = 0 do i = 1, 10 @@ -88,32 +97,45 @@ program test_gbytec if (mod(i, 2) .gt. 0) then if (ichar(out10(i)) .ne. in5(int(i/2) + 1)) stop 51; else - if (ichar(out10(i)) .ne. 0) stop 50; + if (ichar(out10(i)) .ne. 0) stop 52; endif end do - print *, 'Testing g2_sbytec() with iskip of 1...' + print *, ' testing g2_sbytec() with iskip of 1...' in(1) = 1 out(1) = char(0) call g2_sbytec(out, in, 1, 6) - ! print '(z2.2)', out(1) - if (ichar(out(1)) .ne. 2) stop 20 + if (ichar(out(1)) .ne. 2) stop 53 - print *, 'Testing g2_sbytesc() with a small array...' + print *, ' testing g2_sbytesc() with a size 4 output array...' iskip = 0 nbits = 32 nskip = 0 num = 1 in(1) = 1 call g2_sbytesc(out4, in, iskip, nbits, nskip, num) - if (ichar(out4(1)) .ne. 0 .and. ichar(out4(2)) .ne. 0 .and. ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 1) stop 50 - !print '(z2.2)', out4(1) + if (ichar(out4(1)) .ne. 0 .and. ichar(out4(2)) .ne. 0 .and. & + ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 1) stop 60 + + print *, ' now unpack into 4 ints with g2_gbytesc()...' + call g2_gbytesc(out4, in4, iskip, 8, 0, 4) + do i = 1, 4 + if (i < 4) then + if (in4(i) .ne. 0) stop 61 + else + if (in4(i) .ne. 1) stop 62 + endif + end do + print *, ' now unpack into 1 int with g2_gbytesc()...' + call g2_gbytesc(out4, in1, iskip, 32, 0, 1) + if (in1(1) .ne. 1) stop 70 + ! For this test to pass the -fallow-argument-mismatch flag must be ! used, because I am passing in a real array instead of an int array ! for the in parameter. This is how g2_sbytesc() is called in ! addfield.F90. - print *, 'Testing g2_sbytesc() with a real array (size 1) instead of an int array...' + print *, ' testing g2_sbytesc() with a real array (size 1) instead of an int array...' iskip = 0 nbits = 32 nskip = 0 @@ -122,14 +144,13 @@ program test_gbytec call g2_sbytesc(out4, r_in, iskip, nbits, nskip, num) ! Note that the 32-bit IEEE representation of 1.0 is 3f800000. The ! decimal for 3f is 63, the decimal for 80 is 128. - if (ichar(out4(1)) .ne. 63 .and. ichar(out4(2)) .ne. 128 .and. ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 0) stop 50 + if (ichar(out4(1)) .ne. 63 .and. ichar(out4(2)) .ne. 128 .and. & + ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 0) stop 80 ! print '(z2.2)', out4(1) - ! print '(z2.2)', out4(2) - ! print '(z2.2)', out4(3) - ! print '(z2.2)', out4(4) - ! This test is the same as above, but does not require the -fallow-argument-mismatch flag. - print *, 'Testing g2_sbytesc() with a real array (size 1) instead of an int array, using transfer() intrinsic...' + ! This test is the same as above, but does not require the + ! -fallow-argument-mismatch flag. + print *, ' testing g2_sbytesc() with a size 1 real array instead of an int array, using transfer()...' iskip = 0 nbits = 32 nskip = 0 @@ -139,14 +160,14 @@ program test_gbytec call g2_sbytesc(out4, in, iskip, nbits, nskip, num) ! Note that the 32-bit IEEE representation of 1.0 is 3f800000. The ! decimal for 3f is 63, the decimal for 80 is 128. - if (ichar(out4(1)) .ne. 63 .and. ichar(out4(2)) .ne. 128 .and. ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 0) stop 50 - ! print '(z2.2)', out4(1) + if (ichar(out4(1)) .ne. 63 .and. ichar(out4(2)) .ne. 128 .and. & + ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 0) stop 90 ! For this test to pass the -fallow-argument-mismatch flag must be ! used, because I am passing in a real array instead of an int array ! for the in parameter. This is how g2_sbytesc() is called in ! addfield.F90. - print *, 'Testing g2_sbytesc() with a real array instead of an int array...' + print *, ' testing g2_sbytesc() with a real array instead of an int array...' iskip = 0 nbits = 32 nskip = 0 @@ -156,12 +177,14 @@ program test_gbytec call g2_sbytesc(out8, r_in2, iskip, nbits, nskip, num) ! Note that the 32-bit IEEE representation of 1.0 is 3f800000. The ! decimal for 3f is 63, the decimal for 80 is 128. - if (ichar(out8(1)) .ne. 63 .and. ichar(out8(2)) .ne. 128 .and. ichar(out8(3)) .ne. 0 .and. ichar(out8(4)) .ne. 0) stop 50 - if (ichar(out8(5)) .ne. 63 .and. ichar(out8(6)) .ne. 128 .and. ichar(out8(7)) .ne. 0 .and. ichar(out8(8)) .ne. 0) stop 50 + if (ichar(out8(1)) .ne. 63 .and. ichar(out8(2)) .ne. 128 .and. & + ichar(out8(3)) .ne. 0 .and. ichar(out8(4)) .ne. 0) stop 100 + if (ichar(out8(5)) .ne. 63 .and. ichar(out8(6)) .ne. 128 .and. & + ichar(out8(7)) .ne. 0 .and. ichar(out8(8)) .ne. 0) stop 110 ! print '(z2.2)', out8(1) ! This test is the same as above, but does not require the -fallow-argument-mismatch flag. - print *, 'Testing g2_sbytesc() with a real array instead of an int array, using transfer() intrinsic...' + print *, ' testing g2_sbytesc() with a real array instead of an int array, using transfer() intrinsic...' iskip = 0 nbits = 32 nskip = 0 @@ -172,10 +195,73 @@ program test_gbytec call g2_sbytesc(out8, in2, iskip, nbits, nskip, num) ! Note that the 32-bit IEEE representation of 1.0 is 3f800000. The ! decimal for 3f is 63, the decimal for 80 is 128. - if (ichar(out4(1)) .ne. 63 .and. ichar(out4(2)) .ne. 128 .and. ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 0) stop 50 - if (ichar(out8(5)) .ne. 63 .and. ichar(out8(6)) .ne. 128 .and. ichar(out8(7)) .ne. 0 .and. ichar(out8(8)) .ne. 0) stop 50 + if (ichar(out4(1)) .ne. 63 .and. ichar(out4(2)) .ne. 128 .and. & + ichar(out4(3)) .ne. 0 .and. ichar(out4(4)) .ne. 0) stop 120 + if (ichar(out8(5)) .ne. 63 .and. ichar(out8(6)) .ne. 128 .and. & + ichar(out8(7)) .ne. 0 .and. ichar(out8(8)) .ne. 0) stop 130 ! print '(z2.2)', out4(1) + print *, ' testing g2_sbytec() with 64-bit int...' + in8(1) = 1 + do i = 1, 8 + out8(i) = char(0) + end do + call g2_sbytec(out8, in8, iskip, 64) + do i = 1, 8 + !print '(z2.2)', out8(i) + if (i .lt. 8) then + if (ichar(out8(i)) .ne. 0) stop 140 + else + if (ichar(out8(i)) .ne. 1) stop 140 + endif + end do + + print *, ' now unpack into 1 64-bit int with g2_gbytesc()...' + in8_1(1) = 0 + call g2_gbytesc(out8, in8_1, iskip, 64, 0, 1) + if (in8_1(1) .ne. in8(1)) stop 150 + + print *, ' testing g2_sbytec() with 32-bit int array of size 4...' + do i = 1, 4 + in44(i) = 1 + end do + do i = 1, 16 + out16(i) = char(0) + end do + call g2_sbytesc(out16, in44, iskip, 32, 0, 4) + do i = 1, 16 + print '(i3, x, z2.2)', i, out16(i) + end do + + print *, ' now unpack into 4 32-bit ints with g2_gbytesc()...' + do i = 1, 4 + in44_1(i) = 0 + end do + call g2_gbytesc(out16, in44_1, iskip, 32, 0, 4) + do i = 1, 4 + if (in44_1(i) .ne. in44(i)) stop 160 + end do + + print *, ' testing g2_sbytec() with 64-bit int array of size 4...' + do i = 1, 4 + in84(i) = 1 + end do + do i = 1, 32 + out32(i) = char(0) + end do + print *, in84 + call g2_sbytesc(out32, in84, iskip, 64, 0, 4) + do i = 1, 32 + print '(i3, x, z2.2)', i, out32(i) + end do + + print *, ' now unpack into 4 64-bit ints with g2_gbytesc()...' + do i = 1, 4 + in84_1(i) = 0 + end do + call g2_gbytesc(out32, in84_1, iskip, 64, 0, 4) + print *, in84_1 + print *, 'SUCCESS!' end program test_gbytec