branch: elpa/flx commit 331ef6f109664f16102164a660046ef8a0cdc807 Author: Le Wang <le.w...@agworld.com.au> Commit: Le Wang <le.w...@agworld.com.au>
first commit --- .gitignore | 1 + .travis.yml | 14 ++++++++++++ Makefile | 26 ++++++++++++++++++++++ mflex-sort.el | 22 +++++++++++++++++++ tests/mflex-test.el | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/run-test.el | 42 +++++++++++++++++++++++++++++++++++ 6 files changed, 168 insertions(+) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c531d9867f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.elc diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..c143c8757c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: emacs-lisp +before_install: + - git submodule update --init + - if [ "$EMACS" = 'emacs-snapshot' ]; then + sudo add-apt-repository -y ppa:cassou/emacs && + sudo apt-get update -qq && + sudo apt-get install -qq + emacs-snapshot-el emacs-snapshot-gtk emacs-snapshot; + fi +env: + - EMACS=emacs24 + # - EMACS=emacs-snapshot +script: + make travis-ci EMACS=$EMACS diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..990b7e2cb9 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +EMACS=emacs +EMACS23=emacs23 +EMACS-OPTIONS= + +.PHONY: test test-nw travis-ci show-version before-test + +show-version: show-version + echo "*** Emacs version ***" + echo "EMACS = `which ${EMACS}`" + ${EMACS} --version + +install-ert: + emacs --batch -L "${PWD}/lib/ert/lisp/emacs-lisp" --eval "(require 'ert)" || ( git clone git://github.com/ohler/ert.git lib/ert && cd lib/ert && git checkout 00aef6e43 ) + + +before-test: show-version install-ert + +test: before-test + ${EMACS} -Q -L . -l tests/run-test.el + +test-nw: before-test + ${EMACS} -Q -nw -L . -l tests/run-test.el + +travis-ci: before-test + echo ${EMACS-OPTIONS} + ${EMACS} -batch -Q -l tests/run-test.el diff --git a/mflex-sort.el b/mflex-sort.el new file mode 100644 index 0000000000..a4812605db --- /dev/null +++ b/mflex-sort.el @@ -0,0 +1,22 @@ + +(defun mflex-all-combinations (list num) + "let LENGTH = (length list) + +return all combinations of sequences of NUM elements from list. + +The length of the resulting list is (" + (let ((length (length list)) + (head (car list)) + (rest (cdr list))) + (cond ((= 0 num) + (list nil)) + ((= length num) + (list list)) + (t + (append (mapcar + (lambda (list) + (cons head list)) + (mflex-all-combinations rest (1- num))) + (mflex-all-combinations rest num)))))) + +(provide 'mflex) \ No newline at end of file diff --git a/tests/mflex-test.el b/tests/mflex-test.el new file mode 100644 index 0000000000..532b394998 --- /dev/null +++ b/tests/mflex-test.el @@ -0,0 +1,63 @@ +(require 'ert) +(require 'mflex) + + +;; for "every" function +(require 'cl) + +(ert-deftest mflex-test-sanity () + "sanity check." + (should (= 1 1))) + + +(ert-deftest mflex-all-combinations () + "making combinations." + (should (equal '((1) (2) (3)) + (mflex-all-combinations '(1 2 3) 1))) + (should (= 210 + (length (mflex-all-combinations '(1 2 3 4 5 6 7 8 9 10) 4))))) + +(ert-deftest mflex-basename-basic () + "basic scoring -- matches get number, non-matches get nil" + ;; matches + (mapc (lambda (str) + (should (mflex-score "a" str 'file))) + '("a" + "ba" + "ab" + ".a" + "aaaa" + "foo.bra" + "a/foo" + "b/a/foo" + "b/.a/foo" + "b/.a./foo")) + ;; empty string should match everything + (mapc (lambda (str) + (should (mflex-score "" str 'file))) + '("" + "zz" + ".")) + ;; non-matches + (mapc (lambda (str) + (should-not (mflex-score "a" str 'file))) + '("" + "zz" + "."))) + + +(ert-deftest mflex-basename-entire () + "whole match is preferred" + (let* ((query "a") + (higher (mflex-score "a" query 'file)) + (lower (mflex-score "ab" query 'file))) + (should (> higher lowercase)))) + +(ert-deftest mflex-basename-order () + "" + (let* ((query "a") + (higher (mflex-score "a_b_c" query 'file)) + (lower (mflex-score "b_a_c" query 'file))) + (should (> higher lowercase)))) + + diff --git a/tests/run-test.el b/tests/run-test.el new file mode 100644 index 0000000000..b9e2eebe42 --- /dev/null +++ b/tests/run-test.el @@ -0,0 +1,42 @@ +;; Usage: +;; +;; emacs -Q -l tests/run-test.el # interactive mode +;; emacs -batch -Q -l tests/run-test.el # batch mode + + +;; Utils +(defun mflex-test-join-path (path &rest rest) + "Join a list of PATHS with appropriate separator (such as /). + +\(fn &rest paths)" + (if rest + (concat (file-name-as-directory path) (apply 'mflex-test-join-path rest)) + path)) + +(defvar mflex-test-dir (file-name-directory load-file-name)) +(defvar mflex-root-dir (file-name-as-directory (expand-file-name ".." mflex-test-dir))) + + +;; Setup `load-path' +(mapc (lambda (p) (add-to-list 'load-path p)) + (list mflex-test-dir + mflex-root-dir)) + + +;; Use ERT from github when this Emacs does not have it +(unless (locate-library "ert") + (add-to-list + 'load-path + (mflex-test-join-path mflex-root-dir "lib" "ert" "lisp" "emacs-lisp")) + (require 'ert-batch) + (require 'ert-ui)) + + +;; Load tests +(load "mflex-test") + + +;; Run tests +(if noninteractive + (ert-run-tests-batch-and-exit) + (ert t))