|
1 | 1 | using Test, DataAPI
|
2 | 2 |
|
| 3 | +const ≅ = isequal |
| 4 | + |
| 5 | +# For `levels` tests |
| 6 | +struct TestArray{T} <: AbstractVector{T} |
| 7 | + x::Vector{T} |
| 8 | +end |
| 9 | +Base.size(x::TestArray) = size(x.x) |
| 10 | +Base.getindex(x::TestArray, i) = x.x[i] |
| 11 | +DataAPI.levels(x::TestArray) = reverse(DataAPI.levels(x.x)) |
| 12 | + |
3 | 13 | @testset "DataAPI" begin
|
4 | 14 |
|
5 | 15 | @testset "defaultarray" begin
|
|
29 | 39 |
|
30 | 40 | @testset "levels" begin
|
31 | 41 |
|
32 |
| - @test DataAPI.levels(1:1) == |
33 |
| - DataAPI.levels([1]) == |
34 |
| - DataAPI.levels([1, missing]) == |
35 |
| - DataAPI.levels([missing, 1]) == |
| 42 | + @test @inferred(DataAPI.levels(1:1)) == |
| 43 | + @inferred(DataAPI.levels([1])) == |
| 44 | + @inferred(DataAPI.levels([1, missing])) == |
| 45 | + @inferred(DataAPI.levels([missing, 1])) == |
36 | 46 | [1]
|
37 |
| - @test DataAPI.levels(2:-1:1) == |
38 |
| - DataAPI.levels([2, 1]) == |
39 |
| - DataAPI.levels(Any[2, 1]) == |
40 |
| - DataAPI.levels([2, missing, 1]) == |
| 47 | + @test @inferred(DataAPI.levels(2:-1:1)) == |
| 48 | + @inferred(DataAPI.levels([2, 1])) == |
| 49 | + @inferred(DataAPI.levels(Any[2, 1])) == |
| 50 | + @inferred(DataAPI.levels([2, missing, 1])) == |
41 | 51 | [1, 2]
|
42 | 52 | @test DataAPI.levels([missing, "a", "c", missing, "b"]) == ["a", "b", "c"]
|
43 | 53 | @test DataAPI.levels([Complex(0, 1), Complex(1, 0), missing]) ==
|
|
55 | 65 | @test isempty(DataAPI.levels([missing]))
|
56 | 66 | @test isempty(DataAPI.levels([]))
|
57 | 67 |
|
| 68 | + levels_missing(x) = DataAPI.levels(x, skipmissing=false) |
| 69 | + @test @inferred(levels_missing(1:1)) ≅ |
| 70 | + @inferred(levels_missing([1])) ≅ |
| 71 | + [1] |
| 72 | + if VERSION >= v"1.6.0" |
| 73 | + @test @inferred(levels_missing([1, missing])) ≅ |
| 74 | + @inferred(levels_missing([missing, 1])) ≅ |
| 75 | + [1, missing] |
| 76 | + else |
| 77 | + @test levels_missing([1, missing]) ≅ |
| 78 | + levels_missing([missing, 1]) ≅ |
| 79 | + [1, missing] |
| 80 | + end |
| 81 | + @test @inferred(levels_missing(2:-1:1)) ≅ |
| 82 | + @inferred(levels_missing([2, 1])) ≅ |
| 83 | + [1, 2] |
| 84 | + @test @inferred(levels_missing(Any[2, 1])) ≅ |
| 85 | + [1, 2] |
| 86 | + @test DataAPI.levels([2, missing, 1], skipmissing=false) ≅ |
| 87 | + [1, 2, missing] |
| 88 | + @test DataAPI.levels([missing, "a", "c", missing, "b"], skipmissing=false) ≅ |
| 89 | + ["a", "b", "c", missing] |
| 90 | + @test DataAPI.levels([Complex(0, 1), Complex(1, 0), missing], skipmissing=false) ≅ |
| 91 | + [Complex(0, 1), Complex(1, 0), missing] |
| 92 | + @test typeof(DataAPI.levels([1], skipmissing=false)) === Vector{Int} |
| 93 | + @test typeof(DataAPI.levels([1, missing], skipmissing=false)) === |
| 94 | + Vector{Union{Int, Missing}} |
| 95 | + @test typeof(DataAPI.levels(["a"], skipmissing=false)) === Vector{String} |
| 96 | + @test typeof(DataAPI.levels(["a", missing], skipmissing=false)) === |
| 97 | + Vector{Union{String, Missing}} |
| 98 | + @test typeof(DataAPI.levels(Real[1], skipmissing=false)) === Vector{Real} |
| 99 | + @test typeof(DataAPI.levels(Union{Real,Missing}[1, missing], skipmissing=false)) === |
| 100 | + Vector{Union{Real, Missing}} |
| 101 | + @test typeof(DataAPI.levels(trues(1), skipmissing=false)) === Vector{Bool} |
| 102 | + @test DataAPI.levels([missing], skipmissing=false) ≅ [missing] |
| 103 | + @test DataAPI.levels([missing], skipmissing=false) isa Vector{Missing} |
| 104 | + @test typeof(DataAPI.levels(Union{Int,Missing}[missing], skipmissing=false)) === |
| 105 | + Vector{Union{Int,Missing}} |
| 106 | + @test isempty(DataAPI.levels([], skipmissing=false)) |
| 107 | + @test typeof(DataAPI.levels(Int[], skipmissing=false)) === Vector{Int} |
| 108 | + |
| 109 | + # Backward compatibility test: |
| 110 | + # check that an array type which implements a `levels` method |
| 111 | + # which does not accept keyword arguments works thanks to fallbacks |
| 112 | + @test DataAPI.levels(TestArray([1, 2])) == |
| 113 | + DataAPI.levels(TestArray([1, 2]), skipmissing=true) == |
| 114 | + DataAPI.levels(TestArray([1, 2]), skipmissing=false) == [2, 1] |
| 115 | + @test DataAPI.levels(TestArray([1, 2])) isa Vector{Int} |
| 116 | + @test DataAPI.levels(TestArray([1, 2]), skipmissing=true) isa Vector{Int} |
| 117 | + @test DataAPI.levels(TestArray([1, 2]), skipmissing=false) isa Vector{Int} |
| 118 | + @test DataAPI.levels(TestArray([missing, 1, 2])) == |
| 119 | + DataAPI.levels(TestArray([missing, 1, 2]), skipmissing=true) == [2, 1] |
| 120 | + @test DataAPI.levels(TestArray([missing, 1, 2]), skipmissing=false) ≅ |
| 121 | + [2, 1, missing] |
| 122 | + @test DataAPI.levels(TestArray([missing, 1, 2])) isa Vector{Int} |
| 123 | + @test DataAPI.levels(TestArray([missing, 1, 2]), skipmissing=true) isa |
| 124 | + Vector{Int} |
| 125 | + @test DataAPI.levels(TestArray([missing, 1, 2]), skipmissing=false) isa |
| 126 | + Vector{Union{Int, Missing}} |
58 | 127 | end
|
59 | 128 |
|
60 | 129 | @testset "Between" begin
|
|
0 commit comments