defmodule MfmParser.EncoderTest do
use ExUnit.Case
alias MfmParser.Encoder
alias MfmParser.Node
doctest MfmParser.Encoder
describe "to_html" do
test "it handles text" do
input_tree = [%Node.Text{props: %{text: "chocolatine"}}]
expected = "chocolatine"
assert Encoder.to_html(input_tree) == expected
end
test "it handles newlines" do
input_tree = [%Node.Newline{props: %{text: "\n"}}]
expected = "\n"
assert Encoder.to_html(input_tree) == expected
end
test "it handles flip" do
input_tree = [
%Node.MFM.Flip{
children: [%Node.Text{props: %{text: "Misskey expands the world of the Fediverse"}}]
}
]
input_tree_v = [
%Node.MFM.Flip{
children: [%Node.Text{props: %{text: "Misskey expands the world of the Fediverse"}}],
props: %{v: true}
}
]
input_tree_h_v = [
%Node.MFM.Flip{
children: [%Node.Text{props: %{text: "Misskey expands the world of the Fediverse"}}],
props: %{v: true, h: true}
}
]
expected =
~s[Misskey expands the world of the Fediverse]
expected_v =
~s[Misskey expands the world of the Fediverse]
expected_h_v =
~s[Misskey expands the world of the Fediverse]
assert Encoder.to_html(input_tree) == expected
assert Encoder.to_html(input_tree_v) == expected_v
assert Encoder.to_html(input_tree_h_v) == expected_h_v
end
test "it handles font" do
input_tree = [
%Node.MFM.Font{
children: [%Node.Text{props: %{text: "Misskey expands the world of the Fediverse"}}],
props: %{font: "fantasy"}
}
]
expected =
~s[Misskey expands the world of the Fediverse]
assert Encoder.to_html(input_tree) == expected
end
test "it handles x" do
input_tree = [
%Node.MFM.X{
children: [%Node.Text{props: %{text: "🍮"}}],
props: %{size: "400%"}
}
]
expected = ~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles blur" do
input_tree = [
%Node.MFM.Blur{
children: [%Node.Text{props: %{text: "Misskey expands the world of the Fediverse"}}]
}
]
expected =
~s[Misskey expands the world of the Fediverse]
assert Encoder.to_html(input_tree) == expected
end
test "it handles jelly" do
input_tree = [
%Node.MFM.Jelly{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles tada" do
input_tree = [
%Node.MFM.Tada{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles jump" do
input_tree = [
%Node.MFM.Jump{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles bounce" do
input_tree = [
%Node.MFM.Bounce{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles spin" do
input_tree_z_left = [
%Node.MFM.Spin{
props: %{axis: "z", direction: "left", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_x_left = [
%Node.MFM.Spin{
props: %{axis: "x", direction: "left", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_y_left = [
%Node.MFM.Spin{
props: %{axis: "y", direction: "left", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_z_alternate = [
%Node.MFM.Spin{
props: %{axis: "z", direction: "alternate", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_x_alternate = [
%Node.MFM.Spin{
props: %{axis: "x", direction: "alternate", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_y_alternate = [
%Node.MFM.Spin{
props: %{axis: "y", direction: "alternate", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_z_normal = [
%Node.MFM.Spin{
props: %{axis: "z", direction: "normal", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_x_normal = [
%Node.MFM.Spin{
props: %{axis: "x", direction: "normal", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
input_tree_y_normal = [
%Node.MFM.Spin{
props: %{axis: "y", direction: "normal", speed: "1.5s"},
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected_tree_z_left =
~s[🍮]
expected_tree_x_left =
~s[🍮]
expected_tree_y_left =
~s[🍮]
expected_tree_z_alternate =
~s[🍮]
expected_tree_x_alternate =
~s[🍮]
expected_tree_y_alternate =
~s[🍮]
expected_tree_z_normal =
~s[🍮]
expected_tree_x_normal =
~s[🍮]
expected_tree_y_normal =
~s[🍮]
assert Encoder.to_html(input_tree_z_left) == expected_tree_z_left
assert Encoder.to_html(input_tree_x_left) == expected_tree_x_left
assert Encoder.to_html(input_tree_y_left) == expected_tree_y_left
assert Encoder.to_html(input_tree_z_alternate) == expected_tree_z_alternate
assert Encoder.to_html(input_tree_x_alternate) == expected_tree_x_alternate
assert Encoder.to_html(input_tree_y_alternate) == expected_tree_y_alternate
assert Encoder.to_html(input_tree_z_normal) == expected_tree_z_normal
assert Encoder.to_html(input_tree_x_normal) == expected_tree_x_normal
assert Encoder.to_html(input_tree_y_normal) == expected_tree_y_normal
end
test "it handles shake" do
input_tree = [
%Node.MFM.Shake{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles twitch" do
input_tree = [
%Node.MFM.Twitch{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles rainbow" do
input_tree = [
%Node.MFM.Rainbow{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles sparkle" do
# TODO: This is not how Misskey does it and should be changed to make it work like Misskey.
input_tree = [
%Node.MFM.Sparkle{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles rotate" do
input_tree = [
%Node.MFM.Rotate{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles unsuported formats" do
input_tree = [
%Node.MFM.Undefined{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected = ~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles multpile nodes on the same level" do
input_tree = [
%Node.MFM.Rotate{
children: [%Node.Text{props: %{text: "🍮"}}]
},
%Node.Text{props: %{text: "pain au chocolat"}},
%Node.MFM.Font{
children: [%Node.Text{props: %{text: "Misskey expands the world of the Fediverse"}}],
props: %{font: "fantasy"}
}
]
expected =
~s[🍮pain au chocolatMisskey expands the world of the Fediverse]
assert Encoder.to_html(input_tree) == expected
end
test "it handles nesting" do
input_tree = [
%Node.MFM.Rotate{
children: [
%Node.MFM.Font{
children: [%Node.Text{props: %{text: "🍮"}}],
props: %{font: "fantasy"}
}
]
}
]
expected =
~s[🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it shouldn't have duplicate styles" do
input_tree = [
%Node.MFM.Sparkle{
children: [%Node.Text{props: %{text: "🍮"}}]
},
%Node.MFM.Sparkle{
children: [%Node.Text{props: %{text: "🍮"}}]
}
]
expected =
~s[🍮🍮]
assert Encoder.to_html(input_tree) == expected
end
test "it handles complex nesting of nodes" do
input_tree = [
%MfmParser.Node.Text{props: %{text: "It's not "}},
%MfmParser.Node.MFM.Twitch{
children: [%MfmParser.Node.Text{props: %{text: "chocolatine"}}],
props: %{speed: "0.2s"}
},
%MfmParser.Node.Newline{props: %{text: "\n"}},
%MfmParser.Node.Text{props: %{text: "it's "}},
%MfmParser.Node.MFM.X{
children: [
%MfmParser.Node.MFM.Spin{
children: [%MfmParser.Node.Text{props: %{text: "pain"}}],
props: %{direction: "normal", axis: "z", speed: "1s"}
},
%MfmParser.Node.Text{props: %{text: " "}},
%MfmParser.Node.MFM.Rainbow{
children: [%MfmParser.Node.Text{props: %{text: "au"}}],
props: %{speed: "2s"}
},
%MfmParser.Node.Text{props: %{text: " "}},
%MfmParser.Node.MFM.Jump{
children: [%MfmParser.Node.Text{props: %{text: "chocolat"}}],
props: %{speed: "0.5s"}
}
],
props: %{size: "600%"}
}
]
expected =
"It's not chocolatine\nit's pain au chocolat"
assert Encoder.to_html(input_tree) == expected
end
test "it should be able to go from mfm-text input to html output" do
input =
"It's not $[twitch.speed=0.2s chocolatine]\nit's $[x4 $[spin.speed=1s pain] $[rainbow.speed=2s au] $[jump.speed=0.5s chocolat]]"
expected =
"It's not chocolatine\nit's pain au chocolat"
assert Encoder.to_html(input) == expected
end
end
end