@@ -1090,7 +1090,17 @@ end
1090
1090
end
1091
1091
end
1092
1092
1093
- @testset " Dimensionless functions" begin
1093
+ function is_input_valid (f, x)
1094
+ try
1095
+ f (x)
1096
+ catch e
1097
+ e isa DomainError && return false
1098
+ rethrow (e)
1099
+ end
1100
+ return true
1101
+ end
1102
+
1103
+ @testset " Assorted dimensionless functions" begin
1094
1104
functions = (
1095
1105
:sin , :cos , :tan , :sinh , :cosh , :tanh , :asin , :acos ,
1096
1106
:asinh , :acosh , :atanh , :sec , :csc , :cot , :asec , :acsc , :acot , :sech , :csch ,
@@ -1099,15 +1109,6 @@ end
1099
1109
:log , :log2 , :log10 , :log1p , :exp , :exp2 , :exp10 , :expm1 , :frexp , :exponent ,
1100
1110
:atan , :atand
1101
1111
)
1102
- function is_input_valid (f, x)
1103
- try
1104
- f (x)
1105
- catch e
1106
- e isa DomainError && return false
1107
- rethrow (e)
1108
- end
1109
- return true
1110
- end
1111
1112
for Q in (Quantity, GenericQuantity), D in (Dimensions, SymbolicDimensions), f in functions
1112
1113
# Only test on valid domain
1113
1114
valid_inputs = filter (
@@ -1132,3 +1133,67 @@ end
1132
1133
end
1133
1134
end
1134
1135
end
1136
+
1137
+ @testset " Assorted dimensionful functions" begin
1138
+ functions = (
1139
+ :float , :abs , :real , :imag , :conj , :adjoint , :unsigned ,
1140
+ :nextfloat , :prevfloat , :identity , :transpose ,
1141
+ :copysign , :flipsign , :mod , :modf ,
1142
+ :floor , :trunc , :ceil , :significand ,
1143
+ :ldexp , :round
1144
+ )
1145
+ for Q in (Quantity, GenericQuantity), D in (Dimensions, SymbolicDimensions), f in functions
1146
+ T = f in (:abs , :real , :imag , :conj ) ? ComplexF64 : Float64
1147
+ if f == :modf # Functions that return multiple outputs
1148
+ for x in 5 rand (T, 3 ) .- 2.5
1149
+ dim = convert (D, dimension (u " m/s" ))
1150
+ qx_dimensions = Q (x, dim)
1151
+ num_outputs = 2
1152
+ for i= 1 : num_outputs
1153
+ @eval @test $ f ($ qx_dimensions)[$ i] == $ Q ($ f ($ x)[$ i], $ dim)
1154
+ end
1155
+ end
1156
+ elseif f in (:copysign , :flipsign , :rem , :mod ) # Functions that need multiple inputs
1157
+ for x in 5 rand (T, 3 ) .- 2.5
1158
+ for y in 5 rand (T, 3 ) .- 2.5
1159
+ dim = convert (D, dimension (u " m/s" ))
1160
+ qx_dimensions = Q (x, dim)
1161
+ qy_dimensions = Q (y, dim)
1162
+ @eval @test $ f ($ qx_dimensions, $ qy_dimensions) == $ Q ($ f ($ x, $ y), $ dim)
1163
+ end
1164
+ end
1165
+ elseif f == :unsigned
1166
+ for x in 5 rand (- 10 : 10 , 3 )
1167
+ dim = convert (D, dimension (u " m/s" ))
1168
+ qx_dimensions = Q (x, dim)
1169
+ @eval @test $ f ($ qx_dimensions) == $ Q ($ f ($ x), $ dim)
1170
+ end
1171
+ elseif f == :round
1172
+ for x in 5 rand (T, 3 ) .- 2.5
1173
+ dim = convert (D, dimension (u " m/s" ))
1174
+ qx_dimensions = Q (x, dim)
1175
+ @eval @test $ f ($ qx_dimensions) == $ Q ($ f ($ x), $ dim)
1176
+ @eval @test $ f (Int32, $ qx_dimensions) == $ Q ($ f (Int32, $ x), $ dim)
1177
+ end
1178
+ elseif f == :ldexp
1179
+ for x in 5 rand (T, 3 ) .- 2.5
1180
+ dim = convert (D, dimension (u " m/s" ))
1181
+ qx_dimensions = Q (x, dim)
1182
+ for i= 1 : 3
1183
+ @eval @test $ f ($ qx_dimensions, $ i) == $ Q ($ f ($ x, $ i), $ dim)
1184
+ end
1185
+ end
1186
+ else
1187
+ # Only test on valid domain
1188
+ valid_inputs = filter (
1189
+ x -> is_input_valid (eval (f), x),
1190
+ 5 rand (T, 100 ) .- 2.5
1191
+ )
1192
+ for x in valid_inputs[1 : 3 ]
1193
+ dim = convert (D, dimension (u " m/s" ))
1194
+ qx_dimensions = Q (x, dim)
1195
+ @eval @test $ f ($ qx_dimensions) == $ Q ($ f ($ x), $ dim)
1196
+ end
1197
+ end
1198
+ end
1199
+ end
0 commit comments