diff options
context:
space:
mode:
authorBryce Kwon <bryce@brycekwon.com>
committerBryce Kwon <bryce@brycekwon.com>
commit
parent
tree
download
Add a test suite for the shipped extensions
Diffstat (limited to 'tests/extensions/fake-lexers/lexer.lua')
-rw-r--r--tests/extensions/fake-lexers/lexer.lua77
1 file changed, 77 insertions, 0 deletions
diff --git a/tests/extensions/fake-lexers/lexer.lua b/tests/extensions/fake-lexers/lexer.lua
new file mode 100644
index 0000000..adf7d5b
--- /dev/null
+++ b/tests/extensions/fake-lexers/lexer.lua
@@ -0,0 +1,77 @@
+-- A miniature stand-in for the Scintillua lexer module, just enough for the
+-- syntax-highlight checks to drive every path through the filter without the
+-- real collection installed. load() hands out one of the toy lexers below by
+-- name and detect() recognises a single filename suffix, so a check can tell
+-- the detection path apart from the extension path by which lexer ends up
+-- running. Anything the filter treats as optional, a lexer that will not
+-- load or one that raises while lexing, has a name here too.
+
+local M = {}
+
+-- Tokens come back the way Scintillua returns them, one flat list of a tag
+-- name and the position just past the token it names. Letter runs are
+-- keywords, digit runs are numbers, a single quoted run carries a dotted tag
+-- so the dotted first component lookup gets exercised, and any other byte is
+-- whitespace, which maps to no css class.
+local function lex_words(self, text)
+ local tokens = {}
+ local pos = 1
+ while pos <= #text do
+ local start, stop = text:find("^%a+", pos)
+ if not start then
+ start, stop = text:find("^%d+", pos)
+ if start then
+ tokens[#tokens + 1] = "number"
+ else
+ start, stop = text:find("^'[^']*'", pos)
+ if start then
+ tokens[#tokens + 1] = "string.double"
+ else
+ stop = pos
+ tokens[#tokens + 1] = "whitespace"
+ end
+ end
+ else
+ tokens[#tokens + 1] = "keyword"
+ end
+ tokens[#tokens + 1] = stop + 1
+ pos = stop + 1
+ end
+ return tokens
+end
+
+-- Tags only the first four bytes and stops, so the filter has to append the
+-- untagged tail itself or the check for it fails.
+local function lex_short(self, text)
+ if #text < 5 then
+ return {}
+ end
+ return { "keyword", 5 }
+end
+
+local function lex_raise(self, text)
+ error("this lexer always raises")
+end
+
+local lexers = {
+ fake = { lex = lex_words },
+ short = { lex = lex_short },
+ badlex = { lex = lex_raise },
+}
+
+function M.load(name)
+ local lexer = lexers[name]
+ if lexer == nil then
+ error("no fake lexer named " .. tostring(name))
+ end
+ return lexer
+end
+
+function M.detect(filename)
+ if filename:match("%.viadetect$") then
+ return "fake"
+ end
+ return nil
+end
+
+return M