# MarkdownGlance manual test plan
## Matrix
Run the release matrix on Linux, macOS and Windows with Sublime Text build
4200/Python 3.8. The newest available dev build/Python 3.14 is optional
forward-compatibility testing.
1. Open saved and unsaved Markdown in Side-by-Side and Full Screen; repeat open
and toggles from source, preview and TOC focus.
2. Edit, save, Save As, rename and delete on disk. Confirm the latest edit wins,
the title/base path update, and the source is never closed or recreated.
3. Check default light, default dark and one third-party scheme; change scheme
while open. With MarkdownEditing installed, set a Markdown-only scheme with
`markdownediting: select color scheme` that contrasts with the global
`ui: select color scheme` -- preview, TOC and outline must all follow the
Markdown-only one, including the strip of view below the content, and must
move when either scheme is changed under an open preview. Exercise keyboard
and mouse zoom, then reset.
4. Check short, Unicode, malformed/raw HTML and 100 KiB documents. For TOC,
test below-threshold, nested and duplicate headings and top/middle/bottom
navigation.
5. Check tables: narrow, wider than the preview, right/centre aligned, CJK and
mixed CJK/Latin, links and bold inside cells, and a raw HTML table. Confirm
every row stays on the column grid and no row is wrapped by the host. Resize
and maximise the window, and zoom in and out: the table refits within about
a second and still fills the group.
6. Check relative, absolute, missing, oversized and extensionless local images;
HTTPS, redirect, timeout, invalid and oversized remote images. With resvg
installed, a local SVG and a remote SVG badge must appear as images; with
`svg_renderer_path` pointing at nothing they must read *No SVG renderer*,
with `enable_svg` off *Not a PNG, JPEG or GIF*, while a WebP always reads
the latter and a missing file always reads *Unavailable*. The `svg_render`
scenario covers all three.
7. Check Mermaid disabled, enabled disclosure, offline, timeout, invalid source
and custom HTTPS server. Confirm diagnostics contain no source or locator.
Render a `sequenceDiagram` under a dark and a light colour scheme: message
and note labels must stay legible, and the image background must match the
preview's, in both.
Math: with `enable_math` off, `$a^2$` and a `$$` block read as code and
`$5 and $6` stays a sentence. Turn it on: the inline formula and the block
render as images, the first placeholder names the server once, an invalid
formula shows `Unavailable` inline without breaking its line, and a scheme
with a different foreground re-renders the formulas in the new colour.
Confirm diagnostics contain no formula.
8. Close TOC, preview, source, group and window; reload the plugin. Change the
layout after preview creation and confirm it is not overwritten on close.
9. Contents panel: open with `Ctrl+Shift+B` on a file with no preview, and
again with a preview open — one panel, one group, never a tab in the
preview's. With the source focused it shows the outline: check ATX, setext,
fenced-code and front-matter documents and one with no headings; move the
caret across headings; type a new heading and watch it appear; click entries
top, middle and bottom and confirm that **both** the caret and the preview
go to that section, with the focus staying where it was. Scroll the preview
with the wheel (which does not move the focus), click a panel entry, and
confirm the preview jumps — this is the case the halves used to get wrong.
Try a document with a heading inside a raw `
` block and one inside a
block quote: those appear in the table of contents only, and clicking them
must move the preview alone rather than sending the caret somewhere wrong.
Focus the preview and confirm the same panel switches to the rendered table
of contents, then focus the source again — with
`enable_toc` off as well as on, since that setting governs only whether a
panel opens by itself. Open a preview *after* the panel and confirm the
preview gets a group of its own rather than replacing the panel, and that
the caret stays where it was when a panel opens by itself. Then toggle focus
and close: the panel's pane must go with it, leaving the source and the
preview and no empty pane, whether or not you dragged a divider first.
Zoom from the Markdown file (`Ctrl+=` must resize the preview, not the
editor font) and with `Ctrl`-scroll over the preview without clicking it
first; then close the preview and confirm `Ctrl+=` is Sublime's font size
again and `Ctrl+0` is Focus Side Bar throughout. Close the panel, the
source, the group and the window; open panels for two files at once and
switch between them. Automated as `run-markdownglance`'s `panel_navigation`
and `zoom_reach` scenarios.
Automated as `run-markdownglance`'s `panel_toggle` scenario.
10. Several documents: preview two Markdown files long enough for a panel.
There must be exactly one preview tab and one contents tab however many
files are open, each named for the document on it. Click the first source,
the preview, the panel, then the second source, and confirm both follow
every time, that the panel shows the half matching what you clicked, that
the focus stays where you put it, and that the window settles at once
rather than flickering. Clicking the preview must not change the document
on it. Then open a third Markdown file that has never been previewed — from
the sidebar and from Goto Anything, since a file opened that way is
activated before it has a syntax — and confirm both follow it with the
caret still in the file you opened. Scroll one document's preview, switch
away and back, and confirm it comes back where you left it. Zoom, switch
documents, and confirm the zoom stays put. Repeat in Full Screen. Automated
as `run-markdownglance`'s `follow_focus` and `preview_switch` scenarios,
Side-by-Side only.
11. Widths: with `auto_width` on, open a table of contents and an outline over
documents with short headings and with one very long heading — no entry may
wrap, and neither group may be wider than it was with the setting off. Drag
the divider and confirm nothing moves it back until the group is closed and
reopened; then zoom, resize the window and type a longer heading and confirm
the group follows. Switch `auto_width` off and confirm both widen back.
12. Install beside MarkdownLivePreview. Check directory, module, command,
settings and resource isolation; document the expected shortcut collision.
13. Open in Browser: on a saved file with a relative image, a table, a nested
list, a fenced block inside a list item and two headings with the same
text linked as `#same` and `#same-2`, run the command and confirm the page
opens, the image resolves, both heading links stay on the page and the list
shapes match the preview. Add a Mermaid fence and an inline and a display
formula: online, the diagram and the formulas render in the browser under
both a light and a dark system theme, and a page with neither loads no
script. Put the file in a directory whose name has a
space and a `#`. Repeat on an unsaved buffer. Confirm the command is absent
from the palette on a non-Markdown view. On Linux, `ls -l` the page under
`$TMPDIR/MarkdownGlance` and confirm mode 600.
14. Fresh install through Package Control (`Add Repository` with this
repository while the channel entry is pending): confirm the `Markdown` and
`pymdown-extensions` libraries are installed with the package and that a
preview renders without any other step; confirm the install note is the
only message shown. In the console, `import markdown, pymdownx` and print
both `__version__` and `__file__`: 3.2.2 and 8.1.1, from the Python 3.8
library directory.
15. Manual install without the libraries: clone into Packages and start
Sublime Text. A dialog must name the two libraries and the fix; the console
must show no traceback; the commands stay in the palette and repeat the
dialog. Run Satisfy Libraries, restart, confirm the preview renders.
16. Pygments present: install MarkdownPreview beside this package (it brings
the Pygments library), restart, and confirm a Mermaid fence with
`enable_mermaid` on is still a diagram and a fenced block still has its
language class.
17. Restart with a preview open: with `hot_exit` on, open a Markdown file,
`Ctrl+Shift+V`, `Ctrl+Shift+B`, zoom the preview once, and quit Sublime
Text. Start it again: the same document must be back on the preview at the
same zoom, the contents panel beside it, and the focus on whichever view
Sublime restored it to — not on the preview. Repeat with the panel alone
(`Ctrl+Shift+B`, no preview). Then close the Markdown file before quitting
and confirm the panes are gone rather than blank on the next start, and do
the same for an unsaved buffer, which has no name to be found by. Repeat
once with Sublime killed (`kill -9`) rather than quit, which is the case
`plugin_unloaded` cannot help with; and once with a file dragged into the
preview's group before quitting, whose group must survive holding the
file.
## Automated prerequisites
Run `python -m unittest discover -s MarkdownGlance/tests -t . -p 'test_*.py'` from the parent of the `MarkdownGlance` checkout, Python
compilation, the contract runner and the 100-sample benchmark. The last two
are developer commands, kept out of the command palette; run them from the
Sublime console with `window.run_command("mdglance_run_contract_tests")` and
`window.run_command("mdglance_run_benchmark")`.
Attach JSON evidence from `docs/verification/` to the release record.
### Unattended HTTP export check
From the parent checkout, with `Markdown` and `pymdown-extensions` available
in the Python environment, run:
```bash
python3 -m MarkdownGlance.tests.browser_export --open-browser \
--output MarkdownGlance/docs/verification/http-browser.json
```
This starts a temporary server on `127.0.0.1`, opens the default browser,
checks ten image/layout/fragment-link assertions, writes JSON, and stops the
server. Exit status is 0 on success and 1 on failure or timeout (120 seconds
by default; override with `--timeout`). Without `--open-browser`, a browser
agent can open the URL printed to stdout instead.
Only fixed synthetic fixtures are served from memory; there is no directory
listing or general file access. This checks HTTP rendering with the real
export renderer. Keep step 13's native export command, file permissions and
saved-file URL checks separate: an HTTP pass does not certify `file://`
navigation or image resolution from an unsaved buffer.