Skip to content

Commit

Permalink
improve errors, add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
aplavin authored Feb 27, 2024
1 parent 6ef9f1b commit a3248c2
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/functionlenses.jl
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,16 @@ set(obj, ::typeof(Base.splat(=>)), val::Pair) = @set Tuple(obj) = Tuple(val)

set(obj, ::typeof(getproperties), val::NamedTuple) = setproperties(obj, val)

set(x::Union{Tuple,NamedTuple}, ::typeof(propertynames), names) =
function set(x::Union{Tuple,NamedTuple}, ::typeof(propertynames), names)
length(names) == length(x) || throw(ArgumentError("Got $(length(names)) for $(length(x)) properties"))
if eltype(names) === Symbol
NamedTuple{names}(Tuple(x))
elseif eltype(names) <: Integer && names == ntuple(identity, length(names))
Tuple(x)
else
error("invalid property names: $names")
throw(ArgumentError("invalid property names: $names"))
end
end

################################################################################
##### eltype
Expand Down
9 changes: 9 additions & 0 deletions test/test_functionlenses.jl
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,15 @@ end

test_getset_laws(Accessors.getproperties, 1+2im, (im=4., re=3.), (re=5, im=6); cmp=cmp)

@testset for obj in [(10, 20.), (x=10, y=20.)]
@test (@set propertynames(obj) == 1:2) === obj
@test (@set propertynames(obj) == (:a, :b)) === (a=10, b=20.)
@test_throws Exception (@set propertynames(obj) == 1:3)
@test_throws Exception (@set propertynames(obj) == (2, 3))
@test_throws Exception (@set propertynames(obj) == (:a, :b, :c))
@test_throws Exception (@set propertynames(obj) == (1, :b))
@test_throws Exception (@set propertynames(obj) == ("a", "b"))
end
test_getset_laws(propertynames, (10, 20.), (:a, :b), (1, 2); cmp=(===))
test_getset_laws(propertynames, (10, 20.), (1, 2), (:a, :b); cmp=(===))
test_getset_laws(propertynames, (a=10, b=20.), (:x, :y), (1, 2); cmp=(===))
Expand Down

0 comments on commit a3248c2

Please sign in to comment.