From 08e226a70be6f6ac3d924f85871139ae6c795f95 Mon Sep 17 00:00:00 2001 From: pedromxavier Date: Sun, 24 Sep 2023 05:30:24 -0400 Subject: [PATCH] Add tests for parser macro --- src/library/setup/parse.jl | 14 +-- test/assets/test_macro_throws.jl | 5 ++ test/runtests.jl | 2 + test/setup/setup.jl | 147 +++++++++++++++++++++++-------- 4 files changed, 123 insertions(+), 45 deletions(-) create mode 100644 test/assets/test_macro_throws.jl diff --git a/src/library/setup/parse.jl b/src/library/setup/parse.jl index 8e4a01b..6d2ba4d 100644 --- a/src/library/setup/parse.jl +++ b/src/library/setup/parse.jl @@ -1,13 +1,9 @@ -function __setup_parse() - return _SamplerSpec() -end - function __setup_parse(args...) setup_error("Macro takes 1 or 2 arguments, not '$(length(args))'") end function __setup_parse(expr) - if expr isa Symbol + if expr isa Symbol && Base.isidentifier(expr) return _SamplerSpec(; id = __setup_parse_id(expr)) elseif (expr isa Expr && expr.head === :block) return __setup_parse_block(expr) @@ -31,9 +27,7 @@ function __setup_parse(id, block) end function __setup_parse_block(block; id = :Optimizer) - if !(block.head === :block) - setup_error("Sampler configuration must be provided within a `begin ... end` block") - end + @assert (block isa Expr && block.head === :block) name = nothing version = nothing @@ -45,7 +39,7 @@ function __setup_parse_block(block; id = :Optimizer) elseif item isa Expr && item.head === :(=) key, value = item.args - if key isa Symbol + if key isa Symbol && Base.isidentifier(key) if key === :name if !isnothing(name) setup_error("Duplicate entries for 'name'") @@ -84,7 +78,7 @@ function __setup_parse_block(block; id = :Optimizer) ) end else - setup_error("Sampler configuration keys must be a valid identifiers") + setup_error("Sampler configuration keys must be valid identifiers, not '$key'") end else setup_error("Sampler configuration must be provided by `key = value` pairs") diff --git a/test/assets/test_macro_throws.jl b/test/assets/test_macro_throws.jl new file mode 100644 index 0000000..0adb248 --- /dev/null +++ b/test/assets/test_macro_throws.jl @@ -0,0 +1,5 @@ +macro test_macro_throws(error, expr) + return quote + @test_throws $(esc(error)) eval(@macroexpand $(esc(expr))) + end +end diff --git a/test/runtests.jl b/test/runtests.jl index f23b96c..a8e9056 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -4,6 +4,8 @@ using QUBODrivers: QUBOTools const VI = MOI.VariableIndex +include("assets/test_macro_throws.jl") + include("setup/setup.jl") include("drivers/sampler_bundle.jl") diff --git a/test/setup/setup.jl b/test/setup/setup.jl index d73a4da..2b4118a 100644 --- a/test/setup/setup.jl +++ b/test/setup/setup.jl @@ -15,44 +15,121 @@ end function test_setup_spec_parser() @testset "▶ Parser" begin - spec = @setup_spec Optimizer begin - name = "Super Sampler" - version = v"1.2.3" - attributes = begin - SuperAttribute("super_attr")::Union{Integer,Nothing} = nothing - UltraAttribute["ultra_attr"]::Union{String,Nothing} = "" - MegaAttribute = (1, 2, 3) - "simple_attr"::Float64 = 1.2 + @testset "→ Standard" begin + spec = @setup_spec Optimizer begin + name = "Super" * " " * "Sampler" + version = VersionNumber("1.2.3") + attributes = begin + SuperAttribute("super_attr")::Union{Integer,Nothing} = nothing + UltraAttribute["ultra_attr"]::Union{String,Nothing} = "" + MegaAttribute = (1, 2, 3) + "simple_attr"::Float64 = 1.2 + NormalAttribute("normal_attr") = [] + end end + + @test spec == QUBODrivers._SamplerSpec(; + id = :Optimizer, + name = :("Super" * " " * "Sampler"), + version = :(VersionNumber("1.2.3")), + attributes = [ + QUBODrivers._AttrSpec(; # + opt_attr = :SuperAttribute, + raw_attr = "super_attr", + val_type = :(Union{Integer,Nothing}), + default = quote nothing end, + ), + QUBODrivers._AttrSpec(; # + opt_attr = :UltraAttribute, + raw_attr = "ultra_attr", + val_type = :(Union{String,Nothing}), + default = "", + ), + QUBODrivers._AttrSpec(; # + opt_attr = :MegaAttribute, + default = :((1, 2, 3)) + ), + QUBODrivers._AttrSpec(; # + raw_attr = "simple_attr", + val_type = :(Float64), + default = 1.2, + ), + QUBODrivers._AttrSpec(; # + opt_attr = :NormalAttribute, + raw_attr = "normal_attr", + val_type = :Any, + default = quote [] end, + ), + ], + ) end - @test spec == QUBODrivers._SamplerSpec(; - id = :Optimizer, - name = "Super Sampler", - version = v"1.2.3", - attributes = [ - QUBODrivers._AttrSpec(; - opt_attr = :SuperAttribute, - raw_attr = "super_attr", - val_type = :(Union{Integer,Nothing}), - default = quote - nothing - end, - ), - QUBODrivers._AttrSpec(; - opt_attr = :UltraAttribute, - raw_attr = "ultra_attr", - val_type = :(Union{String,Nothing}), - default = "", - ), - QUBODrivers._AttrSpec(; opt_attr = :MegaAttribute, default = :((1, 2, 3))), - QUBODrivers._AttrSpec(; - raw_attr = "simple_attr", - val_type = :(Float64), - default = 1.2, - ), - ], - ) + @testset "→ Misuse" begin + # Empty macro call + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec() + + # Too many arguments + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, 1, 2, 3) + + # Invalid single argument + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(0) + + # Invalid arguments + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, 0) + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(0, begin end) + + # Invalid keys + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + key = "Optimizer" + end) + + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + ! = "Optimizer" + end) + + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + "Optimizer" + end) + + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + 0 => "Optimizer" + end) + + # Duplicate entries + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + name = "Optimizer" + version = VersionNumber("1.2.3") + name = "Optimizer" + end) + + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + version = v"1.2.3" + name = "Optimizer" + version = VersionNumber("1.2.3") + end) + + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + attributes = begin end + name = "Optimizer" + version = v"1.2.3" + attributes = begin end + end) + + # Invalid attribute block + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + attributes = 0 + name = "Optimizer" + version = v"1.2.3" + end) + + @test_macro_throws QUBODrivers.DriverSetupError @setup_spec(Optimizer, begin + attributes = begin + ! = 3 + end + name = "Optimizer" + version = v"1.2.3" + end) + end end return nothing