364 lines
12 KiB
EmacsLisp
364 lines
12 KiB
EmacsLisp
;;; log-edit-tests.el --- Unit tests for log-edit.el -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 2019-2024 Free Software Foundation, Inc.
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
;; GNU Emacs 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.
|
|
|
|
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
;;; Commentary:
|
|
|
|
;; Unit tests for lisp/vc/log-edit.el.
|
|
|
|
;;; Code:
|
|
|
|
(require 'log-edit)
|
|
(require 'ert)
|
|
|
|
(ert-deftest log-edit-fill-entry ()
|
|
(with-temp-buffer
|
|
(insert "\
|
|
* dir/file.ext (fun1):
|
|
\(fun2):
|
|
\(fun3):
|
|
* file2.txt (fun4):
|
|
\(fun5):
|
|
\(fun6):
|
|
\(fun7): Some prose.
|
|
\(fun8): A longer description of a complicated change.\
|
|
Spread over a couple of sentences.\
|
|
Long enough to be filled for several lines.
|
|
\(fun9): Etc.")
|
|
(goto-char (point-min))
|
|
(let ((fill-column 72)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "\
|
|
* dir/file.ext (fun1, fun2, fun3):
|
|
* file2.txt (fun4, fun5, fun6, fun7): Some prose.
|
|
\(fun8): A longer description of a complicated change. Spread over a
|
|
couple of sentences. Long enough to be filled for several lines.
|
|
\(fun9): Etc."))
|
|
(let ((fill-column 20)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "\
|
|
* dir/file.ext (fun1)
|
|
\(fun2, fun3):
|
|
* file2.txt (fun4)
|
|
\(fun5, fun6, fun7):
|
|
Some prose.
|
|
\(fun8): A longer
|
|
description of a
|
|
complicated change.
|
|
Spread over a couple
|
|
of sentences. Long
|
|
enough to be filled
|
|
for several lines.
|
|
\(fun9): Etc."))
|
|
(let ((fill-column 40)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "\
|
|
* dir/file.ext (fun1, fun2, fun3):
|
|
* file2.txt (fun4, fun5, fun6, fun7):
|
|
Some prose.
|
|
\(fun8): A longer description of a
|
|
complicated change. Spread over a
|
|
couple of sentences. Long enough to be
|
|
filled for several lines.
|
|
\(fun9): Etc."))))
|
|
|
|
(ert-deftest log-edit-fill-entry-indented-func-entries ()
|
|
;; Indenting function entries is a typical mistake caused by using a
|
|
;; misconfigured or non-ChangeLog specific fill function.
|
|
(with-temp-buffer
|
|
(insert "\
|
|
* dir/file.ext (fun1):
|
|
(fun2):
|
|
(fun3):
|
|
* file2.txt (fun4):
|
|
(fun5):
|
|
(fun6):
|
|
(fun7): Some prose.
|
|
(fun8): A longer description of a complicated change.\
|
|
Spread over a couple of sentences.\
|
|
Long enough to be filled for several lines.
|
|
(fun9): Etc.")
|
|
(goto-char (point-min))
|
|
(let ((fill-column 72)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "\
|
|
* dir/file.ext (fun1, fun2, fun3):
|
|
* file2.txt (fun4, fun5, fun6, fun7): Some prose.
|
|
\(fun8): A longer description of a complicated change. Spread over a
|
|
couple of sentences. Long enough to be filled for several lines.
|
|
\(fun9): Etc."))))
|
|
|
|
(ert-deftest log-edit-fill-entry-trailing-prose ()
|
|
(with-temp-buffer
|
|
(insert "\
|
|
* dir/file.ext (fun1): A longer description of a complicated change.\
|
|
Spread over a couple of sentences.\
|
|
Long enough to be filled for several lines.")
|
|
(let ((fill-column 72)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "\
|
|
* dir/file.ext (fun1): A longer description of a complicated change.
|
|
Spread over a couple of sentences. Long enough to be filled for several
|
|
lines."))))
|
|
|
|
(ert-deftest log-edit-fill-entry-joining ()
|
|
;; Join short enough function names on the same line.
|
|
(with-temp-buffer
|
|
(insert "* dir/file.ext (fun1):\n(fun2):")
|
|
(let ((fill-column 72)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "* dir/file.ext (fun1, fun2):")))
|
|
;; Don't combine them if they're too long.
|
|
(with-temp-buffer
|
|
(insert "* dir/long-file-name.ext (a-really-long-function-name):
|
|
\(another-very-long-function-name):")
|
|
(let ((fill-column 72)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "* dir/long-file-name.ext (a-really-long-function-name)
|
|
\(another-very-long-function-name):")))
|
|
;; Put function name on next line, if the file name is too long.
|
|
(with-temp-buffer
|
|
(insert "\
|
|
* a-very-long-directory-name/another-long-directory-name/and-a-long-file-name.ext\
|
|
(a-really-long-function-name):")
|
|
(let ((fill-column 72)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) "\
|
|
* a-very-long-directory-name/another-long-directory-name/and-a-long-file-name.ext
|
|
\(a-really-long-function-name):"))))
|
|
|
|
(ert-deftest log-edit-fill-entry-confinement ()
|
|
(let (string string1 string2 string3 string4)
|
|
(setq string
|
|
;; This entry is precisely 65 columns in length;
|
|
;; log-edit-fill-column should leave it unmodified.
|
|
"* file2.txt (fun4, fun5, fun6, fun7, fun8, fun9, fun10, fun1134):"
|
|
string1
|
|
;; This entry is 66 columns in length, and must be filled.
|
|
"* file2.txt (fun4, fun5, fun6, fun7, fun8, fun9, fun10, fun11345):"
|
|
string2
|
|
;; The first line of this entry totals 65 columns in length,
|
|
;; and should be preserved intact.
|
|
"* file2.txt (fun4, fun5, fun6, fun7, fun8, fun9, fun10, fun11345)
|
|
(fun11356):"
|
|
string3
|
|
;; The first defun in this entry is a file name that brings
|
|
;; the total to 40 columns in length and should be preserved
|
|
;; intact.
|
|
"* file2.txt (abcdefghijklmnopqrstuvwxyz)
|
|
(ABC):"
|
|
string4
|
|
;; The first defun brings that total to 41, and should be
|
|
;; placed on the next line.
|
|
"* file2.txt (abcdefghijklmnopqrstuvwxyz):")
|
|
(with-temp-buffer
|
|
(insert string)
|
|
(let ((fill-column 64)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) string))
|
|
(erase-buffer)
|
|
(insert string1)
|
|
(let ((fill-column 64)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string)
|
|
"* file2.txt (fun4, fun5, fun6, fun7, fun8, fun9, fun10)
|
|
(fun11345):"))
|
|
(erase-buffer)
|
|
(insert string2)
|
|
(let ((fill-column 64)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) string2))
|
|
(erase-buffer)
|
|
(insert string3)
|
|
(let ((fill-column 39)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) string3))
|
|
(erase-buffer)
|
|
(insert string4)
|
|
(let ((fill-column 39)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string)
|
|
"* file2.txt\s
|
|
(abcdefghijklmnopqrstuvwxyz):")))))
|
|
|
|
(ert-deftest log-edit-fill-entry-space-substitution ()
|
|
;; This test verifies that filling the paragraph surrounding the
|
|
;; last line of defuns does not break between defun lists with
|
|
;; spaces in identifiers.
|
|
(let (string wanted)
|
|
(setq string "
|
|
* src/sfnt.c (xmalloc, xrealloc): Improve behavior upon allocation
|
|
failures during test.
|
|
(sfnt_table_names): Add prep.
|
|
(sfnt_transform_coordinates): Allow applying offsets during
|
|
coordinate transform.
|
|
(sfnt_decompose_compound_glyph): Defer offset computation until
|
|
any component compound glyph is loaded, then apply it during the
|
|
transform process.
|
|
(sfnt_multiply_divide): Make available everywhere. Implement on
|
|
64 bit systems.
|
|
(sfnt_multiply_divide_signed): New function.
|
|
(sfnt_mul_fixed): Fix division overflow.
|
|
(sfnt_curve_to_and_build_1, sfnt_build_glyph_outline): Remove
|
|
outdated comment.
|
|
(sfnt_build_outline_edges): Fix coding style.
|
|
(sfnt_lookup_glyph_metrics): Allow looking up metrics without
|
|
scaling.
|
|
(struct sfnt_cvt_table): Fix type of cvt values.
|
|
(struct sfnt_prep_table): New structure.
|
|
(sfnt_read_cvt_table): Read cvt values in terms of fwords, not
|
|
longs (as Apple's doc seems to say).
|
|
(sfnt_read_fpgm_table): Fix memory allocation for font program
|
|
table.
|
|
(sfnt_read_prep_table): New function.
|
|
(struct sfnt_interpreter_zone): New structure.
|
|
(struct sfnt_interpreter_graphics_state): New fields `project',
|
|
`move', `vector_dot_product'. Rename to `sfnt_graphics_state'.
|
|
(struct sfnt_interpreter, sfnt_mul_f26dot6): Stop doing rounding
|
|
division.
|
|
(sfnt_init_graphics_state, sfnt_make_interpreter, MOVE, SSW, RAW)
|
|
(SDS, ADD, SUB, ABS, NEG, WCVTF, _MIN, S45ROUND, SVTCAx)
|
|
(sfnt_set_srounding_state, sfnt_skip_code)
|
|
(sfnt_interpret_unimplemented, sfnt_interpret_fdef)
|
|
(sfnt_interpret_idef, sfnt_interpret_if, sfnt_interpret_else)
|
|
(sfnt_round_none, sfnt_round_to_grid, sfnt_round_to_double_grid)
|
|
"
|
|
wanted "
|
|
* src/sfnt.c\s
|
|
(xmalloc, xrealloc):
|
|
Improve behavior
|
|
upon allocation
|
|
failures during
|
|
test.
|
|
(sfnt_table_names):
|
|
Add prep.
|
|
(sfnt_transform_coordinates):
|
|
Allow applying
|
|
offsets during
|
|
coordinate
|
|
transform.
|
|
(sfnt_decompose_compound_glyph):
|
|
Defer offset
|
|
computation until
|
|
any component
|
|
compound glyph is
|
|
loaded, then apply
|
|
it during the
|
|
transform process.
|
|
(sfnt_multiply_divide):
|
|
Make available
|
|
everywhere.
|
|
Implement on 64 bit
|
|
systems.
|
|
(sfnt_multiply_divide_signed):
|
|
New function.
|
|
(sfnt_mul_fixed):
|
|
Fix division
|
|
overflow.
|
|
(sfnt_curve_to_and_build_1)
|
|
(sfnt_build_glyph_outline):
|
|
Remove outdated
|
|
comment.
|
|
(sfnt_build_outline_edges):
|
|
Fix coding style.
|
|
(sfnt_lookup_glyph_metrics):
|
|
Allow looking up
|
|
metrics without
|
|
scaling.
|
|
(struct sfnt_cvt_table):
|
|
Fix type of cvt
|
|
values.
|
|
(struct sfnt_prep_table):
|
|
New structure.
|
|
(sfnt_read_cvt_table):
|
|
Read cvt values in
|
|
terms of fwords, not
|
|
longs (as Apple's
|
|
doc seems to say).
|
|
(sfnt_read_fpgm_table):
|
|
Fix memory
|
|
allocation for font
|
|
program table.
|
|
(sfnt_read_prep_table):
|
|
New function.
|
|
(struct sfnt_interpreter_zone):
|
|
New structure.
|
|
(struct sfnt_interpreter_graphics_state):
|
|
New fields
|
|
`project', `move',
|
|
`vector_dot_product'.
|
|
Rename to
|
|
`sfnt_graphics_state'.
|
|
(struct sfnt_interpreter)
|
|
(sfnt_mul_f26dot6):
|
|
Stop doing rounding
|
|
division.
|
|
(sfnt_init_graphics_state)
|
|
(sfnt_make_interpreter)
|
|
(MOVE, SSW, RAW, SDS)
|
|
(ADD, SUB, ABS, NEG)
|
|
(WCVTF, _MIN)
|
|
(S45ROUND, SVTCAx)
|
|
(sfnt_set_srounding_state)
|
|
(sfnt_skip_code)
|
|
(sfnt_interpret_unimplemented)
|
|
(sfnt_interpret_fdef)
|
|
(sfnt_interpret_idef)
|
|
(sfnt_interpret_if)
|
|
(sfnt_interpret_else)
|
|
(sfnt_round_none)
|
|
(sfnt_round_to_grid)
|
|
(sfnt_round_to_double_grid):
|
|
")
|
|
(with-temp-buffer
|
|
(insert string)
|
|
(let ((fill-column 20)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) wanted)))))
|
|
|
|
(ert-deftest log-edit-fill-entry-initial-wrapping ()
|
|
;; This test verifies that a newline is inserted before a defun
|
|
;; itself longer than the fill column when such a defun is being
|
|
;; inserted after a file name, and not otherwise.
|
|
(let (string wanted)
|
|
(setq string "
|
|
* src/sfnt.c (long_entry_1): This entry should be placed on a
|
|
new line.
|
|
(but_this_entry_should_not): With the prose displaced to the
|
|
next line instead."
|
|
wanted "
|
|
* src/sfnt.c\s
|
|
(long_entry_1): This
|
|
entry should be
|
|
placed on a new
|
|
line.
|
|
(but_this_entry_should_not):
|
|
With the prose
|
|
displaced to the
|
|
next line instead.")
|
|
(with-temp-buffer
|
|
(insert string)
|
|
(let ((fill-column 20)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) wanted)))))
|
|
|
|
(ert-deftest log-edit-fill-entry-no-defun-list-wrapping ()
|
|
;; This test verifies that the opening defun list of an entry is never
|
|
;; broken, even in the event its length in total exceeds the fill
|
|
;; column.
|
|
(let (string wanted)
|
|
(setq string "
|
|
* src/androidfns.c (Fxw_display_color_p):
|
|
(Fx_display_grayscale_p): Report color and/or grayscale properly.
|
|
"
|
|
wanted "
|
|
* src/androidfns.c (Fxw_display_color_p, Fx_display_grayscale_p):
|
|
Report color and/or grayscale properly.
|
|
")
|
|
(with-temp-buffer
|
|
(insert string)
|
|
(let ((fill-column 64)) (log-edit-fill-entry))
|
|
(should (equal (buffer-string) wanted)))))
|
|
|
|
;;; log-edit-tests.el ends here
|