forked from AkkomaGang/mfm-parser
0a2894f07a
When a text token was running, it wouldn't stop on a $-sign if it wasn't followed with a "[". This is good. But when a token was finished and the next char was a $-sign, it would consider it an MFMOpen, even when not followed by a "[". This is now fixed.
97 lines
3.2 KiB
Elixir
97 lines
3.2 KiB
Elixir
defmodule MfmParser.LexerTest do
|
|
use ExUnit.Case
|
|
|
|
alias MfmParser.Lexer
|
|
|
|
alias MfmParser.Token.MFM
|
|
alias MfmParser.Token.Newline
|
|
alias MfmParser.Token.Text
|
|
|
|
describe "eof" do
|
|
test "peek/1 handles eof" do
|
|
assert Lexer.peek("") == :eof
|
|
end
|
|
|
|
test "next/1 handles eof" do
|
|
assert Lexer.next("") == :eof
|
|
end
|
|
end
|
|
|
|
describe "mfm $[ token" do
|
|
test "it ends with a space" do
|
|
assert Lexer.peek("$[ola puerca]") == %MFM.Open{content: "$[ola "}
|
|
assert Lexer.next("$[ola puerca]") == {%MFM.Open{content: "$[ola "}, "puerca]"}
|
|
|
|
assert Lexer.next("$[ola.x,speed=5s puerca]") ==
|
|
{%MFM.Open{content: "$[ola.x,speed=5s "}, "puerca]"}
|
|
end
|
|
|
|
test "it doesn't crash if the token can't be completed" do
|
|
Lexer.peek("$[ola")
|
|
Lexer.next("$[ola")
|
|
end
|
|
end
|
|
|
|
describe "] token" do
|
|
test "it handles ] as a token" do
|
|
assert Lexer.peek("]ve anime") == %MFM.Close{content: "]"}
|
|
assert Lexer.next("]ve anime") == {%MFM.Close{content: "]"}, "ve anime"}
|
|
end
|
|
|
|
test "it works at the eof" do
|
|
assert Lexer.peek("]") == %MFM.Close{content: "]"}
|
|
assert Lexer.next("]") == {%MFM.Close{content: "]"}, ""}
|
|
end
|
|
end
|
|
|
|
describe "text token" do
|
|
test "it ends when a mfm token opens while a $ alone doesn't end the text token" do
|
|
assert Lexer.peek("Tu abuela ve anime y no se lava el $[spin culo]") ==
|
|
%Text{content: "Tu abuela ve anime y no se lava el "}
|
|
|
|
assert Lexer.next("Tu abuela ve anime y no se lava el $[spin culo]") ==
|
|
{%Text{content: "Tu abuela ve anime y no se lava el "}, "$[spin culo]"}
|
|
|
|
assert Lexer.peek("A $2 chocolatine") == %Text{content: "A $2 chocolatine"}
|
|
assert Lexer.next("A $2 chocolatine") == {%Text{content: "A $2 chocolatine"}, ""}
|
|
|
|
assert Lexer.peek("Eyes like $$") == %Text{content: "Eyes like $$"}
|
|
assert Lexer.next("Eyes like $$") == {%Text{content: "Eyes like $$"}, ""}
|
|
|
|
assert Lexer.peek("$2 chocolatine") == %Text{content: "$2 chocolatine"}
|
|
assert Lexer.next("$2 chocolatine") == {%Text{content: "$2 chocolatine"}, ""}
|
|
|
|
assert Lexer.peek("$2") == %Text{content: "$2"}
|
|
assert Lexer.next("$2") == {%Text{content: "$2"}, ""}
|
|
|
|
assert Lexer.peek("$") == %Text{content: "$"}
|
|
assert Lexer.next("$") == {%Text{content: "$"}, ""}
|
|
end
|
|
|
|
test "it ends when a mfm token closes" do
|
|
assert Lexer.peek("el culo]") == %Text{content: "el culo"}
|
|
assert Lexer.next("el culo]") == {%Text{content: "el culo"}, "]"}
|
|
end
|
|
|
|
test "it ends when the eof is reached" do
|
|
assert Lexer.peek("Tu abuela ve anime y no se lava el culo") == %Text{
|
|
content: "Tu abuela ve anime y no se lava el culo"
|
|
}
|
|
|
|
assert Lexer.next("Tu abuela ve anime y no se lava el culo") ==
|
|
{%Text{content: "Tu abuela ve anime y no se lava el culo"}, ""}
|
|
end
|
|
end
|
|
|
|
describe "newline token" do
|
|
test "it handles \n as a token" do
|
|
assert Lexer.peek("\nchocolat") == %Newline{content: "\n"}
|
|
assert Lexer.next("\nchocolat") == {%Newline{content: "\n"}, "chocolat"}
|
|
end
|
|
|
|
test "it works at the eof" do
|
|
assert Lexer.peek("\n") == %Newline{content: "\n"}
|
|
assert Lexer.next("\n") == {%Newline{content: "\n"}, ""}
|
|
end
|
|
end
|
|
end
|