# This file is a part of Julia. License is MIT: https://julialang.org/license
using Random: randstring
@test ifelse(true, 1, 2) == 1
@test ifelse(false, 1, 2) == 2
let s = Set()
ifelse(true, push!(s, 1), push!(s, 2))
@test s == Set([1, 2])
end
let s = Set()
true ? push!(s, 1) : push!(s, 2)
false ? push!(s, 3) : push!(s, 4)
@test s == Set([1, 4])
end
let B = [true true false]
@test ifelse.(B, 1, 2) == [1 1 2]
@test ifelse.(B, 1, [2 3 4]) == [1 1 4]
@test ifelse.(B, [2 3 4], 1) == [2 3 1]
@test ifelse.(B, [2 3 4], [5 6 7]) == [2 3 7]
end
@test reverse(Pair(1,2)) == Pair(2,1)
@test reverse(Pair("13","24")) == Pair("24","13")
@test typeof(reverse(Pair{String,Int64}("a",1))) == Pair{Int64,String}
@test convert(Pair{Float64,Float64}, 17 => 4711) === (17.0 => 4711.0)
@test convert(Pair{Int,Float64}, 17 => 4711) === (17 => 4711.0)
@test convert(Pair{Float64,Int}, 17 => 4711) === (17.0 => 4711)
@test convert(Pair{Any,Any}, 17 => 4711) === Pair{Any,Any}(17, 4711)
@test convert(Pair{Number,Number}, 17 => 4711) === Pair{Number,Number}(17, 4711)
@test promote(1=>1, 2=>2.0) === (1=>1.0, 2=>2.0)
@test promote(1=>1, 2.0=>2) === (1.0=>1, 2.0=>2)
@test promote(1=>1.0, 2.0=>2) === (1.0=>1.0, 2.0=>2.0)
@test promote(1=>1, :b=>2.0) === (Pair{Any,Float64}(1,1.0),Pair{Any,Float64}(:b,2.0))
@test isa([:a=>1, :b=>2], Vector{Pair{Symbol,Int}})
@test isa([:a=>1, :b=>2.0], Vector{Pair{Symbol,Float64}})
@test isa(["a"=>1, :b=>2.0], Vector{Pair{Any,Float64}})
# Infix `isa`
@test 1 isa Integer
p = 1=>:foo
@test first(p) == 1
@test last(p) == :foo
@test first(reverse(p)) == :foo
@test last(reverse(p)) == 1
@test lastindex(p) == 2
@test p[lastindex(p)] == p[end] == p[2] == :foo
@test (|)(2) == 2
@test xor(2) == 2
@test (⊻)(2) == 2
@test_throws MethodError min(Set([1]), Set([2]))
@test_throws MethodError max(Set([1]), Set([2]))
@test_throws MethodError minmax(Set([1]), Set([2]))
# Test if isless (not <) is used by min, max, minmax
# and commutativity.
struct TO23094
x::Int
end
Base.isless(a::TO23094, b::TO23094) = isless(a.x, b.x)
Base.isequal(a::TO23094, b::TO23094) = isequal(a.x, b.x)
import Base.<
<(a::TO23094, b::TO23094) = error("< should not be called")
@test isequal(min(TO23094(1), TO23094(2)), TO23094(1))
@test isequal(min(TO23094(2), TO23094(1)), TO23094(1))
@test isequal(max(TO23094(1), TO23094(2)), TO23094(2))
@test isequal(max(TO23094(2), TO23094(1)), TO23094(2))
@test isequal(minmax(TO23094(1), TO23094(2))[1], TO23094(1))
@test isequal(minmax(TO23094(1), TO23094(2))[2], TO23094(2))
@test isequal(minmax(TO23094(2), TO23094(1))[1], TO23094(1))
@test isequal(minmax(TO23094(2), TO23094(1))[2], TO23094(2))
@test isless('a','b')
@test 1 .!= 2
@test 1 .== 1
@test 1 .< 2
@test 1 .<= 2
# issue #13144: max() with 4 or more array arguments
let xs = [[i:i+4;] for i in 1:10]
for n in 2:10
@test max.(xs[1:n]...) == [n:n+4;]
end
end
# issue #19714
struct T19714 <: Integer end
Base.float(::T19714) = 19714.0
Base.:/(::T19714, ::T19714) = T19714()
Base.convert(::Type{T19714}, ::Int) = T19714()
Base.promote_rule(::Type{T19714}, ::Type{Int}) = T19714
@test T19714()/1 === 1/T19714() === T19714()
# pr #17155
@testset "function composition" begin
@test (uppercase∘hex)(239487) == "3A77F"
end
@testset "function negation" begin
str = randstring(20)
@test filter(!isupper, str) == replace(str, r"[A-Z]" => "")
@test filter(!islower, str) == replace(str, r"[a-z]" => "")
end
# issue #19891
@testset "chained comparison" begin
B = 0 .< [1 -1 5] .< 3
@test B == [true false false]
B = 3 .> [1 -1 5] .> 0
@test B == [true false false]
end
struct TypeWrapper
t::Type
end
Base.:(<)(x::TypeWrapper, y::TypeWrapper) = (x.t <: y.t) & (x.t != y.t)
@testset "poset" begin
# Real
# / \
# Int Float64
# \ /
# Union{}
@test TypeWrapper(Int) <= TypeWrapper(Int)
@test TypeWrapper(Int) <= TypeWrapper(Real)
@test !(TypeWrapper(Int) <= TypeWrapper(Float64))
end
# issue #20355
@testset "mod1, fld1" begin
for T in [Int8, Int16, Int32, Int64],
x in T[typemin(T); typemin(T) + 1; -10:10; typemax(T)-1; typemax(T)],
y in T[typemin(T); typemin(T) + 1; -10:-1; 1:10; typemax(T)-1; typemax(T)]
m = mod1(x, y)
@test mod(x, y) == mod(m, y)
if y > 0
@test 0 < m <= y
else
@test y <= m < 0
end
if x == typemin(T) && y == -1
@test_throws DivideError fld1(x, y)
else
f = fld1(x, y)
@test (f - 1) * y + m == x
end
end
for T in [UInt8, UInt16, UInt32, UInt64],
x in T[0:10; typemax(T)-1; typemax(T)],
y in T[1:10; typemax(T)-1; typemax(T)]
m = mod1(x, y)
@test mod(x, y) == mod(m, y)
@test 0 < m <= y
f = fld1(x, y)
@test (f - 1) * y + m == x
end
for T in [Float32, Float64, Rational{Int64}],
x in T[k // 4 for k in -10:10],
y in T[k // 4 for k in [-10:-1; 1:10]]
m = mod1(x, y)
@test mod(x, y) == mod(m, y)
if y > 0
@test 0 < m <= y
else
@test y <= m < 0
end
f = fld1(x, y)
@test (f - 1) * y + m == x
end
@test fldmod1(4.0, 3) == fldmod1(4, 3)
end