Skip to content

Commit a52ab27

Browse files
committed
Fix conversion rules
1 parent 286e849 commit a52ab27

File tree

3 files changed

+28
-30
lines changed

3 files changed

+28
-30
lines changed

src/symbolic_dimensions.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ for (type, _, _) in ABSTRACT_QUANTITY_TYPES
142142
d = dimension(q)
143143
for (idx, value) in zip(nzdims(d), nzvals(d))
144144
if !iszero(value)
145-
result = result * convert(with_type_parameters(Q, T, D), ALL_VALUES[idx]) ^ value
145+
result *= convert(with_type_parameters(Q, T, D), ALL_VALUES[idx] ^ value)
146146
end
147147
end
148148
return result

src/utils.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ for (type, true_base_type, _) in ABSTRACT_QUANTITY_TYPES
215215
base_type = true_base_type <: Number ? true_base_type : Number
216216
@eval begin
217217
function Base.isapprox(l::$type, r::$type; kws...)
218+
l, r = promote_except_value(l, r)
218219
dimension(l) == dimension(r) || throw(DimensionError(l, r))
219220
return isapprox(ustrip(l), ustrip(r); kws...)
220221
end

test/unittests.jl

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,13 +1487,13 @@ end
14871487
)
14881488
for x in valid_inputs[1:3]
14891489
qx_dimensionless = Q(x, D)
1490-
qx_dimensions = Q(x, convert(D, dimension(u"m/s")))
1490+
qx_dimensions = convert(with_type_parameters(Q, Float64, D), Q(x, dimension(u"m/s")))
14911491
@eval @test $f($qx_dimensionless) == $f($x)
14921492
@eval @test_throws DimensionError $f($qx_dimensions)
14931493
if f in (:atan, :atand)
14941494
for y in valid_inputs[end-3:end]
14951495
qy_dimensionless = Q(y, D)
1496-
qy_dimensions = Q(y, convert(D, dimension(u"m/s")))
1496+
qy_dimensions = convert(with_type_parameters(Q, Float64, D), Q(y, dimension(u"m/s")))
14971497
@eval @test $f($y, $qx_dimensionless) == $f($y, $x)
14981498
@eval @test $f($qy_dimensionless, $x) == $f($y, $x)
14991499
@eval @test $f($qy_dimensionless, $qx_dimensionless) == $f($y, $x)
@@ -1521,24 +1521,25 @@ end
15211521
T <: Complex && Q == RealQuantity && continue
15221522
if f == :modf # Functions that return multiple outputs
15231523
for x in 5rand(T, 3) .- 2.5
1524-
dim = convert(D, dimension(u"m/s"))
1525-
qx_dimensions = Q(x, dim)
1524+
qx_dimensions = convert(with_type_parameters(Q, T, D), Q(x, dimension(u"m/s")))
15261525
num_outputs = 2
15271526
for i=1:num_outputs
1528-
@eval @test $f($qx_dimensions)[$i] == $Q($f($x)[$i], $dim)
1527+
@eval @test $f($qx_dimensions)[$i] == $Q($f($x)[$i], $(dimension(u"m/s")))
15291528
end
15301529
end
15311530
elseif f in (:copysign, :flipsign, :rem, :mod) # Functions that need multiple inputs
15321531
for x in 5rand(T, 3) .- 2.5
15331532
for y in 5rand(T, 3) .- 2.5
1534-
dim = convert(D, dimension(u"m/s"))
1535-
qx_dimensions = Q(x, dim)
1536-
qy_dimensions = Q(y, dim)
1537-
@eval @test $f($qx_dimensions, $qy_dimensions) == $Q($f($x, $y), $dim)
1533+
# dim = convert(D, dimension(u"m/s"))
1534+
# qx_dimensions = Q(x, dim)
1535+
# qy_dimensions = Q(y, dim)
1536+
qx_dimensions = convert(with_type_parameters(Q, T, D), Q(x, dimension(u"m/s")))
1537+
qy_dimensions = convert(with_type_parameters(Q, T, D), Q(y, dimension(u"m/s")))
1538+
@eval @test $f($qx_dimensions, $qy_dimensions) == $Q($f($x, $y), dimension(u"m/s"))
15381539
if f in (:copysign, :flipsign)
15391540
# Also do test without dimensions
15401541
@eval @test $f($x, $qy_dimensions) == $f($x, $y)
1541-
@eval @test $f($qx_dimensions, $y) == $Q($f($x, $y), $dim)
1542+
@eval @test $f($qx_dimensions, $y) == $Q($f($x, $y), dimension(u"m/s"))
15421543
elseif f in (:rem, :mod)
15431544
# Also do test without dimensions (need dimensionless)
15441545
qx_dimensionless = Q(x, D)
@@ -1550,31 +1551,28 @@ end
15501551
if f == :rem && VERSION >= v"1.9"
15511552
# Can also do other rounding modes
15521553
for r in (:RoundFromZero, :RoundNearest, :RoundUp, :RoundDown)
1553-
@eval @test $f($qx_dimensions, $qy_dimensions, $r) $Q($f($x, $y, $r), $dim)
1554+
@eval @test $f($qx_dimensions, $qy_dimensions, $r) $Q($f($x, $y, $r), dimension(u"m/s"))
15541555
end
15551556
end
15561557
end
15571558
end
15581559
end
15591560
elseif f == :unsigned
1560-
for x in 5rand(-10:10, 3)
1561-
dim = convert(D, dimension(u"m/s"))
1562-
qx_dimensions = Q(x, dim)
1563-
@eval @test $f($qx_dimensions) == $Q($f($x), $dim)
1561+
for x in 5rand(10:50, 3)
1562+
qx_dimensions = convert(with_type_parameters(Q, typeof(x), D), Q(x, dimension(u"m/s")))
1563+
@eval @test $f($qx_dimensions) == $Q($f($x), dimension(u"m/s"))
15641564
end
15651565
elseif f in (:round, :floor, :trunc, :ceil)
15661566
for x in 5rand(T, 3) .- 2.5
1567-
dim = convert(D, dimension(u"m/s"))
1568-
qx_dimensions = Q(x, dim)
1569-
@eval @test $f($qx_dimensions) == $Q($f($x), $dim)
1570-
@eval @test $f(Int32, $qx_dimensions) == $Q($f(Int32, $x), $dim)
1567+
qx_dimensions = convert(with_type_parameters(Q, T, D), Q(x, dimension(u"m/s")))
1568+
@eval @test $f($qx_dimensions) == $Q($f($x), dimension(u"m/s"))
1569+
@eval @test $f(Int32, $qx_dimensions) == $Q($f(Int32, $x), dimension(u"m/s"))
15711570
end
15721571
elseif f == :ldexp
15731572
for x in 5rand(T, 3) .- 2.5
1574-
dim = convert(D, dimension(u"m/s"))
1575-
qx_dimensions = Q(x, dim)
1573+
qx_dimensions = convert(with_type_parameters(Q, T, D), Q(x, dimension(u"m/s")))
15761574
for i=1:3
1577-
@eval @test $f($qx_dimensions, $i) == $Q($f($x, $i), $dim)
1575+
@eval @test $f($qx_dimensions, $i) == $Q($f($x, $i), dimension(u"m/s"))
15781576
end
15791577
end
15801578
else
@@ -1584,9 +1582,8 @@ end
15841582
5rand(T, 100) .- 2.5
15851583
)
15861584
for x in valid_inputs[1:3]
1587-
dim = convert(D, dimension(u"m/s"))
1588-
qx_dimensions = Q(x, dim)
1589-
@eval @test $f($qx_dimensions) == $Q($f($x), $dim)
1585+
qx_dimensions = convert(with_type_parameters(Q, T, D), Q(x, dimension(u"m/s")))
1586+
@eval @test $f($qx_dimensions) == $Q($f($x), dimension(u"m/s"))
15901587
end
15911588
end
15921589
end
@@ -1600,8 +1597,8 @@ end
16001597
y = 5randn(10) .- 2.5
16011598
for Q in (RealQuantity, Quantity, GenericQuantity), D in (Dimensions, SymbolicDimensions), f in functions
16021599
ground_truth = @eval $f.($x, $y)
1603-
qx_dimensions = [with_type_parameters(Q, Float64, D)(xi, dim) for xi in x]
1604-
qy_dimensions = [with_type_parameters(Q, Float64, D)(yi, dim) for yi in y]
1600+
qx_dimensions = [convert(with_type_parameters(Q, Float64, D), Q(xi, dimension(u"m/s"))) for xi in x]
1601+
qy_dimensions = [convert(with_type_parameters(Q, Float64, D), Q(yi, dimension(u"m/s"))) for yi in y]
16051602
@eval @test all($f.($qx_dimensions, $qy_dimensions) .== $ground_truth)
16061603
if f in (:isequal, :(==))
16071604
# These include a dimension check in the result, rather than
@@ -1617,8 +1614,8 @@ end
16171614
@eval @test all($f.($qx_dimensionless, $y) .== $ground_truth)
16181615
@eval @test all($f.($x, $qy_dimensionless) .== $ground_truth)
16191616

1620-
qx_real_dimensions = [RealQuantity(xi, dim) for xi in x]
1621-
qy_real_dimensions = [RealQuantity(yi, dim) for yi in y]
1617+
qx_real_dimensions = [convert(RealQuantity{Float64,D}, Quantity(xi, dimension(u"m/s"))) for xi in x]
1618+
qy_real_dimensions = [convert(RealQuantity{Float64,D}, Quantity(yi, dimension(u"m/s"))) for yi in y]
16221619
# Mixed quantity input
16231620
@eval @test all($f.($qx_real_dimensions, $qy_dimensions) .== $ground_truth)
16241621
@eval @test all($f.($qx_dimensions, $qy_real_dimensions) .== $ground_truth)

0 commit comments

Comments
 (0)