From a3b210129ccf416301f36ec9ab6e624b455db907 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Przemys=C5=82aw=20Wojnowski?= Date: Sun, 8 Nov 2015 16:59:07 +0100 Subject: [PATCH] New file with obarray functions. * lisp/obarray.el: basic obarray functions extracted from abbrev.el * test/automated/obarray-tests.el: new file --- lisp/obarray.el | 65 ++++++++++++++++++++++++ test/automated/obarray-tests.el | 90 +++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 lisp/obarray.el create mode 100644 test/automated/obarray-tests.el diff --git a/lisp/obarray.el b/lisp/obarray.el new file mode 100644 index 0000000000..fb7a333b8b --- /dev/null +++ b/lisp/obarray.el @@ -0,0 +1,65 @@ +;;; obarray.el --- obarray functions -*- lexical-binding: t -*- + +;; Copyright (C) 2015 Free Software Foundation, Inc. + +;; Maintainer: emacs-devel@gnu.org +;; Keywords: obarray functions +;; Package: emacs + +;; 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 . + +;;; Commentary: + +;; This file provides function for working with obarrays. + +;;; Code: + +(defconst obarray-default-size 59 + "The value 59 is an arbitrary prime number that gives a good hash.") + +(defun obarray-make (&optional size) + "Return a new obarray of size SIZE or `obarray-default-size'." + (let ((size (or size obarray-default-size))) + (if (< 0 size) + (make-vector size 0) + (signal 'wrong-type-argument '(size 0))))) + +(defun obarray-p (object) + "Return t if OBJECT is an obarray." + (and (vectorp object) + (< 0 (length object)))) + +(defun obarray-get (obarray name) + "Return symbol named NAME if it is contained in OBARRAY. +Return nil otherwise." + (intern-soft name obarray)) + +(defun obarray-put (obarray name) + "Return symbol named NAME from OBARRAY. +Creates and adds the symbol if doesn't exist." + (intern name obarray)) + +(defun obarray-remove (obarray name) + "Remove symbol named NAME if it is contained in OBARRAY. +Return t on success, nil otherwise." + (unintern name obarray)) + +(defun obarray-foreach (fn obarray) + "Call function FN on every symbol in OBARRAY and return nil." + (mapatoms fn obarray)) + +(provide 'obarray) +;;; obarray.el ends here diff --git a/test/automated/obarray-tests.el b/test/automated/obarray-tests.el new file mode 100644 index 0000000000..16ed694bb3 --- /dev/null +++ b/test/automated/obarray-tests.el @@ -0,0 +1,90 @@ +;;; obarray-tests.el --- Tests for obarray -*- lexical-binding: t; -*- + +;; Copyright (C) 2015 Free Software Foundation, Inc. + +;; Author: Przemysław Wojnowski + +;; 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 . + +;;; Commentary: + +;;; Code: + +(require 'obarray) +(require 'ert) + +(ert-deftest obarray-p-test () + "Should assert that given object is an obarray." + (should-not (obarray-p 42)) + (should-not (obarray-p "aoeu")) + (should-not (obarray-p '())) + (should-not (obarray-p [])) + (should (obarray-p (make-vector 7 0)))) + +(ert-deftest obarray-p-unchecked-content-test () + "Should fail to check content of passed obarray." + :expected-result :failed + (should-not (obarray-p ["a" "b" "c"])) + (should-not (obarray-p [1 2 3]))) + +(ert-deftest obarray-make-default-test () + (let ((table (obarray-make))) + (should (obarray-p table)) + (should (equal (make-vector 59 0) table)))) + +(ert-deftest obarray-make-with-size-test () + (should-error (obarray-make -1) :type 'wrong-type-argument) + (should-error (obarray-make 0) :type 'wrong-type-argument) + (let ((table (obarray-make 1))) + (should (obarray-p table)) + (should (equal (make-vector 1 0) table)))) + +(ert-deftest obarray-get-test () + (let ((table (obarray-make 3))) + (should-not (obarray-get table "aoeu")) + (intern "aoeu" table) + (should (string= "aoeu" (obarray-get table "aoeu"))))) + +(ert-deftest obarray-put-test () + (let ((table (obarray-make 3))) + (should-not (obarray-get table "aoeu")) + (should (string= "aoeu" (obarray-put table "aoeu"))) + (should (string= "aoeu" (obarray-get table "aoeu"))))) + +(ert-deftest obarray-remove-test () + (let ((table (obarray-make 3))) + (should-not (obarray-get table "aoeu")) + (should-not (obarray-remove table "aoeu")) + (should (string= "aoeu" (obarray-put table "aoeu"))) + (should (string= "aoeu" (obarray-get table "aoeu"))) + (should (obarray-remove table "aoeu")) + (should-not (obarray-get table "aoeu")))) + +(ert-deftest obarray-foreach-test () + "Should execute function on all elements of obarray." + (let* ((table (obarray-make 3)) + (syms '()) + (collect-names (lambda (sym) (push (symbol-name sym) syms)))) + (obarray-foreach collect-names table) + (should (null syms)) + (obarray-put table "a") + (obarray-put table "b") + (obarray-put table "c") + (obarray-foreach collect-names table) + (should (equal (sort syms #'string<) '("a" "b" "c"))))) + +(provide 'obarray-tests) +;;; obarray-tests.el ends here -- 2.39.2