@@ -212,6 +212,8 @@ module testdrive
212
212
module procedure :: check_int_i8
213
213
module procedure :: check_bool
214
214
module procedure :: check_string
215
+ module procedure :: check_single_array
216
+ module procedure :: check_double_array
215
217
end interface check
216
218
217
219
@@ -1969,4 +1971,240 @@ end function is_nan_qp
1969
1971
#endif
1970
1972
1971
1973
1974
+ subroutine error_wrap (error , more )
1975
+ ! > Error handling
1976
+ type (error_type), intent (inout ) :: error
1977
+ ! > Error message
1978
+ character (len=* ), intent (in ) :: more
1979
+
1980
+ character (len=* ), parameter :: skip = new_line(" a" ) // repeat (" " , 11 )
1981
+
1982
+ error% message = error% message // skip // more
1983
+
1984
+ end subroutine error_wrap
1985
+
1986
+
1987
+ subroutine check_single_array (error , array , message , more )
1988
+
1989
+ ! > Error handing
1990
+ type (error_type), allocatable , intent (out ) :: error
1991
+
1992
+ ! > The array to be checked
1993
+ class(* ), intent (in ), target :: array(:)
1994
+
1995
+ ! > A detailed message describing the error
1996
+ character (len=* ), intent (in ), optional :: message
1997
+
1998
+ ! > Another line of error message
1999
+ character (len=* ), intent (in ), optional :: more
2000
+
2001
+ integer :: i
2002
+ class(* ), pointer :: item(:) ! @note gfortran <=10 does not support syntax: associate(item => array(i))
2003
+
2004
+ item = > array
2005
+ do i = 1 , size (array)
2006
+ select type (item)
2007
+ type is (integer )
2008
+ call check(error, item(i), message, more)
2009
+ type is (logical )
2010
+ call check(error, item(i), message, more)
2011
+ type is (real (sp))
2012
+ call check(error, item(i), message, more)
2013
+ type is (real (dp))
2014
+ call check(error, item(i), message, more)
2015
+ type is (complex (sp))
2016
+ call check(error, item(i), message, more)
2017
+ type is (complex (dp))
2018
+ call check(error, item(i), message, more)
2019
+ #if WITH_XDP
2020
+ type is (real (xdp))
2021
+ call check(error, item(i), message, more)
2022
+ type is (complex (xdp))
2023
+ call check(error, item(i), message, more)
2024
+ #endif
2025
+ #if WITH_QP
2026
+ type is (real (qp))
2027
+ call check(error, item(i), message, more)
2028
+ type is (complex (qp))
2029
+ call check(error, item(i), message, more)
2030
+ #endif
2031
+ end select
2032
+ if (allocated (error)) then
2033
+ call error_wrap(error, " Array check failed at element index " // trim (ch(i)))
2034
+ return
2035
+ end if
2036
+ end do
2037
+
2038
+ end subroutine check_single_array
2039
+
2040
+
2041
+ subroutine check_double_array (error , actual , expected , message , more , thr , rel )
2042
+
2043
+ ! > Error handling
2044
+ type (error_type), allocatable , intent (out ) :: error
2045
+
2046
+ ! > Found values
2047
+ class(* ), intent (in ), target :: actual(:)
2048
+
2049
+ ! > Expected values
2050
+ class(* ), intent (in ), target :: expected(:)
2051
+
2052
+ ! > A detailed message describing the error
2053
+ character (len=* ), intent (in ), optional :: message
2054
+
2055
+ ! > Another line of error message
2056
+ character (len=* ), intent (in ), optional :: more
2057
+
2058
+ ! > Allowed threshold for matching floating point values
2059
+ class(* ), intent (in ), optional :: thr
2060
+
2061
+ ! > Check for relative errors instead
2062
+ logical , intent (in ), optional :: rel
2063
+
2064
+ integer :: i
2065
+ class(* ), pointer :: item1(:), item2(:)
2066
+
2067
+ item1 = > actual
2068
+ item2 = > expected
2069
+ do i = 1 , size (expected)
2070
+ select type (item1)
2071
+ type is (integer (i1))
2072
+ select type (item2)
2073
+ type is (integer (i1))
2074
+ call check(error, item1(i), item2(i), message, more)
2075
+ end select
2076
+ type is (integer (i2))
2077
+ select type (item2)
2078
+ type is (integer (i2))
2079
+ call check(error, item1(i), item2(i), message, more)
2080
+ end select
2081
+ type is (integer (i4))
2082
+ select type (item2)
2083
+ type is (integer (i4))
2084
+ call check(error, item1(i), item2(i), message, more)
2085
+ end select
2086
+ type is (integer (i8))
2087
+ select type (item2)
2088
+ type is (integer (i8))
2089
+ call check(error, item1(i), item2(i), message, more)
2090
+ end select
2091
+ type is (logical )
2092
+ select type (item2)
2093
+ type is (logical )
2094
+ call check(error, item1(i), item2(i), message, more)
2095
+ end select
2096
+ type is (character (* ))
2097
+ select type (item2)
2098
+ type is (character (* ))
2099
+ call check(error, item1(i), item2(i), message, more)
2100
+ end select
2101
+ type is (real (sp))
2102
+ select type (item2)
2103
+ type is (real (sp))
2104
+ if (present (thr)) then
2105
+ select type (thr)
2106
+ type is (real (sp))
2107
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2108
+ end select
2109
+ else
2110
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2111
+ end if
2112
+ end select
2113
+ type is (real (dp))
2114
+ select type (item2)
2115
+ type is (real (dp))
2116
+ if (present (thr)) then
2117
+ select type (thr)
2118
+ type is (real (dp))
2119
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2120
+ end select
2121
+ else
2122
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2123
+ end if
2124
+ end select
2125
+ type is (complex (sp))
2126
+ select type (item2)
2127
+ type is (complex (sp))
2128
+ if (present (thr)) then
2129
+ select type (thr)
2130
+ type is (real (sp))
2131
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2132
+ end select
2133
+ else
2134
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2135
+ end if
2136
+ end select
2137
+ type is (complex (dp))
2138
+ select type (item2)
2139
+ type is (complex (dp))
2140
+ if (present (thr)) then
2141
+ select type (thr)
2142
+ type is (real (dp))
2143
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2144
+ end select
2145
+ else
2146
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2147
+ end if
2148
+ end select
2149
+ #if WITH_XDP
2150
+ type is (real (xdp))
2151
+ select type (item2)
2152
+ type is (real (xdp))
2153
+ if (present (thr)) then
2154
+ select type (thr)
2155
+ type is (real (xdp))
2156
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2157
+ end select
2158
+ else
2159
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2160
+ end if
2161
+ end select
2162
+ type is (complex (xdp))
2163
+ select type (item2)
2164
+ type is (complex (xdp))
2165
+ if (present (thr)) then
2166
+ select type (thr)
2167
+ type is (real (xdp))
2168
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2169
+ end select
2170
+ else
2171
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2172
+ end if
2173
+ end select
2174
+ #endif
2175
+ #if WITH_QP
2176
+ type is (real (qp))
2177
+ select type (item2)
2178
+ type is (real (qp))
2179
+ if (present (thr)) then
2180
+ select type (thr)
2181
+ type is (real (qp))
2182
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2183
+ end select
2184
+ else
2185
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2186
+ end if
2187
+ end select
2188
+ type is (complex (qp))
2189
+ select type (item2)
2190
+ type is (complex (qp))
2191
+ if (present (thr)) then
2192
+ select type (thr)
2193
+ type is (real (qp))
2194
+ call check(error, item1(i), item2(i), message, more, thr, rel)
2195
+ end select
2196
+ else
2197
+ call check(error, item1(i), item2(i), message, more, rel= rel)
2198
+ end if
2199
+ end select
2200
+ #endif
2201
+ end select
2202
+ if (allocated (error)) then
2203
+ call error_wrap(error, " Array check failed at element index " // trim (ch(i)))
2204
+ return
2205
+ end if
2206
+ end do
2207
+
2208
+ end subroutine check_double_array
2209
+
1972
2210
end module testdrive
0 commit comments