mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-11-14 15:20:28 +03:00
5f76979fc8
We previously implemented soft-wrap logic again just for this test. Since the purpose of this test is just to make sure that mutation occurs correctly, we now instead construct a fresh editor for comparison so that changes to soft-wrap logic are reflected. /cc @as-cii Took care of this, so you don’t need to worry about my previous comment on your PR. Sorry for the noise.
91 lines
3.2 KiB
CoffeeScript
91 lines
3.2 KiB
CoffeeScript
{times, random} = require 'underscore-plus'
|
|
randomWords = require 'random-words'
|
|
TextBuffer = require 'text-buffer'
|
|
TextEditor = require '../src/text-editor'
|
|
|
|
describe "TextEditor", ->
|
|
[editor, tokenizedBuffer, buffer, steps] = []
|
|
|
|
softWrapColumn = 80
|
|
|
|
beforeEach ->
|
|
atom.config.set('editor.softWrapAtPreferredLineLength', true)
|
|
atom.config.set('editor.preferredLineLength', softWrapColumn)
|
|
|
|
it "properly renders soft-wrapped lines when randomly mutated", ->
|
|
times 10, (i) ->
|
|
buffer = new TextBuffer
|
|
editor = new TextEditor({buffer})
|
|
editor.setEditorWidthInChars(80)
|
|
tokenizedBuffer = editor.displayBuffer.tokenizedBuffer
|
|
steps = []
|
|
|
|
times 30, ->
|
|
randomlyMutateEditor()
|
|
verifyLines()
|
|
|
|
verifyLines = ->
|
|
{bufferRows, screenLines} = getReferenceScreenLines()
|
|
for referenceBufferRow, screenRow in bufferRows
|
|
referenceScreenLine = screenLines[screenRow]
|
|
actualBufferRow = editor.bufferRowForScreenRow(screenRow)
|
|
unless actualBufferRow is referenceBufferRow
|
|
logLines()
|
|
throw new Error("Invalid buffer row #{actualBufferRow} for screen row #{screenRow}", )
|
|
|
|
actualScreenLine = editor.tokenizedLineForScreenRow(screenRow)
|
|
unless actualScreenLine.text is referenceScreenLine.text
|
|
logLines()
|
|
throw new Error("Invalid line text at screen row #{screenRow}")
|
|
|
|
logLines = ->
|
|
console.log "==== screen lines ===="
|
|
editor.logScreenLines()
|
|
console.log "==== reference lines ===="
|
|
{bufferRows, screenLines} = getReferenceScreenLines()
|
|
for bufferRow, screenRow in bufferRows
|
|
console.log screenRow, bufferRow, screenLines[screenRow].text
|
|
console.log "==== steps to reproduce this failure: ==="
|
|
for step in steps
|
|
console.log 'editor.' + step[0] + '('+ step[1..].map((a) -> JSON.stringify(a)).join(', ') + ')'
|
|
|
|
randomlyMutateEditor = ->
|
|
if Math.random() < .2
|
|
softWrapped = not editor.isSoftWrapped()
|
|
steps.push(['setSoftWrapped', softWrapped])
|
|
editor.setSoftWrapped(softWrapped)
|
|
else
|
|
range = getRandomRange()
|
|
text = getRandomText()
|
|
steps.push(['setTextInBufferRange', range, text])
|
|
editor.setTextInBufferRange(range, text)
|
|
|
|
getRandomRange = ->
|
|
startRow = random(0, buffer.getLastRow())
|
|
startColumn = random(0, buffer.lineForRow(startRow).length)
|
|
endRow = random(startRow, buffer.getLastRow())
|
|
endColumn = random(0, buffer.lineForRow(endRow).length)
|
|
[[startRow, startColumn], [endRow, endColumn]]
|
|
|
|
getRandomText = ->
|
|
text = []
|
|
max = buffer.getText().split(/\s/).length * 0.75
|
|
|
|
times random(5, max), ->
|
|
if Math.random() < .1
|
|
text += '\n'
|
|
else
|
|
text += " " if /\w$/.test(text)
|
|
text += randomWords(exactly: 1)
|
|
text
|
|
|
|
getReferenceScreenLines = ->
|
|
referenceEditor = new TextEditor({})
|
|
referenceEditor.setEditorWidthInChars(80)
|
|
referenceEditor.setText(editor.getText())
|
|
referenceEditor.setSoftWrapped(editor.isSoftWrapped())
|
|
screenLines = referenceEditor.tokenizedLinesForScreenRows(0, referenceEditor.getLastScreenRow())
|
|
bufferRows = referenceEditor.bufferRowsForScreenRows(0, referenceEditor.getLastScreenRow())
|
|
|
|
{screenLines, bufferRows}
|