Browse Source

Apply Runic.jl formatting.

pull/8/head
Fredrik Ekre 12 months ago
parent
commit
e7920eacd8
No known key found for this signature in database
GPG Key ID: DE82E6D5E364C0A2
  1. 18
      src/EnumX.jl
  2. 334
      test/runtests.jl

18
src/EnumX.jl

@ -61,7 +61,7 @@ function enumx(_module_, args)
syms = args syms = args
end end
name_value_map = Vector{Pair{Symbol, baseT}}() name_value_map = Vector{Pair{Symbol, baseT}}()
doc_entries = Vector{Pair{Symbol,Expr}}() doc_entries = Vector{Pair{Symbol, Expr}}()
next = zero(baseT) next = zero(baseT)
first = true first = true
for s in syms for s in syms
@ -117,7 +117,7 @@ function enumx(_module_, args)
next += oneunit(baseT) next += oneunit(baseT)
first = false first = false
end end
value_name_map = Dict{baseT,Symbol}(v => k for (k, v) in reverse(name_value_map)) value_name_map = Dict{baseT, Symbol}(v => k for (k, v) in reverse(name_value_map))
module_block = quote module_block = quote
primitive type $(T) <: Enum{$(baseT)} $(sizeof(baseT) * 8) end primitive type $(T) <: Enum{$(baseT)} $(sizeof(baseT) * 8) end
let value_name_map = $(value_name_map) let value_name_map = $(value_name_map)
@ -129,12 +129,13 @@ function enumx(_module_, args)
end end
Base.Enums.namemap(::Base.Type{$(esc(T))}) = value_name_map Base.Enums.namemap(::Base.Type{$(esc(T))}) = value_name_map
Base.Enums.instances(::Base.Type{$(esc(T))}) = Base.Enums.instances(::Base.Type{$(esc(T))}) =
($([esc(k) for (k,v) in name_value_map]...),) ($([esc(k) for (k, v) in name_value_map]...),)
EnumX.symbol_map(::Base.Type{$(esc(T))}) = $(name_value_map) EnumX.symbol_map(::Base.Type{$(esc(T))}) = $(name_value_map)
end end
end end
for (k, v) in name_value_map for (k, v) in name_value_map
push!(module_block.args, push!(
module_block.args,
Expr(:const, Expr(:(=), esc(k), Expr(:call, esc(T), v))) Expr(:const, Expr(:(=), esc(k), Expr(:call, esc(T), v)))
) )
end end
@ -148,7 +149,7 @@ function enumx(_module_, args)
return Expr(:toplevel, Expr(:module, false, esc(modname), module_block), mdoc, #=Tdoc,=# nothing) return Expr(:toplevel, Expr(:module, false, esc(modname), module_block), mdoc, #=Tdoc,=# nothing)
end end
function Base.show(io::IO, ::MIME"text/plain", x::E) where E <: Enum function Base.show(io::IO, ::MIME"text/plain", x::E) where {E <: Enum}
iob = IOBuffer() iob = IOBuffer()
ix = Integer(x) ix = Integer(x)
found = false found = false
@ -165,7 +166,7 @@ function Base.show(io::IO, ::MIME"text/plain", x::E) where E <: Enum
write(io, seekstart(iob)) write(io, seekstart(iob))
return nothing return nothing
end end
function Base.show(io::IO, ::MIME"text/plain", ::Type{E}) where E <: Enum function Base.show(io::IO, ::MIME"text/plain", ::Type{E}) where {E <: Enum}
if !isconcretetype(E) # handle EnumX.Enum and EnumX.Enum{T} if !isconcretetype(E) # handle EnumX.Enum and EnumX.Enum{T}
invoke(show, Tuple{IO, Type}, io, E) invoke(show, Tuple{IO, Type}, io, E)
return return
@ -177,9 +178,10 @@ function Base.show(io::IO, ::MIME"text/plain", ::Type{E}) where E <: Enum
string("$(nameof(parentmodule(E))).", k) => v for (k, v) in symbol_map(E) string("$(nameof(parentmodule(E))).", k) => v for (k, v) in symbol_map(E)
] ]
mx = maximum(x -> textwidth(x.first), stringmap; init = 0) mx = maximum(x -> textwidth(x.first), stringmap; init = 0)
print(iob, print(
iob,
"Enum type $(nameof(parentmodule(E))).$(nameof(E)) <: ", "Enum type $(nameof(parentmodule(E))).$(nameof(E)) <: ",
"Enum{$(Base.Enums.basetype(E))} with $(n) instance$(n == 1 ? "" : "s")$(n>0 ? ":" : "")" "Enum{$(Base.Enums.basetype(E))} with $(n) instance$(n == 1 ? "" : "s")$(n > 0 ? ":" : "")"
) )
for (k, v) in stringmap for (k, v) in stringmap
print(iob, "\n ", rpad(k, mx), " = ") print(iob, "\n ", rpad(k, mx), " = ")

