From a62759b32bb9002e995d55a2ab42945b97ea781f Mon Sep 17 00:00:00 2001 From: Micah Rufsvold Date: Sat, 10 Jun 2023 16:20:29 -0400 Subject: [PATCH 1/5] fix: check key values, not `get` return for haskey(k, orderedrobindict) --- src/ordered_robin_dict.jl | 6 +++--- test/test_ordered_robin_dict.jl | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ordered_robin_dict.jl b/src/ordered_robin_dict.jl index 917e1a84b..e8ee2fa99 100644 --- a/src/ordered_robin_dict.jl +++ b/src/ordered_robin_dict.jl @@ -305,10 +305,10 @@ julia> haskey(D, 'c') false ``` """ -Base.haskey(h::OrderedRobinDict, key) = (get(h.dict, key, -2) > 0) -Base.in(key, v::Base.KeySet{K,T}) where {K,T<:OrderedRobinDict{K}} = (get(v.dict, key, -1) >= 0) +Base.haskey(h::OrderedRobinDict, key) = key in h.keys +Base.in(key, v::Base.KeySet{K,T}) where {K,T<:OrderedRobinDict{K}} = key in v.dict.keys -""" +"""(get(h.dict, key, -2) > 0) getkey(collection, key, default) Return the key matching argument `key` if one exists in `collection`, otherwise return `default`. diff --git a/test/test_ordered_robin_dict.jl b/test/test_ordered_robin_dict.jl index 2a78fc7aa..842a1b75f 100644 --- a/test/test_ordered_robin_dict.jl +++ b/test/test_ordered_robin_dict.jl @@ -31,10 +31,10 @@ # access, modification for c in 'a':'z' - d[c] = c - 'a' + 1 + d[c] = c - 'a' - 2 end - @test (d['a'] += 1) == 2 + @test (d['a'] += 1) == -1 @test 'a' in keys(d) @test haskey(d, 'a') @test get(d, 'B', 0) == 0 @@ -42,11 +42,11 @@ @test getkey(d, 'B', nothing) == nothing @test !('B' in keys(d)) @test !haskey(d, 'B') - @test pop!(d, 'a') == 2 + @test pop!(d, 'a') == -1 @test collect(keys(d)) == collect('b':'z') - @test collect(values(d)) == collect(2:26) - @test collect(d) == [Pair(a,i) for (a,i) in zip('b':'z', 2:26)] + @test collect(values(d)) == collect(-1:23) + @test collect(d) == [Pair(a,i) for (a,i) in zip('b':'z', -1:23)] end @testset "convert" begin From 226a1cc74b9e9df83087942eb153b19fcd3dc90f Mon Sep 17 00:00:00 2001 From: Micah Rufsvold Date: Mon, 12 Jun 2023 13:59:26 -0400 Subject: [PATCH 2/5] Fix: use isequal in setindex! --- src/ordered_robin_dict.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ordered_robin_dict.jl b/src/ordered_robin_dict.jl index e8ee2fa99..f605589ba 100644 --- a/src/ordered_robin_dict.jl +++ b/src/ordered_robin_dict.jl @@ -132,7 +132,7 @@ function Base.setindex!(h::OrderedRobinDict{K, V}, v0, key0) where {K,V} else @assert haskey(h, key0) @inbounds orig_v = h.vals[index] - (orig_v != v0) && (@inbounds h.vals[index] = v0) + !isequal(orig_v, v0) && (@inbounds h.vals[index] = v0) end check_for_rehash(h) && rehash!(h) From 4356e0326095b976a46e89bf7f583e69b96ef8db Mon Sep 17 00:00:00 2001 From: Micah Rufsvold Date: Mon, 12 Jun 2023 14:15:15 -0400 Subject: [PATCH 3/5] re-fix: use `get` for `in keys()` but descend to the actual id-dict --- src/ordered_robin_dict.jl | 4 ++-- test/runtests.jl | 3 ++- test/test_ordered_robin_dict.jl | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ordered_robin_dict.jl b/src/ordered_robin_dict.jl index f605589ba..995854e76 100644 --- a/src/ordered_robin_dict.jl +++ b/src/ordered_robin_dict.jl @@ -305,8 +305,8 @@ julia> haskey(D, 'c') false ``` """ -Base.haskey(h::OrderedRobinDict, key) = key in h.keys -Base.in(key, v::Base.KeySet{K,T}) where {K,T<:OrderedRobinDict{K}} = key in v.dict.keys +Base.haskey(h::OrderedRobinDict, key) = (get(h.dict, key, -1) > 0) +Base.in(key, v::Base.KeySet{K,T}) where {K,T<:OrderedRobinDict{K}} = (get(v.dict.dict, key, -1) >= 0) """(get(h.dict, key, -2) > 0) getkey(collection, key, default) diff --git a/test/runtests.jl b/test/runtests.jl index 33927d2a4..d44fe5bc5 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -8,7 +8,8 @@ import DataStructures: IntSet @test [] == detect_ambiguities(Core, DataStructures) @test [] == detect_ambiguities(Base, DataStructures) -tests = ["deprecations", +tests = [ + "deprecations", "int_set", "sparse_int_set", "deque", diff --git a/test/test_ordered_robin_dict.jl b/test/test_ordered_robin_dict.jl index 842a1b75f..b7906f5d0 100644 --- a/test/test_ordered_robin_dict.jl +++ b/test/test_ordered_robin_dict.jl @@ -139,6 +139,8 @@ @test h["a","b"] == h[("a","b")] == 4 h["a","b","c"] = 4 @test h["a","b","c"] == h[("a","b","c")] == 4 + h["b"] = missing + @test 5 == (h["b"] = 5) end @testset "KeyError" begin From 16dbe8a55319c72577a81a45a6584d4eb398e0ed Mon Sep 17 00:00:00 2001 From: Micah Rufsvold Date: Mon, 12 Jun 2023 15:58:00 -0400 Subject: [PATCH 4/5] Remove accidental paste in docstring --- src/ordered_robin_dict.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ordered_robin_dict.jl b/src/ordered_robin_dict.jl index 995854e76..141a5f757 100644 --- a/src/ordered_robin_dict.jl +++ b/src/ordered_robin_dict.jl @@ -308,7 +308,7 @@ false Base.haskey(h::OrderedRobinDict, key) = (get(h.dict, key, -1) > 0) Base.in(key, v::Base.KeySet{K,T}) where {K,T<:OrderedRobinDict{K}} = (get(v.dict.dict, key, -1) >= 0) -"""(get(h.dict, key, -2) > 0) +""" getkey(collection, key, default) Return the key matching argument `key` if one exists in `collection`, otherwise return `default`. From 8a62058dadead66d723f12b05160a27c7da21b78 Mon Sep 17 00:00:00 2001 From: Micah Rufsvold Date: Thu, 22 Jun 2023 05:13:38 -0400 Subject: [PATCH 5/5] consolidate tests for issue under testset --- test/test_ordered_robin_dict.jl | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/test_ordered_robin_dict.jl b/test/test_ordered_robin_dict.jl index b7906f5d0..79efa6572 100644 --- a/test/test_ordered_robin_dict.jl +++ b/test/test_ordered_robin_dict.jl @@ -31,10 +31,10 @@ # access, modification for c in 'a':'z' - d[c] = c - 'a' - 2 + d[c] = c - 'a' + 1 end - @test (d['a'] += 1) == -1 + @test (d['a'] += 1) == 2 @test 'a' in keys(d) @test haskey(d, 'a') @test get(d, 'B', 0) == 0 @@ -42,11 +42,11 @@ @test getkey(d, 'B', nothing) == nothing @test !('B' in keys(d)) @test !haskey(d, 'B') - @test pop!(d, 'a') == -1 + @test pop!(d, 'a') == 2 @test collect(keys(d)) == collect('b':'z') - @test collect(values(d)) == collect(-1:23) - @test collect(d) == [Pair(a,i) for (a,i) in zip('b':'z', -1:23)] + @test collect(values(d)) == collect(2:26) + @test collect(d) == [Pair(a,i) for (a,i) in zip('b':'z', 2:26)] end @testset "convert" begin @@ -78,6 +78,13 @@ @test od60[14] == 15 end + @testset "Fixes issue 857" begin + h = OrderedRobinDict{Any,Any}([("a", missing), ("b", -2)]) + @test 5 == (h["a"] = 5) + @test "b" in keys(h) + @test haskey(h,"b") + end + # ############################# # Copied and modified from Base/test/dict.jl @@ -139,8 +146,6 @@ @test h["a","b"] == h[("a","b")] == 4 h["a","b","c"] = 4 @test h["a","b","c"] == h[("a","b","c")] == 4 - h["b"] = missing - @test 5 == (h["b"] = 5) end @testset "KeyError" begin