Add test cases.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Mon, 7 Aug 2017 17:11:13 +0000 (19:11 +0200)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Mon, 7 Aug 2017 17:11:13 +0000 (19:11 +0200)
Change -publish-draft to -publish, as it also publishes hidden pages.

Makefile [new file with mode: 0644]
pelican-mode-test.el [new file with mode: 0644]
pelican-mode.el

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..04f5e88
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,34 @@
+#!/usr/bin/make -f
+#
+# This is free and unencumbered software released into the public
+# domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a
+# compiled binary, for any purpose, commercial or non-commercial, and
+# by any means.
+
+EMACS ?= $(firstword $(shell command -v /Applications/Emacs.app/Contents/MacOS/Emacs emacs))
+SRC := pelican-mode.el
+OBJ := $(SRC:.el=.elc)
+DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+TESTS := $(SRC:.el=.test.stamp)
+
+.INTERMEDIATE: $(TESTS)
+
+all: $(OBJ) test
+
+clean:
+       rm -f $(OBJ) $(TESTS)
+
+test: $(TESTS)
+
+%.elc: %.el
+       $(EMACS) -Q -batch -L $(DIR) -f batch-byte-compile $<
+
+%.test.stamp: %-test.elc %.elc
+       $(EMACS) -Q -batch -L $(DIR) -eval "(checkdoc-file \"$*.el\")"
+       $(EMACS) -Q -batch -L $(DIR) -l $< -f ert-run-tests-batch-and-exit
+       touch $@
+
+.PHONY: all clean test
diff --git a/pelican-mode-test.el b/pelican-mode-test.el
new file mode 100644 (file)
index 0000000..e50f0bb
--- /dev/null
@@ -0,0 +1,107 @@
+;;; pelican-mode-test.el --- Tests pelican-mode  -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2017 Joe Wreschnig
+;;
+;; Author: Joe Wreschnig
+;;
+;; 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 2 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/>.
+
+\f
+
+;;; Commentary:
+;;
+;; This file contains test cases for pelican-mode.  Unless you're
+;; hacking on it you shouldn't need to edit or run this file.
+
+\f
+
+;;; Code:
+
+(require 'ert)
+(require 'pelican-mode)
+
+(defun pelican-mode-test-article (mode expected1 expected2)
+  "Create an article in MODE and perform some edits.
+
+After the first edits, the buffer should contain EXPECTED1; after
+the second, EXPECTED2."
+  (with-temp-buffer
+    (rename-buffer "pelican-test.rst")
+    (funcall mode)
+    (pelican-mode)
+
+    (should (not (pelican-mode-find-root)))
+    (should (not (pelican-mode-page-p)))
+    (should (equal "pelican-test" (pelican-mode-default-slug)))
+
+    (insert "Not really a Pelican article.")
+    (pelican-mode-insert-article-header "Testing" "a, b, c")
+    (pelican-mode-set-field :test "hello world")
+    (pelican-mode-set-field :date "1111-11-11 11:11:11")
+    (should (equal (buffer-string) expected1))
+
+    (pelican-mode-publish)
+    (pelican-mode-set-fields
+     :title "More Tests"
+     :date "2222-22-22 22:22:22")
+    (pelican-mode-remove-field "test")
+    (should (equal (buffer-string) expected2))))
+
+(ert-deftest pelican-mode-test-rst-mode ()
+  (pelican-mode-test-article
+   #'rst-mode
+   "\
+Testing
+#######
+
+:date: 1111-11-11 11:11:11
+:status: draft
+:slug: pelican-test
+:tags: a, b, c
+:test: hello world
+
+Not really a Pelican article."
+
+   "\
+More Tests
+##########
+
+:date: 2222-22-22 22:22:22
+:slug: pelican-test
+:tags: a, b, c
+
+Not really a Pelican article."))
+
+(ert-deftest pelican-mode-test-org-mode ()
+  (pelican-mode-test-article
+   #'org-mode
+   "\
+#+TITLE: Testing
+#+DATE: 1111-11-11 11:11:11
+#+PROPERTY: STATUS draft
+#+PROPERTY: SLUG pelican-test
+#+PROPERTY: TAGS a, b, c
+#+PROPERTY: TEST hello world
+
+Not really a Pelican article."
+
+   "\
+#+TITLE: More Tests
+#+DATE: 2222-22-22 22:22:22
+#+PROPERTY: SLUG pelican-test
+#+PROPERTY: TAGS a, b, c
+
+Not really a Pelican article."))
+
+;;; pelican-mode-test.el ends here
index 60089cd..5fa2179 100644 (file)
@@ -82,7 +82,7 @@ for editing articles or pages:
             (,(kbd "C-c P f") . pelican-set-field)
             (,(kbd "C-c P h") . pelican-make-html)
             (,(kbd "C-c P n") . pelican-mode-insert-header)
-            (,(kbd "C-c P p") . pelican-mode-publish-draft)
+            (,(kbd "C-c P p") . pelican-mode-publish)
             (,(kbd "C-c P u") . pelican-make-rsync-upload)))
 
 ;;;###autoload
@@ -215,19 +215,22 @@ than the modification date."
   (interactive "P")
   (pelican-mode-set-field (if original :date :modified) 'now))
 
-(defun pelican-mode-publish-draft ()
-  "Remove draft status from a Pelican article."
+(defun pelican-mode-publish ()
+  "Remove draft or hidden status from a Pelican article."
   (interactive)
   (pelican-mode-remove-field :status)
   (pelican-mode-update-date :date))
 
-(defun pelican-mode-insert-draft-article-header (title tags)
-  "Insert a Pelican header for a draft with a TITLE and TAGS."
+(defun pelican-mode-insert-article-header (title tags)
+  "Insert a Pelican header for an article with a TITLE and TAGS."
   (interactive "sArticle title: \nsTags: ")
-  (apply #'pelican-mode-set-fields
-         `(:title ,title
-           ,@pelican-mode-default-article-fields
-           :tags ,tags)))
+  (save-excursion
+    (goto-char 0)
+    (insert "\n")
+    (apply #'pelican-mode-set-fields
+           `(:title ,title
+             ,@pelican-mode-default-article-fields
+             :tags ,tags))))
 
 (defun pelican-mode-insert-page-header (title &optional hidden)
   "Insert a Pelican header for a page with a TITLE.
@@ -235,10 +238,13 @@ than the modification date."
 If HIDDEN is non-nil, the page is marked hidden; otherwise it
 has no status."
   (interactive "sPage title: \nP")
-  (apply #'pelican-mode-set-fields
-         (append
-          (list :title title :status (when hidden "hidden"))
-          pelican-mode-default-page-fields)))
+  (save-excursion
+    (goto-char 0)
+    (insert "\n")
+    (apply #'pelican-mode-set-fields
+           (append
+            (list :title title :status (when hidden "hidden"))
+            pelican-mode-default-page-fields))))
 
 (defun pelican-mode-insert-header ()
   "Insert a Pelican header for a page or article."
@@ -246,7 +252,7 @@ has no status."
   (call-interactively
    (if (pelican-mode-page-p)
        #'pelican-mode-insert-page-header
-     #'pelican-mode-insert-draft-article-header)))
+     #'pelican-mode-insert-article-header)))
 
 (defun pelican-make (target)
   "Execute TARGET in a Makefile at the root of the site."