334
test/runtests.jl

@ -9,45 +9,45 @@ const Ananab = -1
@testset "EnumX" begin @testset "EnumX" begin
# Basic # Basic
@enumx Fruit Apple Banana @enumx Fruit Apple Banana
@test Fruit isa Module @test Fruit isa Module
@test Set(names(Fruit)) == Set([:Fruit]) @test Set(names(Fruit)) == Set([:Fruit])
@test_broken Set(names(Fruit; all=true)) == Set([:Fruit, :Apple, :Banana, :T]) @test_broken Set(names(Fruit; all = true)) == Set([:Fruit, :Apple, :Banana, :T])
@test issubset(Set([:Fruit, :Apple, :Banana, :T]), Set(names(Fruit; all=true))) @test issubset(Set([:Fruit, :Apple, :Banana, :T]), Set(names(Fruit; all = true)))
@test Fruit.T <: EnumX.Enum{Int32} <: Base.Enum{Int32} @test Fruit.T <: EnumX.Enum{Int32} <: Base.Enum{Int32}
@test !@isdefined(Apple) @test !@isdefined(Apple)
@test !@isdefined(Banana) @test !@isdefined(Banana)
@test Fruit.Apple isa EnumX.Enum @test Fruit.Apple isa EnumX.Enum
@test Fruit.Apple isa Base.Enum @test Fruit.Apple isa Base.Enum
@test Fruit.Banana isa EnumX.Enum @test Fruit.Banana isa EnumX.Enum
@test Fruit.Banana isa Base.Enum @test Fruit.Banana isa Base.Enum
@test instances(Fruit.T) === (Fruit.Apple, Fruit.Banana) @test instances(Fruit.T) === (Fruit.Apple, Fruit.Banana)
@test Base.Enums.namemap(Fruit.T) == Dict{Int32,Symbol}(0 => :Apple, 1 => :Banana) @test Base.Enums.namemap(Fruit.T) == Dict{Int32, Symbol}(0 => :Apple, 1 => :Banana)
@test Base.Enums.basetype(Fruit.T) == Int32 @test Base.Enums.basetype(Fruit.T) == Int32
@test Symbol(Fruit.Apple) === :Apple @test Symbol(Fruit.Apple) === :Apple
@test Symbol(Fruit.Banana) === :Banana @test Symbol(Fruit.Banana) === :Banana
@test Integer(Fruit.Apple) === Int32(0) @test Integer(Fruit.Apple) === Int32(0)
@test Int(Fruit.Apple) === Int(0) @test Int(Fruit.Apple) === Int(0)
@test Integer(Fruit.Banana) === Int32(1) @test Integer(Fruit.Banana) === Int32(1)
@test Int(Fruit.Banana) === Int(1) @test Int(Fruit.Banana) === Int(1)
@test Fruit.Apple === Fruit.Apple @test Fruit.Apple === Fruit.Apple
@test Fruit.Banana === Fruit.Banana @test Fruit.Banana === Fruit.Banana
@test Fruit.T(Int32(0)) === Fruit.T(0) === Fruit.Apple @test Fruit.T(Int32(0)) === Fruit.T(0) === Fruit.Apple
@test Fruit.T(Int32(1)) === Fruit.T(1) === Fruit.Banana @test Fruit.T(Int32(1)) === Fruit.T(1) === Fruit.Banana
@test_throws ArgumentError("invalid value for Enum Fruit: 123.") Fruit.T(Int32(123)) @test_throws ArgumentError("invalid value for Enum Fruit: 123.") Fruit.T(Int32(123))
@test_throws ArgumentError("invalid value for Enum Fruit: 123.") Fruit.T(123) @test_throws ArgumentError("invalid value for Enum Fruit: 123.") Fruit.T(123)
@test Fruit.Apple < Fruit.Banana @test Fruit.Apple < Fruit.Banana
let io = IOBuffer() let io = IOBuffer()
write(io, Fruit.Apple) write(io, Fruit.Apple)
seekstart(io) seekstart(io)
@test read(io, Fruit.T) === Fruit.Apple @test read(io, Fruit.T) === Fruit.Apple
@ -59,9 +59,9 @@ let io = IOBuffer()
write(io, Int32(123)) write(io, Int32(123))
seekstart(io) seekstart(io)
@test_throws ArgumentError("invalid value for Enum Fruit: 123.") read(io, Fruit.T) @test_throws ArgumentError("invalid value for Enum Fruit: 123.") read(io, Fruit.T)
end end
let io = IOBuffer() let io = IOBuffer()
show(io, "text/plain", Fruit.T) show(io, "text/plain", Fruit.T)
str = String(take!(io)) str = String(take!(io))
@test str == "Enum type Fruit.T <: Enum{Int32} with 2 instances:\n Fruit.Apple = 0\n Fruit.Banana = 1" @test str == "Enum type Fruit.T <: Enum{Int32} with 2 instances:\n Fruit.Apple = 0\n Fruit.Banana = 1"
@ -77,20 +77,20 @@ let io = IOBuffer()
show(io, "text/plain", EnumX.Enum{Int32}) show(io, "text/plain", EnumX.Enum{Int32})
str = String(take!(io)) str = String(take!(io))
@test str == "EnumX.Enum{Int32}" @test str == "EnumX.Enum{Int32}"
end end
# Base type specification # Base type specification
@enumx Fruit8::Int8 Apple @enumx Fruit8::Int8 Apple
@test Fruit8.T <: EnumX.Enum{Int8} <: Base.Enum{Int8} @test Fruit8.T <: EnumX.Enum{Int8} <: Base.Enum{Int8}
@test Base.Enums.basetype(Fruit8.T) === Int8 @test Base.Enums.basetype(Fruit8.T) === Int8
@test Integer(Fruit8.Apple) === Int8(0) @test Integer(Fruit8.Apple) === Int8(0)
@enumx FruitU8::UInt8 Apple Banana # no overflow even if first is typemin(T) @enumx FruitU8::UInt8 Apple Banana # no overflow even if first is typemin(T)
@test Base.Enums.basetype(FruitU8.T) === UInt8 @test Base.Enums.basetype(FruitU8.T) === UInt8
@test FruitU8.Apple === FruitU8.T(0) @test FruitU8.Apple === FruitU8.T(0)
let io = IOBuffer() let io = IOBuffer()
show(io, "text/plain", FruitU8.T) show(io, "text/plain", FruitU8.T)
str = String(take!(io)) str = String(take!(io))
@test str == "Enum type FruitU8.T <: Enum{UInt8} with 2 instances:\n FruitU8.Apple = 0x00\n FruitU8.Banana = 0x01" @test str == "Enum type FruitU8.T <: Enum{UInt8} with 2 instances:\n FruitU8.Apple = 0x00\n FruitU8.Banana = 0x01"
@ -100,111 +100,111 @@ let io = IOBuffer()
show(io, "text/plain", FruitU8.Banana) show(io, "text/plain", FruitU8.Banana)
str = String(take!(io)) str = String(take!(io))
@test str == "FruitU8.Banana = 0x01" @test str == "FruitU8.Banana = 0x01"
end end
@enumx Fruit16::T16 Apple @enumx Fruit16::T16 Apple
@test Fruit16.T <: EnumX.Enum{Int16} <: Base.Enum{Int16} @test Fruit16.T <: EnumX.Enum{Int16} <: Base.Enum{Int16}
@test Base.Enums.basetype(Fruit16.T) === Int16 @test Base.Enums.basetype(Fruit16.T) === Int16
@test Integer(Fruit16.Apple) === Int16(0) @test Integer(Fruit16.Apple) === Int16(0)
@enumx Fruit64::getInt64() Apple @enumx Fruit64::getInt64() Apple
@test Fruit64.T <: EnumX.Enum{Int64} <: Base.Enum{Int64} @test Fruit64.T <: EnumX.Enum{Int64} <: Base.Enum{Int64}
@test Base.Enums.basetype(Fruit64.T) === Int64 @test Base.Enums.basetype(Fruit64.T) === Int64
@test Integer(Fruit64.Apple) == Int64(0) @test Integer(Fruit64.Apple) == Int64(0)
try try
@macroexpand @enumx (Fr + uit) Apple @macroexpand @enumx (Fr + uit) Apple
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "invalid EnumX.@enumx type specification: Fr + uit." @test err.msg == "invalid EnumX.@enumx type specification: Fr + uit."
end end
# Block syntax # Block syntax
@enumx FruitBlock begin @enumx FruitBlock begin
Apple Apple
Banana Banana
end end
@test FruitBlock.T <: EnumX.Enum{Int32} <: Base.Enum{Int32} @test FruitBlock.T <: EnumX.Enum{Int32} <: Base.Enum{Int32}
@test FruitBlock.Apple === FruitBlock.T(0) @test FruitBlock.Apple === FruitBlock.T(0)
@test FruitBlock.Banana === FruitBlock.T(1) @test FruitBlock.Banana === FruitBlock.T(1)
@enumx FruitBlock8::Int8 begin @enumx FruitBlock8::Int8 begin
Apple Apple
Banana Banana
end end
@test FruitBlock8.T <: EnumX.Enum{Int8} <: Base.Enum{Int8} @test FruitBlock8.T <: EnumX.Enum{Int8} <: Base.Enum{Int8}
@test FruitBlock8.Apple === FruitBlock8.T(0) @test FruitBlock8.Apple === FruitBlock8.T(0)
@test FruitBlock8.Banana === FruitBlock8.T(1) @test FruitBlock8.Banana === FruitBlock8.T(1)
# Custom values # Custom values
@enumx FruitValues Apple = 1 Banana = (1 + 2) Orange @enumx FruitValues Apple = 1 Banana = (1 + 2) Orange
@test FruitValues.Apple === FruitValues.T(1) @test FruitValues.Apple === FruitValues.T(1)
@test FruitValues.Banana === FruitValues.T(3) @test FruitValues.Banana === FruitValues.T(3)
@test FruitValues.Orange === FruitValues.T(4) @test FruitValues.Orange === FruitValues.T(4)
@enumx FruitValues8::Int8 Apple = -1 Banana = (1 + 2) Orange @enumx FruitValues8::Int8 Apple = -1 Banana = (1 + 2) Orange
@test FruitValues8.Apple === FruitValues8.T(-1) @test FruitValues8.Apple === FruitValues8.T(-1)
@test FruitValues8.Banana === FruitValues8.T(3) @test FruitValues8.Banana === FruitValues8.T(3)
@test FruitValues8.Orange === FruitValues8.T(4) @test FruitValues8.Orange === FruitValues8.T(4)
@enumx FruitValuesBlock begin @enumx FruitValuesBlock begin
Apple = sum((1, 2, 3)) Apple = sum((1, 2, 3))
Banana Banana
end end
@test FruitValuesBlock.Apple === FruitValuesBlock.T(6) @test FruitValuesBlock.Apple === FruitValuesBlock.T(6)
@test FruitValuesBlock.Banana === FruitValuesBlock.T(7) @test FruitValuesBlock.Banana === FruitValuesBlock.T(7)
try try
@macroexpand @enumx Fruit::Int8 Apple=typemax(Int8) Banana @macroexpand @enumx Fruit::Int8 Apple = typemax(Int8) Banana
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "value overflow for Enum Fruit: Fruit.Banana = -128." @test err.msg == "value overflow for Enum Fruit: Fruit.Banana = -128."
end end
try try
@macroexpand @enumx Fruit::Int8 Apple="apple" @macroexpand @enumx Fruit::Int8 Apple = "apple"
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "invalid value for Enum Fruit{Int8}: Fruit.Apple = \"apple\"." @test err.msg == "invalid value for Enum Fruit{Int8}: Fruit.Apple = \"apple\"."
end end
try try
@macroexpand @enumx Fruit::Int8 Apple=128 @macroexpand @enumx Fruit::Int8 Apple = 128
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "invalid value for Enum Fruit{Int8}: Fruit.Apple = 128." @test err.msg == "invalid value for Enum Fruit{Int8}: Fruit.Apple = 128."
end end
try try
@macroexpand @enumx Fruit::Int8 Apple() @macroexpand @enumx Fruit::Int8 Apple()
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "invalid EnumX.@enumx entry: Apple()" @test err.msg == "invalid EnumX.@enumx entry: Apple()"
end end
try try
@macroexpand @enumx Fruit Apple Apple @macroexpand @enumx Fruit Apple Apple
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "duplicate name for Enum Fruit: Fruit.Apple = 1, name already used for Fruit.Apple = 0." @test err.msg == "duplicate name for Enum Fruit: Fruit.Apple = 1, name already used for Fruit.Apple = 0."
end end
# Duplicate values # Duplicate values
@enumx FruitDup Apple=0 Banana=0 @enumx FruitDup Apple = 0 Banana = 0
@test FruitDup.Apple === FruitDup.Banana === FruitDup.T(0) @test FruitDup.Apple === FruitDup.Banana === FruitDup.T(0)
let io = IOBuffer() let io = IOBuffer()
show(io, "text/plain", FruitDup.T) show(io, "text/plain", FruitDup.T)
str = String(take!(io)) str = String(take!(io))
@test str == "Enum type FruitDup.T <: Enum{Int32} with 2 instances:\n FruitDup.Apple = 0\n FruitDup.Banana = 0" @test str == "Enum type FruitDup.T <: Enum{Int32} with 2 instances:\n FruitDup.Apple = 0\n FruitDup.Banana = 0"
@ -214,70 +214,70 @@ let io = IOBuffer()
show(io, "text/plain", FruitDup.Banana) show(io, "text/plain", FruitDup.Banana)
str = String(take!(io)) str = String(take!(io))
@test str == "FruitDup.Apple = FruitDup.Banana = 0" @test str == "FruitDup.Apple = FruitDup.Banana = 0"
end end
# Initialize with previous instance name # Initialize with previous instance name
@enumx FruitPrev Elppa Banana=Elppa Orange=Ananab @enumx FruitPrev Elppa Banana = Elppa Orange = Ananab
@test FruitPrev.Elppa === FruitPrev.Banana === FruitPrev.T(0) @test FruitPrev.Elppa === FruitPrev.Banana === FruitPrev.T(0)
@test FruitPrev.Orange === FruitPrev.T(-1) @test FruitPrev.Orange === FruitPrev.T(-1)
# Custom typename # Custom typename
@enumx T=Typ FruitT Apple Banana @enumx T = Typ FruitT Apple Banana
@test isdefined(FruitT, :Typ) @test isdefined(FruitT, :Typ)
@test !isdefined(FruitT, :T) @test !isdefined(FruitT, :T)
@test FruitT.Typ <: EnumX.Enum @test FruitT.Typ <: EnumX.Enum
@test FruitT.Apple === FruitT.Typ(0) @test FruitT.Apple === FruitT.Typ(0)
let io = IOBuffer() let io = IOBuffer()
show(io, "text/plain", FruitT.Typ) show(io, "text/plain", FruitT.Typ)
str = String(take!(io)) str = String(take!(io))
@test str == "Enum type FruitT.Typ <: Enum{Int32} with 2 instances:\n FruitT.Apple = 0\n FruitT.Banana = 1" @test str == "Enum type FruitT.Typ <: Enum{Int32} with 2 instances:\n FruitT.Apple = 0\n FruitT.Banana = 1"
end end
# Custom typename with quoted symbol # Custom typename with quoted symbol
@enumx T=:Typ FruitST Apple Banana @enumx T = :Typ FruitST Apple Banana
@test isdefined(FruitST, :Typ) @test isdefined(FruitST, :Typ)
@test !isdefined(FruitST, :T) @test !isdefined(FruitST, :T)
@test FruitST.Typ <: EnumX.Enum @test FruitST.Typ <: EnumX.Enum
@test FruitST.Apple === FruitST.Typ(0) @test FruitST.Apple === FruitST.Typ(0)
try try
@macroexpand @enumx T=Apple Fruit Apple @macroexpand @enumx T = Apple Fruit Apple
error() error()
catch err catch err
err isa LoadError && (err = err.error) err isa LoadError && (err = err.error)
@test err isa ArgumentError @test err isa ArgumentError
@test err.msg == "instance name Fruit.Apple reserved for the Enum typename." @test err.msg == "instance name Fruit.Apple reserved for the Enum typename."
end end
# Empty enum # Empty enum
@enumx FruitEmpty @enumx FruitEmpty
@test instances(FruitEmpty.T) == () @test instances(FruitEmpty.T) == ()
let io = IOBuffer() let io = IOBuffer()
show(io, "text/plain", FruitEmpty.T) show(io, "text/plain", FruitEmpty.T)
str = String(take!(io)) str = String(take!(io))
@test str == "Enum type FruitEmpty.T <: Enum{Int32} with 0 instances" @test str == "Enum type FruitEmpty.T <: Enum{Int32} with 0 instances"
end end
@enumx T=Typ FruitEmptyT @enumx T = Typ FruitEmptyT
@test instances(FruitEmptyT.Typ) == () @test instances(FruitEmptyT.Typ) == ()
# Showing invalid instances # Showing invalid instances
@enumx Invalid A @enumx Invalid A
let io = IOBuffer() let io = IOBuffer()
invalid = Base.bitcast(Invalid.T, Int32(1)) invalid = Base.bitcast(Invalid.T, Int32(1))
show(io, "text/plain", invalid) show(io, "text/plain", invalid)
str = String(take!(io)) str = String(take!(io))
@test str == "Invalid.#invalid# = 1" @test str == "Invalid.#invalid# = 1"
end end
# Documented type (module) and instances # Documented type (module) and instances
begin begin
""" """
Documentation for FruitDoc Documentation for FruitDoc
""" """
@ -294,38 +294,38 @@ begin
@eval const LINENUMBER = $(@__LINE__) @eval const LINENUMBER = $(@__LINE__)
@eval const FILENAME = $(@__FILE__) @eval const FILENAME = $(@__FILE__)
@eval const MODULE = $(@__MODULE__) @eval const MODULE = $(@__MODULE__)
end end
function get_doc_metadata(mod, s) function get_doc_metadata(mod, s)
Base.Docs.meta(mod)[Base.Docs.Binding(mod, s)].docs[Union{}].data Base.Docs.meta(mod)[Base.Docs.Binding(mod, s)].docs[Union{}].data
end end
@test FruitDoc.Apple === FruitDoc.T(0) @test FruitDoc.Apple === FruitDoc.T(0)
@test FruitDoc.Banana === FruitDoc.T(2) @test FruitDoc.Banana === FruitDoc.T(2)
@test FruitDoc.Orange === FruitDoc.T(0) @test FruitDoc.Orange === FruitDoc.T(0)
mod_doc = @doc(FruitDoc) mod_doc = @doc(FruitDoc)
@test sprint(show, mod_doc) == "Documentation for FruitDoc\n" @test sprint(show, mod_doc) == "Documentation for FruitDoc\n"
mod_doc_data = get_doc_metadata(FruitDoc, :FruitDoc) mod_doc_data = get_doc_metadata(FruitDoc, :FruitDoc)
@test mod_doc_data[:linenumber] == LINENUMBER - 13 @test mod_doc_data[:linenumber] == LINENUMBER - 13
@test mod_doc_data[:path] == FILENAME @test mod_doc_data[:path] == FILENAME
@test mod_doc_data[:module] == MODULE @test mod_doc_data[:module] == MODULE
apple_doc = @doc(FruitDoc.Apple) apple_doc = @doc(FruitDoc.Apple)
@test sprint(show, apple_doc) == "Apple documentation.\n" @test sprint(show, apple_doc) == "Apple documentation.\n"
apple_doc_data = get_doc_metadata(FruitDoc, :Apple) apple_doc_data = get_doc_metadata(FruitDoc, :Apple)
@test apple_doc_data[:linenumber] == LINENUMBER - 9 @test apple_doc_data[:linenumber] == LINENUMBER - 9
@test apple_doc_data[:path] == FILENAME @test apple_doc_data[:path] == FILENAME
@test apple_doc_data[:module] == FruitDoc @test apple_doc_data[:module] == FruitDoc
banana_doc = @doc(FruitDoc.Banana) banana_doc = @doc(FruitDoc.Banana)
@test sprint(show, banana_doc) == "Banana documentation on multiple lines.\n" @test sprint(show, banana_doc) == "Banana documentation on multiple lines.\n"
banana_doc_data = get_doc_metadata(FruitDoc, :Banana) banana_doc_data = get_doc_metadata(FruitDoc, :Banana)
@test banana_doc_data[:linenumber] == LINENUMBER - 7 @test banana_doc_data[:linenumber] == LINENUMBER - 7
@test banana_doc_data[:path] == FILENAME @test banana_doc_data[:path] == FILENAME
@test banana_doc_data[:module] == FruitDoc @test banana_doc_data[:module] == FruitDoc
orange_doc = @doc(FruitDoc.Orange) orange_doc = @doc(FruitDoc.Orange)
@test startswith(sprint(show, orange_doc), "No documentation found") @test startswith(sprint(show, orange_doc), "No documentation found")
end # testset end # testset

Loading…
Cancel
Save