(define-module (test create) :use-module ((srfi srfi-1) :select (every)) :use-module (srfi srfi-64) :use-module (srfi srfi-88) :use-module ((hnh util) :select (-> sort*)) :use-module ((vcomponent base) :select (vcomponent?)) :use-module ((vcomponent create) :select (vcomponent with-parameters as-list vcalendar vevent vtimezone standard daylight)) :use-module ((vcomponent) :select (children properties type prop prop* extract param vline?))) ;; vevent, vcalendar, vtimezone, standard, and daylight all trivial ;; and therefore not tested (test-group "Empty component" (let ((ev (vcomponent 'TEST))) (test-equal 'TEST (type ev)) (test-equal '() (children ev)) (test-equal '() (properties ev)))) (test-group "Component with properties, but no children" (let ((ev (vcomponent 'TEST prop: "value"))) (test-equal '(PROP) (map car (properties ev))) (test-equal "value" (prop ev 'PROP)))) (test-group "Component with children, but no properties" (let* ((child (vcomponent 'CHILD)) (ev (vcomponent 'TEST (list child)))) (test-equal '() (properties ev)) (test-equal 1 (length (children ev))) ; (test-eq child (car (children ev))) )) (test-group "Component with both children and properties" (let* ((child (vcomponent 'CHILD)) (ev (vcomponent 'TEST prop: "VALUE" (list child)))) (test-equal '(PROP) (map car (properties ev))) (test-equal "VALUE" (prop ev 'PROP)) (test-equal 1 (length (children ev))) ; (test-eq child (car (children ev))) )) (test-group "Component with multiple children" (let ((cal (vcalendar calscale: "GREGORIAN" (list (vevent summary: "Child 1") (vevent summary: "Child 2"))))) (test-equal 2 (length (children cal))) (test-equal "GREGORIAN" (-> cal (prop 'CALSCALE))) (let ((ch (sort* (children cal) string ch (list-ref 0) (prop 'SUMMARY))) (test-equal "Child 2" (-> ch (list-ref 1) (prop 'SUMMARY)))))) (test-group "Component with no children, where last elements value is a list" (let ((ev (vcomponent 'TEST prop: (list 1 2 3)))) (test-equal '() (children ev)) (test-equal '(PROP) (map car (properties ev))) (test-equal '(1 2 3) (prop ev 'PROP)))) (test-group "With parameters" (let ((ev (vcomponent 'TEST prop: (with-parameters param: 1 2)))) (test-equal 2 (prop ev 'PROP)) (test-equal '(1) (param (prop* ev 'PROP) 'PARAM)))) (test-group "As list" (let ((ev (vcomponent 'TEST prop: (as-list (list 1 2 3))))) (test-equal '(1 2 3) (prop ev 'PROP)) (test-equal 3 (length (prop* ev 'PROP))) (test-assert (every vline? (prop* ev 'PROP))))) ;; (test-group "Parameters and lists" ) (test-assert (vcomponent? (vcalendar))) (test-eq 'VCALENDAR (type (vcalendar))) (test-assert (vcomponent? (vevent))) (test-eq 'VEVENT (type (vevent))) (test-assert (vcomponent? (vtimezone))) (test-eq 'VTIMEZONE (type (vtimezone))) (test-assert (vcomponent? (standard))) (test-eq 'STANDARD (type (standard))) (test-assert (vcomponent? (daylight))) (test-eq 'DAYLIGHT (type (daylight))) '((vcomponent create))