Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Show Mode #12

Merged
merged 8 commits into from
May 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/TruthTables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export @truthtable
export -->, <-->
export ∧, ∨, ¬

include("showmode.jl")
include("truthtable.jl")
include("tables.jl")
include("macro.jl")
Expand Down
93 changes: 93 additions & 0 deletions src/showmode.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
const SHOW_MODE = Ref(:bool)

"""
TruthTables.showmode!(mode::Symbol = :bool)

Changes the way `TruthTable`s are displayed.\\
The mode argument can be one of these symbols: `:bool` (default), `:bit` or `:letter`.\\
`:bool` will use the boolean values (`true` and `false`) without formatting.\\
`:bit` will use `1` and `0` for `true` and `false`, respectively.\\
`:letter` will use T for `true` and F for `false`.

# Examples

```julia
julia> using TruthTables

julia> tt = @truthtable p && q
TruthTable
┌───────┬───────┬───────┐
│ p │ q │ p ∧ q │
├───────┼───────┼───────┤
│ true │ true │ true │
│ false │ true │ false │
│ true │ false │ false │
│ false │ false │ false │
└───────┴───────┴───────┘


julia> TruthTables.showmode!(:bit)
:bit

julia> tt
TruthTable
┌───┬───┬───────┐
│ p │ q │ p ∧ q │
├───┼───┼───────┤
│ 1 │ 1 │ 1 │
│ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │
│ 0 │ 0 │ 0 │
└───┴───┴───────┘


julia> TruthTables.showmode!(:letter)
:letter

julia> tt
TruthTable
┌───┬───┬───────┐
│ p │ q │ p ∧ q │
├───┼───┼───────┤
│ T │ T │ T │
│ F │ T │ F │
│ T │ F │ F │
│ F │ F │ F │
└───┴───┴───────┘


julia> TruthTables.showmode!()
:bool

julia> tt
TruthTable
┌───────┬───────┬───────┐
│ p │ q │ p ∧ q │
├───────┼───────┼───────┤
│ true │ true │ true │
│ false │ true │ false │
│ true │ false │ false │
│ false │ false │ false │
└───────┴───────┴───────┘
```
"""
function showmode!(mode::Symbol)
if mode ∉ (:bool, :bit, :letter)
throw(ArgumentError("Invalid show mode, use :bool, :bit or :letter."))
end
SHOW_MODE[] = mode
end

showmode!() = (SHOW_MODE[] = :bool)

# formatters
_bit_formatter(v, i, j) = Int(v)
_letter_formatter(v, i, j) = v ? "T" : "F"

function getformatter()
mode = SHOW_MODE[]
mode == :bool && return nothing
mode == :bit && return _bit_formatter
mode == :letter && return _letter_formatter
return nothing
end
2 changes: 2 additions & 0 deletions src/truthtable.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ function TruthTable(columns::Vector{Vector{Bool}}, colnames::Vector{Symbol})
end

function Base.show(io::IO, table::TruthTable)
formatter = getformatter()
println(io, "TruthTable")
pretty_table(io, table,
vcrop_mode=:middle,
header_alignment=:c,
header=table.colnames,
formatters=formatter,
alignment=:l
)
end
102 changes: 99 additions & 3 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using Test, Tables
using TruthTables
using TruthTables: TruthTable
using TruthTables: -->, <-->, ∧, ∨, ¬

@testset "TruthTables.jl" begin
@testset "TruthTable" begin
Expand Down Expand Up @@ -72,6 +71,10 @@ using TruthTables: -->, <-->, ∧, ∨, ¬
end

@testset "TruthTable show" begin
# default show mode
@test TruthTables.showmode!() == :bool

# show mode: :bool
tt = @truthtable p && (q || r)
str = """
TruthTable
Expand All @@ -88,9 +91,48 @@ using TruthTables: -->, <-->, ∧, ∨, ¬
│ false │ false │ false │ false │
└───────┴───────┴───────┴─────────────┘
"""

@test sprint(show, tt) == str

