Moving all of my Emacs-related files into their own directory at the root of this repository.
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; do.el --- Small assertion library for Elisp -*- lexical-binding: t -*-
 | |
| ;; Author: William Carroll <wpcarro@gmail.com>
 | |
| 
 | |
| ;;; Commentary:
 | |
| ;; Assertion library inspired by Elixir's core testing library.
 | |
| ;;
 | |
| ;; The goal here is to create this module without relying on other non-core
 | |
| ;; Elisp libraries.  I will attempt to do this as long as I'm not sacrificing
 | |
| ;; the readability of this code nor the ease at which it can be written.
 | |
| ;;
 | |
| ;; A note on testing:
 | |
| ;; Another goal with this library is to blur the line between testing code and
 | |
| ;; runtime code.  Developers should ideally be using `do/assert' and `do/refute'
 | |
| ;; in their library code.  Because of this, I'm avoiding referring
 | |
| ;; to the notion of testing in the names of these functions.
 | |
| ;;
 | |
| ;; Hypothesis:
 | |
| ;; The lower the friction is for writing tests, the more likely people will
 | |
| ;; write tests.
 | |
| 
 | |
| ;; TODO: Support better error messages, which might include information about
 | |
| ;; line numbers in source code where the assertion failed.
 | |
| 
 | |
| ;; TODO: Consider offering the ability to have some of these functions compile
 | |
| ;; to nothing at runtime if developers want to use them while developing without
 | |
| ;; incurring the costs at runtime.
 | |
| 
 | |
| ;; TODO: Consider using this module instead of prelude.el.  Right now, I'm
 | |
| ;; having troubling preferring one to the other.  The benefit of this module is
 | |
| ;; that it's independent of prelude, but that might also be a downside, since
 | |
| ;; the messaging that asserting should be a critical part of any core library
 | |
| ;; like prelude.
 | |
| 
 | |
| ;;; Code:
 | |
| 
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| ;; Library
 | |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | |
| 
 | |
| (defmacro do/assert (x)
 | |
|   "Errors unless X is t.
 | |
| These are strict assertions and purposely do not rely on truthiness."
 | |
|   (let ((as-string (format "%s" x)))
 | |
|     `(unless (equal t ,x)
 | |
|        (error (concat "Assertion failed: " ,as-string)))))
 | |
| 
 | |
| (defmacro do/refute (x)
 | |
|   "Errors unless X is nil."
 | |
|   (let ((as-string (format "%s" x)))
 | |
|     `(unless (eq nil ,x)
 | |
|        (error (concat "Refutation failed: " ,as-string)))))
 | |
| 
 | |
| (provide 'do)
 | |
| ;;; do.el ends here
 |