@@ -1090,7 +1090,17 @@ end
10901090 end
10911091end
10921092
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
10941104 functions = (
10951105 :sin , :cos , :tan , :sinh , :cosh , :tanh , :asin , :acos ,
10961106 :asinh , :acosh , :atanh , :sec , :csc , :cot , :asec , :acsc , :acot , :sech , :csch ,
@@ -1099,15 +1109,6 @@ end
10991109 :log , :log2 , :log10 , :log1p , :exp , :exp2 , :exp10 , :expm1 , :frexp , :exponent ,
11001110 :atan , :atand
11011111 )
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
11111112 for Q in (Quantity, GenericQuantity), D in (Dimensions, SymbolicDimensions), f in functions
11121113 # Only test on valid domain
11131114 valid_inputs = filter (
@@ -1132,3 +1133,67 @@ end
11321133 end
11331134 end
11341135end
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