@fairyhunter13/opentui-core 0.1.114 → 0.1.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/3d/SpriteResourceManager.d.ts +74 -0
- package/3d/SpriteUtils.d.ts +13 -0
- package/3d/TextureUtils.d.ts +24 -0
- package/3d/ThreeRenderable.d.ts +40 -0
- package/3d/WGPURenderer.d.ts +61 -0
- package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
- package/3d/animation/SpriteAnimator.d.ts +124 -0
- package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
- package/3d/canvas.d.ts +44 -0
- package/3d/index.d.ts +12 -0
- package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
- package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
- package/3d/physics/physics-interface.d.ts +27 -0
- package/3d.d.ts +2 -0
- package/3d.js +34041 -0
- package/3d.js.map +155 -0
- package/LICENSE +21 -0
- package/NativeSpanFeed.d.ts +41 -0
- package/Renderable.d.ts +334 -0
- package/animation/Timeline.d.ts +126 -0
- package/ansi.d.ts +13 -0
- package/buffer.d.ts +111 -0
- package/console.d.ts +144 -0
- package/edit-buffer.d.ts +98 -0
- package/editor-view.d.ts +73 -0
- package/index-j4m38kjn.js +411 -0
- package/index-j4m38kjn.js.map +10 -0
- package/index-tse8gzh0.js +20614 -0
- package/index-tse8gzh0.js.map +67 -0
- package/index-vv2jcd4r.js +12299 -0
- package/index-vv2jcd4r.js.map +42 -0
- package/index.d.ts +23 -0
- package/index.js +478 -0
- package/index.js.map +9 -0
- package/lib/KeyHandler.d.ts +61 -0
- package/lib/RGBA.d.ts +25 -0
- package/lib/ascii.font.d.ts +508 -0
- package/lib/border.d.ts +51 -0
- package/lib/bunfs.d.ts +7 -0
- package/lib/clipboard.d.ts +17 -0
- package/lib/clock.d.ts +15 -0
- package/lib/data-paths.d.ts +26 -0
- package/lib/debounce.d.ts +42 -0
- package/lib/detect-links.d.ts +6 -0
- package/lib/env.d.ts +42 -0
- package/lib/extmarks-history.d.ts +17 -0
- package/lib/extmarks.d.ts +89 -0
- package/lib/hast-styled-text.d.ts +17 -0
- package/lib/index.d.ts +21 -0
- package/lib/keymapping.d.ts +25 -0
- package/lib/objects-in-viewport.d.ts +24 -0
- package/lib/output.capture.d.ts +24 -0
- package/lib/parse.keypress-kitty.d.ts +2 -0
- package/lib/parse.keypress.d.ts +26 -0
- package/lib/parse.mouse.d.ts +30 -0
- package/lib/paste.d.ts +7 -0
- package/lib/queue.d.ts +15 -0
- package/lib/renderable.validations.d.ts +12 -0
- package/lib/scroll-acceleration.d.ts +43 -0
- package/lib/selection.d.ts +63 -0
- package/lib/singleton.d.ts +7 -0
- package/lib/stdin-parser.d.ts +87 -0
- package/lib/styled-text.d.ts +63 -0
- package/lib/terminal-capability-detection.d.ts +30 -0
- package/lib/terminal-palette.d.ts +50 -0
- package/lib/tree-sitter/assets/update.d.ts +11 -0
- package/lib/tree-sitter/client.d.ts +47 -0
- package/lib/tree-sitter/default-parsers.d.ts +2 -0
- package/lib/tree-sitter/download-utils.d.ts +21 -0
- package/lib/tree-sitter/index.d.ts +8 -0
- package/lib/tree-sitter/parser.worker.d.ts +1 -0
- package/lib/tree-sitter/parsers-config.d.ts +53 -0
- package/lib/tree-sitter/resolve-ft.d.ts +5 -0
- package/lib/tree-sitter/types.d.ts +82 -0
- package/lib/tree-sitter-styled-text.d.ts +14 -0
- package/lib/validate-dir-name.d.ts +1 -0
- package/lib/yoga.options.d.ts +32 -0
- package/package.json +50 -62
- package/parser.worker.js +899 -0
- package/parser.worker.js.map +12 -0
- package/plugins/core-slot.d.ts +72 -0
- package/plugins/registry.d.ts +42 -0
- package/plugins/types.d.ts +34 -0
- package/post/effects.d.ts +147 -0
- package/post/filters.d.ts +65 -0
- package/post/matrices.d.ts +20 -0
- package/renderables/ASCIIFont.d.ts +52 -0
- package/renderables/Box.d.ts +81 -0
- package/renderables/Code.d.ts +78 -0
- package/renderables/Diff.d.ts +142 -0
- package/renderables/EditBufferRenderable.d.ts +237 -0
- package/renderables/FrameBuffer.d.ts +16 -0
- package/renderables/Input.d.ts +67 -0
- package/renderables/LineNumberRenderable.d.ts +78 -0
- package/renderables/Markdown.d.ts +185 -0
- package/renderables/ScrollBar.d.ts +77 -0
- package/renderables/ScrollBox.d.ts +124 -0
- package/renderables/Select.d.ts +115 -0
- package/renderables/Slider.d.ts +47 -0
- package/renderables/TabSelect.d.ts +96 -0
- package/renderables/Text.d.ts +36 -0
- package/renderables/TextBufferRenderable.d.ts +105 -0
- package/renderables/TextNode.d.ts +91 -0
- package/renderables/TextTable.d.ts +140 -0
- package/renderables/Textarea.d.ts +63 -0
- package/renderables/TimeToFirstDraw.d.ts +24 -0
- package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
- package/renderables/composition/VRenderable.d.ts +16 -0
- package/renderables/composition/constructs.d.ts +35 -0
- package/renderables/composition/vnode.d.ts +46 -0
- package/renderables/index.d.ts +23 -0
- package/renderables/markdown-parser.d.ts +10 -0
- package/renderer.d.ts +419 -0
- package/runtime-plugin-support.d.ts +3 -0
- package/runtime-plugin-support.js +29 -0
- package/runtime-plugin-support.js.map +10 -0
- package/runtime-plugin.d.ts +16 -0
- package/runtime-plugin.js +16 -0
- package/runtime-plugin.js.map +9 -0
- package/syntax-style.d.ts +54 -0
- package/testing/manual-clock.d.ts +17 -0
- package/testing/mock-keys.d.ts +81 -0
- package/testing/mock-mouse.d.ts +38 -0
- package/testing/mock-tree-sitter-client.d.ts +23 -0
- package/testing/spy.d.ts +7 -0
- package/testing/test-recorder.d.ts +61 -0
- package/testing/test-renderer.d.ts +23 -0
- package/testing.d.ts +6 -0
- package/testing.js +697 -0
- package/testing.js.map +15 -0
- package/text-buffer-view.d.ts +42 -0
- package/text-buffer.d.ts +67 -0
- package/types.d.ts +139 -0
- package/utils.d.ts +14 -0
- package/zig-structs.d.ts +155 -0
- package/zig.d.ts +353 -0
- package/dev/keypress-debug-renderer.ts +0 -148
- package/dev/keypress-debug.ts +0 -43
- package/dev/print-env-vars.ts +0 -32
- package/dev/test-tmux-graphics-334.sh +0 -68
- package/dev/thai-debug-test.ts +0 -68
- package/docs/development.md +0 -144
- package/scripts/build.ts +0 -400
- package/scripts/publish.ts +0 -60
- package/src/3d/SpriteResourceManager.ts +0 -286
- package/src/3d/SpriteUtils.ts +0 -70
- package/src/3d/TextureUtils.ts +0 -196
- package/src/3d/ThreeRenderable.ts +0 -197
- package/src/3d/WGPURenderer.ts +0 -294
- package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
- package/src/3d/animation/SpriteAnimator.ts +0 -633
- package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
- package/src/3d/canvas.ts +0 -464
- package/src/3d/index.ts +0 -12
- package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
- package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
- package/src/3d/physics/physics-interface.ts +0 -31
- package/src/3d/shaders/supersampling.wgsl +0 -201
- package/src/3d.ts +0 -3
- package/src/NativeSpanFeed.ts +0 -300
- package/src/Renderable.ts +0 -1704
- package/src/__snapshots__/buffer.test.ts.snap +0 -28
- package/src/animation/Timeline.test.ts +0 -2709
- package/src/animation/Timeline.ts +0 -598
- package/src/ansi.ts +0 -18
- package/src/benchmark/attenuation-benchmark.ts +0 -81
- package/src/benchmark/colormatrix-benchmark.ts +0 -128
- package/src/benchmark/gain-benchmark.ts +0 -80
- package/src/benchmark/latest-all-bench-run.json +0 -707
- package/src/benchmark/latest-async-bench-run.json +0 -336
- package/src/benchmark/latest-default-bench-run.json +0 -657
- package/src/benchmark/latest-large-bench-run.json +0 -707
- package/src/benchmark/latest-quick-bench-run.json +0 -207
- package/src/benchmark/markdown-benchmark.ts +0 -1796
- package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
- package/src/benchmark/native-span-feed-benchmark.md +0 -56
- package/src/benchmark/native-span-feed-benchmark.ts +0 -596
- package/src/benchmark/native-span-feed-compare.ts +0 -280
- package/src/benchmark/renderer-benchmark.ts +0 -754
- package/src/benchmark/text-table-benchmark.ts +0 -948
- package/src/buffer.test.ts +0 -291
- package/src/buffer.ts +0 -554
- package/src/console.test.ts +0 -612
- package/src/console.ts +0 -1254
- package/src/edit-buffer.test.ts +0 -1769
- package/src/edit-buffer.ts +0 -411
- package/src/editor-view.test.ts +0 -1032
- package/src/editor-view.ts +0 -284
- package/src/examples/ascii-font-selection-demo.ts +0 -245
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +0 -1018
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +0 -115
- package/src/examples/code-demo.ts +0 -924
- package/src/examples/console-demo.ts +0 -358
- package/src/examples/core-plugin-slots-demo.ts +0 -759
- package/src/examples/diff-demo.ts +0 -701
- package/src/examples/draggable-three-demo.ts +0 -259
- package/src/examples/editor-demo.ts +0 -322
- package/src/examples/extmarks-demo.ts +0 -196
- package/src/examples/focus-restore-demo.ts +0 -310
- package/src/examples/fonts.ts +0 -245
- package/src/examples/fractal-shader-demo.ts +0 -268
- package/src/examples/framebuffer-demo.ts +0 -674
- package/src/examples/full-unicode-demo.ts +0 -241
- package/src/examples/golden-star-demo.ts +0 -933
- package/src/examples/grayscale-buffer-demo.ts +0 -249
- package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
- package/src/examples/index.ts +0 -926
- package/src/examples/input-demo.ts +0 -377
- package/src/examples/input-select-layout-demo.ts +0 -425
- package/src/examples/install.sh +0 -143
- package/src/examples/keypress-debug-demo.ts +0 -452
- package/src/examples/lib/HexList.ts +0 -122
- package/src/examples/lib/PaletteGrid.ts +0 -125
- package/src/examples/lib/standalone-keys.ts +0 -25
- package/src/examples/lib/tab-controller.ts +0 -243
- package/src/examples/lights-phong-demo.ts +0 -290
- package/src/examples/link-demo.ts +0 -220
- package/src/examples/live-state-demo.ts +0 -480
- package/src/examples/markdown-demo.ts +0 -725
- package/src/examples/mouse-interaction-demo.ts +0 -428
- package/src/examples/nested-zindex-demo.ts +0 -357
- package/src/examples/opacity-example.ts +0 -235
- package/src/examples/opentui-demo.ts +0 -1057
- package/src/examples/physx-planck-2d-demo.ts +0 -623
- package/src/examples/physx-rapier-2d-demo.ts +0 -655
- package/src/examples/relative-positioning-demo.ts +0 -323
- package/src/examples/scroll-example.ts +0 -214
- package/src/examples/scrollbox-mouse-test.ts +0 -112
- package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
- package/src/examples/select-demo.ts +0 -237
- package/src/examples/shader-cube-demo.ts +0 -1015
- package/src/examples/simple-layout-example.ts +0 -591
- package/src/examples/slider-demo.ts +0 -617
- package/src/examples/split-mode-demo.ts +0 -453
- package/src/examples/sprite-animation-demo.ts +0 -443
- package/src/examples/sprite-particle-generator-demo.ts +0 -486
- package/src/examples/static-sprite-demo.ts +0 -193
- package/src/examples/sticky-scroll-example.ts +0 -308
- package/src/examples/styled-text-demo.ts +0 -282
- package/src/examples/tab-select-demo.ts +0 -219
- package/src/examples/terminal-title.ts +0 -29
- package/src/examples/terminal.ts +0 -305
- package/src/examples/text-node-demo.ts +0 -416
- package/src/examples/text-selection-demo.ts +0 -377
- package/src/examples/text-table-demo.ts +0 -503
- package/src/examples/text-truncation-demo.ts +0 -481
- package/src/examples/text-wrap.ts +0 -757
- package/src/examples/texture-loading-demo.ts +0 -259
- package/src/examples/timeline-example.ts +0 -670
- package/src/examples/transparency-demo.ts +0 -400
- package/src/examples/vnode-composition-demo.ts +0 -404
- package/src/examples/wide-grapheme-overlay-demo.ts +0 -280
- package/src/index.ts +0 -24
- package/src/lib/KeyHandler.integration.test.ts +0 -292
- package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
- package/src/lib/KeyHandler.test.ts +0 -662
- package/src/lib/KeyHandler.ts +0 -222
- package/src/lib/RGBA.test.ts +0 -984
- package/src/lib/RGBA.ts +0 -204
- package/src/lib/ascii.font.ts +0 -330
- package/src/lib/border.test.ts +0 -83
- package/src/lib/border.ts +0 -170
- package/src/lib/bunfs.test.ts +0 -27
- package/src/lib/bunfs.ts +0 -18
- package/src/lib/clipboard.test.ts +0 -41
- package/src/lib/clipboard.ts +0 -47
- package/src/lib/clock.ts +0 -35
- package/src/lib/data-paths.test.ts +0 -133
- package/src/lib/data-paths.ts +0 -109
- package/src/lib/debounce.ts +0 -106
- package/src/lib/detect-links.test.ts +0 -98
- package/src/lib/detect-links.ts +0 -56
- package/src/lib/env.test.ts +0 -228
- package/src/lib/env.ts +0 -209
- package/src/lib/extmarks-history.ts +0 -51
- package/src/lib/extmarks-multiwidth.test.ts +0 -322
- package/src/lib/extmarks.test.ts +0 -3457
- package/src/lib/extmarks.ts +0 -843
- package/src/lib/fonts/block.json +0 -405
- package/src/lib/fonts/grid.json +0 -265
- package/src/lib/fonts/huge.json +0 -741
- package/src/lib/fonts/pallet.json +0 -314
- package/src/lib/fonts/shade.json +0 -591
- package/src/lib/fonts/slick.json +0 -321
- package/src/lib/fonts/tiny.json +0 -69
- package/src/lib/hast-styled-text.ts +0 -59
- package/src/lib/index.ts +0 -21
- package/src/lib/keymapping.test.ts +0 -317
- package/src/lib/keymapping.ts +0 -115
- package/src/lib/objects-in-viewport.test.ts +0 -787
- package/src/lib/objects-in-viewport.ts +0 -153
- package/src/lib/output.capture.ts +0 -58
- package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
- package/src/lib/parse.keypress-kitty.test.ts +0 -663
- package/src/lib/parse.keypress-kitty.ts +0 -439
- package/src/lib/parse.keypress.test.ts +0 -1849
- package/src/lib/parse.keypress.ts +0 -397
- package/src/lib/parse.mouse.test.ts +0 -552
- package/src/lib/parse.mouse.ts +0 -232
- package/src/lib/paste.ts +0 -16
- package/src/lib/queue.ts +0 -65
- package/src/lib/renderable.validations.test.ts +0 -87
- package/src/lib/renderable.validations.ts +0 -83
- package/src/lib/scroll-acceleration.ts +0 -98
- package/src/lib/selection.ts +0 -240
- package/src/lib/singleton.ts +0 -28
- package/src/lib/stdin-parser.test.ts +0 -2290
- package/src/lib/stdin-parser.ts +0 -1810
- package/src/lib/styled-text.ts +0 -178
- package/src/lib/terminal-capability-detection.test.ts +0 -202
- package/src/lib/terminal-capability-detection.ts +0 -79
- package/src/lib/terminal-palette.test.ts +0 -878
- package/src/lib/terminal-palette.ts +0 -383
- package/src/lib/tree-sitter/assets/README.md +0 -118
- package/src/lib/tree-sitter/assets/update.ts +0 -334
- package/src/lib/tree-sitter/assets.d.ts +0 -9
- package/src/lib/tree-sitter/cache.test.ts +0 -273
- package/src/lib/tree-sitter/client.test.ts +0 -1165
- package/src/lib/tree-sitter/client.ts +0 -607
- package/src/lib/tree-sitter/default-parsers.ts +0 -86
- package/src/lib/tree-sitter/download-utils.ts +0 -148
- package/src/lib/tree-sitter/index.ts +0 -28
- package/src/lib/tree-sitter/parser.worker.ts +0 -1042
- package/src/lib/tree-sitter/parsers-config.ts +0 -81
- package/src/lib/tree-sitter/resolve-ft.test.ts +0 -55
- package/src/lib/tree-sitter/resolve-ft.ts +0 -189
- package/src/lib/tree-sitter/types.ts +0 -82
- package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
- package/src/lib/tree-sitter-styled-text.ts +0 -306
- package/src/lib/validate-dir-name.ts +0 -55
- package/src/lib/yoga.options.test.ts +0 -628
- package/src/lib/yoga.options.ts +0 -346
- package/src/plugins/core-slot.ts +0 -579
- package/src/plugins/registry.ts +0 -402
- package/src/plugins/types.ts +0 -46
- package/src/post/effects.ts +0 -930
- package/src/post/filters.ts +0 -489
- package/src/post/matrices.ts +0 -288
- package/src/renderables/ASCIIFont.ts +0 -219
- package/src/renderables/Box.test.ts +0 -205
- package/src/renderables/Box.ts +0 -326
- package/src/renderables/Code.test.ts +0 -2062
- package/src/renderables/Code.ts +0 -357
- package/src/renderables/Diff.regression.test.ts +0 -226
- package/src/renderables/Diff.test.ts +0 -3101
- package/src/renderables/Diff.ts +0 -1211
- package/src/renderables/EditBufferRenderable.test.ts +0 -288
- package/src/renderables/EditBufferRenderable.ts +0 -1166
- package/src/renderables/FrameBuffer.ts +0 -47
- package/src/renderables/Input.test.ts +0 -1228
- package/src/renderables/Input.ts +0 -247
- package/src/renderables/LineNumberRenderable.ts +0 -724
- package/src/renderables/Markdown.ts +0 -1393
- package/src/renderables/ScrollBar.ts +0 -422
- package/src/renderables/ScrollBox.ts +0 -883
- package/src/renderables/Select.test.ts +0 -1033
- package/src/renderables/Select.ts +0 -524
- package/src/renderables/Slider.test.ts +0 -456
- package/src/renderables/Slider.ts +0 -342
- package/src/renderables/TabSelect.test.ts +0 -197
- package/src/renderables/TabSelect.ts +0 -455
- package/src/renderables/Text.selection-buffer.test.ts +0 -123
- package/src/renderables/Text.test.ts +0 -2660
- package/src/renderables/Text.ts +0 -147
- package/src/renderables/TextBufferRenderable.ts +0 -518
- package/src/renderables/TextNode.test.ts +0 -1058
- package/src/renderables/TextNode.ts +0 -325
- package/src/renderables/TextTable.test.ts +0 -1421
- package/src/renderables/TextTable.ts +0 -1344
- package/src/renderables/Textarea.ts +0 -430
- package/src/renderables/TimeToFirstDraw.ts +0 -89
- package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
- package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
- package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1865
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +0 -242
- package/src/renderables/__tests__/Markdown.test.ts +0 -2518
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
- package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
- package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
- package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
- package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
- package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
- package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1866
- package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
- package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
- package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
- package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
- package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
- package/src/renderables/composition/README.md +0 -8
- package/src/renderables/composition/VRenderable.ts +0 -32
- package/src/renderables/composition/constructs.ts +0 -127
- package/src/renderables/composition/vnode.ts +0 -289
- package/src/renderables/index.ts +0 -23
- package/src/renderables/markdown-parser.ts +0 -66
- package/src/renderer.ts +0 -2681
- package/src/runtime-plugin-support.ts +0 -39
- package/src/runtime-plugin.ts +0 -615
- package/src/syntax-style.test.ts +0 -841
- package/src/syntax-style.ts +0 -257
- package/src/testing/README.md +0 -210
- package/src/testing/capture-spans.test.ts +0 -194
- package/src/testing/integration.test.ts +0 -276
- package/src/testing/manual-clock.ts +0 -117
- package/src/testing/mock-keys.test.ts +0 -1378
- package/src/testing/mock-keys.ts +0 -457
- package/src/testing/mock-mouse.test.ts +0 -218
- package/src/testing/mock-mouse.ts +0 -247
- package/src/testing/mock-tree-sitter-client.ts +0 -73
- package/src/testing/spy.ts +0 -13
- package/src/testing/test-recorder.test.ts +0 -415
- package/src/testing/test-recorder.ts +0 -145
- package/src/testing/test-renderer.ts +0 -132
- package/src/testing.ts +0 -7
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
- package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
- package/src/tests/allocator-stats.test.ts +0 -38
- package/src/tests/destroy-during-render.test.ts +0 -200
- package/src/tests/destroy-on-exit.fixture.ts +0 -36
- package/src/tests/destroy-on-exit.test.ts +0 -41
- package/src/tests/hover-cursor.test.ts +0 -98
- package/src/tests/native-span-feed-async.test.ts +0 -173
- package/src/tests/native-span-feed-close.test.ts +0 -120
- package/src/tests/native-span-feed-coverage.test.ts +0 -227
- package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
- package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
- package/src/tests/opacity.test.ts +0 -123
- package/src/tests/renderable.snapshot.test.ts +0 -524
- package/src/tests/renderable.test.ts +0 -1281
- package/src/tests/renderer.clock.test.ts +0 -158
- package/src/tests/renderer.console-startup.test.ts +0 -185
- package/src/tests/renderer.control.test.ts +0 -425
- package/src/tests/renderer.core-slot-binding.test.ts +0 -952
- package/src/tests/renderer.cursor.test.ts +0 -26
- package/src/tests/renderer.destroy-during-render.test.ts +0 -147
- package/src/tests/renderer.focus-restore.test.ts +0 -257
- package/src/tests/renderer.focus.test.ts +0 -294
- package/src/tests/renderer.idle.test.ts +0 -219
- package/src/tests/renderer.input.test.ts +0 -2237
- package/src/tests/renderer.kitty-flags.test.ts +0 -195
- package/src/tests/renderer.mouse.test.ts +0 -1274
- package/src/tests/renderer.palette.test.ts +0 -629
- package/src/tests/renderer.selection.test.ts +0 -49
- package/src/tests/renderer.slot-registry.test.ts +0 -684
- package/src/tests/renderer.useMouse.test.ts +0 -47
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +0 -76
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +0 -43
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +0 -67
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +0 -72
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +0 -44
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +0 -85
- package/src/tests/runtime-plugin-path-alias.fixture.ts +0 -43
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +0 -65
- package/src/tests/runtime-plugin-support.fixture.ts +0 -11
- package/src/tests/runtime-plugin-support.test.ts +0 -19
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +0 -30
- package/src/tests/runtime-plugin.fixture.ts +0 -40
- package/src/tests/runtime-plugin.test.ts +0 -354
- package/src/tests/scrollbox-culling-bug.test.ts +0 -114
- package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
- package/src/tests/scrollbox-hitgrid.test.ts +0 -909
- package/src/tests/scrollbox.test.ts +0 -1530
- package/src/tests/wrap-resize-perf.test.ts +0 -276
- package/src/tests/yoga-setters.test.ts +0 -921
- package/src/text-buffer-view.test.ts +0 -705
- package/src/text-buffer-view.ts +0 -189
- package/src/text-buffer.test.ts +0 -347
- package/src/text-buffer.ts +0 -250
- package/src/types.ts +0 -161
- package/src/utils.ts +0 -88
- package/src/zig/ansi.zig +0 -268
- package/src/zig/bench/README.md +0 -50
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
- package/src/zig/bench/edit-buffer_bench.zig +0 -476
- package/src/zig/bench/native-span-feed_bench.zig +0 -100
- package/src/zig/bench/rope-markers_bench.zig +0 -713
- package/src/zig/bench/rope_bench.zig +0 -514
- package/src/zig/bench/styled-text_bench.zig +0 -470
- package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
- package/src/zig/bench/text-buffer-view_bench.zig +0 -459
- package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
- package/src/zig/bench/utf8_bench.zig +0 -799
- package/src/zig/bench-utils.zig +0 -431
- package/src/zig/bench.zig +0 -217
- package/src/zig/buffer-methods.zig +0 -211
- package/src/zig/buffer.zig +0 -2281
- package/src/zig/build.zig +0 -289
- package/src/zig/build.zig.zon +0 -16
- package/src/zig/edit-buffer.zig +0 -825
- package/src/zig/editor-view.zig +0 -802
- package/src/zig/event-bus.zig +0 -13
- package/src/zig/event-emitter.zig +0 -65
- package/src/zig/file-logger.zig +0 -92
- package/src/zig/grapheme.zig +0 -599
- package/src/zig/lib.zig +0 -1854
- package/src/zig/link.zig +0 -333
- package/src/zig/logger.zig +0 -43
- package/src/zig/mem-registry.zig +0 -125
- package/src/zig/native-span-feed-bench-lib.zig +0 -7
- package/src/zig/native-span-feed.zig +0 -708
- package/src/zig/renderer.zig +0 -1393
- package/src/zig/rope.zig +0 -1220
- package/src/zig/syntax-style.zig +0 -161
- package/src/zig/terminal.zig +0 -987
- package/src/zig/test.zig +0 -72
- package/src/zig/tests/README.md +0 -18
- package/src/zig/tests/buffer-methods_test.zig +0 -1109
- package/src/zig/tests/buffer_test.zig +0 -2557
- package/src/zig/tests/edit-buffer-history_test.zig +0 -271
- package/src/zig/tests/edit-buffer_test.zig +0 -1689
- package/src/zig/tests/editor-view_test.zig +0 -3299
- package/src/zig/tests/event-emitter_test.zig +0 -249
- package/src/zig/tests/grapheme_test.zig +0 -1304
- package/src/zig/tests/link_test.zig +0 -190
- package/src/zig/tests/mem-registry_test.zig +0 -473
- package/src/zig/tests/memory_leak_regression_test.zig +0 -159
- package/src/zig/tests/native-span-feed_test.zig +0 -1264
- package/src/zig/tests/renderer_test.zig +0 -1017
- package/src/zig/tests/rope-nested_test.zig +0 -712
- package/src/zig/tests/rope_fuzz_test.zig +0 -238
- package/src/zig/tests/rope_test.zig +0 -2362
- package/src/zig/tests/segment-merge.test.zig +0 -148
- package/src/zig/tests/syntax-style_test.zig +0 -557
- package/src/zig/tests/terminal_test.zig +0 -754
- package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
- package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
- package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
- package/src/zig/tests/text-buffer-segment_test.zig +0 -320
- package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
- package/src/zig/tests/text-buffer-view_test.zig +0 -3649
- package/src/zig/tests/text-buffer_test.zig +0 -2191
- package/src/zig/tests/unicode-width-map.zon +0 -3909
- package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
- package/src/zig/tests/utf8_test.zig +0 -4057
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
- package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
- package/src/zig/tests/word-wrap-editing_test.zig +0 -498
- package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
- package/src/zig/text-buffer-iterators.zig +0 -499
- package/src/zig/text-buffer-segment.zig +0 -404
- package/src/zig/text-buffer-view.zig +0 -1371
- package/src/zig/text-buffer.zig +0 -1180
- package/src/zig/utf8.zig +0 -1948
- package/src/zig/utils.zig +0 -9
- package/src/zig-structs.ts +0 -261
- package/src/zig.ts +0 -3884
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -27
- /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
|
@@ -1,2191 +0,0 @@
|
|
|
1
|
-
const std = @import("std");
|
|
2
|
-
const text_buffer = @import("../text-buffer.zig");
|
|
3
|
-
const gp = @import("../grapheme.zig");
|
|
4
|
-
const link = @import("../link.zig");
|
|
5
|
-
const iter_mod = @import("../text-buffer-iterators.zig");
|
|
6
|
-
|
|
7
|
-
const TextBuffer = text_buffer.UnifiedTextBuffer;
|
|
8
|
-
|
|
9
|
-
test "TextBuffer init - creates empty buffer" {
|
|
10
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
11
|
-
defer gp.deinitGlobalPool();
|
|
12
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
13
|
-
defer link.deinitGlobalLinkPool();
|
|
14
|
-
|
|
15
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
16
|
-
defer tb.deinit();
|
|
17
|
-
|
|
18
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
19
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount()); // Empty buffer has 1 empty line (invariant)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
test "TextBuffer line info - empty buffer" {
|
|
23
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
24
|
-
defer gp.deinitGlobalPool();
|
|
25
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
26
|
-
defer link.deinitGlobalLinkPool();
|
|
27
|
-
|
|
28
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
29
|
-
defer tb.deinit();
|
|
30
|
-
|
|
31
|
-
try tb.setText("");
|
|
32
|
-
|
|
33
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
34
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
35
|
-
try std.testing.expectEqual(@as(u32, 1), tb.rope().count());
|
|
36
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
37
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.lineWidthAt(tb.rope(), 0));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
test "TextBuffer line info - simple text without newlines" {
|
|
41
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
42
|
-
defer gp.deinitGlobalPool();
|
|
43
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
44
|
-
defer link.deinitGlobalLinkPool();
|
|
45
|
-
|
|
46
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
47
|
-
defer tb.deinit();
|
|
48
|
-
|
|
49
|
-
const text = "Hello World";
|
|
50
|
-
try tb.setText(text);
|
|
51
|
-
|
|
52
|
-
try std.testing.expectEqual(@as(u32, 11), tb.getLength());
|
|
53
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
54
|
-
try std.testing.expectEqual(@as(u32, 2), tb.rope().count());
|
|
55
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
56
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
57
|
-
|
|
58
|
-
var out_buffer: [100]u8 = undefined;
|
|
59
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
60
|
-
try std.testing.expectEqual(@as(usize, 11), written);
|
|
61
|
-
try std.testing.expectEqualStrings(text, out_buffer[0..written]);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
test "TextBuffer line info - single newline" {
|
|
65
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
66
|
-
defer gp.deinitGlobalPool();
|
|
67
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
68
|
-
defer link.deinitGlobalLinkPool();
|
|
69
|
-
|
|
70
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
71
|
-
defer tb.deinit();
|
|
72
|
-
|
|
73
|
-
try tb.setText("Hello\nWorld");
|
|
74
|
-
|
|
75
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
76
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
77
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
78
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
79
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) > 0);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
test "TextBuffer line info - multiple lines separated by newlines" {
|
|
83
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
84
|
-
defer gp.deinitGlobalPool();
|
|
85
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
86
|
-
defer link.deinitGlobalLinkPool();
|
|
87
|
-
|
|
88
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
89
|
-
defer tb.deinit();
|
|
90
|
-
|
|
91
|
-
const text = "Line 1\nLine 2\nLine 3";
|
|
92
|
-
try tb.setText(text);
|
|
93
|
-
|
|
94
|
-
try std.testing.expectEqual(@as(u32, 18), tb.getLength());
|
|
95
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
96
|
-
try std.testing.expectEqual(@as(u32, 8), tb.rope().count());
|
|
97
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
98
|
-
try std.testing.expectEqual(@as(u32, 7), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
99
|
-
try std.testing.expectEqual(@as(u32, 14), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
100
|
-
|
|
101
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
102
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) > 0);
|
|
103
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) > 0);
|
|
104
|
-
|
|
105
|
-
var out_buffer: [100]u8 = undefined;
|
|
106
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
107
|
-
try std.testing.expectEqual(@as(usize, 20), written);
|
|
108
|
-
try std.testing.expectEqualStrings(text, out_buffer[0..written]);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
test "TextBuffer line info - text ending with newline" {
|
|
112
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
113
|
-
defer gp.deinitGlobalPool();
|
|
114
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
115
|
-
defer link.deinitGlobalLinkPool();
|
|
116
|
-
|
|
117
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
118
|
-
defer tb.deinit();
|
|
119
|
-
|
|
120
|
-
const text = "Line 1\nLine 2\n";
|
|
121
|
-
try tb.setText(text);
|
|
122
|
-
|
|
123
|
-
// Trailing newline creates an empty 3rd line (matches editor semantics)
|
|
124
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
125
|
-
try std.testing.expectEqual(@as(u32, 7), tb.rope().count());
|
|
126
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
127
|
-
try std.testing.expectEqual(@as(u32, 7), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
128
|
-
try std.testing.expectEqual(@as(u32, 14), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
129
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
130
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) > 0);
|
|
131
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) >= 0); // Empty line
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
test "TextBuffer line info - consecutive newlines" {
|
|
135
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
136
|
-
defer gp.deinitGlobalPool();
|
|
137
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
138
|
-
defer link.deinitGlobalLinkPool();
|
|
139
|
-
|
|
140
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
141
|
-
defer tb.deinit();
|
|
142
|
-
|
|
143
|
-
try tb.setText("Line 1\n\nLine 3");
|
|
144
|
-
|
|
145
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
146
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
147
|
-
try std.testing.expectEqual(@as(u32, 7), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
148
|
-
try std.testing.expectEqual(@as(u32, 8), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
test "TextBuffer line info - text starting with newline" {
|
|
152
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
153
|
-
defer gp.deinitGlobalPool();
|
|
154
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
155
|
-
defer link.deinitGlobalLinkPool();
|
|
156
|
-
|
|
157
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
158
|
-
defer tb.deinit();
|
|
159
|
-
|
|
160
|
-
try tb.setText("\nHello World");
|
|
161
|
-
|
|
162
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
163
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
164
|
-
try std.testing.expectEqual(@as(u32, 1), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
test "TextBuffer line info - only newlines" {
|
|
168
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
169
|
-
defer gp.deinitGlobalPool();
|
|
170
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
171
|
-
defer link.deinitGlobalLinkPool();
|
|
172
|
-
|
|
173
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
174
|
-
defer tb.deinit();
|
|
175
|
-
|
|
176
|
-
try tb.setText("\n\n\n");
|
|
177
|
-
|
|
178
|
-
try std.testing.expectEqual(@as(u32, 4), tb.getLineCount());
|
|
179
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
180
|
-
try std.testing.expectEqual(@as(u32, 1), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
181
|
-
try std.testing.expectEqual(@as(u32, 2), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
182
|
-
try std.testing.expectEqual(@as(u32, 3), iter_mod.coordsToOffset(tb.rope(), 3, 0).?);
|
|
183
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
184
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
185
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) >= 0);
|
|
186
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 3) >= 0);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
test "TextBuffer line info - wide characters (Unicode)" {
|
|
190
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
191
|
-
defer gp.deinitGlobalPool();
|
|
192
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
193
|
-
defer link.deinitGlobalLinkPool();
|
|
194
|
-
|
|
195
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
196
|
-
defer tb.deinit();
|
|
197
|
-
|
|
198
|
-
const text = "Hello 世界 🌟";
|
|
199
|
-
try tb.setText(text);
|
|
200
|
-
|
|
201
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
202
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
203
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
204
|
-
|
|
205
|
-
var out_buffer: [100]u8 = undefined;
|
|
206
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
207
|
-
try std.testing.expectEqualStrings(text, out_buffer[0..written]);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
test "TextBuffer line info - empty lines between content" {
|
|
211
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
212
|
-
defer gp.deinitGlobalPool();
|
|
213
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
214
|
-
defer link.deinitGlobalLinkPool();
|
|
215
|
-
|
|
216
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
217
|
-
defer tb.deinit();
|
|
218
|
-
|
|
219
|
-
try tb.setText("First\n\nThird");
|
|
220
|
-
|
|
221
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
222
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
223
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
224
|
-
try std.testing.expectEqual(@as(u32, 7), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
test "TextBuffer line info - very long lines" {
|
|
228
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
229
|
-
defer gp.deinitGlobalPool();
|
|
230
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
231
|
-
defer link.deinitGlobalLinkPool();
|
|
232
|
-
|
|
233
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
234
|
-
defer tb.deinit();
|
|
235
|
-
|
|
236
|
-
// Create a long text with 1000 'A' characters
|
|
237
|
-
const longText = [_]u8{'A'} ** 1000;
|
|
238
|
-
try tb.setText(&longText);
|
|
239
|
-
|
|
240
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
241
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
242
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
test "TextBuffer line info - lines with different widths" {
|
|
246
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
247
|
-
defer gp.deinitGlobalPool();
|
|
248
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
249
|
-
defer link.deinitGlobalLinkPool();
|
|
250
|
-
|
|
251
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
252
|
-
defer tb.deinit();
|
|
253
|
-
|
|
254
|
-
// Create text with different line lengths
|
|
255
|
-
var text_builder: std.ArrayListUnmanaged(u8) = .{};
|
|
256
|
-
defer text_builder.deinit(std.testing.allocator);
|
|
257
|
-
try text_builder.appendSlice(std.testing.allocator, "Short\n");
|
|
258
|
-
try text_builder.appendNTimes(std.testing.allocator, 'A', 50);
|
|
259
|
-
try text_builder.appendSlice(std.testing.allocator, "\nMedium");
|
|
260
|
-
const text = text_builder.items;
|
|
261
|
-
try tb.setText(text);
|
|
262
|
-
|
|
263
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
264
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) < iter_mod.lineWidthAt(tb.rope(), 1));
|
|
265
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) > iter_mod.lineWidthAt(tb.rope(), 2));
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
test "TextBuffer line info - text without styling" {
|
|
269
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
270
|
-
defer gp.deinitGlobalPool();
|
|
271
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
272
|
-
defer link.deinitGlobalLinkPool();
|
|
273
|
-
|
|
274
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
275
|
-
defer tb.deinit();
|
|
276
|
-
|
|
277
|
-
// setText now handles all text at once without styling
|
|
278
|
-
try tb.setText("Red\nBlue");
|
|
279
|
-
|
|
280
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
281
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
282
|
-
try std.testing.expectEqual(@as(u32, 4), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
test "TextBuffer line info - buffer with only whitespace" {
|
|
286
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
287
|
-
defer gp.deinitGlobalPool();
|
|
288
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
289
|
-
defer link.deinitGlobalLinkPool();
|
|
290
|
-
|
|
291
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
292
|
-
defer tb.deinit();
|
|
293
|
-
|
|
294
|
-
try tb.setText(" \n \n ");
|
|
295
|
-
|
|
296
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
297
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
298
|
-
try std.testing.expectEqual(@as(u32, 4), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
299
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
300
|
-
|
|
301
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
302
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
303
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) >= 0);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
test "TextBuffer line info - single character lines" {
|
|
307
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
308
|
-
defer gp.deinitGlobalPool();
|
|
309
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
310
|
-
defer link.deinitGlobalLinkPool();
|
|
311
|
-
|
|
312
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
313
|
-
defer tb.deinit();
|
|
314
|
-
|
|
315
|
-
try tb.setText("A\nB\nC");
|
|
316
|
-
|
|
317
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
318
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
319
|
-
try std.testing.expectEqual(@as(u32, 2), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
320
|
-
try std.testing.expectEqual(@as(u32, 4), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
321
|
-
|
|
322
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
323
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) > 0);
|
|
324
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) > 0);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
test "TextBuffer line info - mixed content with special characters" {
|
|
328
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
329
|
-
defer gp.deinitGlobalPool();
|
|
330
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
331
|
-
defer link.deinitGlobalLinkPool();
|
|
332
|
-
|
|
333
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
334
|
-
defer tb.deinit();
|
|
335
|
-
|
|
336
|
-
try tb.setText("Normal\n123\n!@#\n测试\n");
|
|
337
|
-
|
|
338
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLineCount()); // line_count (4 lines + empty line at end)
|
|
339
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
340
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
341
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) >= 0);
|
|
342
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 3) >= 0);
|
|
343
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 4) >= 0);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
test "TextBuffer line info - buffer resize operations" {
|
|
347
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
348
|
-
defer gp.deinitGlobalPool();
|
|
349
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
350
|
-
defer link.deinitGlobalLinkPool();
|
|
351
|
-
|
|
352
|
-
// Create a small buffer that will need to resize
|
|
353
|
-
|
|
354
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
355
|
-
defer tb.deinit();
|
|
356
|
-
|
|
357
|
-
// Add text that will cause multiple resizes
|
|
358
|
-
var text_builder: std.ArrayListUnmanaged(u8) = .{};
|
|
359
|
-
defer text_builder.deinit(std.testing.allocator);
|
|
360
|
-
try text_builder.appendNTimes(std.testing.allocator, 'A', 100);
|
|
361
|
-
try text_builder.appendSlice(std.testing.allocator, "\n");
|
|
362
|
-
try text_builder.appendNTimes(std.testing.allocator, 'B', 100);
|
|
363
|
-
const longText = text_builder.items;
|
|
364
|
-
try tb.setText(longText);
|
|
365
|
-
|
|
366
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
test "TextBuffer line info - thousands of lines" {
|
|
370
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
371
|
-
defer gp.deinitGlobalPool();
|
|
372
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
373
|
-
defer link.deinitGlobalLinkPool();
|
|
374
|
-
|
|
375
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
376
|
-
defer tb.deinit();
|
|
377
|
-
|
|
378
|
-
// Create text with 1000 lines
|
|
379
|
-
var text_builder: std.ArrayListUnmanaged(u8) = .{};
|
|
380
|
-
defer text_builder.deinit(std.testing.allocator);
|
|
381
|
-
|
|
382
|
-
var i: u32 = 0;
|
|
383
|
-
while (i < 999) : (i += 1) {
|
|
384
|
-
try text_builder.writer(std.testing.allocator).print("Line {}\n", .{i});
|
|
385
|
-
}
|
|
386
|
-
// Last line without newline
|
|
387
|
-
try text_builder.writer(std.testing.allocator).print("Line {}", .{i});
|
|
388
|
-
|
|
389
|
-
try tb.setText(text_builder.items);
|
|
390
|
-
|
|
391
|
-
try std.testing.expectEqual(@as(u32, 1000), tb.getLineCount());
|
|
392
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
393
|
-
|
|
394
|
-
// Check that line starts are monotonically increasing
|
|
395
|
-
var line_idx: u32 = 1;
|
|
396
|
-
while (line_idx < 1000) : (line_idx += 1) {
|
|
397
|
-
try std.testing.expect(iter_mod.coordsToOffset(tb.rope(), line_idx, 0).? > iter_mod.coordsToOffset(tb.rope(), line_idx - 1, 0).?);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
test "TextBuffer line info - alternating empty and content lines" {
|
|
402
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
403
|
-
defer gp.deinitGlobalPool();
|
|
404
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
405
|
-
defer link.deinitGlobalLinkPool();
|
|
406
|
-
|
|
407
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
408
|
-
defer tb.deinit();
|
|
409
|
-
|
|
410
|
-
try tb.setText("\nContent\n\nMore\n\n");
|
|
411
|
-
|
|
412
|
-
try std.testing.expectEqual(@as(u32, 6), tb.getLineCount());
|
|
413
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
414
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
415
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) >= 0);
|
|
416
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 3) >= 0);
|
|
417
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 4) >= 0);
|
|
418
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 5) >= 0);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
test "TextBuffer line info - complex Unicode combining characters" {
|
|
422
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
423
|
-
defer gp.deinitGlobalPool();
|
|
424
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
425
|
-
defer link.deinitGlobalLinkPool();
|
|
426
|
-
|
|
427
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
428
|
-
defer tb.deinit();
|
|
429
|
-
|
|
430
|
-
try tb.setText("café\nnaïve\nrésumé");
|
|
431
|
-
|
|
432
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
433
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
434
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) > 0);
|
|
435
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) > 0);
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
test "TextBuffer line info - simple multi-line text" {
|
|
439
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
440
|
-
defer gp.deinitGlobalPool();
|
|
441
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
442
|
-
defer link.deinitGlobalLinkPool();
|
|
443
|
-
|
|
444
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
445
|
-
defer tb.deinit();
|
|
446
|
-
|
|
447
|
-
try tb.setText("Test\nText");
|
|
448
|
-
|
|
449
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
450
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
451
|
-
try std.testing.expectEqual(@as(u32, 5), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
452
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
453
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
test "TextBuffer line info - unicode width method" {
|
|
457
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
458
|
-
defer gp.deinitGlobalPool();
|
|
459
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
460
|
-
defer link.deinitGlobalLinkPool();
|
|
461
|
-
|
|
462
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
463
|
-
defer tb.deinit();
|
|
464
|
-
|
|
465
|
-
try tb.setText("Hello 世界 🌟");
|
|
466
|
-
|
|
467
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
468
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
469
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
test "TextBuffer line info - unicode mixed content with special characters" {
|
|
473
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
474
|
-
defer gp.deinitGlobalPool();
|
|
475
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
476
|
-
defer link.deinitGlobalLinkPool();
|
|
477
|
-
|
|
478
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
479
|
-
defer tb.deinit();
|
|
480
|
-
|
|
481
|
-
try tb.setText("Normal\n123\n!@#\n测试\n");
|
|
482
|
-
|
|
483
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLineCount()); // line_count (4 lines + empty line at end)
|
|
484
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
485
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
486
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 2) >= 0);
|
|
487
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 3) >= 0);
|
|
488
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 4) >= 0);
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
test "TextBuffer line info - unicode text without styling" {
|
|
492
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
493
|
-
defer gp.deinitGlobalPool();
|
|
494
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
495
|
-
defer link.deinitGlobalLinkPool();
|
|
496
|
-
|
|
497
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
498
|
-
defer tb.deinit();
|
|
499
|
-
|
|
500
|
-
// setText now handles all text at once without styling
|
|
501
|
-
try tb.setText("Red\nBlue");
|
|
502
|
-
|
|
503
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
504
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
505
|
-
try std.testing.expectEqual(@as(u32, 4), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
506
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) >= 0);
|
|
507
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 1) >= 0);
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
test "TextBuffer line info - extremely long single line" {
|
|
511
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
512
|
-
defer gp.deinitGlobalPool();
|
|
513
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
514
|
-
defer link.deinitGlobalLinkPool();
|
|
515
|
-
|
|
516
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
517
|
-
defer tb.deinit();
|
|
518
|
-
|
|
519
|
-
// Create extremely long text with 10000 'A' characters
|
|
520
|
-
const extremelyLongText = [_]u8{'A'} ** 10000;
|
|
521
|
-
try tb.setText(&extremelyLongText);
|
|
522
|
-
|
|
523
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
524
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
525
|
-
try std.testing.expect(iter_mod.lineWidthAt(tb.rope(), 0) > 0);
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
test "TextBuffer unicode - multi-line with extraction" {
|
|
529
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
530
|
-
defer gp.deinitGlobalPool();
|
|
531
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
532
|
-
defer link.deinitGlobalLinkPool();
|
|
533
|
-
|
|
534
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
535
|
-
defer tb.deinit();
|
|
536
|
-
|
|
537
|
-
const text = "Hello 世界\n🚀 Emoji\nΑλφα";
|
|
538
|
-
try tb.setText(text);
|
|
539
|
-
|
|
540
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
541
|
-
|
|
542
|
-
var out_buffer: [100]u8 = undefined;
|
|
543
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
544
|
-
try std.testing.expectEqualStrings(text, out_buffer[0..written]);
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
test "TextBuffer reset - clears all content" {
|
|
548
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
549
|
-
defer gp.deinitGlobalPool();
|
|
550
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
551
|
-
defer link.deinitGlobalLinkPool();
|
|
552
|
-
|
|
553
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
554
|
-
defer tb.deinit();
|
|
555
|
-
|
|
556
|
-
try tb.setText("Some text\nMore text");
|
|
557
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
558
|
-
|
|
559
|
-
tb.reset();
|
|
560
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
561
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
test "TextBuffer line iteration - walkLines callback" {
|
|
565
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
566
|
-
defer gp.deinitGlobalPool();
|
|
567
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
568
|
-
defer link.deinitGlobalLinkPool();
|
|
569
|
-
|
|
570
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
571
|
-
defer tb.deinit();
|
|
572
|
-
|
|
573
|
-
const text = "First\nSecond\nThird";
|
|
574
|
-
try tb.setText(text);
|
|
575
|
-
|
|
576
|
-
const Context = struct {
|
|
577
|
-
lines: std.ArrayListUnmanaged(iter_mod.LineInfo),
|
|
578
|
-
allocator: std.mem.Allocator,
|
|
579
|
-
|
|
580
|
-
fn callback(ctx_ptr: *anyopaque, line_info: iter_mod.LineInfo) void {
|
|
581
|
-
const ctx = @as(*@This(), @ptrCast(@alignCast(ctx_ptr)));
|
|
582
|
-
ctx.lines.append(ctx.allocator, line_info) catch {};
|
|
583
|
-
}
|
|
584
|
-
};
|
|
585
|
-
|
|
586
|
-
var ctx = Context{ .lines = .{}, .allocator = std.testing.allocator };
|
|
587
|
-
defer ctx.lines.deinit(std.testing.allocator);
|
|
588
|
-
|
|
589
|
-
iter_mod.walkLines(tb.rope(), &ctx, Context.callback, true);
|
|
590
|
-
|
|
591
|
-
try std.testing.expectEqual(@as(usize, 3), ctx.lines.items.len);
|
|
592
|
-
try std.testing.expectEqual(@as(u32, 0), ctx.lines.items[0].line_idx);
|
|
593
|
-
try std.testing.expectEqual(@as(u32, 5), ctx.lines.items[0].width_cols);
|
|
594
|
-
|
|
595
|
-
try std.testing.expectEqual(@as(u32, 1), ctx.lines.items[1].line_idx);
|
|
596
|
-
try std.testing.expectEqual(@as(u32, 6), ctx.lines.items[1].width_cols);
|
|
597
|
-
|
|
598
|
-
try std.testing.expectEqual(@as(u32, 2), ctx.lines.items[2].line_idx);
|
|
599
|
-
try std.testing.expectEqual(@as(u32, 5), ctx.lines.items[2].width_cols);
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
test "TextBuffer line queries - comprehensive rope coordinate checks" {
|
|
603
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
604
|
-
defer gp.deinitGlobalPool();
|
|
605
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
606
|
-
defer link.deinitGlobalLinkPool();
|
|
607
|
-
|
|
608
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
609
|
-
defer tb.deinit();
|
|
610
|
-
|
|
611
|
-
try tb.setText("First\nSecond\nThird");
|
|
612
|
-
|
|
613
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
614
|
-
|
|
615
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
616
|
-
try std.testing.expectEqual(@as(u32, 5), iter_mod.lineWidthAt(tb.rope(), 0));
|
|
617
|
-
|
|
618
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
619
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.lineWidthAt(tb.rope(), 1));
|
|
620
|
-
|
|
621
|
-
try std.testing.expectEqual(@as(u32, 13), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
622
|
-
try std.testing.expectEqual(@as(u32, 5), iter_mod.lineWidthAt(tb.rope(), 2));
|
|
623
|
-
|
|
624
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.getMaxLineWidth(tb.rope()));
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
// ===== View Registration Tests =====
|
|
628
|
-
|
|
629
|
-
test "TextBuffer view registration - multiple views can be created" {
|
|
630
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
631
|
-
defer gp.deinitGlobalPool();
|
|
632
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
633
|
-
defer link.deinitGlobalLinkPool();
|
|
634
|
-
|
|
635
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
636
|
-
defer tb.deinit();
|
|
637
|
-
|
|
638
|
-
const id1 = try tb.registerView();
|
|
639
|
-
const id2 = try tb.registerView();
|
|
640
|
-
const id3 = try tb.registerView();
|
|
641
|
-
|
|
642
|
-
try std.testing.expect(id1 != id2);
|
|
643
|
-
try std.testing.expect(id2 != id3);
|
|
644
|
-
try std.testing.expect(id1 != id3);
|
|
645
|
-
|
|
646
|
-
tb.unregisterView(id1);
|
|
647
|
-
tb.unregisterView(id2);
|
|
648
|
-
tb.unregisterView(id3);
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
test "TextBuffer view registration - views marked dirty on setText" {
|
|
652
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
653
|
-
defer gp.deinitGlobalPool();
|
|
654
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
655
|
-
defer link.deinitGlobalLinkPool();
|
|
656
|
-
|
|
657
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
658
|
-
defer tb.deinit();
|
|
659
|
-
|
|
660
|
-
const id1 = try tb.registerView();
|
|
661
|
-
defer tb.unregisterView(id1);
|
|
662
|
-
|
|
663
|
-
try std.testing.expect(tb.isViewDirty(id1));
|
|
664
|
-
|
|
665
|
-
tb.clearViewDirty(id1);
|
|
666
|
-
try std.testing.expect(!tb.isViewDirty(id1));
|
|
667
|
-
|
|
668
|
-
try tb.setText("Hello World");
|
|
669
|
-
try std.testing.expect(tb.isViewDirty(id1));
|
|
670
|
-
|
|
671
|
-
tb.clearViewDirty(id1);
|
|
672
|
-
try std.testing.expect(!tb.isViewDirty(id1));
|
|
673
|
-
|
|
674
|
-
try tb.setText("New text");
|
|
675
|
-
try std.testing.expect(tb.isViewDirty(id1));
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
test "TextBuffer view registration - views marked dirty on reset" {
|
|
679
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
680
|
-
defer gp.deinitGlobalPool();
|
|
681
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
682
|
-
defer link.deinitGlobalLinkPool();
|
|
683
|
-
|
|
684
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
685
|
-
defer tb.deinit();
|
|
686
|
-
|
|
687
|
-
const id1 = try tb.registerView();
|
|
688
|
-
defer tb.unregisterView(id1);
|
|
689
|
-
|
|
690
|
-
tb.clearViewDirty(id1);
|
|
691
|
-
try std.testing.expect(!tb.isViewDirty(id1));
|
|
692
|
-
|
|
693
|
-
tb.reset();
|
|
694
|
-
try std.testing.expect(tb.isViewDirty(id1));
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
test "TextBuffer view registration - ID reuse after unregister" {
|
|
698
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
699
|
-
defer gp.deinitGlobalPool();
|
|
700
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
701
|
-
defer link.deinitGlobalLinkPool();
|
|
702
|
-
|
|
703
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
704
|
-
defer tb.deinit();
|
|
705
|
-
|
|
706
|
-
const id1 = try tb.registerView();
|
|
707
|
-
tb.unregisterView(id1);
|
|
708
|
-
|
|
709
|
-
const id2 = try tb.registerView();
|
|
710
|
-
defer tb.unregisterView(id2);
|
|
711
|
-
|
|
712
|
-
try std.testing.expectEqual(id1, id2);
|
|
713
|
-
|
|
714
|
-
try std.testing.expect(tb.isViewDirty(id2));
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
test "TextBuffer view registration - multiple views all marked dirty on setText" {
|
|
718
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
719
|
-
defer gp.deinitGlobalPool();
|
|
720
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
721
|
-
defer link.deinitGlobalLinkPool();
|
|
722
|
-
|
|
723
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
724
|
-
defer tb.deinit();
|
|
725
|
-
|
|
726
|
-
const id1 = try tb.registerView();
|
|
727
|
-
defer tb.unregisterView(id1);
|
|
728
|
-
|
|
729
|
-
const id2 = try tb.registerView();
|
|
730
|
-
defer tb.unregisterView(id2);
|
|
731
|
-
|
|
732
|
-
const id3 = try tb.registerView();
|
|
733
|
-
defer tb.unregisterView(id3);
|
|
734
|
-
|
|
735
|
-
tb.clearViewDirty(id1);
|
|
736
|
-
tb.clearViewDirty(id2);
|
|
737
|
-
tb.clearViewDirty(id3);
|
|
738
|
-
|
|
739
|
-
try std.testing.expect(!tb.isViewDirty(id1));
|
|
740
|
-
try std.testing.expect(!tb.isViewDirty(id2));
|
|
741
|
-
try std.testing.expect(!tb.isViewDirty(id3));
|
|
742
|
-
|
|
743
|
-
try tb.setText("Test");
|
|
744
|
-
|
|
745
|
-
try std.testing.expect(tb.isViewDirty(id1));
|
|
746
|
-
try std.testing.expect(tb.isViewDirty(id2));
|
|
747
|
-
try std.testing.expect(tb.isViewDirty(id3));
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
// ===== Memory Registry Tests =====
|
|
751
|
-
|
|
752
|
-
test "TextBuffer memory registry - register and get buffer" {
|
|
753
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
754
|
-
defer gp.deinitGlobalPool();
|
|
755
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
756
|
-
defer link.deinitGlobalLinkPool();
|
|
757
|
-
|
|
758
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
759
|
-
defer tb.deinit();
|
|
760
|
-
|
|
761
|
-
const text = "Hello World";
|
|
762
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
763
|
-
|
|
764
|
-
const retrieved = tb.getMemBuffer(mem_id);
|
|
765
|
-
try std.testing.expect(retrieved != null);
|
|
766
|
-
try std.testing.expectEqualStrings(text, retrieved.?);
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
test "TextBuffer memory registry - multiple buffers" {
|
|
770
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
771
|
-
defer gp.deinitGlobalPool();
|
|
772
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
773
|
-
defer link.deinitGlobalLinkPool();
|
|
774
|
-
|
|
775
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
776
|
-
defer tb.deinit();
|
|
777
|
-
|
|
778
|
-
const text1 = "First buffer";
|
|
779
|
-
const text2 = "Second buffer";
|
|
780
|
-
const text3 = "Third buffer";
|
|
781
|
-
|
|
782
|
-
const id1 = try tb.registerMemBuffer(text1, false);
|
|
783
|
-
const id2 = try tb.registerMemBuffer(text2, false);
|
|
784
|
-
const id3 = try tb.registerMemBuffer(text3, false);
|
|
785
|
-
|
|
786
|
-
try std.testing.expect(id1 != id2);
|
|
787
|
-
try std.testing.expect(id2 != id3);
|
|
788
|
-
try std.testing.expect(id1 != id3);
|
|
789
|
-
|
|
790
|
-
try std.testing.expectEqualStrings(text1, tb.getMemBuffer(id1).?);
|
|
791
|
-
try std.testing.expectEqualStrings(text2, tb.getMemBuffer(id2).?);
|
|
792
|
-
try std.testing.expectEqualStrings(text3, tb.getMemBuffer(id3).?);
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
test "TextBuffer memory registry - invalid ID returns null" {
|
|
796
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
797
|
-
defer gp.deinitGlobalPool();
|
|
798
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
799
|
-
defer link.deinitGlobalLinkPool();
|
|
800
|
-
|
|
801
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
802
|
-
defer tb.deinit();
|
|
803
|
-
|
|
804
|
-
// Try to get buffer with ID that doesn't exist
|
|
805
|
-
const result = tb.getMemBuffer(99);
|
|
806
|
-
try std.testing.expect(result == null);
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
test "TextBuffer memory registry - addLine from single buffer" {
|
|
810
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
811
|
-
defer gp.deinitGlobalPool();
|
|
812
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
813
|
-
defer link.deinitGlobalLinkPool();
|
|
814
|
-
|
|
815
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
816
|
-
defer tb.deinit();
|
|
817
|
-
|
|
818
|
-
const text = "Hello World";
|
|
819
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
820
|
-
|
|
821
|
-
// Add line from buffer
|
|
822
|
-
try tb.addLine(mem_id, 0, 5); // "Hello"
|
|
823
|
-
|
|
824
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
825
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLength());
|
|
826
|
-
|
|
827
|
-
var out_buffer: [100]u8 = undefined;
|
|
828
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
829
|
-
try std.testing.expectEqualStrings("Hello", out_buffer[0..written]);
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
test "TextBuffer memory registry - addLine from multiple buffers" {
|
|
833
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
834
|
-
defer gp.deinitGlobalPool();
|
|
835
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
836
|
-
defer link.deinitGlobalLinkPool();
|
|
837
|
-
|
|
838
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
839
|
-
defer tb.deinit();
|
|
840
|
-
|
|
841
|
-
const text1 = "First line";
|
|
842
|
-
const text2 = "Second line";
|
|
843
|
-
const text3 = "Third line";
|
|
844
|
-
|
|
845
|
-
const id1 = try tb.registerMemBuffer(text1, false);
|
|
846
|
-
const id2 = try tb.registerMemBuffer(text2, false);
|
|
847
|
-
const id3 = try tb.registerMemBuffer(text3, false);
|
|
848
|
-
|
|
849
|
-
try tb.addLine(id1, 0, 10);
|
|
850
|
-
try tb.addLine(id2, 0, 11);
|
|
851
|
-
try tb.addLine(id3, 0, 10);
|
|
852
|
-
|
|
853
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
854
|
-
|
|
855
|
-
var out_buffer: [100]u8 = undefined;
|
|
856
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
857
|
-
try std.testing.expectEqualStrings("First line\nSecond line\nThird line", out_buffer[0..written]);
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
test "TextBuffer memory registry - addLine with invalid mem_id" {
|
|
861
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
862
|
-
defer gp.deinitGlobalPool();
|
|
863
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
864
|
-
defer link.deinitGlobalLinkPool();
|
|
865
|
-
|
|
866
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
867
|
-
defer tb.deinit();
|
|
868
|
-
|
|
869
|
-
// Try to add line with invalid mem_id
|
|
870
|
-
const result = tb.addLine(99, 0, 5);
|
|
871
|
-
try std.testing.expectError(text_buffer.TextBufferError.InvalidMemId, result);
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
test "TextBuffer memory registry - mixed with setText" {
|
|
875
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
876
|
-
defer gp.deinitGlobalPool();
|
|
877
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
878
|
-
defer link.deinitGlobalLinkPool();
|
|
879
|
-
|
|
880
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
881
|
-
defer tb.deinit();
|
|
882
|
-
|
|
883
|
-
try tb.setText("Initial text");
|
|
884
|
-
try std.testing.expectEqual(@as(u32, 12), tb.getLength());
|
|
885
|
-
|
|
886
|
-
const text = "New text";
|
|
887
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
888
|
-
try tb.addLine(mem_id, 0, 8);
|
|
889
|
-
|
|
890
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
test "TextBuffer memory registry - reset clears memory buffers" {
|
|
894
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
895
|
-
defer gp.deinitGlobalPool();
|
|
896
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
897
|
-
defer link.deinitGlobalLinkPool();
|
|
898
|
-
|
|
899
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
900
|
-
defer tb.deinit();
|
|
901
|
-
|
|
902
|
-
const text = "Hello";
|
|
903
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
904
|
-
try tb.addLine(mem_id, 0, 5);
|
|
905
|
-
|
|
906
|
-
tb.reset();
|
|
907
|
-
|
|
908
|
-
// Old mem_id should no longer be valid
|
|
909
|
-
try std.testing.expect(tb.getMemBuffer(mem_id) == null);
|
|
910
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
test "TextBuffer clear - preserves memory buffers" {
|
|
914
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
915
|
-
defer gp.deinitGlobalPool();
|
|
916
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
917
|
-
defer link.deinitGlobalLinkPool();
|
|
918
|
-
|
|
919
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
920
|
-
defer tb.deinit();
|
|
921
|
-
|
|
922
|
-
const text = "Hello World";
|
|
923
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
924
|
-
try tb.addLine(mem_id, 0, 5); // "Hello"
|
|
925
|
-
|
|
926
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
927
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLength());
|
|
928
|
-
|
|
929
|
-
// Clear should empty the buffer but preserve memory registry
|
|
930
|
-
tb.clear();
|
|
931
|
-
|
|
932
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount()); // Empty buffer has 1 empty line
|
|
933
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
934
|
-
|
|
935
|
-
// mem_id should still be valid
|
|
936
|
-
const retrieved = tb.getMemBuffer(mem_id);
|
|
937
|
-
try std.testing.expect(retrieved != null);
|
|
938
|
-
try std.testing.expectEqualStrings(text, retrieved.?);
|
|
939
|
-
|
|
940
|
-
// We can re-use the same mem_id after clear
|
|
941
|
-
try tb.addLine(mem_id, 6, 11); // "World"
|
|
942
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
943
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLength());
|
|
944
|
-
|
|
945
|
-
var out_buffer: [100]u8 = undefined;
|
|
946
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
947
|
-
try std.testing.expectEqualStrings("World", out_buffer[0..written]);
|
|
948
|
-
}
|
|
949
|
-
|
|
950
|
-
test "TextBuffer setText - preserves previously registered memory buffers" {
|
|
951
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
952
|
-
defer gp.deinitGlobalPool();
|
|
953
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
954
|
-
defer link.deinitGlobalLinkPool();
|
|
955
|
-
|
|
956
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
957
|
-
defer tb.deinit();
|
|
958
|
-
|
|
959
|
-
// Register a memory buffer
|
|
960
|
-
const old_text = "Previous content";
|
|
961
|
-
const old_mem_id = try tb.registerMemBuffer(old_text, false);
|
|
962
|
-
|
|
963
|
-
// Set some text using setText (which now calls clear() not reset())
|
|
964
|
-
try tb.setText("New text content");
|
|
965
|
-
|
|
966
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
967
|
-
|
|
968
|
-
// The old mem_id should still be valid after setText
|
|
969
|
-
const retrieved = tb.getMemBuffer(old_mem_id);
|
|
970
|
-
try std.testing.expect(retrieved != null);
|
|
971
|
-
try std.testing.expectEqualStrings(old_text, retrieved.?);
|
|
972
|
-
|
|
973
|
-
// We can still use the old mem_id
|
|
974
|
-
tb.clear();
|
|
975
|
-
try tb.addLine(old_mem_id, 0, 8); // "Previous"
|
|
976
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
977
|
-
|
|
978
|
-
var out_buffer: [100]u8 = undefined;
|
|
979
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
980
|
-
try std.testing.expectEqualStrings("Previous", out_buffer[0..written]);
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
test "TextBuffer setStyledText - preserves previously registered memory buffers" {
|
|
984
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
985
|
-
defer gp.deinitGlobalPool();
|
|
986
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
987
|
-
defer link.deinitGlobalLinkPool();
|
|
988
|
-
|
|
989
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
990
|
-
defer tb.deinit();
|
|
991
|
-
|
|
992
|
-
// Register a memory buffer before setStyledText
|
|
993
|
-
const preserved_text = "Preserved data";
|
|
994
|
-
const preserved_mem_id = try tb.registerMemBuffer(preserved_text, false);
|
|
995
|
-
|
|
996
|
-
// Use setStyledText (which now calls clear() not reset())
|
|
997
|
-
const chunk1_text = "Styled ";
|
|
998
|
-
const chunk2_text = "Text";
|
|
999
|
-
const chunks = [_]text_buffer.StyledChunk{
|
|
1000
|
-
.{
|
|
1001
|
-
.text_ptr = chunk1_text.ptr,
|
|
1002
|
-
.text_len = chunk1_text.len,
|
|
1003
|
-
.fg_ptr = null,
|
|
1004
|
-
.bg_ptr = null,
|
|
1005
|
-
.attributes = 0,
|
|
1006
|
-
},
|
|
1007
|
-
.{
|
|
1008
|
-
.text_ptr = chunk2_text.ptr,
|
|
1009
|
-
.text_len = chunk2_text.len,
|
|
1010
|
-
.fg_ptr = null,
|
|
1011
|
-
.bg_ptr = null,
|
|
1012
|
-
.attributes = 0,
|
|
1013
|
-
},
|
|
1014
|
-
};
|
|
1015
|
-
try tb.setStyledText(&chunks);
|
|
1016
|
-
|
|
1017
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1018
|
-
|
|
1019
|
-
// The preserved mem_id should still be valid
|
|
1020
|
-
const retrieved = tb.getMemBuffer(preserved_mem_id);
|
|
1021
|
-
try std.testing.expect(retrieved != null);
|
|
1022
|
-
try std.testing.expectEqualStrings(preserved_text, retrieved.?);
|
|
1023
|
-
|
|
1024
|
-
// We can use the preserved buffer
|
|
1025
|
-
tb.clear();
|
|
1026
|
-
try tb.addLine(preserved_mem_id, 0, 9); // "Preserved"
|
|
1027
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1028
|
-
|
|
1029
|
-
var out_buffer: [100]u8 = undefined;
|
|
1030
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1031
|
-
try std.testing.expectEqualStrings("Preserved", out_buffer[0..written]);
|
|
1032
|
-
}
|
|
1033
|
-
|
|
1034
|
-
test "TextBuffer clear vs reset - memory registry behavior" {
|
|
1035
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1036
|
-
defer gp.deinitGlobalPool();
|
|
1037
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1038
|
-
defer link.deinitGlobalLinkPool();
|
|
1039
|
-
|
|
1040
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1041
|
-
defer tb.deinit();
|
|
1042
|
-
|
|
1043
|
-
const text = "Test buffer";
|
|
1044
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
1045
|
-
try tb.addLine(mem_id, 0, 4); // "Test"
|
|
1046
|
-
|
|
1047
|
-
// clear() preserves memory buffers
|
|
1048
|
-
tb.clear();
|
|
1049
|
-
try std.testing.expect(tb.getMemBuffer(mem_id) != null);
|
|
1050
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
1051
|
-
|
|
1052
|
-
// Restore content
|
|
1053
|
-
try tb.addLine(mem_id, 5, 11); // "buffer"
|
|
1054
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1055
|
-
|
|
1056
|
-
// reset() clears memory buffers
|
|
1057
|
-
tb.reset();
|
|
1058
|
-
try std.testing.expect(tb.getMemBuffer(mem_id) == null);
|
|
1059
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
test "TextBuffer memory registry - partial buffer slices" {
|
|
1063
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1064
|
-
defer gp.deinitGlobalPool();
|
|
1065
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1066
|
-
defer link.deinitGlobalLinkPool();
|
|
1067
|
-
|
|
1068
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1069
|
-
defer tb.deinit();
|
|
1070
|
-
|
|
1071
|
-
const full_text = "0123456789ABCDEFGHIJ";
|
|
1072
|
-
const mem_id = try tb.registerMemBuffer(full_text, false);
|
|
1073
|
-
|
|
1074
|
-
try tb.addLine(mem_id, 0, 5); // "01234"
|
|
1075
|
-
try tb.addLine(mem_id, 5, 10); // "56789"
|
|
1076
|
-
try tb.addLine(mem_id, 10, 20); // "ABCDEFGHIJ"
|
|
1077
|
-
|
|
1078
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1079
|
-
|
|
1080
|
-
var out_buffer: [100]u8 = undefined;
|
|
1081
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1082
|
-
try std.testing.expectEqualStrings("01234\n56789\nABCDEFGHIJ", out_buffer[0..written]);
|
|
1083
|
-
}
|
|
1084
|
-
|
|
1085
|
-
test "TextBuffer memory registry - unicode text from buffers" {
|
|
1086
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1087
|
-
defer gp.deinitGlobalPool();
|
|
1088
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1089
|
-
defer link.deinitGlobalLinkPool();
|
|
1090
|
-
|
|
1091
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1092
|
-
defer tb.deinit();
|
|
1093
|
-
|
|
1094
|
-
const text1 = "Hello 世界";
|
|
1095
|
-
const text2 = "🌟 Test";
|
|
1096
|
-
|
|
1097
|
-
const id1 = try tb.registerMemBuffer(text1, false);
|
|
1098
|
-
const id2 = try tb.registerMemBuffer(text2, false);
|
|
1099
|
-
|
|
1100
|
-
try tb.addLine(id1, 0, @intCast(text1.len));
|
|
1101
|
-
try tb.addLine(id2, 0, @intCast(text2.len));
|
|
1102
|
-
|
|
1103
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
1104
|
-
|
|
1105
|
-
var out_buffer: [100]u8 = undefined;
|
|
1106
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1107
|
-
const expected = "Hello 世界\n🌟 Test";
|
|
1108
|
-
try std.testing.expectEqualStrings(expected, out_buffer[0..written]);
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
test "TextBuffer memory registry - getByteSize with multiple buffers" {
|
|
1112
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1113
|
-
defer gp.deinitGlobalPool();
|
|
1114
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1115
|
-
defer link.deinitGlobalLinkPool();
|
|
1116
|
-
|
|
1117
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1118
|
-
defer tb.deinit();
|
|
1119
|
-
|
|
1120
|
-
const text1 = "Hello"; // 5 bytes
|
|
1121
|
-
const text2 = "World"; // 5 bytes
|
|
1122
|
-
|
|
1123
|
-
const id1 = try tb.registerMemBuffer(text1, false);
|
|
1124
|
-
const id2 = try tb.registerMemBuffer(text2, false);
|
|
1125
|
-
|
|
1126
|
-
try tb.addLine(id1, 0, 5);
|
|
1127
|
-
try tb.addLine(id2, 0, 5);
|
|
1128
|
-
|
|
1129
|
-
const byte_size = tb.getByteSize();
|
|
1130
|
-
try std.testing.expectEqual(@as(u32, 11), byte_size);
|
|
1131
|
-
}
|
|
1132
|
-
|
|
1133
|
-
test "TextBuffer memory registry - views marked dirty on addLine" {
|
|
1134
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1135
|
-
defer gp.deinitGlobalPool();
|
|
1136
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1137
|
-
defer link.deinitGlobalLinkPool();
|
|
1138
|
-
|
|
1139
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1140
|
-
defer tb.deinit();
|
|
1141
|
-
|
|
1142
|
-
const view_id = try tb.registerView();
|
|
1143
|
-
defer tb.unregisterView(view_id);
|
|
1144
|
-
|
|
1145
|
-
tb.clearViewDirty(view_id);
|
|
1146
|
-
try std.testing.expect(!tb.isViewDirty(view_id));
|
|
1147
|
-
|
|
1148
|
-
const text = "Hello";
|
|
1149
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
1150
|
-
try tb.addLine(mem_id, 0, 5);
|
|
1151
|
-
|
|
1152
|
-
try std.testing.expect(tb.isViewDirty(view_id));
|
|
1153
|
-
}
|
|
1154
|
-
|
|
1155
|
-
test "TextBuffer memory registry - empty chunk handling" {
|
|
1156
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1157
|
-
defer gp.deinitGlobalPool();
|
|
1158
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1159
|
-
defer link.deinitGlobalLinkPool();
|
|
1160
|
-
|
|
1161
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1162
|
-
defer tb.deinit();
|
|
1163
|
-
|
|
1164
|
-
const text = "Hello World";
|
|
1165
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
1166
|
-
|
|
1167
|
-
// Add line with empty slice (start == end)
|
|
1168
|
-
try tb.addLine(mem_id, 5, 5);
|
|
1169
|
-
|
|
1170
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1171
|
-
try std.testing.expectEqual(@as(u32, 0), tb.getLength());
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
test "TextBuffer memory registry - buffer limit of 255" {
|
|
1175
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1176
|
-
defer gp.deinitGlobalPool();
|
|
1177
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1178
|
-
defer link.deinitGlobalLinkPool();
|
|
1179
|
-
|
|
1180
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1181
|
-
defer tb.deinit();
|
|
1182
|
-
|
|
1183
|
-
// Register 255 buffers (the maximum for u8)
|
|
1184
|
-
var i: u32 = 0;
|
|
1185
|
-
while (i < 255) : (i += 1) {
|
|
1186
|
-
const text = "Buffer";
|
|
1187
|
-
_ = try tb.registerMemBuffer(text, false);
|
|
1188
|
-
}
|
|
1189
|
-
|
|
1190
|
-
// Try to register 256th buffer - should fail
|
|
1191
|
-
const result = tb.registerMemBuffer("One more", false);
|
|
1192
|
-
try std.testing.expectError(text_buffer.TextBufferError.OutOfMemory, result);
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
test "TextBuffer memory registry - owned buffer memory management" {
|
|
1196
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1197
|
-
defer gp.deinitGlobalPool();
|
|
1198
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1199
|
-
defer link.deinitGlobalLinkPool();
|
|
1200
|
-
|
|
1201
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1202
|
-
defer tb.deinit();
|
|
1203
|
-
|
|
1204
|
-
// Allocate a buffer that the TextBuffer should own and free
|
|
1205
|
-
const owned_text = try std.testing.allocator.dupe(u8, "Owned text");
|
|
1206
|
-
const mem_id = try tb.registerMemBuffer(owned_text, true);
|
|
1207
|
-
|
|
1208
|
-
try tb.addLine(mem_id, 0, 10);
|
|
1209
|
-
|
|
1210
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1211
|
-
|
|
1212
|
-
// tb.deinit() should free the owned buffer
|
|
1213
|
-
// If there's a memory leak, the test allocator will catch it
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
test "TextBuffer memory registry - byte range out of bounds" {
|
|
1217
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1218
|
-
defer gp.deinitGlobalPool();
|
|
1219
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1220
|
-
defer link.deinitGlobalLinkPool();
|
|
1221
|
-
|
|
1222
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1223
|
-
defer tb.deinit();
|
|
1224
|
-
|
|
1225
|
-
const text = "Hello"; // Only 5 bytes
|
|
1226
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
1227
|
-
|
|
1228
|
-
// This should panic in debug mode or cause undefined behavior
|
|
1229
|
-
// We can't easily test this without catching panics, but we can document it
|
|
1230
|
-
// try tb.addLine(mem_id, 0, 100); // Would access out of bounds
|
|
1231
|
-
|
|
1232
|
-
// Test that valid range works
|
|
1233
|
-
try tb.addLine(mem_id, 0, 5);
|
|
1234
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLength());
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
test "TextBuffer memory registry - character range highlights across buffers" {
|
|
1238
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1239
|
-
defer gp.deinitGlobalPool();
|
|
1240
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1241
|
-
defer link.deinitGlobalLinkPool();
|
|
1242
|
-
|
|
1243
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1244
|
-
defer tb.deinit();
|
|
1245
|
-
|
|
1246
|
-
const text1 = "Line One";
|
|
1247
|
-
const text2 = "Line Two";
|
|
1248
|
-
|
|
1249
|
-
const id1 = try tb.registerMemBuffer(text1, false);
|
|
1250
|
-
const id2 = try tb.registerMemBuffer(text2, false);
|
|
1251
|
-
|
|
1252
|
-
try tb.addLine(id1, 0, 8);
|
|
1253
|
-
try tb.addLine(id2, 0, 8);
|
|
1254
|
-
|
|
1255
|
-
// Add highlight spanning both lines (from different buffers)
|
|
1256
|
-
try tb.addHighlightByCharRange(3, 11, 1, 1, 0);
|
|
1257
|
-
|
|
1258
|
-
const line0_highlights = tb.getLineHighlights(0);
|
|
1259
|
-
const line1_highlights = tb.getLineHighlights(1);
|
|
1260
|
-
|
|
1261
|
-
try std.testing.expectEqual(@as(usize, 1), line0_highlights.len);
|
|
1262
|
-
try std.testing.expectEqual(@as(usize, 1), line1_highlights.len);
|
|
1263
|
-
}
|
|
1264
|
-
|
|
1265
|
-
test "TextBuffer memory registry - empty buffer registration" {
|
|
1266
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1267
|
-
defer gp.deinitGlobalPool();
|
|
1268
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1269
|
-
defer link.deinitGlobalLinkPool();
|
|
1270
|
-
|
|
1271
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1272
|
-
defer tb.deinit();
|
|
1273
|
-
|
|
1274
|
-
const empty_text = "";
|
|
1275
|
-
const mem_id = try tb.registerMemBuffer(empty_text, false);
|
|
1276
|
-
|
|
1277
|
-
const retrieved = tb.getMemBuffer(mem_id);
|
|
1278
|
-
try std.testing.expect(retrieved != null);
|
|
1279
|
-
try std.testing.expectEqual(@as(usize, 0), retrieved.?.len);
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
test "TextBuffer memory registry - same buffer registered multiple times" {
|
|
1283
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1284
|
-
defer gp.deinitGlobalPool();
|
|
1285
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1286
|
-
defer link.deinitGlobalLinkPool();
|
|
1287
|
-
|
|
1288
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1289
|
-
defer tb.deinit();
|
|
1290
|
-
|
|
1291
|
-
const text = "Shared buffer";
|
|
1292
|
-
|
|
1293
|
-
// Register the same buffer multiple times (different IDs)
|
|
1294
|
-
const id1 = try tb.registerMemBuffer(text, false);
|
|
1295
|
-
const id2 = try tb.registerMemBuffer(text, false);
|
|
1296
|
-
const id3 = try tb.registerMemBuffer(text, false);
|
|
1297
|
-
|
|
1298
|
-
// IDs should be different
|
|
1299
|
-
try std.testing.expect(id1 != id2);
|
|
1300
|
-
try std.testing.expect(id2 != id3);
|
|
1301
|
-
|
|
1302
|
-
// Use different slices of the same registered buffer
|
|
1303
|
-
try tb.addLine(id1, 0, 6); // "Shared"
|
|
1304
|
-
try tb.addLine(id2, 7, 13); // "buffer"
|
|
1305
|
-
try tb.addLine(id3, 0, 13); // "Shared buffer"
|
|
1306
|
-
|
|
1307
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1308
|
-
|
|
1309
|
-
var out_buffer: [100]u8 = undefined;
|
|
1310
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1311
|
-
try std.testing.expectEqualStrings("Shared\nbuffer\nShared buffer", out_buffer[0..written]);
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
// ===== setText SIMD Line Break Tests =====
|
|
1315
|
-
|
|
1316
|
-
test "TextBuffer setText - CRLF line endings (Windows)" {
|
|
1317
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1318
|
-
defer gp.deinitGlobalPool();
|
|
1319
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1320
|
-
defer link.deinitGlobalLinkPool();
|
|
1321
|
-
|
|
1322
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1323
|
-
defer tb.deinit();
|
|
1324
|
-
|
|
1325
|
-
try tb.setText("Line1\r\nLine2\r\nLine3");
|
|
1326
|
-
|
|
1327
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1328
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
1329
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
1330
|
-
try std.testing.expectEqual(@as(u32, 12), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
1331
|
-
|
|
1332
|
-
var out_buffer: [100]u8 = undefined;
|
|
1333
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1334
|
-
try std.testing.expectEqualStrings("Line1\nLine2\nLine3", out_buffer[0..written]);
|
|
1335
|
-
}
|
|
1336
|
-
|
|
1337
|
-
test "TextBuffer setText - mixed line endings (LF, CRLF, CR)" {
|
|
1338
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1339
|
-
defer gp.deinitGlobalPool();
|
|
1340
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1341
|
-
defer link.deinitGlobalLinkPool();
|
|
1342
|
-
|
|
1343
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1344
|
-
defer tb.deinit();
|
|
1345
|
-
|
|
1346
|
-
try tb.setText("Unix\nWindows\r\nOldMac\rEnd");
|
|
1347
|
-
|
|
1348
|
-
try std.testing.expectEqual(@as(u32, 4), tb.getLineCount());
|
|
1349
|
-
|
|
1350
|
-
var out_buffer: [100]u8 = undefined;
|
|
1351
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1352
|
-
try std.testing.expectEqualStrings("Unix\nWindows\nOldMac\nEnd", out_buffer[0..written]);
|
|
1353
|
-
}
|
|
1354
|
-
|
|
1355
|
-
test "TextBuffer setText - text ending with CRLF" {
|
|
1356
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1357
|
-
defer gp.deinitGlobalPool();
|
|
1358
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1359
|
-
defer link.deinitGlobalLinkPool();
|
|
1360
|
-
|
|
1361
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1362
|
-
defer tb.deinit();
|
|
1363
|
-
|
|
1364
|
-
try tb.setText("Hello World\r\n");
|
|
1365
|
-
|
|
1366
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
1367
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
1368
|
-
try std.testing.expectEqual(@as(u32, 12), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
1369
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.lineWidthAt(tb.rope(), 1)); // Empty line
|
|
1370
|
-
}
|
|
1371
|
-
|
|
1372
|
-
test "TextBuffer setText - consecutive CRLF sequences" {
|
|
1373
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1374
|
-
defer gp.deinitGlobalPool();
|
|
1375
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1376
|
-
defer link.deinitGlobalLinkPool();
|
|
1377
|
-
|
|
1378
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1379
|
-
defer tb.deinit();
|
|
1380
|
-
|
|
1381
|
-
try tb.setText("Line1\r\n\r\nLine3");
|
|
1382
|
-
|
|
1383
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1384
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
1385
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
1386
|
-
try std.testing.expectEqual(@as(u32, 7), iter_mod.coordsToOffset(tb.rope(), 2, 0).?);
|
|
1387
|
-
}
|
|
1388
|
-
|
|
1389
|
-
test "TextBuffer setText - only CRLF sequences" {
|
|
1390
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1391
|
-
defer gp.deinitGlobalPool();
|
|
1392
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1393
|
-
defer link.deinitGlobalLinkPool();
|
|
1394
|
-
|
|
1395
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1396
|
-
defer tb.deinit();
|
|
1397
|
-
|
|
1398
|
-
try tb.setText("\r\n\r\n\r\n");
|
|
1399
|
-
|
|
1400
|
-
try std.testing.expectEqual(@as(u32, 4), tb.getLineCount());
|
|
1401
|
-
|
|
1402
|
-
// All lines should be empty
|
|
1403
|
-
for (0..4) |i| {
|
|
1404
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.lineWidthAt(tb.rope(), @intCast(i)));
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
|
|
1408
|
-
test "TextBuffer setText - text starting with CRLF" {
|
|
1409
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1410
|
-
defer gp.deinitGlobalPool();
|
|
1411
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1412
|
-
defer link.deinitGlobalLinkPool();
|
|
1413
|
-
|
|
1414
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1415
|
-
defer tb.deinit();
|
|
1416
|
-
|
|
1417
|
-
try tb.setText("\r\nHello World");
|
|
1418
|
-
|
|
1419
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
1420
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?); // Empty first line
|
|
1421
|
-
try std.testing.expectEqual(@as(u32, 1), iter_mod.coordsToOffset(tb.rope(), 1, 0).?);
|
|
1422
|
-
}
|
|
1423
|
-
|
|
1424
|
-
test "TextBuffer setText - CR without LF" {
|
|
1425
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1426
|
-
defer gp.deinitGlobalPool();
|
|
1427
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1428
|
-
defer link.deinitGlobalLinkPool();
|
|
1429
|
-
|
|
1430
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1431
|
-
defer tb.deinit();
|
|
1432
|
-
|
|
1433
|
-
try tb.setText("Line1\rLine2\rLine3");
|
|
1434
|
-
|
|
1435
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1436
|
-
|
|
1437
|
-
var out_buffer: [100]u8 = undefined;
|
|
1438
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1439
|
-
try std.testing.expectEqualStrings("Line1\nLine2\nLine3", out_buffer[0..written]);
|
|
1440
|
-
}
|
|
1441
|
-
|
|
1442
|
-
test "TextBuffer setText - very long line with SIMD processing" {
|
|
1443
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1444
|
-
defer gp.deinitGlobalPool();
|
|
1445
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1446
|
-
defer link.deinitGlobalLinkPool();
|
|
1447
|
-
|
|
1448
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1449
|
-
defer tb.deinit();
|
|
1450
|
-
|
|
1451
|
-
// Create a text longer than 16 bytes (SIMD vector size) to test SIMD path
|
|
1452
|
-
var text_builder: std.ArrayListUnmanaged(u8) = .{};
|
|
1453
|
-
defer text_builder.deinit(std.testing.allocator);
|
|
1454
|
-
|
|
1455
|
-
try text_builder.appendNTimes(std.testing.allocator, 'A', 100);
|
|
1456
|
-
try text_builder.appendSlice(std.testing.allocator, "\r\n");
|
|
1457
|
-
try text_builder.appendNTimes(std.testing.allocator, 'B', 100);
|
|
1458
|
-
try text_builder.appendSlice(std.testing.allocator, "\n");
|
|
1459
|
-
try text_builder.appendNTimes(std.testing.allocator, 'C', 100);
|
|
1460
|
-
|
|
1461
|
-
try tb.setText(text_builder.items);
|
|
1462
|
-
|
|
1463
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1464
|
-
try std.testing.expectEqual(@as(u32, 100), iter_mod.lineWidthAt(tb.rope(), 0));
|
|
1465
|
-
try std.testing.expectEqual(@as(u32, 100), iter_mod.lineWidthAt(tb.rope(), 1));
|
|
1466
|
-
try std.testing.expectEqual(@as(u32, 100), iter_mod.lineWidthAt(tb.rope(), 2));
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
|
-
test "TextBuffer setText - unicode content with various line endings" {
|
|
1470
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1471
|
-
defer gp.deinitGlobalPool();
|
|
1472
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1473
|
-
defer link.deinitGlobalLinkPool();
|
|
1474
|
-
|
|
1475
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1476
|
-
defer tb.deinit();
|
|
1477
|
-
|
|
1478
|
-
try tb.setText("Hello 世界\r\n🌟 Test\nEnd");
|
|
1479
|
-
|
|
1480
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1481
|
-
|
|
1482
|
-
var out_buffer: [100]u8 = undefined;
|
|
1483
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1484
|
-
try std.testing.expectEqualStrings("Hello 世界\n🌟 Test\nEnd", out_buffer[0..written]);
|
|
1485
|
-
}
|
|
1486
|
-
|
|
1487
|
-
test "TextBuffer setText - multiple consecutive different line endings" {
|
|
1488
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1489
|
-
defer gp.deinitGlobalPool();
|
|
1490
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1491
|
-
defer link.deinitGlobalLinkPool();
|
|
1492
|
-
|
|
1493
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1494
|
-
defer tb.deinit();
|
|
1495
|
-
|
|
1496
|
-
// Mix of \n, \r\n, \r in sequence
|
|
1497
|
-
try tb.setText("A\n\r\n\rB");
|
|
1498
|
-
|
|
1499
|
-
// "A", "", "", "B"
|
|
1500
|
-
try std.testing.expectEqual(@as(u32, 4), tb.getLineCount());
|
|
1501
|
-
}
|
|
1502
|
-
|
|
1503
|
-
test "TextBuffer setText - SIMD boundary conditions" {
|
|
1504
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1505
|
-
defer gp.deinitGlobalPool();
|
|
1506
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1507
|
-
defer link.deinitGlobalLinkPool();
|
|
1508
|
-
|
|
1509
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1510
|
-
defer tb.deinit();
|
|
1511
|
-
|
|
1512
|
-
// Create text with newlines at SIMD vector boundaries (16 bytes)
|
|
1513
|
-
var text_builder: std.ArrayListUnmanaged(u8) = .{};
|
|
1514
|
-
defer text_builder.deinit(std.testing.allocator);
|
|
1515
|
-
|
|
1516
|
-
// 15 chars + \n = exactly 16 bytes
|
|
1517
|
-
try text_builder.appendNTimes(std.testing.allocator, 'X', 15);
|
|
1518
|
-
try text_builder.appendSlice(std.testing.allocator, "\n");
|
|
1519
|
-
// 15 more chars + \n
|
|
1520
|
-
try text_builder.appendNTimes(std.testing.allocator, 'Y', 15);
|
|
1521
|
-
try text_builder.appendSlice(std.testing.allocator, "\n");
|
|
1522
|
-
// Final line
|
|
1523
|
-
try text_builder.appendNTimes(std.testing.allocator, 'Z', 10);
|
|
1524
|
-
|
|
1525
|
-
try tb.setText(text_builder.items);
|
|
1526
|
-
|
|
1527
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1528
|
-
try std.testing.expectEqual(@as(u32, 15), iter_mod.lineWidthAt(tb.rope(), 0));
|
|
1529
|
-
try std.testing.expectEqual(@as(u32, 15), iter_mod.lineWidthAt(tb.rope(), 1));
|
|
1530
|
-
try std.testing.expectEqual(@as(u32, 10), iter_mod.lineWidthAt(tb.rope(), 2));
|
|
1531
|
-
}
|
|
1532
|
-
|
|
1533
|
-
test "TextBuffer setText - CRLF at SIMD boundary" {
|
|
1534
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1535
|
-
defer gp.deinitGlobalPool();
|
|
1536
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1537
|
-
defer link.deinitGlobalLinkPool();
|
|
1538
|
-
|
|
1539
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1540
|
-
defer tb.deinit();
|
|
1541
|
-
|
|
1542
|
-
// Create text where \r is at end of SIMD vector and \n is at start of next
|
|
1543
|
-
var text_builder: std.ArrayListUnmanaged(u8) = .{};
|
|
1544
|
-
defer text_builder.deinit(std.testing.allocator);
|
|
1545
|
-
|
|
1546
|
-
// 15 chars + \r = 16 bytes, then \n at position 16
|
|
1547
|
-
try text_builder.appendNTimes(std.testing.allocator, 'A', 15);
|
|
1548
|
-
try text_builder.appendSlice(std.testing.allocator, "\r\n");
|
|
1549
|
-
try text_builder.appendSlice(std.testing.allocator, "Next line");
|
|
1550
|
-
|
|
1551
|
-
try tb.setText(text_builder.items);
|
|
1552
|
-
|
|
1553
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
1554
|
-
try std.testing.expectEqual(@as(u32, 15), iter_mod.lineWidthAt(tb.rope(), 0));
|
|
1555
|
-
|
|
1556
|
-
var out_buffer: [100]u8 = undefined;
|
|
1557
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1558
|
-
const expected_len = 15 + 1 + 9;
|
|
1559
|
-
try std.testing.expectEqual(expected_len, written);
|
|
1560
|
-
}
|
|
1561
|
-
|
|
1562
|
-
test "TextBuffer setText - line with multiple u16-sized chunks (SKIPPED)" {
|
|
1563
|
-
return error.SkipZigTest;
|
|
1564
|
-
}
|
|
1565
|
-
|
|
1566
|
-
test "TextBuffer setText - validate rope structure is correct" {
|
|
1567
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1568
|
-
defer gp.deinitGlobalPool();
|
|
1569
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1570
|
-
defer link.deinitGlobalLinkPool();
|
|
1571
|
-
|
|
1572
|
-
var tb = try text_buffer.UnifiedTextBuffer.init(std.testing.allocator, pool, link_pool, .wcwidth);
|
|
1573
|
-
defer tb.deinit();
|
|
1574
|
-
|
|
1575
|
-
try tb.setText("Line 1\nLine 2\nLine 3");
|
|
1576
|
-
|
|
1577
|
-
const line_count = tb.lineCount();
|
|
1578
|
-
try std.testing.expectEqual(@as(u32, 3), line_count);
|
|
1579
|
-
|
|
1580
|
-
const break_count = tb.rope().markerCount(.brk);
|
|
1581
|
-
try std.testing.expectEqual(@as(u32, 2), break_count);
|
|
1582
|
-
|
|
1583
|
-
const linestart_count = tb.rope().markerCount(.linestart);
|
|
1584
|
-
try std.testing.expectEqual(@as(u32, 3), linestart_count);
|
|
1585
|
-
|
|
1586
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.lineWidthAt(tb.rope(), 0));
|
|
1587
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.lineWidthAt(tb.rope(), 1));
|
|
1588
|
-
try std.testing.expectEqual(@as(u32, 6), iter_mod.lineWidthAt(tb.rope(), 2));
|
|
1589
|
-
|
|
1590
|
-
const total_weight = tb.rope().totalWeight();
|
|
1591
|
-
try std.testing.expectEqual(@as(u32, 20), total_weight);
|
|
1592
|
-
}
|
|
1593
|
-
|
|
1594
|
-
test "TextBuffer setText - then deleteRange via EditBuffer - validate markers" {
|
|
1595
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1596
|
-
defer gp.deinitGlobalPool();
|
|
1597
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1598
|
-
defer link.deinitGlobalLinkPool();
|
|
1599
|
-
|
|
1600
|
-
const edit_buffer = @import("../edit-buffer.zig");
|
|
1601
|
-
var eb = try edit_buffer.EditBuffer.init(std.testing.allocator, pool, link_pool, .wcwidth);
|
|
1602
|
-
defer eb.deinit();
|
|
1603
|
-
|
|
1604
|
-
try eb.setText("Line 1\nLine 2\nLine 3");
|
|
1605
|
-
|
|
1606
|
-
try eb.deleteRange(.{ .row = 2, .col = 0 }, .{ .row = 2, .col = 6 });
|
|
1607
|
-
|
|
1608
|
-
try std.testing.expectEqual(@as(u32, 2), eb.getTextBuffer().lineCount());
|
|
1609
|
-
try std.testing.expectEqual(@as(u32, 2), eb.getTextBuffer().rope().markerCount(.brk));
|
|
1610
|
-
try std.testing.expectEqual(@as(u32, 2), eb.getTextBuffer().rope().markerCount(.linestart));
|
|
1611
|
-
}
|
|
1612
|
-
|
|
1613
|
-
test "TextBuffer setStyledText - repeated calls with SyntaxStyle (crash reproduction)" {
|
|
1614
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1615
|
-
defer gp.deinitGlobalPool();
|
|
1616
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1617
|
-
defer link.deinitGlobalLinkPool();
|
|
1618
|
-
|
|
1619
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1620
|
-
defer tb.deinit();
|
|
1621
|
-
|
|
1622
|
-
// Create a SyntaxStyle (similar to what Text.ts does)
|
|
1623
|
-
const ss = @import("../syntax-style.zig");
|
|
1624
|
-
const style = try ss.SyntaxStyle.init(std.testing.allocator);
|
|
1625
|
-
defer style.deinit();
|
|
1626
|
-
|
|
1627
|
-
tb.setSyntaxStyle(style);
|
|
1628
|
-
|
|
1629
|
-
const iterations = 10000;
|
|
1630
|
-
const initial_arena = tb.getArenaAllocatedBytes();
|
|
1631
|
-
|
|
1632
|
-
// Simulate what styled-text-demo does - call setStyledText repeatedly
|
|
1633
|
-
var iteration: u32 = 0;
|
|
1634
|
-
while (iteration < iterations) : (iteration += 1) {
|
|
1635
|
-
// Create styled chunks similar to the demo
|
|
1636
|
-
const text1 = "System Stats: ";
|
|
1637
|
-
const text2 = "Frame: ";
|
|
1638
|
-
var frame_buf: [32]u8 = undefined;
|
|
1639
|
-
const frame_text = try std.fmt.bufPrint(&frame_buf, "{}", .{iteration});
|
|
1640
|
-
|
|
1641
|
-
const chunks = [_]text_buffer.StyledChunk{
|
|
1642
|
-
.{
|
|
1643
|
-
.text_ptr = text1.ptr,
|
|
1644
|
-
.text_len = text1.len,
|
|
1645
|
-
.fg_ptr = null,
|
|
1646
|
-
.bg_ptr = null,
|
|
1647
|
-
.attributes = 1, // bold
|
|
1648
|
-
},
|
|
1649
|
-
.{
|
|
1650
|
-
.text_ptr = text2.ptr,
|
|
1651
|
-
.text_len = text2.len,
|
|
1652
|
-
.fg_ptr = null,
|
|
1653
|
-
.bg_ptr = null,
|
|
1654
|
-
.attributes = 0,
|
|
1655
|
-
},
|
|
1656
|
-
.{
|
|
1657
|
-
.text_ptr = frame_text.ptr,
|
|
1658
|
-
.text_len = frame_text.len,
|
|
1659
|
-
.fg_ptr = null,
|
|
1660
|
-
.bg_ptr = null,
|
|
1661
|
-
.attributes = 0,
|
|
1662
|
-
},
|
|
1663
|
-
};
|
|
1664
|
-
|
|
1665
|
-
try tb.setStyledText(&chunks);
|
|
1666
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1667
|
-
}
|
|
1668
|
-
|
|
1669
|
-
const final_arena = tb.getArenaAllocatedBytes();
|
|
1670
|
-
const arena_growth = final_arena - initial_arena;
|
|
1671
|
-
|
|
1672
|
-
// Arena should not grow significantly - setStyledText should reuse memory
|
|
1673
|
-
// Max 50KB growth is reasonable for rope structure
|
|
1674
|
-
const max_expected_growth = 50000;
|
|
1675
|
-
try std.testing.expect(arena_growth < max_expected_growth);
|
|
1676
|
-
}
|
|
1677
|
-
|
|
1678
|
-
test "addHighlightByCharRange - single line highlight should not extend to EOL" {
|
|
1679
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1680
|
-
defer gp.deinitGlobalPool();
|
|
1681
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1682
|
-
defer link.deinitGlobalLinkPool();
|
|
1683
|
-
|
|
1684
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1685
|
-
defer tb.deinit();
|
|
1686
|
-
|
|
1687
|
-
const text = "Try moving your cursor through the [VIRTUAL] markers below:";
|
|
1688
|
-
try tb.setText(text);
|
|
1689
|
-
|
|
1690
|
-
try tb.addHighlightByCharRange(35, 44, 1, 1, 0);
|
|
1691
|
-
|
|
1692
|
-
const highlights = tb.getLineHighlights(0);
|
|
1693
|
-
try std.testing.expectEqual(@as(usize, 1), highlights.len);
|
|
1694
|
-
try std.testing.expectEqual(@as(u32, 35), highlights[0].col_start);
|
|
1695
|
-
try std.testing.expectEqual(@as(u32, 44), highlights[0].col_end);
|
|
1696
|
-
|
|
1697
|
-
try std.testing.expect(highlights[0].col_end < 59);
|
|
1698
|
-
try std.testing.expect(highlights[0].col_end == 44);
|
|
1699
|
-
}
|
|
1700
|
-
|
|
1701
|
-
test "addHighlightByCharRange - multiple highlights on same line should have correct bounds" {
|
|
1702
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1703
|
-
defer gp.deinitGlobalPool();
|
|
1704
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1705
|
-
defer link.deinitGlobalLinkPool();
|
|
1706
|
-
|
|
1707
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1708
|
-
defer tb.deinit();
|
|
1709
|
-
|
|
1710
|
-
const text = "Text [MARK1] and [MARK2] here";
|
|
1711
|
-
try tb.setText(text);
|
|
1712
|
-
|
|
1713
|
-
try tb.addHighlightByCharRange(5, 12, 1, 1, 0);
|
|
1714
|
-
try tb.addHighlightByCharRange(17, 24, 1, 2, 0);
|
|
1715
|
-
|
|
1716
|
-
const highlights = tb.getLineHighlights(0);
|
|
1717
|
-
try std.testing.expectEqual(@as(usize, 2), highlights.len);
|
|
1718
|
-
|
|
1719
|
-
try std.testing.expectEqual(@as(u32, 5), highlights[0].col_start);
|
|
1720
|
-
try std.testing.expectEqual(@as(u32, 12), highlights[0].col_end);
|
|
1721
|
-
|
|
1722
|
-
try std.testing.expectEqual(@as(u32, 17), highlights[1].col_start);
|
|
1723
|
-
try std.testing.expectEqual(@as(u32, 24), highlights[1].col_end);
|
|
1724
|
-
}
|
|
1725
|
-
|
|
1726
|
-
test "addHighlightByCharRange - highlight after newline should not span to EOL" {
|
|
1727
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1728
|
-
defer gp.deinitGlobalPool();
|
|
1729
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1730
|
-
defer link.deinitGlobalLinkPool();
|
|
1731
|
-
|
|
1732
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1733
|
-
defer tb.deinit();
|
|
1734
|
-
|
|
1735
|
-
const text = "Line1\nLine2 with [MARK] text\nLine3";
|
|
1736
|
-
try tb.setText(text);
|
|
1737
|
-
|
|
1738
|
-
const line1_char_offset: u32 = 5;
|
|
1739
|
-
const mark_start = line1_char_offset + 11;
|
|
1740
|
-
const mark_end = line1_char_offset + 17;
|
|
1741
|
-
|
|
1742
|
-
try tb.addHighlightByCharRange(mark_start, mark_end, 1, 1, 0);
|
|
1743
|
-
|
|
1744
|
-
const hl0 = tb.getLineHighlights(0);
|
|
1745
|
-
try std.testing.expectEqual(@as(usize, 0), hl0.len);
|
|
1746
|
-
|
|
1747
|
-
const hl1 = tb.getLineHighlights(1);
|
|
1748
|
-
try std.testing.expectEqual(@as(usize, 1), hl1.len);
|
|
1749
|
-
|
|
1750
|
-
try std.testing.expectEqual(@as(u32, 11), hl1[0].col_start);
|
|
1751
|
-
try std.testing.expectEqual(@as(u32, 17), hl1[0].col_end);
|
|
1752
|
-
|
|
1753
|
-
const line1_text = "Line2 with [MARK] text";
|
|
1754
|
-
try std.testing.expect(hl1[0].col_end < line1_text.len);
|
|
1755
|
-
}
|
|
1756
|
-
|
|
1757
|
-
test "addHighlightByCharRange - extmarks demo scenario reproduction" {
|
|
1758
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1759
|
-
defer gp.deinitGlobalPool();
|
|
1760
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1761
|
-
defer link.deinitGlobalLinkPool();
|
|
1762
|
-
|
|
1763
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1764
|
-
defer tb.deinit();
|
|
1765
|
-
|
|
1766
|
-
const full_text =
|
|
1767
|
-
\\Welcome to the Extmarks Demo!
|
|
1768
|
-
\\
|
|
1769
|
-
\\This demo showcases virtual extmarks - text ranges that the cursor jumps over.
|
|
1770
|
-
\\
|
|
1771
|
-
\\Try moving your cursor through the [VIRTUAL] markers below:
|
|
1772
|
-
\\- Use arrow keys to navigate
|
|
1773
|
-
;
|
|
1774
|
-
try tb.setText(full_text);
|
|
1775
|
-
|
|
1776
|
-
const line4_char_offset: u32 = 107;
|
|
1777
|
-
const virtual_start = line4_char_offset + 35;
|
|
1778
|
-
const virtual_end = line4_char_offset + 44;
|
|
1779
|
-
|
|
1780
|
-
try tb.addHighlightByCharRange(virtual_start, virtual_end, 1, 1, 0);
|
|
1781
|
-
|
|
1782
|
-
const line4_highlights = tb.getLineHighlights(4);
|
|
1783
|
-
try std.testing.expectEqual(@as(usize, 1), line4_highlights.len);
|
|
1784
|
-
try std.testing.expectEqual(@as(u32, 35), line4_highlights[0].col_start);
|
|
1785
|
-
try std.testing.expectEqual(@as(u32, 44), line4_highlights[0].col_end);
|
|
1786
|
-
|
|
1787
|
-
const line4_text = "Try moving your cursor through the [VIRTUAL] markers below:";
|
|
1788
|
-
try std.testing.expect(line4_highlights[0].col_end == 44);
|
|
1789
|
-
try std.testing.expect(line4_highlights[0].col_end < line4_text.len);
|
|
1790
|
-
}
|
|
1791
|
-
|
|
1792
|
-
// ===== TextBuffer.append() Tests =====
|
|
1793
|
-
|
|
1794
|
-
test "TextBuffer append - to empty buffer" {
|
|
1795
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1796
|
-
defer gp.deinitGlobalPool();
|
|
1797
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1798
|
-
defer link.deinitGlobalLinkPool();
|
|
1799
|
-
|
|
1800
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1801
|
-
defer tb.deinit();
|
|
1802
|
-
|
|
1803
|
-
try tb.append("Hello");
|
|
1804
|
-
|
|
1805
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1806
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLength());
|
|
1807
|
-
|
|
1808
|
-
var out_buffer: [100]u8 = undefined;
|
|
1809
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1810
|
-
try std.testing.expectEqualStrings("Hello", out_buffer[0..written]);
|
|
1811
|
-
}
|
|
1812
|
-
|
|
1813
|
-
test "TextBuffer append - to non-empty buffer, no newline" {
|
|
1814
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1815
|
-
defer gp.deinitGlobalPool();
|
|
1816
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1817
|
-
defer link.deinitGlobalLinkPool();
|
|
1818
|
-
|
|
1819
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1820
|
-
defer tb.deinit();
|
|
1821
|
-
|
|
1822
|
-
try tb.setText("Hello");
|
|
1823
|
-
try tb.append(" World");
|
|
1824
|
-
|
|
1825
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1826
|
-
try std.testing.expectEqual(@as(u32, 11), tb.getLength());
|
|
1827
|
-
|
|
1828
|
-
var out_buffer: [100]u8 = undefined;
|
|
1829
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1830
|
-
try std.testing.expectEqualStrings("Hello World", out_buffer[0..written]);
|
|
1831
|
-
}
|
|
1832
|
-
|
|
1833
|
-
test "TextBuffer append - creating new line with LF" {
|
|
1834
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1835
|
-
defer gp.deinitGlobalPool();
|
|
1836
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1837
|
-
defer link.deinitGlobalLinkPool();
|
|
1838
|
-
|
|
1839
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1840
|
-
defer tb.deinit();
|
|
1841
|
-
|
|
1842
|
-
try tb.setText("Hello");
|
|
1843
|
-
try tb.append("\nWorld");
|
|
1844
|
-
|
|
1845
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
1846
|
-
|
|
1847
|
-
var out_buffer: [100]u8 = undefined;
|
|
1848
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1849
|
-
try std.testing.expectEqualStrings("Hello\nWorld", out_buffer[0..written]);
|
|
1850
|
-
}
|
|
1851
|
-
|
|
1852
|
-
test "TextBuffer append - multiple lines with various endings" {
|
|
1853
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1854
|
-
defer gp.deinitGlobalPool();
|
|
1855
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1856
|
-
defer link.deinitGlobalLinkPool();
|
|
1857
|
-
|
|
1858
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1859
|
-
defer tb.deinit();
|
|
1860
|
-
|
|
1861
|
-
try tb.setText("A\nB");
|
|
1862
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
1863
|
-
|
|
1864
|
-
try tb.append("\nC\nD\n");
|
|
1865
|
-
|
|
1866
|
-
try std.testing.expectEqual(@as(u32, 5), tb.getLineCount());
|
|
1867
|
-
|
|
1868
|
-
var out_buffer: [100]u8 = undefined;
|
|
1869
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1870
|
-
try std.testing.expectEqualStrings("A\nB\nC\nD\n", out_buffer[0..written]);
|
|
1871
|
-
}
|
|
1872
|
-
|
|
1873
|
-
test "TextBuffer append - CRLF line endings" {
|
|
1874
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1875
|
-
defer gp.deinitGlobalPool();
|
|
1876
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1877
|
-
defer link.deinitGlobalLinkPool();
|
|
1878
|
-
|
|
1879
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1880
|
-
defer tb.deinit();
|
|
1881
|
-
|
|
1882
|
-
try tb.append("Line1\r\nLine2\r\nLine3");
|
|
1883
|
-
|
|
1884
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1885
|
-
|
|
1886
|
-
var out_buffer: [100]u8 = undefined;
|
|
1887
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1888
|
-
// CRLF should be normalized to LF
|
|
1889
|
-
try std.testing.expectEqualStrings("Line1\nLine2\nLine3", out_buffer[0..written]);
|
|
1890
|
-
}
|
|
1891
|
-
|
|
1892
|
-
test "TextBuffer append - mixed line endings" {
|
|
1893
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1894
|
-
defer gp.deinitGlobalPool();
|
|
1895
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1896
|
-
defer link.deinitGlobalLinkPool();
|
|
1897
|
-
|
|
1898
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1899
|
-
defer tb.deinit();
|
|
1900
|
-
|
|
1901
|
-
try tb.setText("Unix\n");
|
|
1902
|
-
try tb.append("Windows\r\nOldMac\rEnd");
|
|
1903
|
-
|
|
1904
|
-
try std.testing.expectEqual(@as(u32, 4), tb.getLineCount());
|
|
1905
|
-
|
|
1906
|
-
var out_buffer: [100]u8 = undefined;
|
|
1907
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1908
|
-
try std.testing.expectEqualStrings("Unix\nWindows\nOldMac\nEnd", out_buffer[0..written]);
|
|
1909
|
-
}
|
|
1910
|
-
|
|
1911
|
-
test "TextBuffer append - empty string is no-op" {
|
|
1912
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1913
|
-
defer gp.deinitGlobalPool();
|
|
1914
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1915
|
-
defer link.deinitGlobalLinkPool();
|
|
1916
|
-
|
|
1917
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1918
|
-
defer tb.deinit();
|
|
1919
|
-
|
|
1920
|
-
try tb.setText("Hello");
|
|
1921
|
-
const initial_length = tb.getLength();
|
|
1922
|
-
const initial_line_count = tb.getLineCount();
|
|
1923
|
-
|
|
1924
|
-
try tb.append("");
|
|
1925
|
-
|
|
1926
|
-
try std.testing.expectEqual(initial_length, tb.getLength());
|
|
1927
|
-
try std.testing.expectEqual(initial_line_count, tb.getLineCount());
|
|
1928
|
-
}
|
|
1929
|
-
|
|
1930
|
-
test "TextBuffer append - unicode content" {
|
|
1931
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1932
|
-
defer gp.deinitGlobalPool();
|
|
1933
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1934
|
-
defer link.deinitGlobalLinkPool();
|
|
1935
|
-
|
|
1936
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1937
|
-
defer tb.deinit();
|
|
1938
|
-
|
|
1939
|
-
try tb.setText("Hello ");
|
|
1940
|
-
try tb.append("世界 🌟");
|
|
1941
|
-
|
|
1942
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
1943
|
-
|
|
1944
|
-
var out_buffer: [100]u8 = undefined;
|
|
1945
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1946
|
-
try std.testing.expectEqualStrings("Hello 世界 🌟", out_buffer[0..written]);
|
|
1947
|
-
}
|
|
1948
|
-
|
|
1949
|
-
test "TextBuffer append - streaming/chunked append vs ground truth" {
|
|
1950
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1951
|
-
defer gp.deinitGlobalPool();
|
|
1952
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1953
|
-
defer link.deinitGlobalLinkPool();
|
|
1954
|
-
|
|
1955
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1956
|
-
defer tb.deinit();
|
|
1957
|
-
|
|
1958
|
-
// Append in chunks
|
|
1959
|
-
try tb.append("First");
|
|
1960
|
-
try tb.append("\nLine2");
|
|
1961
|
-
try tb.append("\n");
|
|
1962
|
-
try tb.append("Line3");
|
|
1963
|
-
try tb.append(" end");
|
|
1964
|
-
|
|
1965
|
-
// Build expected ground truth
|
|
1966
|
-
var expected: std.ArrayListUnmanaged(u8) = .{};
|
|
1967
|
-
defer expected.deinit(std.testing.allocator);
|
|
1968
|
-
try expected.appendSlice(std.testing.allocator, "First");
|
|
1969
|
-
try expected.appendSlice(std.testing.allocator, "\nLine2");
|
|
1970
|
-
try expected.appendSlice(std.testing.allocator, "\n");
|
|
1971
|
-
try expected.appendSlice(std.testing.allocator, "Line3");
|
|
1972
|
-
try expected.appendSlice(std.testing.allocator, " end");
|
|
1973
|
-
|
|
1974
|
-
var out_buffer: [100]u8 = undefined;
|
|
1975
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
1976
|
-
try std.testing.expectEqualStrings(expected.items, out_buffer[0..written]);
|
|
1977
|
-
|
|
1978
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
1979
|
-
}
|
|
1980
|
-
|
|
1981
|
-
test "TextBuffer append - large streaming append" {
|
|
1982
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
1983
|
-
defer gp.deinitGlobalPool();
|
|
1984
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
1985
|
-
defer link.deinitGlobalLinkPool();
|
|
1986
|
-
|
|
1987
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
1988
|
-
defer tb.deinit();
|
|
1989
|
-
|
|
1990
|
-
// Simulate streaming large content
|
|
1991
|
-
var i: u32 = 0;
|
|
1992
|
-
while (i < 100) : (i += 1) {
|
|
1993
|
-
var buf: [32]u8 = undefined;
|
|
1994
|
-
const line = try std.fmt.bufPrint(&buf, "Line {}\n", .{i});
|
|
1995
|
-
try tb.append(line);
|
|
1996
|
-
}
|
|
1997
|
-
|
|
1998
|
-
try std.testing.expectEqual(@as(u32, 101), tb.getLineCount()); // 100 lines + empty final line
|
|
1999
|
-
|
|
2000
|
-
// Verify first and last lines can be extracted correctly
|
|
2001
|
-
try std.testing.expectEqual(@as(u32, 0), iter_mod.coordsToOffset(tb.rope(), 0, 0).?);
|
|
2002
|
-
try std.testing.expect(iter_mod.coordsToOffset(tb.rope(), 99, 0).? > 0);
|
|
2003
|
-
}
|
|
2004
|
-
|
|
2005
|
-
test "TextBuffer appendFromMemId - basic functionality" {
|
|
2006
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2007
|
-
defer gp.deinitGlobalPool();
|
|
2008
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2009
|
-
defer link.deinitGlobalLinkPool();
|
|
2010
|
-
|
|
2011
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2012
|
-
defer tb.deinit();
|
|
2013
|
-
|
|
2014
|
-
const text = "Alpha\nBeta";
|
|
2015
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
2016
|
-
|
|
2017
|
-
try tb.appendFromMemId(mem_id);
|
|
2018
|
-
|
|
2019
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
2020
|
-
|
|
2021
|
-
var out_buffer: [100]u8 = undefined;
|
|
2022
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
2023
|
-
try std.testing.expectEqualStrings("Alpha\nBeta", out_buffer[0..written]);
|
|
2024
|
-
}
|
|
2025
|
-
|
|
2026
|
-
test "TextBuffer appendFromMemId - append to existing content" {
|
|
2027
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2028
|
-
defer gp.deinitGlobalPool();
|
|
2029
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2030
|
-
defer link.deinitGlobalLinkPool();
|
|
2031
|
-
|
|
2032
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2033
|
-
defer tb.deinit();
|
|
2034
|
-
|
|
2035
|
-
const text = "Gamma";
|
|
2036
|
-
const mem_id = try tb.registerMemBuffer(text, false);
|
|
2037
|
-
|
|
2038
|
-
try tb.setText("Alpha\nBeta");
|
|
2039
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
2040
|
-
|
|
2041
|
-
try tb.appendFromMemId(mem_id);
|
|
2042
|
-
|
|
2043
|
-
try std.testing.expectEqual(@as(u32, 2), tb.getLineCount());
|
|
2044
|
-
|
|
2045
|
-
var out_buffer: [100]u8 = undefined;
|
|
2046
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
2047
|
-
try std.testing.expectEqualStrings("Alpha\nBetaGamma", out_buffer[0..written]);
|
|
2048
|
-
}
|
|
2049
|
-
|
|
2050
|
-
test "TextBuffer appendFromMemId - invalid mem_id" {
|
|
2051
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2052
|
-
defer gp.deinitGlobalPool();
|
|
2053
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2054
|
-
defer link.deinitGlobalLinkPool();
|
|
2055
|
-
|
|
2056
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2057
|
-
defer tb.deinit();
|
|
2058
|
-
|
|
2059
|
-
const result = tb.appendFromMemId(99);
|
|
2060
|
-
try std.testing.expectError(text_buffer.TextBufferError.InvalidMemId, result);
|
|
2061
|
-
}
|
|
2062
|
-
|
|
2063
|
-
test "TextBuffer append - marker invariants maintained" {
|
|
2064
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2065
|
-
defer gp.deinitGlobalPool();
|
|
2066
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2067
|
-
defer link.deinitGlobalLinkPool();
|
|
2068
|
-
|
|
2069
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2070
|
-
defer tb.deinit();
|
|
2071
|
-
|
|
2072
|
-
try tb.append("Line1\n");
|
|
2073
|
-
try tb.append("Line2\n");
|
|
2074
|
-
try tb.append("Line3");
|
|
2075
|
-
|
|
2076
|
-
const line_count = tb.getLineCount();
|
|
2077
|
-
try std.testing.expectEqual(@as(u32, 3), line_count);
|
|
2078
|
-
|
|
2079
|
-
// Verify marker counts
|
|
2080
|
-
const linestart_count = tb.rope().markerCount(.linestart);
|
|
2081
|
-
try std.testing.expectEqual(line_count, linestart_count);
|
|
2082
|
-
|
|
2083
|
-
const break_count = tb.rope().markerCount(.brk);
|
|
2084
|
-
try std.testing.expectEqual(@as(u32, 2), break_count); // 2 newlines
|
|
2085
|
-
}
|
|
2086
|
-
|
|
2087
|
-
test "TextBuffer append - memory registry preserved" {
|
|
2088
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2089
|
-
defer gp.deinitGlobalPool();
|
|
2090
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2091
|
-
defer link.deinitGlobalLinkPool();
|
|
2092
|
-
|
|
2093
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2094
|
-
defer tb.deinit();
|
|
2095
|
-
|
|
2096
|
-
const preserved_text = "Preserved";
|
|
2097
|
-
const preserved_id = try tb.registerMemBuffer(preserved_text, false);
|
|
2098
|
-
|
|
2099
|
-
try tb.append("First\n");
|
|
2100
|
-
try tb.append("Second\n");
|
|
2101
|
-
try tb.append("Third");
|
|
2102
|
-
|
|
2103
|
-
// Preserved buffer should still be accessible
|
|
2104
|
-
const retrieved = tb.getMemBuffer(preserved_id);
|
|
2105
|
-
try std.testing.expect(retrieved != null);
|
|
2106
|
-
try std.testing.expectEqualStrings(preserved_text, retrieved.?);
|
|
2107
|
-
}
|
|
2108
|
-
|
|
2109
|
-
test "TextBuffer append - views marked dirty" {
|
|
2110
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2111
|
-
defer gp.deinitGlobalPool();
|
|
2112
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2113
|
-
defer link.deinitGlobalLinkPool();
|
|
2114
|
-
|
|
2115
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2116
|
-
defer tb.deinit();
|
|
2117
|
-
|
|
2118
|
-
const view_id = try tb.registerView();
|
|
2119
|
-
defer tb.unregisterView(view_id);
|
|
2120
|
-
|
|
2121
|
-
tb.clearViewDirty(view_id);
|
|
2122
|
-
try std.testing.expect(!tb.isViewDirty(view_id));
|
|
2123
|
-
|
|
2124
|
-
try tb.append("New content");
|
|
2125
|
-
|
|
2126
|
-
try std.testing.expect(tb.isViewDirty(view_id));
|
|
2127
|
-
}
|
|
2128
|
-
|
|
2129
|
-
test "TextBuffer append - append after clear" {
|
|
2130
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2131
|
-
defer gp.deinitGlobalPool();
|
|
2132
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2133
|
-
defer link.deinitGlobalLinkPool();
|
|
2134
|
-
|
|
2135
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2136
|
-
defer tb.deinit();
|
|
2137
|
-
|
|
2138
|
-
try tb.setText("Initial content");
|
|
2139
|
-
tb.clear();
|
|
2140
|
-
|
|
2141
|
-
try tb.append("After clear");
|
|
2142
|
-
|
|
2143
|
-
try std.testing.expectEqual(@as(u32, 1), tb.getLineCount());
|
|
2144
|
-
|
|
2145
|
-
var out_buffer: [100]u8 = undefined;
|
|
2146
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
2147
|
-
try std.testing.expectEqualStrings("After clear", out_buffer[0..written]);
|
|
2148
|
-
}
|
|
2149
|
-
|
|
2150
|
-
test "TextBuffer append - consecutive empty line handling" {
|
|
2151
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2152
|
-
defer gp.deinitGlobalPool();
|
|
2153
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2154
|
-
defer link.deinitGlobalLinkPool();
|
|
2155
|
-
|
|
2156
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2157
|
-
defer tb.deinit();
|
|
2158
|
-
|
|
2159
|
-
try tb.setText("Line1\n");
|
|
2160
|
-
try tb.append("\n");
|
|
2161
|
-
try tb.append("Line3");
|
|
2162
|
-
|
|
2163
|
-
try std.testing.expectEqual(@as(u32, 3), tb.getLineCount());
|
|
2164
|
-
|
|
2165
|
-
var out_buffer: [100]u8 = undefined;
|
|
2166
|
-
const written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
2167
|
-
try std.testing.expectEqualStrings("Line1\n\nLine3", out_buffer[0..written]);
|
|
2168
|
-
}
|
|
2169
|
-
|
|
2170
|
-
test "TextBuffer append - mixed append and setText" {
|
|
2171
|
-
const pool = gp.initGlobalPool(std.testing.allocator);
|
|
2172
|
-
defer gp.deinitGlobalPool();
|
|
2173
|
-
const link_pool = link.initGlobalLinkPool(std.testing.allocator);
|
|
2174
|
-
defer link.deinitGlobalLinkPool();
|
|
2175
|
-
|
|
2176
|
-
var tb = try TextBuffer.init(std.testing.allocator, pool, link_pool, .unicode);
|
|
2177
|
-
defer tb.deinit();
|
|
2178
|
-
|
|
2179
|
-
try tb.setText("First");
|
|
2180
|
-
try tb.append(" appended");
|
|
2181
|
-
|
|
2182
|
-
var out_buffer: [100]u8 = undefined;
|
|
2183
|
-
var written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
2184
|
-
try std.testing.expectEqualStrings("First appended", out_buffer[0..written]);
|
|
2185
|
-
|
|
2186
|
-
try tb.setText("Reset");
|
|
2187
|
-
try tb.append(" again");
|
|
2188
|
-
|
|
2189
|
-
written = tb.getPlainTextIntoBuffer(&out_buffer);
|
|
2190
|
-
try std.testing.expectEqualStrings("Reset again", out_buffer[0..written]);
|
|
2191
|
-
}
|