Hi All,

I've been perusing the Coveralls/Codecov reports looking for opportunities 
to write some additional tests.
I was looking at the promote_rule in int.jl and noticed that some 
promote_rules were apparently missing tests. 

See for example:
 promote_rule(::Type{Int64}, ::Type{Int8} ) = Int64 

 
https://codecov.io/github/JuliaLang/julia/base/int.jl?ref=e6cd2bc8c6ab2444d7750cf42d43b4c45e8f3545

Apparently, this line is not covered by any test as indicated by the red 
highlight.

However, the test file for int.jl

https://github.com/JuliaLang/julia/blob/master/test/int.jl

contains the following tests:

UItypes = (UInt8, UInt16, UInt32, UInt64, UInt128)
SItypes = (Int8, Int16, Int32, Int64, Int128)


for T in UItypes, S in UItypes
    @test promote(S(3), T(3)) === (sizeof(T) < sizeof(S) ? (S(3), S(3)) : (T
(3), T(3)))
end


for T in SItypes, S in SItypes
    @test promote(S(3), T(3)) === (sizeof(T) < sizeof(S) ? (S(3), S(3)) : (T
(3), T(3)))
end


for T in SItypes, S in UItypes
    R = sizeof(S) < sizeof(Int) ? Int : S
    @test promote(R(3), T(3)) === (sizeof(R) < sizeof(T) ? (T(3), T(3)) : (R
(3), R(3)))
end

Looking deeper at one of these tests using the following code:

for  T in SItypes, S in SItypes
    print(eltype(S(3)) )
    print(", ")
    print(eltype(T(3)) )
    print(" -> ")
    print(eltype(promote(S(3), T(3))))
    print(" | ")
    print(@which promote(S(3), T(3)))
    println(" ")
end

which yields:

Int8, Int8 -> Int8 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int16, Int8 -> Int16 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int32, Int8 -> Int32 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> *Int64, Int8 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 *
> Int128, Int8 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int8, Int16 -> Int16 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int16, Int16 -> Int16 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int32, Int16 -> Int32 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int64, Int16 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int128, Int16 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int8, Int32 -> Int32 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int16, Int32 -> Int32 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int32, Int32 -> Int32 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int64, Int32 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int128, Int32 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int8, Int64 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int16, Int64 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int32, Int64 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int64, Int64 -> Int64 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int128, Int64 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int8, Int128 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int16, Int128 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int32, Int128 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int64, Int128 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 
> Int128, Int128 -> Int128 | promote{T,S}(x::T, y::S) at promotion.jl:132 


it would appear that the line *highlighted in blue* above is indeed testing:
 promote_rule(::Type{Int64}, ::Type{Int8} ) = Int64 

contrary to what the Coveralls/Codecov is reporting. I'm not sure how 
to reconcile these results, and would appreciate any insight.

On a sightly different note, could anyone suggest a neat way of printing 
element types on a single
line such as:

> Int64, Int64 -> Int64 


For example, is there a way to convert Tuples to Strings? 

I've tried things such as:
print(AbstractString(eltype(8)) * ", " * AbstractString(eltype(8)))

LoadError: MethodError: `convert` has no method matching 
> convert(::Type{AbstractString}, ::Type{Int64})
> This may have arisen from a call to the constructor AbstractString(...),
> since type constructors fall back to convert methods.
> Closest candidates are:
> call{T}(::Type{T}, ::Any)
> convert{T<:AbstractString,S<:Union{Char,Int32,UInt32}}(::Type{T<:AbstractString},
>  
> !Matched::AbstractArray{S<:Union{Char,Int32,UInt32},1})
> convert{S<:AbstractString}(::Type{S<:AbstractString}, 
> !Matched::Base.UTF8proc.GraphemeIterator{S<:AbstractString})
> ...
> while loading In[128], in expression starting on line 1 in call at 
> essentials.jl:56


from which I understand that there is currently no conversion method from 
Types to Strings.

Many thanks for your time.

Zygmunt

Reply via email to