# show mode: :bit
TruthTables.showmode!(:bit)
str = """
TruthTable
┌───┬───┬───┬─────────────┐
│ p │ q │ r │ p ∧ (q ∨ r) │
├───┼───┼───┼─────────────┤
│ 1 │ 1 │ 1 │ 1 │
│ 0 │ 1 │ 1 │ 0 │
│ 1 │ 0 │ 1 │ 1 │
│ 0 │ 0 │ 1 │ 0 │
│ 1 │ 1 │ 0 │ 1 │
│ 0 │ 1 │ 0 │ 0 │
│ 1 │ 0 │ 0 │ 0 │
│ 0 │ 0 │ 0 │ 0 │
└───┴───┴───┴─────────────┘
"""
@test sprint(show, tt) == str

# show mode: :letter
TruthTables.showmode!(:letter)
str = """
TruthTable
┌───┬───┬───┬─────────────┐
│ p │ q │ r │ p ∧ (q ∨ r) │
├───┼───┼───┼─────────────┤
│ T │ T │ T │ T │
│ F │ T │ T │ F │
│ T │ F │ T │ T │
│ F │ F │ T │ F │
│ T │ T │ F │ T │
│ F │ T │ F │ F │
│ T │ F │ F │ F │
│ F │ F │ F │ F │
└───┴───┴───┴─────────────┘
"""
@test sprint(show, tt) == str

# show mode: :bool (default)
TruthTables.showmode!()
tt = @truthtable p && (q || r) full=true
str = """
TruthTable
Expand All @@ -107,8 +149,62 @@ using TruthTables: -->, <-->, ∧, ∨, ¬
│ false │ false │ false │ false │ false │
└───────┴───────┴───────┴───────┴─────────────┘
"""

@test sprint(show, tt) == str

# show mode: :bit
TruthTables.showmode!(:bit)
str = """
TruthTable
┌───┬───┬───┬───────┬─────────────┐
│ p │ q │ r │ q ∨ r │ p ∧ (q ∨ r) │
├───┼───┼───┼───────┼─────────────┤
│ 1 │ 1 │ 1 │ 1 │ 1 │
│ 0 │ 1 │ 1 │ 1 │ 0 │
│ 1 │ 0 │ 1 │ 1 │ 1 │
│ 0 │ 0 │ 1 │ 1 │ 0 │
│ 1 │ 1 │ 0 │ 1 │ 1 │
│ 0 │ 1 │ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │ 0 │ 0 │
│ 0 │ 0 │ 0 │ 0 │ 0 │
└───┴───┴───┴───────┴─────────────┘
"""
@test sprint(show, tt) == str

# show mode: :letter
TruthTables.showmode!(:letter)
str = """
TruthTable
┌───┬───┬───┬───────┬─────────────┐
│ p │ q │ r │ q ∨ r │ p ∧ (q ∨ r) │
├───┼───┼───┼───────┼─────────────┤
│ T │ T │ T │ T │ T │
│ F │ T │ T │ T │ F │
│ T │ F │ T │ T │ T │
│ F │ F │ T │ T │ F │
│ T │ T │ F │ T │ T │
│ F │ T │ F │ T │ F │
│ T │ F │ F │ F │ F │
│ F │ F │ F │ F │ F │
└───┴───┴───┴───────┴─────────────┘
"""
@test sprint(show, tt) == str

# getformatter
TruthTables.showmode!(:bit)
@test TruthTables.getformatter() === TruthTables._bit_formatter
TruthTables.showmode!(:letter)
@test TruthTables.getformatter() === TruthTables._letter_formatter
TruthTables.showmode!(:bool)
@test TruthTables.getformatter() === nothing

# formatters
@test TruthTables._bit_formatter(true, 1, 1) == 1
@test TruthTables._bit_formatter(false, 1, 1) == 0
@test TruthTables._letter_formatter(true, 1, 1) == "T"
@test TruthTables._letter_formatter(false, 1, 1) == "F"

# throws
@test_throws ArgumentError TruthTables.showmode!(:test)
end

@testset "Logical operators" begin
Expand Down