;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2018, 2019 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix 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 Guix 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 Guix. If not, see . (define-module (test-records) #:use-module (srfi srfi-1) #:use-module (srfi srfi-64) #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (guix records)) (define (test-module) ;; A module in
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Bakke <marius@gnu.org>2020-06-06 20:57:50 +0200
committerMarius Bakke <marius@gnu.org>2020-06-06 21:14:17 +0200
commitb69ca4d234db8fe2750e9b0d6b6139a5a89a4da6 (patch)
tree3c0fbcab3167b48661adee3470bafbed39a6c29b /gnu/packages/conky.scm
parent9c0fd3d34cab839411ba47312eba6b659d5213ae (diff)
downloadguix-b69ca4d234db8fe2750e9b0d6b6139a5a89a4da6.tar.gz
guix-b69ca4d234db8fe2750e9b0d6b6139a5a89a4da6.zip
gnu: Add kpeoplevcard.
* gnu/packages/kde-pim.scm (kpeoplevcard): New public variable.
Diffstat (limited to 'gnu/packages/conky.scm')
0 files changed, 0 insertions, 0 deletions
-baz (thunked) (default (+ (foo-bar this-record) 2)))) (let ((x (foo (bar 40)))) (and (= 40 (foo-bar x)) (= 42 (foo-baz x)))))) (test-assert "define-record-type* & thunked & inherit & this-record" (begin (define-record-type* foo make-foo foo? (bar foo-bar) (baz foo-baz (thunked) (default (+ (foo-bar this-record) 2)))) (let* ((x (foo (bar 40))) (y (foo (inherit x) (bar -2))) (z (foo (inherit x) (baz -2)))) (and (= -2 (foo-bar y)) (= 0 (foo-baz y)) (= 40 (foo-bar z)) (= -2 (foo-baz z)))))) (test-assert "define-record-type* & thunked & inherit & custom this" (let () (define-record-type* foo make-foo foo? this-foo (thing foo-thing (thunked))) (define-record-type* bar make-bar bar? this-bar (baz bar-baz (thunked))) ;; Nest records and test the two self references. (let* ((x (foo (thing (bar (baz (list this-bar this-foo)))))) (y (foo-thing x))) (match (bar-baz y) ((first second) (and (eq? second x) (bar? first) (eq? first y))))))) (test-assert "define-record-type* & delayed" (begin (define-record-type* foo make-foo foo? (bar foo-bar (delayed))) (let* ((calls 0) (x (foo (bar (begin (set! calls (1+ calls)) 3))))) (and (zero? calls) (equal? (foo-bar x) 3) (= 1 calls) (equal? (foo-bar x) 3) (= 1 calls) (equal? (foo-bar x) 3) (= 1 calls))))) (test-assert "define-record-type* & delayed & default" (let ((mark #f)) (define-record-type* foo make-foo foo? (bar foo-bar (delayed) (default mark))) (let ((x (foo))) (set! mark 42) (and (equal? (foo-bar x) 42) (begin (set! mark 7) (equal? (foo-bar x) 42)))))) (test-assert "define-record-type* & delayed & inherited" (begin (define-record-type* foo make-foo foo? (bar foo-bar (delayed)) (baz foo-baz (delayed))) (let* ((m 1) (n #f) (x (foo (bar m) (baz n))) (y (foo (inherit x) (baz 'b)))) (set! n 'a) (and (equal? (foo-bar x) 1) (eq? (foo-baz x) 'a) (begin (set! m 777) (equal? (foo-bar y) 1)) ;promise was already forced (eq? (foo-baz y) 'b))))) (test-assert "define-record-type* & wrong field specifier" (let ((exp '(begin (define-record-type* foo make-foo foo? (bar foo-bar (default 42)) (baz foo-baz)) (foo (baz 1 2 3 4 5)))) ;syntax error (loc (current-source-location))) ;keep this alignment! (catch 'syntax-error (lambda () (eval exp (test-module)) #f) (lambda (key proc message location form . args) (and (eq? proc 'foo) (string-match "invalid field" message) (equal? form '(baz 1 2 3 4 5)) ;; Make sure the location is that of the field specifier. ;; See . (lset= equal? (pk 'expected-loc `((line . ,(- (assq-ref loc 'line) 1)) ,@(alist-delete 'line loc))) (pk 'actual-loc location))))))) (test-assert "define-record-type* & missing initializers" (catch 'syntax-error (lambda () (eval '(begin (define-record-type* foo make-foo foo? (bar foo-bar (default 42)) (baz foo-baz)) (foo)) (test-module)) #f) (lambda (key proc message location form . args) (and (eq? proc 'foo) (string-match "missing .*initialize.*baz" message) (equal? form '(foo)))))) (test-assert "define-record-type* & extra initializers" (catch 'syntax-error (lambda () (eval '(begin (define-record-type* foo make-foo foo? (bar foo-bar (default 42))) (foo (baz 'what?))) (test-module)) #f) (lambda (key proc message location form . args) (and (string-match "extra.*initializer.*baz" message) (eq? proc 'foo))))) (test-assert "define-record-type* & inherit & extra initializers" (catch 'syntax-error (lambda () (eval '(begin (define-record-type* foo make-foo foo? (bar foo-bar (default 42))) (foo (inherit (foo)) (baz 'what?))) (test-module)) #f) (lambda (key proc message location form . args) (and (string-match "extra.*initializer.*baz" message) (eq? proc 'foo))))) (test-assert "define-record-type* & duplicate initializers" (let ((exp '(begin (define-record-type* foo make-foo foo? (bar foo-bar (default 42))) (foo (bar 1) (bar 2)))) (loc (current-source-location))) ;keep this alignment! (catch 'syntax-error (lambda () (eval exp (test-module)) #f) (lambda (key proc message location form . args) (and (string-match "duplicate.*initializer" message) (eq? proc 'foo) ;; Make sure the location is that of the field specifier. (lset= equal? (pk 'expected-loc `((line . ,(- (assq-ref loc 'line) 1)) ,@(alist-delete 'line loc))) (pk 'actual-loc location))))))) (test-assert "ABI checks" (let ((module (test-module))) (eval '(begin (define-record-type* foo make-foo foo? (bar foo-bar (default 42))) (define (make-me-a-record) (foo))) module) (unless (eval '(foo? (make-me-a-record)) module) (error "what?" (eval '(make-me-a-record) module))) ;; Redefine with an additional field. (eval '(define-record-type* foo make-foo foo? (baz foo-baz) (bar foo-bar (default 42))) module) ;; Now 'make-me-a-record' is out of sync because it does an ;; 'allocate-struct' that corresponds to the previous definition of . (catch 'record-abi-mismatch-error (lambda () (eval '(foo? (make-me-a-record)) module) #f) (match-lambda* ((key 'abi-check (? string? message) (rtd) . _) (eq? rtd (eval ' module))))))) (test-equal "recutils->alist" '((("Name" . "foo") ("Version" . "0.1") ("Synopsis" . "foo bar") ("Something_else" . "chbouib")) (("Name" . "bar") ("Version" . "1.5"))) (let ((p (open-input-string " # Comment following an empty line, and # preceding a couple of empty lines, all of # which should be silently consumed. Name: foo Version: 0.1 # Comment right in the middle, # spanning two lines. Synopsis: foo bar Something_else: chbouib # Comment right before. Name: bar Version: 1.5 # Comment at the end."))) (list (recutils->alist p) (recutils->alist p)))) (test-equal "recutils->alist with + lines" '(("Name" . "foo") ("Description" . "1st line,\n2nd line,\n 3rd line with extra space,\n4th line without space.")) (recutils->alist (open-input-string " Name: foo Description: 1st line, + 2nd line, + 3rd line with extra space, +4th line without space."))) (test-equal "alist->record" '((1 2) b c) (alist->record '(("a" . 1) ("b" . b) ("c" . c) ("a" . 2)) list '("a" "b" "c") '("a"))) (test-end)