Skip to content

Commit 46d650a

Browse files
authored
Merge pull request #37 from johnnychen94/default
break `handlers.jl` into default_rendermode, default_equality and _convert
2 parents dcba05a + ffa165a commit 46d650a

8 files changed

+225
-203
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ReferenceTests"
22
uuid = "324d217c-45ce-50fc-942e-d289b448e8cf"
33
authors = ["Christof Stocker <[email protected]>", "Lyndon White <[email protected]>"]
4-
version = "0.8.1"
4+
version = "0.8.2"
55

66
[deps]
77
DeepDiffs = "ab62b9b5-e342-54a8-a765-a90f495de1a6"

src/ReferenceTests.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export
1717

1818
include("utils.jl")
1919
include("test_reference.jl")
20-
include("core.jl")
21-
include("handlers.jl")
20+
include("fileio.jl")
2221
include("equality_metrics.jl")
22+
include("render.jl")
2323

2424
end # module

src/core.jl

Lines changed: 0 additions & 122 deletions
This file was deleted.

src/equality_metrics.jl

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
1+
"""
2+
default_equality(reference, actual) -> f
3+
4+
Infer a suitable equality comparison method `f` according to input types.
5+
6+
`f` is a function that satisfies signature `f(reference, actual)::Bool`. If `f` outputs
7+
`true`, it indicates that `reference` and `actual` are "equal" in the sense of `f`.
8+
"""
9+
default_equality(reference, actual) = isequal
10+
function default_equality(
11+
reference::AbstractArray{<:Colorant},
12+
actual::AbstractArray{<:Colorant})
13+
14+
return psnr_equality()
15+
end
16+
117
# ---------------------------------
218
# Image
319

