[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/rust-mode b83aabf 054/486: Add ERT tests
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/rust-mode b83aabf 054/486: Add ERT tests |
Date: |
Sat, 7 Aug 2021 09:24:47 -0400 (EDT) |
branch: elpa/rust-mode
commit b83aabf510e0754a9b0e192b5426c775ae13e255
Author: Micah Chalmer <micah@micahchalmer.net>
Commit: Micah Chalmer <micah@micahchalmer.net>
Add ERT tests
---
README.md | 6 +
run_rust_emacs_tests.sh | 3 +
rust-mode-tests.el | 380 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 389 insertions(+)
diff --git a/README.md b/README.md
index 508ac7f..63fbe1f 100644
--- a/README.md
+++ b/README.md
@@ -68,6 +68,12 @@ marking, press x, and ELPA will install the packages for you
(under
* or using <kbd>M-x package-install rust-mode
+### Tests via ERT
+
+The file `rust-mode-tests.el` contains tests that can be run via ERT. You can
+use `run_rust_emacs_tests.sh` to run them in batch mode, if emacs is somewhere
+in your `$PATH`.
+
### Known bugs
* Combining `global-whitespace-mode` and `rust-mode` is generally glitchy.
diff --git a/run_rust_emacs_tests.sh b/run_rust_emacs_tests.sh
new file mode 100755
index 0000000..afb98fd
--- /dev/null
+++ b/run_rust_emacs_tests.sh
@@ -0,0 +1,3 @@
+# This runs the test for emacs rust-mode.
+# It must be possible to find emacs via PATH.
+emacs -batch -l rust-mode.el -l rust-mode-tests.el -f
ert-run-tests-batch-and-exit
diff --git a/rust-mode-tests.el b/rust-mode-tests.el
new file mode 100644
index 0000000..a7cb261
--- /dev/null
+++ b/rust-mode-tests.el
@@ -0,0 +1,380 @@
+;;; rust-mode-tests.el --- ERT tests for rust-mode.el
+
+(require 'rust-mode)
+(require 'ert)
+(require 'cl)
+
+(setq rust-test-fill-column 32)
+
+(defun rust-compare-code-after-manip (original point-pos manip-func expected
got)
+ (equal expected got))
+
+(defun rust-test-explain-bad-manip (original point-pos manip-func expected got)
+ (if (equal expected got)
+ nil
+ (list
+ ;; The (goto-char) and (insert) business here is just for
+ ;; convenience--after an error, you can copy-paste that into emacs eval to
+ ;; insert the bare strings into a buffer
+ "Rust code was manipulated wrong after:"
+ `(insert ,original)
+ `(goto-char ,point-pos)
+ 'expected `(insert ,expected)
+ 'got `(insert ,got)
+ (loop for i from 0 to (max (length original) (length expected))
+ for oi = (if (< i (length got)) (elt got i))
+ for ei = (if (< i (length expected)) (elt expected i))
+ while (equal oi ei)
+ finally return `(first-difference-at
+ (goto-char ,(+ 1 i))
+ expected ,(char-to-string ei)
+ got ,(char-to-string oi))))))
+(put 'rust-compare-code-after-manip 'ert-explainer
+ 'rust-test-explain-bad-manip)
+
+(defun rust-test-manip-code (original point-pos manip-func expected)
+ (with-temp-buffer
+ (rust-mode)
+ (insert original)
+ (goto-char point-pos)
+ (funcall manip-func)
+ (should (rust-compare-code-after-manip
+ original point-pos manip-func expected (buffer-string)))))
+
+(defun test-fill-paragraph (unfilled expected &optional start-pos end-pos)
+ "We're going to run through many scenarios here--the point should be able to
be anywhere from the start-pos (defaults to 1) through end-pos (defaults to the
length of what was passed in) and (fill-paragraph) should return the same
result.
+
+Also, the result should be the same regardless of whether the code is at the
beginning or end of the file. (If you're not careful, that can make a
difference.) So we test each position given above with the passed code at the
beginning, the end, neither and both. So we do this a total of (end-pos -
start-pos)*4 times. Oy."
+ (let* ((start-pos (or start-pos 1))
+ (end-pos (or end-pos (length unfilled)))
+ (padding "\n \n")
+ (padding-len (length padding)))
+ (loop
+ for pad-at-beginning from 0 to 1
+ for pad-at-end from 0 to 1
+ with padding-beginning = (if (= 0 pad-at-beginning) "" padding)
+ with padding-end = (if (= 0 pad-at-end) "" padding)
+ with padding-adjust = (* padding-len pad-at-beginning)
+ with padding-beginning = (if (= 0 pad-at-beginning) "" padding)
+ with padding-end = (if (= 0 pad-at-end) "" padding)
+ for pos from (if (= 1 start-pos) 1 (+ padding-adjust start-pos)) to (+
end-pos padding-adjust)
+ do (rust-test-manip-code
+ (concat padding-beginning unfilled padding-end)
+ pos
+ (lambda ()
+ (let ((fill-column rust-test-fill-column))
+ (fill-paragraph)))
+ (concat padding-beginning expected padding-end)))))
+
+(ert-deftest fill-paragraph-top-level-multi-line-style-doc-comment-second-line
()
+ (test-fill-paragraph
+ "/**
+ * This is a very very very very very very very long string
+ */"
+ "/**
+ * This is a very very very very
+ * very very very long string
+ */"))
+
+
+(ert-deftest fill-paragraph-top-level-multi-line-style-doc-comment-first-line
()
+ (test-fill-paragraph
+ "/** This is a very very very very very very very long string
+ */"
+ "/** This is a very very very
+ * very very very very long
+ * string
+ */"))
+
+(ert-deftest fill-paragraph-multi-paragraph-multi-line-style-doc-comment ()
+ (let
+ ((multi-paragraph-unfilled
+ "/**
+ * This is the first really really really really really really really long
paragraph
+ *
+ * This is the second really really really really really really long paragraph
+ */"))
+ (test-fill-paragraph
+ multi-paragraph-unfilled
+ "/**
+ * This is the first really
+ * really really really really
+ * really really long paragraph
+ *
+ * This is the second really really really really really really long paragraph
+ */"
+ 1 89)
+ (test-fill-paragraph
+ multi-paragraph-unfilled
+ "/**
+ * This is the first really really really really really really really long
paragraph
+ *
+ * This is the second really
+ * really really really really
+ * really long paragraph
+ */"
+ 90)))
+
+(ert-deftest fill-paragraph-multi-paragraph-single-line-style-doc-comment ()
+ (let
+ ((multi-paragraph-unfilled
+ "/// This is the first really really really really really really
really long paragraph
+///
+/// This is the second really really really really really really long
paragraph"))
+ (test-fill-paragraph
+ multi-paragraph-unfilled
+ "/// This is the first really
+/// really really really really
+/// really really long paragraph
+///
+/// This is the second really really really really really really long
paragraph"
+ 1 86)
+ (test-fill-paragraph
+ multi-paragraph-unfilled
+ "/// This is the first really really really really really really really
long paragraph
+///
+/// This is the second really
+/// really really really really
+/// really long paragraph"
+ 87)))
+
+(ert-deftest fill-paragraph-multi-paragraph-single-line-style-indented ()
+ (test-fill-paragraph
+ " // This is the first really really really really really really really
long paragraph
+ //
+ // This is the second really really really really really really long
paragraph"
+ " // This is the first really
+ // really really really
+ // really really really
+ // long paragraph
+ //
+ // This is the second really really really really really really long
paragraph" 1 89))
+
+(ert-deftest fill-paragraph-multi-line-style-inner-doc-comment ()
+ (test-fill-paragraph
+ "/*! This is a very very very very very very very long string
+ */"
+ "/*! This is a very very very
+ * very very very very long
+ * string
+ */"))
+
+(ert-deftest fill-paragraph-single-line-style-inner-doc-comment ()
+ (test-fill-paragraph
+ "//! This is a very very very very very very very long string"
+ "//! This is a very very very
+//! very very very very long
+//! string"))
+
+(ert-deftest fill-paragraph-prefixless-multi-line-doc-comment ()
+ (test-fill-paragraph
+ "/**
+This is my summary. Blah blah blah blah blah. Dilly dally dilly dally dilly
dally doo.
+
+This is some more text. Fee fie fo fum. Humpty dumpty sat on a wall.
+*/"
+ "/**
+This is my summary. Blah blah
+blah blah blah. Dilly dally
+dilly dally dilly dally doo.
+
+This is some more text. Fee fie fo fum. Humpty dumpty sat on a wall.
+*/" 4 90))
+
+(ert-deftest fill-paragraph-with-no-space-after-star-prefix ()
+ (test-fill-paragraph
+ "/**
+ *This is a very very very very very very very long string
+ */"
+ "/**
+ *This is a very very very very
+ *very very very long string
+ */"))
+
+(defun test-auto-fill (initial position inserted expected)
+ (rust-test-manip-code
+ initial
+ position
+ (lambda ()
+ (unwind-protect
+ (progn
+ (let ((fill-column rust-test-fill-column))
+ (auto-fill-mode)
+ (goto-char position)
+ (insert inserted)
+ (syntax-ppss-flush-cache 1)
+ (funcall auto-fill-function)))
+ (auto-fill-mode t)))
+ expected))
+
+(ert-deftest auto-fill-multi-line-doc-comment ()
+ (test-auto-fill
+ "/**
+ *
+ */"
+ 8
+ "This is a very very very very very very very long string"
+ "/**
+ * This is a very very very very
+ * very very very long string
+ */"))
+
+(ert-deftest auto-fill-single-line-doc-comment ()
+ (test-auto-fill
+ "/// This is the first really
+/// really really really really
+/// really really long paragraph
+///
+/// "
+ 103
+ "This is the second really really really really really really long
paragraph"
+ "/// This is the first really
+/// really really really really
+/// really really long paragraph
+///
+/// This is the second really
+/// really really really really
+/// really long paragraph"
+ ))
+
+(ert-deftest auto-fill-multi-line-prefixless ()
+ (test-auto-fill
+ "/*
+
+ */"
+ 4
+ "This is a very very very very very very very long string"
+ "/*
+This is a very very very very
+very very very long string
+ */"
+ ))
+
+(defun test-indent (indented)
+ (let ((deindented (replace-regexp-in-string "^[[:blank:]]*" " "
indented)))
+ (rust-test-manip-code
+ deindented
+ 1
+ (lambda () (indent-region 1 (buffer-size)))
+ indented)))
+
+
+(ert-deftest indent-struct-fields-aligned ()
+ (test-indent
+"
+struct Foo { bar: int,
+ baz: int }
+
+struct Blah {x:int,
+ y:int,
+ z:~str}"))
+
+(ert-deftest indent-doc-comments ()
+ (test-indent
+"
+/**
+ * This is a doc comment
+ *
+ */
+
+/// So is this
+
+fn foo() {
+ /*!
+ * this is a nested doc comment
+ */
+
+ //! And so is this
+}"))
+
+(ert-deftest indent-inside-braces ()
+ (test-indent
+ "
+// struct fields out one level:
+struct foo {
+ a:int,
+ // comments too
+ b:char
+}
+
+fn bar(x:~int) { // comment here should not affect the next indent
+ bla();
+ bla();
+}"))
+
+(ert-deftest indent-top-level ()
+ (test-indent
+ "
+// Everything here is at the top level and should not be indented
+#[attrib]
+mod foo;
+
+pub static bar = Quux{a: b()}
+
+use foo::bar::baz;
+
+fn foo() { }
+"))
+
+(ert-deftest indent-params-no-align ()
+ (test-indent
+ "
+// Indent out one level because no params appear on the first line
+fn xyzzy(
+ a:int,
+ b:char) { }
+
+fn abcdef(
+ a:int,
+ b:char)
+ -> char
+{ }"))
+
+(ert-deftest indent-params-align ()
+ (test-indent
+ "
+// Align the second line of params to the first
+fn foo(a:int,
+ b:char) { }
+
+fn bar( a:int,
+ b:char)
+ -> int
+{ }
+
+fn baz( a:int, // shoudl work with a comment here
+ b:char)
+ -> int
+{ }
+"))
+
+(ert-deftest indent-square-bracket-alignment ()
+ (test-indent
+ "
+fn args_on_the_next_line( // with a comment
+ a:int,
+ b:~str) {
+ let aaaaaa = [
+ 1,
+ 2,
+ 3];
+ let bbbbbbb = [1, 2, 3,
+ 4, 5, 6];
+ let ccc = [ 10, 9, 8,
+ 7, 6, 5];
+}
+"))
+
+(ert-deftest indent-nested-fns ()
+ (test-indent
+ "
+fn nexted_fns(a: fn(b:int,
+ c:char)
+ -> int,
+ d: int)
+ -> uint
+{
+ 0
+}
+"
+))
- [nongnu] elpa/rust-mode 3517321 230/486: Merge pull request #129 from MicahChalmer/fix-issue-127, (continued)
- [nongnu] elpa/rust-mode 3517321 230/486: Merge pull request #129 from MicahChalmer/fix-issue-127, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 8400638 241/486: update README.md and Package-Requires to require emacs 24, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode c3feac1 243/486: Fill regular block comments correctly too, in addition to rustdoc comments, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 1587839 268/486: Merge pull request #169 from mrBliss/fix-168, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 664c7b0 277/486: improve position recovery in rust-format-buffer, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 46e7fc0 285/486: fix PR link in README, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 35298ed 288/486: Don't use "&optional &rest", ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 3301c70 047/486: Align field names in struct expressions with fields on same line as the opening curly brace, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode fe55b71 046/486: Multiline comments with leading *s line up the *s, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode af2aba9 049/486: Indent correctly after opening square bracket, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode b83aabf 054/486: Add ERT tests,
ELPA Syncer <=
- [nongnu] elpa/rust-mode 38dab12 063/486: Fix rust-align-to-expr-after-brace, closes #11239., ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 7625c5c 058/486: Add 'continue' keyword to emacs, vim, gedit, kate, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode d82b5a7 062/486: Add "proc" as keyword to emacs mode, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 891716a 059/486: Fix single-line-style paragraph fills with code immediately before or after, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 6b323f3 064/486: Add crate to emacs and kate modefiles, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 4f40156 071/486: Emacs: Remove README warning of old whitespace bug, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode ef048b3 082/486: emacs: highlight `#[foo = "bar"]` attributes, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode d4264a9 065/486: extern mod => extern crate, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode f3c784f 083/486: Update repo location, ELPA Syncer, 2021/08/07
- [nongnu] elpa/rust-mode 0617f1c 078/486: Recommend autoload instead of require, ELPA Syncer, 2021/08/07