Test run on Sun May 24 2026 09:11:28 GMT+0200 (Central European Summer Time): PASSED HEAD is now at 91244336 Make CI badge smaller state exists, updating to origin HEAD is now at f255a5f Remove github workflow file view exists, updating to origin HEAD is now at 24f7c9c Mark version 6.43.0 language exists, updating to origin HEAD is now at c08b250 Remove github workflow file commands exists, updating to origin HEAD is now at 30a280e Remove github workflow file search exists, updating to origin HEAD is now at c72953a Mark version 6.7.0 autocomplete exists, updating to origin HEAD is now at 7e2ef4e Mark version 6.20.2 lint exists, updating to origin HEAD is now at e7f3151 Always show lint tooltips above their target range collab exists, updating to origin HEAD is now at bf7e21f Remove github workflow file language-data exists, updating to origin HEAD is now at 57b6279 Remove github workflow file merge exists, updating to origin HEAD is now at 189cc58 Update github links lsp-client exists, updating to origin HEAD is now at 3df5043 Shorten comment, add release note codemirror exists, updating to origin HEAD is now at 62c0e6c Remove github workflow file lang-javascript exists, updating to origin HEAD is now at 752304c Remove github workflow file lang-java exists, updating to origin HEAD is now at 332f878 Remove github workflow file lang-json exists, updating to origin HEAD is now at 2aea18b Remove github workflow file lang-cpp exists, updating to origin HEAD is now at c403d8b Remove github workflow file lang-php exists, updating to origin HEAD is now at dac5164 Update github links lang-python exists, updating to origin HEAD is now at 9a0b77b Remove github workflow file lang-go exists, updating to origin HEAD is now at cefe86f Remove github workflow file lang-css exists, updating to origin HEAD is now at aa4f214 Remove github workflow file lang-sass exists, updating to origin HEAD is now at dca4bf7 Remove github workflow file lang-html exists, updating to origin HEAD is now at 83d112d Remove github workflow file lang-sql exists, updating to origin HEAD is now at 8b1ad59 Remove github workflow file lang-rust exists, updating to origin HEAD is now at 69962a0 Remove github workflow file lang-xml exists, updating to origin HEAD is now at 6b5db82 Remove github workflow file lang-markdown exists, updating to origin HEAD is now at 80e2aab Remove github workflow file lang-lezer exists, updating to origin HEAD is now at 3efbc0d Remove github workflow file lang-wast exists, updating to origin HEAD is now at fa810c1 Remove github workflow file lang-angular exists, updating to origin HEAD is now at b8c583a Update github links lang-vue exists, updating to origin HEAD is now at 34c8571 Update github links lang-liquid exists, updating to origin HEAD is now at ab2471c Update github links lang-less exists, updating to origin HEAD is now at 907f156 Remove github workflow file lang-yaml exists, updating to origin HEAD is now at 3dede7c Remove github workflow file lang-jinja exists, updating to origin HEAD is now at e317d9b Mark version 6.0.1 legacy-modes exists, updating to origin HEAD is now at e11702f Mark version 6.5.3 theme-one-dark exists, updating to origin HEAD is now at c752a5d Remove github workflow file Running npm install up to date, audited 249 packages in 2s 27 packages are looking for funding run `npm fund` for details 5 vulnerabilities (4 moderate, 1 high) To address issues that do not require attention, run: npm audit fix To address all issues (including breaking changes), run: npm audit fix --force Run `npm audit` for details. Building modules Building... Done in 15.56s > test > node bin/cm.js test ChangeDesc composition ✔ can compose unrelated changes ✔ cancels insertions with deletions ✔ joins adjacent insertions ✔ joins adjacent deletions ✔ allows a delete to shadow multiple operations ✔ can handle empty sets ✔ can join multiple replaces ✔ throws for inconsistent lengths mapping ✔ can map over an insertion ✔ can map over a deletion ✔ orders insertions ✔ can map a deletion over an overlapping replace ✔ can handle changes after ✔ joins deletions ✔ keeps insertions in deletions ✔ keeps replacements ✔ doesn't join replacements ✔ drops duplicate deletion ✔ handles overlapping replaces mapPos ✔ maps through an insertion ✔ maps through deletion ✔ maps through multiple insertions ✔ maps through multiple deletions ✔ maps through mixed edits ✔ stays on its own side of replacements ✔ maps through insertions around replacements ✔ stays in between replacements ChangeSet ✔ can create change sets ✔ can apply change sets ✔ can apply composed sets ✔ can clip inserted strings on compose ✔ can apply mapped sets ✔ can apply inverted sets ✔ can be iterated ✔ mapping before produces the same result as mapping the other after ✔ mapping still converges when mapping through multiple changes ✔ compose produces the same result as individual changes ✔ composing is associative ✔ survives random sequences of changes ✔ can be serialized to JSON EditorState char categorizer ✔ categorises into alphanumeric ✔ categorises into whitespace ✔ categorises into other EditorState facets ✔ allows querying of facets ✔ includes sub-extenders ✔ only includes duplicated extensions once ✔ returns an empty array for absent facet ✔ sorts extensions by priority ✔ lets sub-extensions inherit their parent's priority ✔ supports dynamic facet ✔ only recomputes a facet value when necessary ✔ can handle dependencies on facets that aren't present in the state ✔ can specify a dependency on the document ✔ can specify a dependency on the selection ✔ can provide multiple values at once ✔ works with a static combined facet ✔ works with a dynamic combined facet ✔ survives reconfiguration ✔ survives unrelated reconfiguration even without deep-compare ✔ preserves static facets across reconfiguration ✔ creates newly added fields when reconfiguring ✔ applies effects from reconfiguring transaction to new fields ✔ errors on cyclic dependencies ✔ updates facets computed from static values on reconfigure ✔ preserves dynamic facet values when dependencies stay the same RangeSet ✔ divides a set into chunks and layers ✔ complains about misordered ranges update ✔ can add ranges ✔ can add a large amount of ranges ✔ can filter ranges ✔ can filter all over ✔ collapses the chunks when removing almost all ranges ✔ calls filter on precisely those ranges touching the filter range ✔ returns the empty set when filter removes everything map ✔ can map through changes ✔ takes inclusivity into account ✔ uses side to determine mapping of points ✔ defaults to exclusive on both sides ✔ drops point ranges ✔ drops ranges in deleted regions ✔ shrinks ranges ✔ leaves point ranges on change boundaries ✔ can collapse chunks compare ✔ notices added ranges ✔ notices deleted ranges ✔ recognizes identical ranges ✔ skips changes ✔ ignores identical sub-nodes ✔ ignores changes in points ✔ notices adding a point ✔ notices removing a point ✔ can handle multiple changes ✔ reports point decorations with different cover spans ✔ separates the range in covering spans ✔ can retrieve a limited range ✔ reads from multiple sets at once ✔ orders active ranges by origin set ✔ doesn't get confused by same-place points ✔ properly resyncs active ranges after points ✔ doesn't split spans on ignored ranges ✔ omits points that are covered by the previous point ✔ puts smaller spans inside bigger ones with the same rank iter ✔ iterates over ranges ✔ can iterate over a subset between ✔ iterates over ranges ✔ returns ranges in a zero-length set EditorSelection ✔ stores ranges with a primary range ✔ merges and sorts ranges when normalizing ✔ merges adjacent point ranges when normalizing ✔ preserves the direction of the last range when merging ranges EditorState ✔ holds doc and selection properties ✔ can apply changes ✔ maps selection through changes ✔ can store annotations on transactions ✔ throws when a change's bounds are invalid ✔ stores and updates tab size ✔ stores and updates the line separator ✔ stores and updates fields ✔ allows fields to have an initializer ✔ can be serialized to JSON ✔ can preserve fields across reconfiguration ✔ can replace extension groups ✔ raises an error on duplicate extension groups ✔ preserves compartments on reconfigure ✔ forgets dropped compartments ✔ allows facets computed from fields ✔ blocks multiple selections when not allowed changeByRange ✔ can make simple changes ✔ does the right thing when there are multiple selections changeFilter ✔ can cancel changes ✔ can split changes ✔ combines filter masks ✔ can be turned off transactionFilter ✔ can constrain the selection ✔ can append sequential changes transactionExtender ✔ can add annotations ✔ allows multipe extenders to take effect Text ✔ handles basic replacement ✔ can append documents ✔ preserves length ✔ creates a balanced tree when loading a document ✔ rebalances on insert ✔ collapses on delete ✔ handles deleting at start ✔ handles deleting at end ✔ can handle deleting the entire document ✔ can insert on node boundaries ✔ can build up a doc by repeated appending ✔ properly maintains content during editing ✔ returns the correct strings for slice ✔ can be compared ✔ can be compared despite different tree shape ✔ can compare small documents ✔ is iterable ✔ is iterable in reverse ✔ allows negative skip values in iteration ✔ is partially iterable ✔ is partially iterable in reverse ✔ can partially iter over subsections at the start and end ✔ can iterate over lines ✔ can convert to JSON ✔ can get line info by line number ✔ can get line info by position ✔ can delete a range at the start of a child node ✔ can retrieve pieces of text ✔ clips out-of-range boundaries HeightMap ✔ starts empty ✔ grows to match the document ✔ separates lines with decorations on them ✔ ignores irrelevant decorations ✔ drops decorations from the tree when they are deleted ✔ updates the length of replaced decorations for changes ✔ stores information about block widgets ✔ stores information about block ranges ✔ handles empty lines correctly ✔ joins ranges ✔ joins lines ✔ materializes lines for measured heights ✔ doesn't set the heightChanged flag for small within-line replacements ✔ can update lines across the tree ✔ balances a big tree ✔ can handle inserting a line break ✔ can handle insertion in the middle of a line ✔ properly shrinks gaps when partially replaced blockAt ✔ finds blocks in a gap ✔ finds blocks in lines ✔ finds widget blocks lineAt ✔ finds lines in gaps ✔ finds lines in lines ✔ includes adjacent widgets in lines Folding ✔ stores fold state ✔ can store fold state as JSON StreamLanguage ✔ can parse content ✔ can reuse state on updates ✔ can find the correct parse state for indentation ✔ will make up a state when the viewport is far away from the frontier ✔ doesn't parse beyond the viewport ✔ supports gaps ✔ accepts custom token types ParseContext ✔ can parse a document ✔ can parse incrementally (169ms) Indentation ✔ tracks indent units ✔ errors for bad indent units commands indentMore ✔ adds indentation ✔ indents all lines in a range ✔ doesn't double-indent a given line ✔ ignores lines if a range selection ends directly at their start indentLess ✔ removes indentation ✔ removes one unit of indentation ✔ dedents all lines in a range ✔ takes tabs into account ✔ can split tabs indentSelection ✔ auto-indents the current line ✔ moves the cursor ahead of the indentation ✔ indents blocks of lines ✔ includes previous indentation changes in relative indentation insertNewlineKeepIndent ✔ keeps indentation ✔ keeps zero indentation ✔ deletes the selection insertNewlineAndIndent ✔ indents the new line ✔ can handle multiple selections ✔ isn't confused by text after the cursor ✔ clears empty lines before the cursor ✔ deletes selected text ✔ can explode brackets ✔ can explode in indented positions ✔ can explode brackets with whitespace ✔ doesn't try to explode already-exploded brackets ✔ doesn't indent when previous line lacks indentation ✔ indents when previous line uses two space indentation ✔ indents when previous line uses four space indentation ✔ indents when previous line uses tab indentation ✔ indents when previous line uses tab indentation and short alignment deleteTrailingWhitespace ✔ deletes trailing whitespace ✔ checks multiple lines ✔ can handle empty lines deleteGroupForward ✔ deletes a word ✔ deletes a word with leading space ✔ deletes a group of punctuation ✔ deletes a group of space ✔ deletes a newline ✔ stops deleting at a newline ✔ stops deleting after a newline ✔ deletes up to the end of the doc ✔ does nothing at the end of the doc deleteGroupBackward ✔ deletes a word ✔ deletes a word with trailing space ✔ deletes a group of punctuation ✔ deletes a group of space ✔ deletes a newline ✔ stops deleting at a newline ✔ stops deleting after a newline ✔ deletes up to the start of the doc moveLineUp ✔ can move a line up ✔ preserves multiple cursors on a single line ✔ moves selected blocks as one ✔ moves blocks made of multiple ranges as one ✔ does not include a trailing line after a range moveLineDown ✔ can move a line own ✔ preserves multiple cursors on a single line ✔ moves selected blocks as one ✔ moves blocks made of multiple ranges as one ✔ does not include a trailing line after a range ✔ clips the selection when moving to the end of the doc comment ✔ toggles line comment in multi-language doc Line comments ('//') ✔ toggles in an empty single selection ✔ toggles comments in a single line when the cursor is at the beginning ✔ toggles comments in a single line selection ✔ toggles comments in a multi-line selection ✔ toggles comments in a multi-line multi-range selection ✔ can handle multiple selections on one line ✔ doesn't include lines in which a selection range ends ✔ leaves empty lines alone ✔ does comment empty lines with a cursor Line comments ('#') ✔ toggles in an empty single selection ✔ toggles comments in a single line when the cursor is at the beginning ✔ toggles comments in a single line selection ✔ toggles comments in a multi-line selection ✔ toggles comments in a multi-line multi-range selection ✔ can handle multiple selections on one line ✔ doesn't include lines in which a selection range ends ✔ leaves empty lines alone ✔ does comment empty lines with a cursor Block comments ('/* */') ✔ toggles block comment in multi-line selection ✔ toggles block comment in multi-line multi-range selection ✔ can toggle comments inside the selection ✔ comments the entire line ✔ comments multiple lines ✔ joins selected blocks of lines ✔ doesn't include lines that the selection stops at the start of ✔ does include lines with cursor selection at the start Block comments ('') ✔ toggles block comment in multi-line selection ✔ toggles block comment in multi-line multi-range selection ✔ can toggle comments inside the selection ✔ comments the entire line ✔ comments multiple lines ✔ joins selected blocks of lines ✔ doesn't include lines that the selection stops at the start of ✔ does include lines with cursor selection at the start history ✔ allows to undo a change ✔ allows to undo nearby changes in one change ✔ allows to redo a change ✔ allows to redo nearby changes in one change ✔ puts the cursor after the change on redo ✔ restores selection on undo-redo-undo ✔ tracks multiple levels of history ✔ starts a new event when newGroupDelay elapses ✔ supports a custom join predicate ✔ allows changes that aren't part of the history ✔ doesn't get confused by an undo not adding any redo item ✔ accurately maps changes through each other ✔ can handle complex editing sequences ✔ supports overlapping edits ✔ supports overlapping edits that aren't collapsed ✔ supports overlapping unsynced deletes ✔ can go back and forth through history multiple times ✔ supports non-tracked changes next to tracked changes ✔ can go back and forth through history when preserving items ✔ restores selection on undo ✔ restores the selection before the first change in an item (#46) ✔ doesn't merge document changes if there's a selection change in between ✔ rebases selection on undo ✔ supports querying for the undo and redo depth ✔ all functions gracefully handle EditorStates without history ✔ truncates history ✔ doesn't undo selection-only transactions ✔ isolates transactions when asked to ✔ can group events around a non-history transaction ✔ properly maps selections through non-history changes ✔ restores selection on redo undoSelection ✔ allows to undo a change ✔ allows to undo selection-only transactions ✔ merges selection-only transactions from keyboard ✔ doesn't merge selection-only transactions from other sources ✔ doesn't merge selection-only transactions if they change the number of selections ✔ doesn't merge selection-only transactions if a selection changes empty state ✔ allows to redo a change ✔ allows to redo selection-only transactions ✔ only changes selection ✔ can undo a selection through remote changes ✔ preserves text inserted inside a change effects ✔ includes inverted effects in the history ✔ can map effects ✔ can restore comments lost through deletion JSON ✔ survives serialization SearchCursor ✔ finds all matches in a simple string ✔ finds only matches in the given region ✔ can cross lines ✔ can normalize case ✔ doesn't get confused by expanding transforms ✔ normalizes composed chars ✔ can match across lines ✔ can search an empty document ✔ doesn't include overlapping results ✔ includes overlapping results with nextOverlapping ✔ will mark matched partial normalized content as imprecise ✔ produces the correct range for astral chars that get normalized to non-astral ✔ can handle normalizers that remove text ✔ matches full compatibility-character expansions ✔ matches prefixes inside compatibility-character expansions ✔ matches suffixes inside compatibility-character expansions ✔ matches characters completely inside compatibility-character expansions ✔ matches across compatibility-character expansion boundaries RegExpCursor ✔ finds all matches in a simple string ✔ matches by-line ✔ handles empty lines ✔ handles empty documents ✔ properly cuts off long matches ✔ can match case-insensitively ✔ matches across lines ✔ detects multi-line regexps ✔ can match a large document ✔ will match line starts properly in multiline mode ✔ will match line ends properly in multiline mode SearchQuery ✔ can match plain strings ✔ skips overlapping matches ✔ can match case-insensitive strings ✔ can match across lines ✔ can match across multiple lines ✔ can match literally ✔ can match by word ✔ doesn't match non-words by word ✔ can match regular expressions ✔ can match case-insensitive regular expressions ✔ can match regular expressions by word ✔ can filter string matches with a test function ✔ combines whole-word matches with a test function ✔ can filter regexp matches with a test function selectNextOccurrence ✔ expands to the surrounding word ✔ selects the next occurrence ✔ matches full words ✔ matches subwords if a subword is selected lint ✔ can store diagnostics ✔ can map diagnostics through changes ✔ doesn't include new text in diagnostics ✔ properly stores overlapping diagnostics ✔ properly stores empty diagnostics ✔ doesn't create overlapping decorations ✔ creates widgets for empty and newline-only ranges collab ✔ converges for simple changes ✔ converges for multiple local changes ✔ converges with three peers ✔ converges with three peers with multiple steps ✔ supports undo ✔ supports redo ✔ supports deep undo ✔ support undo with clashing events ✔ handles conflicting steps ✔ can undo simultaneous typing ✔ allows you to set the initial version ✔ client ids survive reconfiguration ✔ associates transaction info with local changes ✔ supports shared effects rebasing collab ✔ works for simple cases ✔ works for multiple rebased changes ✔ works for multiple peer changes ✔ works with local unconfirmed changes ✔ works with multiple local unconfirmed changes ✔ works with local changes sandwiched between peer changes ✔ works when multiple sets of local changes are in-flight ✔ can handle two changesets from the same client on top of each other ✔ properly undoes rebased changes ✔ works for random input (201ms) chunks ✔ enumerates changed chunks ✔ handles changes at end of document ✔ can update chunks for changes ✔ can handle deleting updates ✔ clears chunks when a is set to equal b ✔ drops old chunks when a doc is cleared ✔ works for changes inside changed code ✔ handles changes that overlap with the start of chunks ✔ tracks chunk precision ✔ properly copies over unaffected insertion/deletion chunks at end of doc ✔ correctly handles changes to empty doc ✔ properly drops ranges at the start of the document diff ✔ produces close to minimal diffs (147ms) ✔ doesn't cut in the middle of surrogate pairs ✔ handles random input (173ms) ✔ can limit scan depth ✔ can time out diffs (56ms) presentableDiff ✔ grows changes to word start ✔ grows changes to word end ✔ grows changes from both sides ✔ doesn't grow short insertions ✔ doesn't grow short deletions ✔ does grow long insertions ✔ does grow long deletions ✔ covers words that contain other changes ✔ aligns to the end of words ✔ aligns to the start of words ✔ removes small unchanged ranges ✔ moves indentation after a change ✔ aligns insertions to line boundaries ✔ aligns deletions to line boundaries javascript indentation ✔ indents argument blocks ✔ indents function args ✔ indents nested calls ✔ aligns lists ✔ indents unfinished nodes ✔ deindents else ✔ support multiple opening calls on a line ✔ supports opening brackets on their own line ✔ handles hanging braces ✔ indents case bodies ✔ indents method chains ✔ indents JSON-style ✔ indents continued properties ✔ doesn't get confused by continued param lists ✔ doesn't indent below labels ✔ properly indents function expression arguments ✔ indents arrow functions ✔ indents braceless structure ✔ indents JSX constructs javascript syntax queries ✔ returns a tree ✔ keeps the tree up to date through changes ✔ reuses nodes when parsing big documents (85ms) python indentation ✔ indents bodies ✔ indents function arg lists ✔ indents nested bodies ✔ dedents except ✔ multi-line-block try-except ✔ multi-line-nested-block try-except ✔ match-case ✔ match-case-multi-line-block ✔ class-with-decorators ✔ list-comprehension ✔ multi-line-expressions ✔ async-function-and-with ✔ nested-functions ✔ type-hints-and-annotations ✔ multi-line-dict-comprehension ✔ multi-line-with-comments Go local completion ✔ doesn't complete from nothing unless explicit ✔ completes locals ✔ completes locals defined in a list ✔ completes locals defined as a set ✔ completes constants ✔ completes shorthand variables ✔ completes function names ✔ doesn't complete method names ✔ completes arguments ✔ completes imports ✔ completes type names ✔ completes from outer scopes ✔ doesn't complete from inner or sibling scopes HTML completion ✔ completes tag names ✔ doesn't complete from nothing unless explicit ✔ completes at top level ✔ completes inside an element ✔ completes attribute names ✔ completes attribute names explicitly ✔ completes attribute values ✔ completes the 2nd attribute's values ✔ keeps quotes for attribute values ✔ omits already closed quotes ✔ can handle single quotes ✔ completes close tags ✔ completes partial close tags ✔ only completes close tags that haven't already been closed ✔ includes close tag in completion after less-than ✔ completes allowed children ✔ completes allowed children after unfinished opening tag SQL completion ✔ completes table names ✔ completes quoted table names ✔ completes table names under schema ✔ completes quoted table names under schema ✔ completes quoted table names under quoted schema ✔ completes column names ✔ completes quoted column names ✔ completes column names in quoted tables ✔ completes column names in tables for a specific schema ✔ completes quoted column names in tables for a specific schema ✔ completes column names in quoted tables for a specific schema ✔ completes column names in quoted tables for a specific quoted schema ✔ completes quoted column names in quoted tables for a specific quoted schema ✔ completes column names in bracket quoted tables with MSSQL ✔ completes column names of aliased tables ✔ completes column names of aliased quoted tables ✔ completes column names of aliased tables for a specific schema ✔ completes column names in aliased quoted tables for a specific schema ✔ completes column names in aliased quoted tables for a specific quoted schema ✔ completes aliased table names ✔ completes bracket quoted aliases with MSSQL ✔ includes closing quote in completion ✔ keeps extra table completion properties ✔ keeps extra column completion properties ✔ supports a default table ✔ supports alternate quoting styles ✔ doesn't complete without identifier ✔ does complete explicitly without identifier ✔ adds identifiers for non-word completions ✔ adds identifiers for upper case completions ✔ can add MSSQL-style brackets as identifier quotes ✔ supports nesting more than two deep ✔ supports escaped dots in table names ✔ supports nested schema declarations ✔ supports self fields to specify table/schema completions ✔ can complete keywords ✔ can complete upper-case keywords ✔ can transform keyword completions Parse MySQL tokens ✔ parses quoted bit-value literals ✔ parses unquoted bit-value literals Parse PostgreSQL tokens ✔ parses quoted bit-value literals ✔ parses quoted bit-value literals ✔ parses double dollar quoted string literals ✔ parses tagged double dollar quoted string literals Parse BigQuery tokens ✔ parses quoted bytes literals in single quotes ✔ parses quoted bytes literals in double quotes ✔ parses bytes literals in single quotes ✔ parses bytes literals in double quotes Parse PL/SQL tokens ✔ parses alternative quoting mechanism - [] ✔ parses alternative quoting mechanism - {} ✔ parses alternative quoting mechanism - <> ✔ parses alternative quoting mechanism - () ✔ parses alternative quoting mechanism - custom ✔ parses alternative quoting mechanism - uppercase Q ✔ parses alternative quoting mechanism - unclosed Parse MSSQL tokens ✔ parses brackets as QuotedIdentifier XML completion ✔ completes closing tags ✔ completes attributes after a tag name ✔ completes attributes after a partial name ✔ completes attributes after another attribute ✔ completes attribute values ✔ completes partial attribute values ✔ completes locally defined attribute values ✔ doesn't complete for attributes without values ✔ completes tag names after a partial name ✔ completes tag names after a tag start ✔ completes closing tag names ✔ completes tags when in text ✔ doesn't complete close tags for already-closed elements ✔ only completes tags when explicit is true ✔ can attach extra info to completions ✔ completes the top element ✔ completes pre-provided text insertNewlineContinueMarkup ✔ doesn't continue anything at the top level ✔ doesn't do anything in non-Markdown content ✔ can continue blockquotes ✔ will end blockquotes after two empty lines ✔ will end nested blockquotes after two empty lines ✔ can continue nested blockquotes ✔ preserves the absence of a blockquote space ✔ can continue bullet lists with dashes ✔ can continue bullet lists with asterisks ✔ can continue bullet lists with plus signs ✔ can continue ordered lists with dots ✔ can continue ordered lists with parens ✔ can continue lists inside blockquotes ✔ can continue markup for multiple cursors ✔ can continue nested lists ✔ will leave space before nested blockquotes ✔ can drop trailing space when pressing enter in a blockquote ✔ can move list markup when pressing enter directly after it ✔ will preserve non-tight list after second item ✔ will preserve tight list after second item ✔ exits tight list after second item ✔ can drop list markup after an empty line ✔ deletes the first list marker ✔ will keep the current ordered list number when moving a marker ✔ can move list markup inside a blockquote ✔ can preserve list tightness inside a blockquote ✔ renumbers following ordered list items ✔ renumbers after removed markers ✔ stops renumbering on discontinuities ✔ doesn't fire when the cursor is before the markup depth ✔ continues list items ✔ continues dedented list items ✔ can lift out of one list level ✔ can lift out of one list level and renumber ✔ doesn't treat lines with content after the cursor as empty ✔ doesn't take effect in fenced code ✔ continues nested task lists at the right level ✔ properly indents task lists nested 2 deep ✔ handles tab-indentation deleteMarkupBackward ✔ does nothing in regular text ✔ does nothing at the top level ✔ can delete blockquote markers ✔ only deletes one marker at a time ✔ deletes trailing whitespace ✔ clears list markers ✔ removes extra indentation ✔ clears triple-space indentation ✔ clears one level of indentation ✔ deletes the first list marker immediately ✔ clears number markers in one go ✔ deletes nested list markers ✔ can delete for multiple cursors ✔ does noting in a continued list item ✔ doesn't delete normal text in continued list items ✔ normalizes whitespace on deleting Liquid parsing ✔ Interpolation ✔ Filters ✔ Unknown tag ✔ If ✔ Operators ✔ Booleans ✔ Whitespace control ✔ Case ✔ For ✔ Range ✔ Cycle ✔ Tablerow ✔ Comment ✔ Inline comment ✔ Raw ✔ Render ✔ Liquid ✔ Assign with filter ✔ Keyword as variable in interpolation ✔ Keyword as variable in tag ✔ Keyword as variable in liquid tag ✔ Multiple keywords as variables Less parsing ✔ // Variables ✔ @property: color; ✔ @primary: green; ✔ // Properties as variables ✔ // Parent selector join ✔ .a:extend(.b) {} ✔ pre:hover, ✔ :nth-child(1n+3) { ✔ // Merge ✔ // Guarded namespace ✔ .foo (@bg: #f5f5f5; @color: #900) { ✔ // Named parameters ✔ .mixin(...) {} ✔ // Mixin guards ✔ // Logic ops ✔ // Aliasing ✔ // Variable calls ✔ // declare detached ruleset ✔ @import (less) "foo.css"; ✔ @plugin "my-plugin"; ✔ // Detached without semi Jinja completion ✔ completes tags ✔ completes tag after an open tag ✔ completes filters ✔ completes filter after a bar ✔ completes filter in a filter statement ✔ completes expressions in a variable name ✔ completes expressions in a tag ✔ completes expressions in an interpolation ✔ doesn't complete in comments ✔ doesn't complete in strings ✔ completes custom globals ✔ can complete property names examples ✔ Comments ✔ Interpolation ✔ If ✔ For ✔ Raw ✔ Dashes on tags ✔ Block ✔ Extends ✔ Macro ✔ Call ✔ Filter ✔ Assignment ✔ Include ✔ Import ✔ Translation ✔ With ✔ Autoescape ✔ Literals ✔ Booleans ✔ Data Structures ✔ Operators ✔ Is Operator ✔ Properties ✔ Call expression ✔ If expression Browser tests (chrome) bidi ✔ properly handles isolates in RTL ✔ properly handles isolates in LTR ✔ properly handles isolates in RTL text in LTR context ✔ handles LTR isolates in nested numerals ✔ handles RTL isolates in nested numerals ✔ works for multiple isolates ✔ handles multiple isolates in a row ✔ supports nested isolates ✔ includes isolates at the end of spans in the base direction ✔ normalizes neutrals between isolates ✔ matches brackets across isolates LTR context ✔ codemirror ✔ كودالمرآة ✔ codeمرآة ✔ الشفرةmirror ✔ codeمرآةabc ✔ كود1234المرآة ✔ كودabcالمرآة ✔ كو, ✔ code123مرآة157abc ✔ foo ✔ مرآة ✔ ab12-34%م ✔ م1234%bc ✔ ر12:34ر ✔ xyאהxyאהxyאהxyאהxyאהxyאהxyאה ✔ ab مرآة10 cde 20مرآة! ✔ (ء)و) ✔ (([^ء-ي]|^)و) ✔ ء(و) ✔ [foo(barء)] LTR motion ✔ codemirror forward ✔ codemirror backward ✔ كودالمرآة forward ✔ كودالمرآة backward ✔ codeمرآة forward ✔ codeمرآة backward ✔ الشفرةmirror forward ✔ الشفرةmirror backward ✔ codeمرآةabc forward ✔ codeمرآةabc backward ✔ كود1234المرآة forward ✔ كود1234المرآة backward ✔ كودabcالمرآة forward ✔ كودabcالمرآة backward ✔ كو, forward ✔ كو, backward ✔ code123مرآة157abc forward ✔ code123مرآة157abc backward ✔ foo forward ✔ foo backward ✔ مرآة forward ✔ مرآة backward ✔ ab12-34%م forward ✔ ab12-34%م backward ✔ م1234%bc forward ✔ م1234%bc backward ✔ ر12:34ر forward ✔ ر12:34ر backward ✔ xyאהxyאהxyאהxyאהxyאהxyאהxyאה forward ✔ xyאהxyאהxyאהxyאהxyאהxyאהxyאה backward ✔ ab مرآة10 cde 20مرآة! forward ✔ ab مرآة10 cde 20مرآة! backward ✔ (ء)و) forward ✔ (ء)و) backward ✔ (([^ء-ي]|^)و) forward ✔ (([^ء-ي]|^)و) backward ✔ ء(و) forward ✔ ء(و) backward ✔ [foo(barء)] forward ✔ [foo(barء)] backward ✔ handles extending characters ✔ handles a misplaced non-joiner without going in a loop RTL context ✔ codemirror ✔ كودالمرآة ✔ codeمرآة ✔ الشفرةmirror ✔ codeمرآةabc ✔ كود1234المرآة ✔ كودabcالمرآة ✔ كو, ✔ code123مرآة157abc ✔ foo ✔ مرآة ✔ ab12-34%م ✔ م1234%bc ✔ ر12:34ر ✔ xyאהxyאהxyאהxyאהxyאהxyאהxyאה ✔ ab مرآة10 cde 20مرآة! ✔ (ء)و) ✔ (([^ء-ي]|^)و) ✔ ء(و) ✔ [foo(barء)] RTL motion ✔ codemirror forward ✔ codemirror backward ✔ كودالمرآة forward ✔ كودالمرآة backward ✔ codeمرآة forward ✔ codeمرآة backward ✔ الشفرةmirror forward ✔ الشفرةmirror backward ✔ codeمرآةabc forward ✔ codeمرآةabc backward ✔ كود1234المرآة forward ✔ كود1234المرآة backward ✔ كودabcالمرآة forward ✔ كودabcالمرآة backward ✔ كو, forward ✔ كو, backward ✔ code123مرآة157abc forward ✔ code123مرآة157abc backward ✔ foo forward ✔ foo backward ✔ مرآة forward ✔ مرآة backward ✔ ab12-34%م forward ✔ ab12-34%م backward ✔ م1234%bc forward ✔ م1234%bc backward ✔ ر12:34ر forward ✔ ر12:34ر backward ✔ xyאהxyאהxyאהxyאהxyאהxyאהxyאה forward ✔ xyאהxyאהxyאהxyאהxyאהxyאהxyאה backward ✔ ab مرآة10 cde 20مرآة! forward ✔ ab مرآة10 cde 20مرآة! backward ✔ (ء)و) forward ✔ (ء)و) backward ✔ (([^ء-ي]|^)و) forward ✔ (([^ء-ي]|^)و) backward ✔ ء(و) forward ✔ ء(و) backward ✔ [foo(barء)] forward ✔ [foo(barء)] backward ✔ handles extending characters ✔ handles a misplaced non-joiner without going in a loop Composition ✔ supports composition on an empty line ✔ supports composition at end of line in existing node ✔ supports composition at end of line in a new node ✔ supports composition at start of line in a new node ✔ supports composition inside existing text ✔ can deal with Android-style newline-after-composition ✔ handles replacement of existing words ✔ doesn't get interrupted by changes in decorations ✔ works inside highlighted text ✔ can handle compositions spanning multiple tokens ✔ doesn't overwrite widgets next to the composition ✔ works for composition in the middle of a mark ✔ works when composition rewraps the middle of a mark ✔ cancels composition when a change fully overlaps with it ✔ cancels composition when a change partially overlaps with it ✔ cancels composition when a change happens inside of it ✔ doesn't cancel composition when a change happens elsewhere ✔ doesn't cancel composition when the composition is moved into a new line ✔ doesn't cancel composition when a line break is inserted in front of it ✔ works before a block widget ✔ properly handles line break insertion at end of composition ✔ can handle browsers inserting new wrapper nodes around the composition ✔ can handle siblings being moved into a new wrapper ✔ doesn't cancel composition when a newline is added immediately in front ✔ handles compositions rapidly following each other ✔ applies compositions at secondary cursors ✔ applies compositions at secondary cursors even when the change is before the cursor ✔ doesn't try to apply multi-cursor composition in a single node ✔ can handle IME merging spans ✔ can handle IME extending text nodes EditorView coords ✔ can find coordinates for simple text ✔ can find coordinates in text scrolled into view horizontally ✔ can find coordinates in decorated text ✔ can find coordinates in line-wrapped text ✔ returns the proper position for coordinates past the end of a wrapped line ✔ can find coordinates in decorated line-wrapped text ✔ can find coordinates in RTL text ✔ can find coordinates in bidi text ✔ can find coordinates in wrapped bidi text ✔ takes coordinates before side=1 widgets ✔ takes coordinates after side=-1 widgets ✔ respects sides for widgets wrapped in marks ✔ takes coordinates between widgets ✔ takes coordinates before side=1 block widgets ✔ takes coordinates after side=-1 block widgets ✔ takes coordinates around non-inclusive block widgets ✔ takes proper coordinates for elements on decoration boundaries ✔ can find coordinates around a side=1 block widget ✔ can find coordinates around a side=-1 block widget ✔ can handle positions between non-uniform lines ✔ can handle coordinates above small text in a non-uniform line coordsForChar ✔ returns reasonable coords ✔ returns null for non-rendered characters ✔ returns proper rectangles in right-to-left text ✔ doesn't include space taken up by widgets ✔ returns positions for wrap points ✔ works in right-to-left text ✔ can handle nested elements with direction breaks EditorView text direction ✔ notices the text direction ✔ can compute direction per-line DOM changes ✔ notices text changes ✔ handles browser enter behavior ✔ supports deleting lines ✔ can deal with large insertions ✔ properly handles selection for ambiguous backspace ✔ notices text changes at the end of a long document ✔ handles replacing a selection with a prefix of itself ✔ handles replacing a selection with a suffix of itself ✔ handles replacing a selection with a prefix of itself and something else ✔ handles replacing a selection with a suffix of itself and something else ✔ handles replacing a selection with new content that shares a prefix and a suffix ✔ handles appending ✔ handles deleting the first line and the newline after it ✔ handles deleting a line with an empty line after it ✔ doesn't drop collapsed text ✔ preserves text nodes when edited in the middle ✔ preserves text nodes when edited at the start ✔ preserves text nodes when edited at the end ✔ doesn't insert newlines for block widgets ✔ correctly handles changes ending on a widget ✔ calls input handlers ✔ ignores dom-changes in read-only mode ✔ can handle crlf insertion ✔ works when line breaks are multiple characters ✔ doesn't insert a newline after a block widget ✔ can repair attributes on lines ✔ can repair attributes on marks EditorView decoration ✔ renders tag names ✔ renders attributes ✔ updates for added decorations ✔ updates for removed decorations ✔ doesn't update DOM that doesn't need to change ✔ nests decoration elements ✔ drops entirely deleted decorations ✔ doesn't merge separate decorations ✔ merges joined decorations ✔ properly joins decorations when partially reusing them ✔ keeps identical but separate decorations separate ✔ merges stacked decorations ✔ keeps decorations together when deleting inside of them ✔ does merge recreated decorations ✔ breaks high-precedence ranges for low-precedence wrappers ✔ draws outer decorations around others ✔ properly updates the viewport gap when changes fall inside it ✔ reuses mark nodes ✔ properly handles random decorations and changes widget ✔ draws widgets ✔ supports editing around widgets ✔ compares widgets with their eq method ✔ notices replaced replacement decorations ✔ allows replacements to shadow inner replacements ✔ doesn't consider different widgets types equivalent ✔ orders widgets by side ✔ places the cursor based on side ✔ preserves widgets alongside edits regardless of side ✔ reuses widgets on empty lines ✔ can update widgets in an empty document ✔ doesn't duplicate widgets on line splitting ✔ can remove widgets at the end of a line ✔ can wrap widgets in marks ✔ includes negative-side widgets in marks that end at their position ✔ includes positive-side widgets in marks that start at their position ✔ wraps widgets even when the mark starts at the same offset ✔ merges text around a removed widget ✔ draws buffers around widgets ✔ doesn't draw unnecessary buffers between adjacent widgets ✔ doesn't wrap buffers at the start of a mark in the mark ✔ puts a buffer in front of widgets spanned by marks ✔ reuses buffers on redraw ✔ calls the destroy method on destroyed widgets ✔ calls the destroy method widgets when the editor is destroyed ✔ calls destroy on updated widgets ✔ can show inline and block widgets next to each other after a position ✔ can show inline and block widgets next to each other before a position ✔ updates widgets when appropriate replaced ✔ omits replaced content ✔ can replace across lines ✔ draws replacement widgets ✔ can handle multiple overlapping replaced ranges ✔ allows splitting a replaced range ✔ allows replacing a single replaced range with two adjacent ones ✔ can handle changes inside replaced content ✔ preserves selection endpoints inside replaced ranges ✔ draws buffers around replacements ✔ properly handles marks growing to include replaced ranges ✔ covers block ranges at the end of a replaced range ✔ raises errors for replacing decorations from plugins if they cross lines line attributes ✔ adds line attributes ✔ updates when line attributes are added ✔ updates when line attributes are removed ✔ handles line joining properly ✔ handles line splitting properly ✔ can handle insertion block widgets ✔ draws block widgets in the right place ✔ adds widgets when they appear ✔ removes widgets when they vanish ✔ draws block ranges ✔ can add widgets at the end and start of the doc ✔ can add widgets around inner lines ✔ can replace an empty line with a range ✔ can put a block range in the middle of a line ✔ can draw a block range that partially overlaps with a collapsed range ✔ doesn't redraw unchanged widgets ✔ does redraw changed widgets ✔ allows splitting a block widget ✔ block replacements cover inline widgets but not block widgets on their sides ✔ block replacements cover inline replacements at their sides ✔ doesn't draw replaced lines even when decorated ✔ draws lines around non-inclusive block widgets ✔ raises an error when providing block widgets from plugins block wrappers ✔ can wrap a line ✔ can wrap multiple lines ✔ only takes effect at the start of a line ✔ can nest wrappers ✔ uses precedence to determine nesting order ✔ uses rank to determine nesting order within a source ✔ doesn't join individual wrappers ✔ can handle changes in wrappers ✔ can handle replacements at end of wrappers ✔ can skip large distances correctly ✔ represents wrapper padding and borders as ghost widgets ✔ properly measures nested wrapper padding EditorView drawing ✔ follows updates to the document ✔ works in multiple lines ✔ can split a line ✔ redraws lazily ✔ notices the doc needs to be redrawn when only inserting empty lines ✔ draws BR nodes on empty lines ✔ only draws visible content ✔ scrolls the selection into view when asked ✔ can scroll ranges into view ✔ keeps a drawn area around selection ends ✔ can handle replace-all like events ✔ can replace across line boundaries ✔ can handle deleting a line's content ✔ can insert blank lines at the end of the document ✔ can handle deleting the end of a line ✔ correctly handles very complicated transactions ✔ notices it is added to the DOM even if initially detached ✔ hides parts of long lines that are horizontally out of view ✔ stabilizes the scroll position in the middle ✔ stabilizes the scroll position at the end ✔ doesn't overcompensate scroll position for poorly estimated height ✔ hides parts of long lines that are vertically out of view ✔ properly attaches styles in shadow roots ✔ allows editor attributes to override each other ✔ updates height info when a widget changes size ✔ reuses line nodes ✔ splits long stretches of text into chunks EditorView events ✔ runs built-in handlers ✔ runs custom handlers ✔ runs handlers in the right order ✔ stops running handlers on handled events ✔ runs observers before handlers ✔ can dynamically change event handlers ✔ runs handlers with this bound to the plugin EditorView extension ✔ calls update when the viewport changes ✔ calls update on plugins ✔ allows content attributes to be changed through effects ✔ allows editor attributes to be changed through effects ✔ redraws the view when phrases change ✔ supports plugins with arguments hoverTooltip ✔ renders one tooltip view in container ✔ renders two tooltip views in container ✔ adds tooltip view if mouse moves into the range ✔ removes tooltip view if mouse moves outside of the range EditorView selection ✔ can read the DOM selection ✔ syncs the DOM selection with the editor selection commands cursorSubwordForward ✔ stops at first camelcase boundary ✔ stops at inner camelcase boundary ✔ stops at last camelcase boundary ✔ treats ranges of capitals as a single word ✔ stops at the end of word ✔ stops before underscores ✔ stops after underscores ✔ stops before dashes ✔ stops after dashes ✔ stops on dashes at end of word ✔ stops on CJK word boundaries cursorSubwordBackward ✔ stops at camelcase boundary ✔ stops at last camelcase boundary ✔ treats ranges of capitals as a single word ✔ stops at the end of word ✔ stops before underscores ✔ stops after underscores ✔ stops before dashes ✔ stops after dashes ✔ stops on dashes at end of word ✔ stops on CJK word boundaries cursorLineDown ✔ can move to the next line ✔ can move to a shorter line ✔ goes to the end on last line ✔ keeps a colum pos across a shorter line ✔ can move in a wrapped line ✔ isn't affected by folded lines ✔ skips block widgets ✔ skips multiple block widgets ✔ skips inline widgets on their own line ✔ can escape lines with padding ✔ can move in a wrapped line with large line height ✔ keeps assoc when moving through wrapped text cursorLineUp ✔ can move to the previous line ✔ can move to a shorter line ✔ goes to the start on first line ✔ keeps a colum pos across a shorter line ✔ can move in a wrapped line ✔ isn't affected by folded lines ✔ skips block widgets ✔ skips multiple block widgets ✔ can escape lines with padding selectLineDown ✔ selects to the next line ✔ keeps the horizontal position ✔ keeps a colum pos across a shorter line ✔ moves to the end of doc when moving beyond the last line ✔ clears goal column when hitting the end of doc ✔ preserves assoc in wrapped text selectLineUp ✔ selects to the previous line ✔ keeps the horizontal position ✔ keeps a colum pos across a shorter line ✔ moves to the start of doc when moving beyond the first line ✔ clears goal column when hitting the start of doc autocomplete ✔ works LSPClient ✔ can connect to a server ✔ can open a file ✔ can update a file ✔ can update a file with multiple changes ✔ can close a file ✔ can open multiple files ✔ can provide mapping ✔ can provide mapping across syncs ✔ reports invalid methods ✔ can receive custom notifications ✔ can report unknown notifications ✔ can display messages in the editor ✔ routes exceptions from Transport.send to the request promise LSPPlugin ✔ can render doc strings ✔ can render doc strings with highlighting ✔ can convert to LSP positions ✔ can convert from positions ✔ can display errors renameSymbol ✔ can run a rename ✔ can handle changes during the request formatDocument ✔ can make format requests completion ✔ can get completions from the server ✔ expands snippet completions and unescapes LSP escapes hoverTooltips ✔ can retrieve hover info signatureHelp ✔ can display a signature 1172 passing (2s)