4-
default_image_equality(reference, actual) = psnr_equality()(reference, actual)
5-
620
"""
721
psnr_equality(threshold=25) -> f
822

src/fileio.jl

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#######################################
2+
# IO
3+
# Right now this basically just extends FileIO to support some things as text files
4+
5+
const TextFile = Union{File{format"TXT"}, File{format"SHA256"}}
6+
7+
function loadfile(T, file::File)
8+
T(load(file)) # Fallback to FileIO
9+
end
10+
11+
function loadfile(T, file::TextFile)
12+
read(file.filename, String)
13+
end
14+
15+
function loadfile(::Type{<:Number}, file::File{format"TXT"})
16+
parse(Float64, loadfile(String, file))
17+
end
18+
19+
function savefile(file::File, content)
20+
save(file, content) # Fallback to FileIO
21+
end
22+
23+
function savefile(file::TextFile, content)
24+
write(file.filename, content)
25+
end
26+
27+
function query_extended(filename)
28+
file, ext = splitext(filename)
29+
# TODO: make this less hacky
30+
if uppercase(ext) == ".SHA256"
31+
res = File{format"SHA256"}(filename)
32+
else
33+
res = query(filename)
34+
if res isa File{DataFormat{:UNKNOWN}}
35+
res = File{format"TXT"}(filename)
36+
end
37+
end
38+
res
39+
end
40+
41+
"""
42+
_convert(T::Type{<:DataFormat}, x; kw...) -> out
43+
44+
Convert `x` to a validate content for file data format `T`.
45+
"""
46+
_convert(::Type{<:DataFormat}, x; kw...) = x
47+
48+
# plain TXT
49+
_convert(::Type{DataFormat{:TXT}}, x; kw...) = string(x)
50+
_convert(::Type{DataFormat{:TXT}}, x::Number; kw...) = x
51+
function _convert(::Type{DataFormat{:TXT}}, x::AbstractArray{<:AbstractString}; kw...)
52+
return join(x, '\n')
53+
end
54+
function _convert(
55+
::Type{DataFormat{:TXT}}, img::AbstractArray{<:Colorant};
56+
size = (20,40), kw...)
57+
58+
# encode image into string
59+
strs = @withcolor ImageInTerminal.encodeimg(
60+
ImageInTerminal.SmallBlocks(),
61+
ImageInTerminal.TermColor256(),
62+
img,
63+
size...)[1]
64+
return join(strs,'\n')
65+
end
66+
67+
# SHA256
68+
_convert(::Type{DataFormat{:SHA256}}, x; kw...) = bytes2hex(sha256(string(x)))
69+
function _convert(::Type{DataFormat{:SHA256}}, img::AbstractArray{<:Colorant}; kw...)
70+
# encode image into SHA256
71+
size_str = bytes2hex(sha256(reinterpret(UInt8,[map(Int64,size(img))...])))
72+
img_str = bytes2hex(sha256(reinterpret(UInt8,vec(rawview(channelview(img))))))
73+
74+
return size_str * img_str
75+
end

src/handlers.jl

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/render.jl

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#################################################
2+
# Rendering
3+
# This controls how failures are displayed
4+
abstract type RenderMode end
5+
struct Diff <: RenderMode end
6+
7+
abstract type BeforeAfter <: RenderMode end
8+
struct BeforeAfterLimited <: BeforeAfter end
9+
struct BeforeAfterFull <: BeforeAfter end
10+
struct BeforeAfterImage <: BeforeAfter end
11+
12+
render_item(::RenderMode, item) = println(item)
13+
function render_item(::BeforeAfterLimited, item)
14+
show(IOContext(stdout, :limit=>true, :displaysize=>(20,80)), "text/plain", item)
15+
println()
16+
end
17+
function render_item(::BeforeAfterImage, item)
18+
str_item = @withcolor ImageInTerminal.encodeimg(ImageInTerminal.SmallBlocks(), ImageInTerminal.TermColor256(), item, 20, 40)[1]
19+
println("eltype: ", eltype(item))
20+
println("size: ", map(length, axes(item)))
21+
println("thumbnail:")
22+
println.(str_item)
23+
end
24+
25+
## 2 arg form render for comparing
26+
function render(mode::BeforeAfter, reference, actual)
27+
println("- REFERENCE -------------------")
28+
render_item(mode, reference)
29+
println("-------------------------------")
30+
println("- ACTUAL ----------------------")
31+
render_item(mode, actual)
32+
println("-------------------------------")
33+
end
34+
function render(::Diff, reference, actual)
35+
println("- DIFF ------------------------")
36+
@withcolor println(deepdiff(reference, actual))
37+
println("-------------------------------")
38+
end
39+
40+
## 1 arg form render for new content
41+
function render(mode::RenderMode, actual)
42+
println("- NEW CONTENT -----------------")
43+
render_item(mode, actual)
44+
println("-------------------------------")
45+
end
46+
47+
"""
48+
default_rendermode(::DataFormat, actual)
49+
50+
Infer the most appropriate render mode according to type of reference file and `actual`.
51+
"""
52+
default_rendermode(::Type{<:DataFormat}, ::Any) = BeforeAfterLimited()
53+
default_rendermode(::Type{<:DataFormat}, ::AbstractString) = Diff()
54+
default_rendermode(::Type{<:DataFormat}, ::AbstractArray{<:Colorant}) = BeforeAfterImage()
55+
56+
# plain TXTs
57+
default_rendermode(::Type{DataFormat{:TXT}}, ::Any) = Diff()
58+
default_rendermode(::Type{DataFormat{:TXT}}, ::AbstractString) = Diff()
59+
default_rendermode(::Type{DataFormat{:TXT}}, ::Number) = BeforeAfterFull()
60+
default_rendermode(::Type{DataFormat{:TXT}}, ::AbstractArray{<:Colorant}) = BeforeAfterFull()
61+
62+
# SHA256
63+
default_rendermode(::Type{DataFormat{:SHA256}}, ::Any) = BeforeAfterFull()
64+
default_rendermode(::Type{DataFormat{:SHA256}}, ::AbstractString) = BeforeAfterFull()
65+
default_rendermode(::Type{DataFormat{:SHA256}}, ::AbstractArray{<:Colorant}) = BeforeAfterFull()

0 commit comments

Comments
 (0)