[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/dape 4de787ca66 7/8: Initial erc tests (#35)
From: |
ELPA Syncer |
Subject: |
[elpa] externals/dape 4de787ca66 7/8: Initial erc tests (#35) |
Date: |
Thu, 28 Dec 2023 18:58:23 -0500 (EST) |
branch: externals/dape
commit 4de787ca66e61154b83d707ee6cf69ba8e7f1cb8
Author: Daniel Pettersson <daniel@dpettersson.net>
Commit: GitHub <noreply@github.com>
Initial erc tests (#35)
---
.github/workflows/test.yml | 57 ++++
Makefile | 16 ++
dape-tests.el | 629 +++++++++++++++++++++++++++++++++++++++++++++
dape.el | 5 +-
4 files changed, 706 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000000..6acc8954f4
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,57 @@
+name: test
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Install emacs
+ uses: purcell/setup-emacs@master
+ with:
+ version: 29.1
+
+ - name: Install Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: "3.9"
+ architecture: "x64"
+
+ - name: Install debugpy
+ run: |
+ pip3 install debugpy
+
+ - name: Download codelldb
+ run: |
+ sudo apt install wget
+ mkdir -p ~/.emacs.d/debug-adapters/codelldb/
+ wget
https://github.com/vadimcn/codelldb/releases/download/v1.10.0/codelldb-x86_64-linux.vsix
+ unzip codelldb-x86_64-linux.vsix -d ~/.emacs.d/debug-adapters/codelldb/
+
+ - name: Download js-debug
+ run: |
+ sudo apt install wget
+ mkdir -p ~/.emacs.d/debug-adapters/
+ wget
https://github.com/microsoft/vscode-js-debug/releases/download/v1.84.0/js-debug-dap-v1.84.0.tar.gz
+ tar -xvzf js-debug-dap-v1.84.0.tar.gz -C ~/.emacs.d/debug-adapters
+
+ - name: Install ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.2'
+
+ - name: Install rdbg
+ run: gem install debug
+
+ - name: Build
+ run: make all
+
+ - name: Test
+ run: make check
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000..eb89bb419d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,16 @@
+export EMACS ?= $(shell which emacs)
+
+ELFILES = dape.el dape-tests.el
+ELCFILES = $(addsuffix .elc, $(basename $(ELFILES)))
+
+all: $(ELCFILES)
+
+%.elc: %.el
+ @echo Compiling $<
+ @${EMACS} -batch -q -no-site-file -L . -f batch-byte-compile $<
+
+check: $(ELCFILES)
+ @${EMACS} -batch -l ert $(foreach file, $^, -l $(file)) -f
ert-run-tests-batch-and-exit
+
+clean:
+ @rm -f *.elc
diff --git a/dape-tests.el b/dape-tests.el
new file mode 100644
index 0000000000..4e15dcbc78
--- /dev/null
+++ b/dape-tests.el
@@ -0,0 +1,629 @@
+;;; dape-tests.el --- Tests for dape.el -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2018-2023 Free Software Foundation, Inc.
+
+;; Author: Daniel Pettersson
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+(require 'dape)
+(require 'ert)
+
+;;; Helpers
+(defun dape-test--goto-line (line)
+ "Goto LINE."
+ (goto-char (point-min))
+ (forward-line (1- line)))
+
+(defun dape-test--line-at-regex (regexp)
+ "Search for a line matching the REGEXP in the current buffer."
+ (save-excursion
+ (goto-char (point-min))
+ (let ((match (re-search-forward regexp nil t)))
+ (when match
+ (line-number-at-pos)))))
+
+(defmacro dape-test--should (pred &optional seconds)
+ "PRED should eventually be non nil during duration SECONDS.'
+If PRED does not eventually return nil, abort the current test as
+failed."
+ (let ((seconds (or seconds 10)))
+ `(progn
+ (with-timeout (,seconds)
+ (while (not ,pred)
+ (accept-process-output nil 0.01)))
+ (should ,pred)
+ (let ((ret ,pred))
+ (ignore ret)
+ ret))))
+
+(defmacro dape-test--with-files (buffer-fixtures &rest body)
+ "Setup BUFFER-FIXTURES call body with bindings and clean up.
+FIXTURE is an alist of the form
+(BUFFER-BINDING (FILE-NAME . CONTENT-LIST).
+
+Inserts breakpoints based on string properties in elements in
+CONTENT-LIST.
+- bp: inserts breakpoint
+- condition: inserts condition breakpoint
+- log: inserts log breakpoint"
+ (declare (indent 1) (debug t))
+ `(dape-test--call-with-files ',(mapcar 'cdr buffer-fixtures)
+ (lambda ,(mapcar 'car buffer-fixtures)
+ ,@body)))
+
+(defvar dape--test-skip-cleanup nil)
+
+(defun dape-test--call-with-files (fixtures fn)
+ "Setup FIXTURES and apply FN with created buffers.
+Helper for `dape-test--with-files'."
+ (let* ((temp-dir (make-temp-file "dape-tests-" t))
+ (default-directory temp-dir)
+ buffers)
+ (unwind-protect
+ (progn
+ ;; init files and buffers
+ (pcase-dolist (`(,file-name ,content) fixtures)
+ (with-current-buffer (find-file-noselect file-name)
+ (insert (mapconcat 'eval content "\n"))
+ (save-buffer)
+ (push (current-buffer) buffers)
+ (goto-char (point-min))))
+ (setq buffers (nreverse buffers))
+ (apply fn buffers))
+ ;; reset dape
+ (unless dape--test-skip-cleanup
+ (advice-add 'yes-or-no-p :around (defun always-yes (&rest _) t))
+ (dape-quit)
+ (setq dape--info-expanded-p
+ (make-hash-table :test 'equal))
+ (setq dape--watched nil)
+ (dape-test--should
+ (not dape--process) 10)
+ (dape-test--should
+ (not (seq-find (lambda (buffer)
+ (string-match-p "\\*dape-.+\\*"
+ (buffer-name buffer)))
+ (buffer-list))))
+ (advice-remove 'yes-or-no-p 'always-yes)
+ ;; clean up files
+ (delete-directory temp-dir t)))))
+
+(defun dape-test--apply-to-match (regex fn)
+ "Apply FN to match of REGEX in the current buffer."
+ (save-excursion
+ (goto-char (point-min))
+ (when (re-search-forward regex nil)
+ (funcall-interactively fn))))
+
+(defun dape-test--debug (key &rest options)
+ "Invoke `dape' config KEY with OPTIONS."
+ (dape (dape--config-eval key options)))
+
+;;; Tests
+(defun dape--test-restart (buffer &rest dape-args)
+ "Helper for ert test `dape-test-restart'.
+Expects line with string \"breakpoint\" in source."
+ (with-current-buffer buffer
+ ;; set breakpoint
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle)))
+ (apply 'dape-test--debug dape-args)
+ ;; at breakpoint and stopped
+ (dape-test--should
+ (and (eq dape--state 'stopped)
+ (equal (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))
+ ;; restart
+ (goto-char (point-min))
+ (dape-restart)
+ ;; at breakpoint and stopped
+ (dape-test--should
+ (and (eq dape--state 'stopped)
+ (equal (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))))
+
+(ert-deftest dape-test-restart ()
+ "Restart with restart."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("pass"
+ "pass # breakpoint")))
+ (dape--test-restart main-buffer
+ 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory))
+ (dape-test--with-files
+ ((index-buffer
+ "index.js"
+ ("()=>{};"
+ "()=>{}; // breakpoint")))
+ (dape--test-restart index-buffer
+ 'js-debug-node
+ :program (buffer-file-name index-buffer)
+ :cwd default-directory))
+ (dape-test--with-files
+ ((index-buffer
+ "main.c"
+ ("int main() {"
+ " return 0; // breakpoint"
+ "}")))
+ (dape--test-restart index-buffer
+ 'codelldb-cc
+ :program
+ (file-name-concat default-directory "./a.out")
+ :cwd default-directory
+ 'compile "gcc -g -o a.out main.c"))
+ (dape-test--with-files
+ ((main-buffer
+ "main.rb"
+ ("puts \"\""
+ "puts \"\""
+ "0 # breakpoint")))
+ (dape--test-restart main-buffer
+ 'rdbg
+ 'command-cwd default-directory
+ '-c (format "ruby \"%s\""
+ (buffer-file-name main-buffer)))))
+
+(defun dape--test-restart-with-dape (buffer &rest dape-args)
+ "Helper for ert test `dape-test-restart-with-dape'.
+Expects line with string \"breakpoint\" in source."
+ (with-current-buffer buffer
+ ;; set breakpoint
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle)))
+ (apply 'dape-test--debug dape-args)
+ ;; at breakpoint and stopped
+ (dape-test--should
+ (and (eq dape--state 'stopped)
+ (equal (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))
+ ;; restart
+ (goto-char (point-min))
+ (apply 'dape-test--debug dape-args)
+ ;; at breakpoint and stopped
+ (dape-test--should
+ (and (eq dape--state 'stopped)
+ (equal (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))))
+
+(ert-deftest dape-test-restart-with-dape ()
+ "Should be able to restart with `dape' even though session active."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("pass"
+ "pass # breakpoint")))
+ (dape--test-restart-with-dape main-buffer
+ 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory))
+ (dape-test--with-files
+ ((index-buffer
+ "index.js"
+ ("()=>{};"
+ "()=>{}; // breakpoint")))
+ (dape--test-restart-with-dape index-buffer
+ 'js-debug-node
+ :program (buffer-file-name index-buffer)
+ :cwd default-directory))
+ (dape-test--with-files
+ ((main-buffer
+ "main.c"
+ ("int main() {"
+ " return 0; // breakpoint"
+ "}")))
+ (dape--test-restart-with-dape main-buffer
+ 'codelldb-cc
+ :program
+ (file-name-concat default-directory
"./a.out")
+ :cwd default-directory
+ 'compile "gcc -g -o a.out main.c"))
+ (dape-test--with-files
+ ((main-buffer
+ "main.rb"
+ ("puts \"\""
+ "puts \"\""
+ "0 # breakpoint")))
+ (dape--test-restart-with-dape main-buffer
+ 'rdbg
+ 'command-cwd default-directory
+ '-c (format "ruby \"%s\"" (buffer-file-name
main-buffer)))))
+
+(defun dape--test-scope-buffer (buffer &rest dape-args)
+ "Helper for ert test `dape-test-scope-buffer-contents'.
+Watch buffer should contain variables a, b and expandable c with
+property member.
+Expects line with string \"breakpoint\" in source."
+ ;; set breakpoint
+ (with-current-buffer buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ (apply 'dape-test--debug dape-args)
+ ;; we are at breakpoint and stopped
+ (with-current-buffer buffer
+ (dape-test--should
+ (equal (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-scope-mode 0))
+ (dape-test--should
+ (dape-test--line-at-regex "^ a"))
+ (dape-test--should
+ (dape-test--line-at-regex "^\\+ b"))
+ ;; expansion
+ (dape-test--apply-to-match "^\\+ b" 'dape-info-scope-toggle)
+ (dape-test--should
+ (dape-test--line-at-regex "^ member"))
+ ;; contraction
+ (dape-test--apply-to-match "^\\- b" 'dape-info-scope-toggle)
+ (dape-test--should
+ (not (dape-test--line-at-regex "^ member")))
+ ;; set value
+ (when (eq (plist-get dape--capabilities :supportsSetVariable)
+ t)
+ (dape-test--should
+ (dape-test--line-at-regex "^ a *0"))
+ (cl-letf (((symbol-function 'read-string)
+ (lambda (&rest _) "99")))
+ (dape-test--apply-to-match "^ a" 'dape-info-variable-edit))
+ (dape-test--should
+ (dape-test--line-at-regex "^ a *99")))
+ ;; add watch
+ (dape-test--apply-to-match "^ a" 'dape-info-scope-watch-dwim)
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-watch-mode))
+ (dape-test--should
+ (dape-test--line-at-regex "^ a")))))
+
+(ert-deftest dape-test-scope-buffer ()
+ "Assert basic scope buffer content."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("class B:"
+ " member = 0"
+ "a = 0"
+ "b = B()"
+ "pass # breakpoint")))
+ (dape--test-scope-buffer main-buffer
+ 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory))
+ (dape-test--with-files
+ ((index-buffer
+ "index.js"
+ ("var a = 0;"
+ "var b = {'member': 0};"
+ "()=>{}; // breakpoint")))
+ (dape--test-scope-buffer index-buffer
+ 'js-debug-node
+ :program (buffer-file-name index-buffer)
+ :cwd default-directory))
+ (dape-test--with-files
+ ((main
+ "main.c"
+ ("int main() {"
+ " int a = 0;"
+ " struct { int member; } b = {0};"
+ " return 0; // breakpoint"
+ "}")))
+ (ignore main)
+ (dape--test-scope-buffer main
+ 'codelldb-cc
+ :program
+ (file-name-concat default-directory "./a.out")
+ :cwd default-directory
+ 'compile "gcc -g -o a.out main.c")))
+
+(ert-deftest dape-test-watch-buffer()
+ "Watch buffer content and commands."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("class B:"
+ " member = 0"
+ "a = 0"
+ "b = B()"
+ "pass # breakpoint")))
+ ;; setup watched vars
+ (dape-watch-dwim "a")
+ (dape-watch-dwim "b")
+ ;; set breakpoint
+ (with-current-buffer main-buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ ;; start debugging
+ (dape-test--debug 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory)
+ ;; at breakpoint and stopped
+ (with-current-buffer main-buffer
+ (dape-test--should
+ (equal (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))
+ (dape-test--should
+ (equal dape--state 'stopped))
+ ;; contents of watch buffer
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-watch-mode))
+ (dape-test--should
+ (and (dape-test--line-at-regex "^ a")
+ (dape-test--line-at-regex "^\\+ b")))
+ ;; expansion
+ (dape-test--apply-to-match "^\\+ b" 'dape-info-scope-toggle)
+ (dape-test--should
+ (dape-test--line-at-regex "^ member"))
+ ;; assert contraction
+ (dape-test--apply-to-match "^\\- b" 'dape-info-scope-toggle)
+ (dape-test--should
+ (not (dape-test--line-at-regex "^ member")))
+ ;; set value
+ (dape-test--should
+ (dape-test--line-at-regex "^ a *0"))
+ (cl-letf (((symbol-function 'read-string)
+ (lambda (&rest _) "99")))
+ (dape-test--apply-to-match "^ a" 'dape-info-variable-edit))
+ (dape-test--should
+ (dape-test--line-at-regex "^ a *99"))
+ ;; watch removal
+ (dape-test--apply-to-match "^ a" 'dape-info-scope-watch-dwim)
+ (dape-test--should
+ (not (dape-test--line-at-regex "^ a"))))))
+
+(ert-deftest dape-test-stack-buffer()
+ "Stack buffer contents and commands."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("def a():"
+ " a_var = 0"
+ " b() # stack"
+ "def b():"
+ " b_var = 0"
+ " pass # breakpoint"
+ "a()")))
+ ;; set breakpoint
+ (with-current-buffer main-buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ ;; start debugging
+ (dape-test--debug 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory)
+ ;; at breakpoint and stopped
+ (with-current-buffer main-buffer
+ (dape-test--should
+ (= (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-stack-mode))
+ ;; buffer contents
+ (dape-test--should
+ (and (dape-test--line-at-regex "^1 in b")
+ (dape-test--line-at-regex "^2 in a")
+ (member 'dape--info-stack-position
+ overlay-arrow-variable-list)
+ (= (marker-position dape--info-stack-position) 1)))
+ ;; select stack frame
+ (dape-test--apply-to-match "^2 in a" 'dape-info-stack-select)
+ ;; buffer contents
+ (dape-test--should
+ (and (= (marker-position dape--info-stack-position)
+ (save-excursion
+ (dape-test--goto-line (dape-test--line-at-regex "^2 in a"))
+ (point))))))
+ ;; scope buffer should update to new stack
+ (with-current-buffer
+ (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-scope-mode 0))
+ (dape-test--should
+ (dape-test--line-at-regex "^ a_var")))
+ ;; source buffer points at new stack frame
+ (with-current-buffer main-buffer
+ (= (line-number-at-pos)
+ (dape-test--line-at-regex "stack")))))
+
+(ert-deftest dape-test-threads-buffer ()
+ "Threads buffer contents and commands."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("import threading"
+ "def thread_fn():"
+ " thread_var = 0"
+ " pass # breakpoint"
+ "thread = threading.Thread(target=thread_fn)"
+ "thread.start()"
+ "thread.join()")))
+ ;; set breakpoint
+ (with-current-buffer main-buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ ;; start debugging
+ (dape-test--debug 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory)
+ ;; at breakpoint and stopped
+ (with-current-buffer main-buffer
+ (dape-test--should
+ (= (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))))
+ (dape--info-buffer 'dape-info-threads-mode)
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-threads-mode))
+ ;; buffer contents
+ (dape-test--should
+ (and (dape-test--line-at-regex "^1 .* stopped in")
+ (dape-test--line-at-regex "^2 .* stopped in thread_fn")
+ (member 'dape--info-thread-position
+ overlay-arrow-variable-list)
+ (= (marker-position dape--info-thread-position)
+ (save-excursion
+ (dape-test--goto-line (dape-test--line-at-regex
+ "^2 .* stopped in thread_fn"))
+ (point))))))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-scope-mode 0))
+ ;; scope buffer in thread_fn
+ (dape-test--should
+ (dape-test--line-at-regex "^ thread_var")))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-threads-mode))
+ ;; select thread
+ (dape-test--apply-to-match "^1 .* stopped in" 'dape-info-select-thread))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-threads-mode))
+ ;; thread selected
+ (dape-test--should
+ (and (dape-test--line-at-regex "^1 .* stopped in")
+ (dape-test--line-at-regex "^2 .* stopped in thread_fn")
+ (member 'dape--info-thread-position
+ overlay-arrow-variable-list)
+ (= (marker-position dape--info-thread-position)
+ (save-excursion
+ (dape-test--goto-line (dape-test--line-at-regex
+ "^1 .* stopped in"))
+ (point))))))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-scope-mode 0))
+ ;; scope buffer in thread_fn
+ (dape-test--should
+ (not (dape-test--line-at-regex "^ thread_var"))))))
+
+(ert-deftest dape-test-repl-buffer ()
+ "Repl buffer contents and commands."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("a = 0 # breakpoint"
+ "b = 0 # second line"
+ "c = 0 # third line")))
+ ;; set breakpoint
+ (with-current-buffer main-buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ ;; start debugging
+ (dape-test--debug 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory)
+ ;; at breakpoint and stopped
+ (dape-test--should
+ (eq dape--state 'stopped))
+ (with-current-buffer main-buffer
+ (dape-test--should
+ (and (= (line-number-at-pos)
+ (dape-test--line-at-regex "breakpoint"))
+ (eq dape--state 'stopped))))
+ (pop-to-buffer "*dape-repl*")
+ (insert "next")
+ (comint-send-input)
+ (with-current-buffer main-buffer
+ (dape-test--should
+ (and (= (line-number-at-pos)
+ (dape-test--line-at-regex "second line"))
+ (eq dape--state 'stopped))))
+ (insert "next")
+ (comint-send-input)
+ (with-current-buffer main-buffer
+ (dape-test--should
+ (and (= (line-number-at-pos)
+ (dape-test--line-at-regex "third line"))
+ (eq dape--state 'stopped))))
+ (insert "a = 99")
+ (comint-send-input)
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-scope-mode 0))
+ (dape-test--should
+ (dape-test--line-at-regex "^ a *99")))))
+
+(ert-deftest dape-test-modules-buffer ()
+ "Modules buffer contents and commands."
+ (dape-test--with-files
+ ((main-buffer
+ "main.py"
+ ("pass # breakpoint")))
+ ;; set breakpoint
+ (with-current-buffer main-buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ ;; start debugging
+ (dape-test--debug 'debugpy
+ :program (buffer-file-name main-buffer)
+ :cwd default-directory)
+ ;; at breakpoint and stopped
+ (dape-test--should
+ (eq dape--state 'stopped))
+ (dape--info-buffer 'dape-info-modules-mode)
+ ;; contents
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-modules-mode))
+ (dape-test--should
+ (dape-test--line-at-regex "^__main__ of main.py")))))
+
+(ert-deftest dape-test-sources-buffer ()
+ "Sources buffer contents and commands."
+ (dape-test--with-files
+ ((index-buffer
+ "index.js"
+ ("()=>{};"
+ "()=>{}; // breakpoint")))
+ ;; set breakpoint
+ (with-current-buffer index-buffer
+ (let ((line (dape-test--line-at-regex "breakpoint")))
+ (save-excursion
+ (dape-test--goto-line line)
+ (dape-breakpoint-toggle))))
+ ;; start debugging
+ (dape-test--debug 'js-debug-node
+ :program (buffer-file-name index-buffer)
+ :cwd default-directory)
+ ;; stopped
+ (dape-test--should
+ (eq dape--state 'stopped))
+ (dape--info-buffer 'dape-info-sources-mode)
+ ;; contents
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-sources-mode))
+ (dape-test--should
+ (and (dape-test--line-at-regex "^os ")
+ (dape-test--line-at-regex "index.js"))))
+ (with-current-buffer (dape-test--should
+ (dape--info-get-live-buffer 'dape-info-sources-mode))
+ (dape-test--apply-to-match "^os " 'dape-info-sources-goto))
+ (dape-test--should
+ (member "*dape-source os*" (mapcar 'buffer-name (buffer-list))))))
diff --git a/dape.el b/dape.el
index 0b132e2068..c8b2d7184b 100644
--- a/dape.el
+++ b/dape.el
@@ -1014,7 +1014,10 @@ If NOWARN does not error on no active process."
(json (json-serialize object :false-object nil))
(string (format "Content-Length: %d\r\n\r\n%s" (length json) json)))
(dape--debug 'io "Sending:\n%S" object)
- (process-send-string process string)))
+ (condition-case err
+ (process-send-string process string)
+ (error (dape--debug 'error "%s"
+ (error-message-string err))))))
(defun dape-request (process command arguments &optional cb skip-timeout)
"Send request COMMAND to PROCESS with ARGUMENTS.
- [elpa] externals/dape updated (53560932c3 -> 00b226369c), ELPA Syncer, 2023/12/28
- [elpa] externals/dape 7b54a23ec0 1/8: Fix set variable on js-debug, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 7b1168ddb1 3/8: Add support for modules and loaded sources, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 571df6faeb 6/8: Add new modes to dape display buffer, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 00b226369c 8/8: Fix spelling of arrangement #41, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 790d360712 2/8: Update info buffers on repl evaluation, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 279444ac94 5/8: Refactor dape info buffer fetch and update, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 4597ee6300 4/8: Add dape-commands custom, ELPA Syncer, 2023/12/28
- [elpa] externals/dape 4de787ca66 7/8: Initial erc tests (#35),
ELPA Syncer <=