mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
add unit test for cashflow-barchart report
Heavily inspired by test-generic-net-barchart.scm with a touch of test-cash-flow.scm
This commit is contained in:
@@ -507,10 +507,14 @@
|
||||
(cons 'money-in-collector money-in-collector)
|
||||
(cons 'money-out-collector money-out-collector))))
|
||||
|
||||
;; export to make uuid available to unit test: test-cashflow-barchart
|
||||
(export cashflow-barchart-uuid)
|
||||
(define cashflow-barchart-uuid "5426e4d987f6444387fe70880e5b28a0")
|
||||
|
||||
(gnc:define-report
|
||||
'version 1
|
||||
'name reportname
|
||||
'report-guid "5426e4d987f6444387fe70880e5b28a0"
|
||||
'report-guid cashflow-barchart-uuid
|
||||
'menu-tip (N_ "Shows a barchart with cash flow over time")
|
||||
'menu-path (list gnc:menuname-income-expense)
|
||||
'options-generator cashflow-barchart-options-generator
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
GNC_ADD_SCHEME_TEST(test-cash-flow test-cash-flow.scm)
|
||||
GNC_ADD_SCHEME_TEST(test-cashflow-barchart test-cashflow-barchart.scm)
|
||||
GNC_ADD_SCHEME_TEST(test-standard-category-report test-standard-category-report.scm)
|
||||
GNC_ADD_SCHEME_TEST(test-standard-net-barchart test-standard-net-barchart.scm)
|
||||
GNC_ADD_SCHEME_TEST(test-standard-net-linechart test-standard-net-linechart.scm)
|
||||
@@ -20,5 +21,5 @@ GNC_ADD_SCHEME_TARGETS(scm-test-standard-reports
|
||||
)
|
||||
|
||||
SET_DIST_LIST(test_standard_reports_DIST CMakeLists.txt Makefile.am ${scm_test_standard_reports_SOURCES}
|
||||
test-cash-flow.scm test-standard-category-report.scm test-standard-net-barchart.scm
|
||||
test-cash-flow.scm test-cashflow-barchart.scm test-standard-category-report.scm test-standard-net-barchart.scm
|
||||
test-standard-net-linechart.scm)
|
||||
|
||||
@@ -2,6 +2,7 @@ TESTS = $(SCM_TESTS)
|
||||
|
||||
SCM_TESTS = \
|
||||
test-cash-flow \
|
||||
test-cashflow-barchart \
|
||||
test-standard-category-report \
|
||||
test-standard-net-barchart \
|
||||
test-standard-net-linechart
|
||||
|
||||
288
gnucash/report/standard-reports/test/test-cashflow-barchart.scm
Normal file
288
gnucash/report/standard-reports/test/test-cashflow-barchart.scm
Normal file
@@ -0,0 +1,288 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; This program 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 2 of
|
||||
;; the License, or (at your option) any later version.
|
||||
;;
|
||||
;; This program 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 this program; if not, contact:
|
||||
;;
|
||||
;; Free Software Foundation Voice: +1-617-542-5942
|
||||
;; 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
|
||||
;; Boston, MA 02110-1301, USA gnu@gnu.org
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(use-modules (gnucash gnc-module))
|
||||
|
||||
(gnc:module-begin-syntax (gnc:module-load "gnucash/app-utils" 0))
|
||||
(gnc:module-load "gnucash/report/report-system" 0)
|
||||
|
||||
(use-modules (gnucash engine))
|
||||
(use-modules (sw_engine))
|
||||
|
||||
(use-modules (gnucash engine test test-extras))
|
||||
(use-modules (gnucash report report-system))
|
||||
(use-modules (gnucash report report-system test test-extras))
|
||||
(use-modules (gnucash report standard-reports cashflow-barchart))
|
||||
|
||||
(add-to-load-path "../../stylesheets/")
|
||||
(use-modules (gnucash report stylesheets))
|
||||
|
||||
(use-modules (ice-9 format))
|
||||
(use-modules (ice-9 streams))
|
||||
(use-modules (srfi srfi-1))
|
||||
|
||||
|
||||
(define (run-test)
|
||||
(logging-and (test-in-txn)
|
||||
(test-out-txn)
|
||||
(test-null-txn)))
|
||||
|
||||
|
||||
(define (set-option report page tag value)
|
||||
((gnc:option-setter (gnc:lookup-option (gnc:report-options report)
|
||||
page tag)) value))
|
||||
|
||||
|
||||
(define constructor (record-constructor <report>))
|
||||
|
||||
|
||||
(define structure
|
||||
(list "Root" (list (cons 'type ACCT-TYPE-ASSET))
|
||||
(list "Asset"
|
||||
(list "Bank")
|
||||
(list "Wallet"))
|
||||
(list "Expenses" (list (cons 'type ACCT-TYPE-EXPENSE)))
|
||||
(list "Income" (list (cons 'type ACCT-TYPE-INCOME)))))
|
||||
|
||||
|
||||
;; Test two transactions from income to two different assets in two different days
|
||||
(define (test-in-txn)
|
||||
(let* ((template (gnc:find-report-template cashflow-barchart-uuid))
|
||||
(options (gnc:make-report-options cashflow-barchart-uuid))
|
||||
(report (constructor cashflow-barchart-uuid "bar" options
|
||||
#t #t #f #f ""))
|
||||
(renderer (gnc:report-template-renderer template)))
|
||||
(let* ((env (create-test-env))
|
||||
(account-alist (env-create-account-structure-alist env structure))
|
||||
(bank-account (cdr (assoc "Bank" account-alist)))
|
||||
(wallet-account (cdr (assoc "Wallet" account-alist)))
|
||||
(expense-account (cdr (assoc "Expenses" account-alist)))
|
||||
(income-account (cdr (assoc "Income" account-alist)))
|
||||
(date-0 (gnc:get-start-this-month))
|
||||
(date-1 (gnc:timepair-next-day date-0))
|
||||
(date-2 (gnc:timepair-next-day date-1)))
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
bank-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 1 1))
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
wallet-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 5 1))
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show Table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
(set-option report gnc:pagename-general "End Date" (cons 'absolute date-2))
|
||||
(set-option report gnc:pagename-general "Step Size" 'DayDelta)
|
||||
(set-option report gnc:pagename-general "Price Source" 'pricedb-nearest)
|
||||
(set-option report gnc:pagename-general "Report's currency" (gnc-default-report-currency))
|
||||
(set-option report gnc:pagename-accounts "Accounts" (list wallet-account bank-account))
|
||||
|
||||
(let ((doc (renderer report)))
|
||||
(gnc:html-document-set-style-sheet! doc (gnc:report-stylesheet report))
|
||||
(let* ((result (gnc:html-document-render doc #f))
|
||||
(tbl (stream->list
|
||||
(pattern-streamer "<tr>"
|
||||
(list (list "<td>([0-9]+)/([0-9]+)/([0-9]+)</td>"
|
||||
1 2 3)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result)))
|
||||
(total (stream->list
|
||||
(pattern-streamer "<tr><td>Total</td>"
|
||||
(list (list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row) ; test in=net & out=0 in all rows (all days)
|
||||
(and (equal? (second row) (fourth row))
|
||||
(= 0 (string->number (car (third row))))))
|
||||
tbl)
|
||||
(= 0 (tbl-ref->number tbl 0 1)) ; 1st day in =0
|
||||
(= 1 (tbl-ref->number tbl 1 1)) ; 2nd day in =1
|
||||
(= 5 (tbl-ref->number tbl 2 1)) ; 3rd day in =5
|
||||
(= (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) ; total in=total net
|
||||
(= 0 (tbl-ref->number total 0 1)) ; total out=0
|
||||
(= 3 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; Test two transactions from two different assets to expense in two different days
|
||||
(define (test-out-txn)
|
||||
(let* ((template (gnc:find-report-template cashflow-barchart-uuid))
|
||||
(options (gnc:make-report-options cashflow-barchart-uuid))
|
||||
(report (constructor cashflow-barchart-uuid "bar" options
|
||||
#t #t #f #f ""))
|
||||
(renderer (gnc:report-template-renderer template)))
|
||||
(let* ((env (create-test-env))
|
||||
(account-alist (env-create-account-structure-alist env structure))
|
||||
(bank-account (cdr (assoc "Bank" account-alist)))
|
||||
(wallet-account (cdr (assoc "Wallet" account-alist)))
|
||||
(expense-account (cdr (assoc "Expenses" account-alist)))
|
||||
(income-account (cdr (assoc "Income" account-alist)))
|
||||
(date-0 (gnc:get-start-this-month))
|
||||
(date-1 (gnc:timepair-next-day date-0))
|
||||
(date-2 (gnc:timepair-next-day date-1)))
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
bank-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 100 1)) ; large in txn to avoid negative net (hard to parse)
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
expense-account
|
||||
bank-account
|
||||
(gnc:make-gnc-numeric 1 1))
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
wallet-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 100 1)) ; large in txn to avoid negative net (hard to parse)
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
expense-account
|
||||
wallet-account
|
||||
(gnc:make-gnc-numeric 5 1))
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show Table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
(set-option report gnc:pagename-general "End Date" (cons 'absolute date-2))
|
||||
(set-option report gnc:pagename-general "Step Size" 'DayDelta)
|
||||
(set-option report gnc:pagename-general "Price Source" 'pricedb-nearest)
|
||||
(set-option report gnc:pagename-general "Report's currency" (gnc-default-report-currency))
|
||||
(set-option report gnc:pagename-accounts "Accounts" (list wallet-account bank-account))
|
||||
|
||||
(let ((doc (renderer report)))
|
||||
(gnc:html-document-set-style-sheet! doc (gnc:report-stylesheet report))
|
||||
(let* ((result (gnc:html-document-render doc #f))
|
||||
(tbl (stream->list
|
||||
(pattern-streamer "<tr>"
|
||||
(list (list "<td>([0-9]+)/([0-9]+)/([0-9]+)</td>"
|
||||
1 2 3)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result)))
|
||||
(total (stream->list
|
||||
(pattern-streamer "<tr><td>Total</td>"
|
||||
(list (list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row) ; test in-out=net in all rows (all days)
|
||||
(let ((in (string->number (car (second row))))
|
||||
(out (string->number (car (third row))))
|
||||
(net (string->number (car (fourth row)))))
|
||||
(= (- in out) net)))
|
||||
tbl)
|
||||
(= 0 (tbl-ref->number tbl 0 2)) ; 1st day out =0
|
||||
(= 1 (tbl-ref->number tbl 1 2)) ; 2nd day out =1
|
||||
(= 5 (tbl-ref->number tbl 2 2)) ; 3rd day out =5
|
||||
(= (- (tbl-ref->number total 0 0) (tbl-ref->number total 0 1)) ; total in-total out=total net
|
||||
(tbl-ref->number total 0 2))
|
||||
(= 6 (tbl-ref->number total 0 1)) ; total out=6
|
||||
(= 3 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; Test null transaction (transaction between assets)
|
||||
;; This test is identical to test-in-txn but with an extra transaction between assets
|
||||
(define (test-null-txn)
|
||||
(let* ((template (gnc:find-report-template cashflow-barchart-uuid))
|
||||
(options (gnc:make-report-options cashflow-barchart-uuid))
|
||||
(report (constructor cashflow-barchart-uuid "bar" options
|
||||
#t #t #f #f ""))
|
||||
(renderer (gnc:report-template-renderer template)))
|
||||
(let* ((env (create-test-env))
|
||||
(account-alist (env-create-account-structure-alist env structure))
|
||||
(bank-account (cdr (assoc "Bank" account-alist)))
|
||||
(wallet-account (cdr (assoc "Wallet" account-alist)))
|
||||
(expense-account (cdr (assoc "Expenses" account-alist)))
|
||||
(income-account (cdr (assoc "Income" account-alist)))
|
||||
(date-0 (gnc:get-start-this-month))
|
||||
(date-1 (gnc:timepair-next-day date-0))
|
||||
(date-2 (gnc:timepair-next-day date-1)))
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
bank-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 1 1))
|
||||
(env-create-transaction env
|
||||
date-1
|
||||
bank-account
|
||||
wallet-account
|
||||
(gnc:make-gnc-numeric 20 1)) ; this transaction should not be counted
|
||||
(env-create-transaction env
|
||||
date-2
|
||||
wallet-account
|
||||
income-account
|
||||
(gnc:make-gnc-numeric 5 1))
|
||||
|
||||
(begin
|
||||
(set-option report gnc:pagename-display "Show Table" #t)
|
||||
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
|
||||
(set-option report gnc:pagename-general "End Date" (cons 'absolute date-2))
|
||||
(set-option report gnc:pagename-general "Step Size" 'DayDelta)
|
||||
(set-option report gnc:pagename-general "Price Source" 'pricedb-nearest)
|
||||
(set-option report gnc:pagename-general "Report's currency" (gnc-default-report-currency))
|
||||
(set-option report gnc:pagename-accounts "Accounts" (list wallet-account bank-account))
|
||||
|
||||
(let ((doc (renderer report)))
|
||||
(gnc:html-document-set-style-sheet! doc (gnc:report-stylesheet report))
|
||||
(let* ((result (gnc:html-document-render doc #f))
|
||||
(tbl (stream->list
|
||||
(pattern-streamer "<tr>"
|
||||
(list (list "<td>([0-9]+)/([0-9]+)/([0-9]+)</td>"
|
||||
1 2 3)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result)))
|
||||
(total (stream->list
|
||||
(pattern-streamer "<tr><td>Total</td>"
|
||||
(list (list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
|
||||
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
|
||||
result))))
|
||||
(and (every (lambda (row) ; test in=net & out=0 in all rows (all days)
|
||||
(and (equal? (second row) (fourth row))
|
||||
(= 0 (string->number (car (third row))))))
|
||||
tbl)
|
||||
(= 0 (tbl-ref->number tbl 0 1)) ; 1st day in =0
|
||||
(= 1 (tbl-ref->number tbl 1 1)) ; 2nd day in =1
|
||||
(= 5 (tbl-ref->number tbl 2 1)) ; 3rd day in =5
|
||||
(= (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) ; total in=total net
|
||||
(= 0 (tbl-ref->number total 0 1)) ; total out=0
|
||||
(= 3 (tbl-row-count tbl))
|
||||
(= 4 (tbl-column-count tbl)))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user