aboutsummaryrefslogtreecommitdiff
path: root/ci/compile-tests/005-change-recompile/runtest.el
diff options
context:
space:
mode:
authorHendrik Tews2020-12-15 21:54:53 +0100
committerhendriktews2020-12-19 16:43:49 +0100
commit12be85a9032ebed02d9b65da7848ab173081f41a (patch)
treefa10cd50dccf09de5dad10aea64c40b1e58bc8c4 /ci/compile-tests/005-change-recompile/runtest.el
parent8bca3fbcf3e2aa51e1035ec0349dc52b652bb9ad (diff)
include compile tests in CI elisp compilation
Diffstat (limited to 'ci/compile-tests/005-change-recompile/runtest.el')
-rw-r--r--ci/compile-tests/005-change-recompile/runtest.el221
1 files changed, 221 insertions, 0 deletions
diff --git a/ci/compile-tests/005-change-recompile/runtest.el b/ci/compile-tests/005-change-recompile/runtest.el
new file mode 100644
index 00000000..c5d7f9b3
--- /dev/null
+++ b/ci/compile-tests/005-change-recompile/runtest.el
@@ -0,0 +1,221 @@
+;; This file is part of Proof General.
+;;
+;; © Copyright 2020 Hendrik Tews
+;;
+;; Authors: Hendrik Tews
+;; Maintainer: Hendrik Tews <hendrik@askra.de>
+;;
+;; License: GPL (GNU GENERAL PUBLIC LICENSE)
+
+;;; Commentary:
+;;
+;; Coq Compile Tests (cct) --
+;; ert tests for parallel background compilation for Coq
+;;
+;; Test that the right files are recompiled when changes are made in
+;; the dependency hierarchy and that unaffected ancestors are not
+;; touched.
+;;
+;; The following graph shows the file dependencies in this test:
+;;
+;; a
+;; / \
+;; b c
+;; / / \
+;; d e f
+;; / \ | /
+;; | \ | /
+;; | \|/
+;; g h
+;;
+;;
+;;
+;;
+;;
+;;
+;;
+
+;; require cct-lib for the elisp compilation, otherwise this is present already
+(require 'cct-lib)
+
+;;; set configuration
+(cct-configure-proof-general)
+
+;;; Data and utility functions
+
+(defconst b-ancestors '("./b.v" "./d.v" "./g.v" "./h.v")
+ "Ancestors of b.v.")
+
+(defconst c-ancestors '("./c.v" "./e.v" "./f.v")
+ "Ancestors of c.v.")
+
+(defconst all-ancestors (append b-ancestors c-ancestors)
+ "All ancestors.")
+
+(defconst all-compiled-ancestors
+ (mapcar 'cct-library-vo-of-v-file all-ancestors)
+ "All vo ancestors files.")
+
+
+(defun cct-replace-last-word (line word)
+ "Replace last word in line LINE with WORD.
+In current buffer, go to the end of line LINE and one word
+backward. Replace the word there with WORD."
+ (cct-goto-line line)
+ (end-of-line)
+ (backward-word)
+ (kill-word 1)
+ (insert word))
+
+(defun cct-check-main-buffer (vo-times new-sum recompiled-files
+ other-locked-files)
+ "Perform various checks for recompilation in buffer a.v.
+Combine all the following tests in this order:
+- line 21 in a.v is unlocked
+- after replacing the sum on line 28 with NEW-SUM, a.v can be
+ processed until line 38
+- files in VO-TIMES not listed in RECOMPILED-FILES have the same
+ last change time as in VO-TIMES
+- files in RECOMPILED-FILES have a newer change time
+- the spans in line 22 and 23 hold the ancestors of b and c, respectively.
+- all the buffers in OTHER-LOCKED-FILES are locked until line 18."
+ (let (splitted)
+ (set-buffer "a.v")
+ (cct-check-locked 21 'unlocked)
+ (cct-replace-last-word 28 new-sum)
+ (cct-process-to-line 38)
+ (cct-check-locked 37 'locked)
+ (setq splitted (cct-split-change-times vo-times recompiled-files))
+ (cct-unmodified-change-times (car splitted))
+ (cct-older-change-times (cdr splitted))
+ (cct-locked-ancestors 22 b-ancestors)
+ (cct-locked-ancestors 23 c-ancestors)
+ (mapc
+ (lambda (b)
+ (set-buffer b)
+ (cct-check-locked 18 'locked))
+ other-locked-files)))
+
+
+;;; The test itself
+
+(ert-deftest cct-change-recompile ()
+ "Test successful recompilation after changes and deletion."
+ (find-file "a.v")
+
+ ;; 1. process original content - compile everything
+ (message "\n1. process original content - compile everything\n")
+ (cct-process-to-line 38)
+ (cct-check-locked 37 'locked)
+ (cct-locked-ancestors 22 b-ancestors)
+ (cct-locked-ancestors 23 c-ancestors)
+
+ (let ((vo-times (cct-record-change-times all-compiled-ancestors))
+ other-locked-files)
+
+ ;; 2. retract and process again - nothing should be compiled
+ (message "\n2. retract and process again - nothing should be compiled\n")
+ (cct-process-to-line 21)
+ (cct-check-main-buffer vo-times "35" nil nil)
+
+ ;; 3. change c and process again - only c should be compiled
+ (message "\n3. change c and process again - only c should be compiled\n")
+ (find-file "c.v")
+ (push "c.v" other-locked-files)
+ (cct-check-locked 23 'locked)
+ (cct-replace-last-word 23 "4")
+ (cct-check-main-buffer vo-times "36" '("./c.vo") other-locked-files)
+
+ ;; 4. change h and process again - everything except g should get compiled
+ (message (concat "\n4. change h and process again - "
+ "everything except g should get compiled\n"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (find-file "h.v")
+ (push "h.v" other-locked-files)
+ (cct-check-locked 21 'locked)
+ (cct-replace-last-word 21 "10")
+ (cct-check-main-buffer
+ vo-times "38" '("./b.vo" "./c.vo" "./d.vo" "./e.vo" "./f.vo" "./h.vo")
+ other-locked-files)
+
+ ;; 5. change d and f and process again -
+ ;; only b, c, d and f should get recompiled
+ (message (concat "\n5. change d and f and process again - "
+ "only b, c, d and f should get recompiled"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (find-file "d.v")
+ (push "d.v" other-locked-files)
+ (cct-check-locked 23 'locked)
+ (cct-replace-last-word 23 "7")
+ (find-file "f.v")
+ (push "f.v" other-locked-files)
+ (cct-check-locked 23 'unlocked)
+ (cct-replace-last-word 23 "10")
+
+ (cct-check-main-buffer
+ vo-times "45" '("./b.vo" "./c.vo" "./d.vo" "./f.vo") other-locked-files)
+
+ ;; 6. change d and b and process again - only d and b should get compiled
+ (message (concat "\n6. change d and b and process again - "
+ "only d and b should get compiled\n"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (find-file "b.v")
+ (push "b.v" other-locked-files)
+ (cct-check-locked 23 'locked)
+ (cct-replace-last-word 23 "7")
+ (set-buffer "d.v")
+ (cct-check-locked 23 'unlocked)
+ (cct-replace-last-word 23 "13") ; increase by 6
+
+ (cct-check-main-buffer vo-times "56" '("./b.vo" "./d.vo")
+ other-locked-files)
+
+ ;; 7. delete b and process again - only b should get compiled
+ (message (concat "\n7. delete b and process again - "
+ "only b should get compiled\n"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (delete-file "b.vo")
+ (set-buffer "a.v")
+ (cct-process-to-line 21)
+ (cct-check-main-buffer vo-times "56" '("./b.vo") other-locked-files)
+
+ ;; 8. delete h and process again - everything except g should get compiled
+ (message (concat "\n8. delete h and process again - "
+ "everything except g should get compiled\n"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (delete-file "h.vo")
+ (set-buffer "a.v")
+ (cct-process-to-line 21)
+ (cct-check-main-buffer
+ vo-times "56" '("./b.vo" "./c.vo" "./d.vo" "./e.vo" "./f.vo" "./h.vo")
+ other-locked-files)
+
+ ;; 9. change d, delete g and process again - only b, d and g should
+ ;; get compiled
+ (message (concat "\n9. change d, delete g and process again - "
+ "only b, d and g should get compiled\n"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (set-buffer "d.v")
+ (cct-check-locked 23 'locked)
+ (cct-replace-last-word 23 "20") ; increase by 7
+ (delete-file "g.vo")
+ (set-buffer "a.v")
+ (cct-process-to-line 21)
+ (cct-check-main-buffer vo-times "63" '("./b.vo" "./d.vo" "./g.vo")
+ other-locked-files)
+
+ ;; 10. delete d, change g and process again - only b, d and g should
+ ;; get compiled
+ (message (concat "\n10. delete d, change g and process again - "
+ "only b, d and g should get compiled\n"))
+ (setq vo-times (cct-record-change-times all-compiled-ancestors))
+ (delete-file "d.vo")
+ (find-file "g.v")
+ (push "g.v" other-locked-files)
+ (cct-check-locked 21 'locked)
+ (cct-replace-last-word 21 "15") ; increase by 8
+ (set-buffer "a.v")
+ (cct-process-to-line 21)
+ (cct-check-main-buffer vo-times "71" '("./b.vo" "./d.vo" "./g.vo")
+ other-locked-files)
+ ))