summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-10-28 02:34:40 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-10-28 02:34:40 -0400
commitbd96928410124e70e70ada7fd05820e2cf781d2c (patch)
treea054e62051e8a2cdb7351f9b166a1fba5d5ba43f
parentade0a8b6f3eeb893eda2ae7355d503bf6514f147 (diff)
parent65e8eca6cfd394390c1e2091cf8674a93d2eae2d (diff)
downloadfork-ledger-bd96928410124e70e70ada7fd05820e2cf781d2c.tar.gz
fork-ledger-bd96928410124e70e70ada7fd05820e2cf781d2c.tar.bz2
fork-ledger-bd96928410124e70e70ada7fd05820e2cf781d2c.zip
Merge branch 'next'
-rw-r--r--src/account.cc4
-rw-r--r--src/amount.cc2
-rw-r--r--src/chain.cc8
-rw-r--r--src/commodity.cc2
-rw-r--r--src/filters.cc97
-rw-r--r--src/global.cc3
-rw-r--r--src/iterators.cc11
-rw-r--r--src/iterators.h7
-rw-r--r--src/report.cc3
-rw-r--r--src/report.h40
-rw-r--r--src/session.cc12
-rw-r--r--src/temps.cc3
-rw-r--r--src/temps.h4
-rw-r--r--src/textual.cc15
-rw-r--r--src/times.h8
-rw-r--r--src/utils.cc20
-rw-r--r--src/xact.cc15
-rwxr-xr-xtest/LedgerHarness.py5
-rw-r--r--test/baseline/opt-by-payee.test32
-rw-r--r--test/baseline/opt-effective.test4
-rw-r--r--test/baseline/opt-forecast-while.test104
-rw-r--r--test/baseline/opt-lot-dates.test2
-rw-r--r--test/baseline/opt-lot-prices.test2
-rw-r--r--test/baseline/opt-lots.test2
-rw-r--r--test/baseline/opt-lots_basis.test12
-rw-r--r--test/baseline/opt-lots_basis_base.test12
-rw-r--r--test/baseline/opt-strict.test4
-rw-r--r--test/regress/793F6BF0.test2
-rw-r--r--test/regress/B68FFB0D.test2
29 files changed, 258 insertions, 179 deletions
diff --git a/src/account.cc b/src/account.cc
index 4bcb0c25..57b66d86 100644
--- a/src/account.cc
+++ b/src/account.cc
@@ -42,8 +42,10 @@ account_t::~account_t()
{
TRACE_DTOR(account_t);
- foreach (accounts_map::value_type& pair, accounts)
+ foreach (accounts_map::value_type& pair, accounts) {
+ assert(! pair.second->has_flags(ACCOUNT_TEMP));
checked_delete(pair.second);
+ }
}
account_t * account_t::find_account(const string& name,
diff --git a/src/amount.cc b/src/amount.cc
index 5aa985c8..a6788af9 100644
--- a/src/amount.cc
+++ b/src/amount.cc
@@ -107,6 +107,7 @@ void amount_t::initialize(shared_ptr<commodity_pool_t> pool)
mpq_init(tempq);
mpfr_init(tempf);
mpfr_init(tempfb);
+
is_initialized = true;
}
current_pool = pool;
@@ -126,6 +127,7 @@ void amount_t::shutdown()
mpq_clear(tempq);
mpfr_clear(tempf);
mpfr_clear(tempfb);
+
is_initialized = false;
}
}
diff --git a/src/chain.cc b/src/chain.cc
index 25f4833c..018b3812 100644
--- a/src/chain.cc
+++ b/src/chain.cc
@@ -114,6 +114,10 @@ post_handler_ptr chain_post_handlers(report_t& report,
else
handler.reset(new sort_posts(handler, report.HANDLER(sort_).str()));
}
+ else if (! report.HANDLED(period_) &&
+ ! report.HANDLED(unsorted)) {
+ handler.reset(new sort_posts(handler, "date"));
+ }
// collapse_posts causes xacts with multiple posts to appear as xacts
// with a subtotaled post for each commodity used.
@@ -135,6 +139,10 @@ post_handler_ptr chain_post_handlers(report_t& report,
else if (report.HANDLED(subtotal))
handler.reset(new subtotal_posts(handler, expr));
}
+ else if (! report.HANDLED(period_) &&
+ ! report.HANDLED(unsorted)) {
+ handler.reset(new sort_posts(handler, "date"));
+ }
if (report.HANDLED(dow))
handler.reset(new dow_posts(handler, expr));
diff --git a/src/commodity.cc b/src/commodity.cc
index 4041946b..54cb02d6 100644
--- a/src/commodity.cc
+++ b/src/commodity.cc
@@ -393,7 +393,7 @@ commodity_t::check_for_updated_price(const optional<price_point_t>& point,
DEBUG("commodity.download", "moment = " << *moment);
DEBUG("commodity.download", "slip.moment = " << seconds_diff);
} else {
- seconds_diff = (CURRENT_TIME() - point->when).total_seconds();
+ seconds_diff = (TRUE_CURRENT_TIME() - point->when).total_seconds();
DEBUG("commodity.download", "slip.now = " << seconds_diff);
}
diff --git a/src/filters.cc b/src/filters.cc
index 25649ad0..814cf276 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -686,6 +686,7 @@ void transfer_details::operator()(post_t& post)
xact.payee = expr.calc(bound_scope).to_string();
break;
case SET_ACCOUNT:
+ temp.account->remove_post(&temp);
temp.account = master->find_account(expr.calc(bound_scope).to_string());
temp.account->add_post(&temp);
break;
@@ -805,6 +806,7 @@ void forecast_posts::add_post(const date_interval_t& period, post_t& post)
{
generate_posts::add_post(period, post);
+ // Advance the period's interval until it is at or beyond the current date.
date_interval_t& i = pending_posts.back().first;
if (! i.start) {
if (! i.find_period(CURRENT_DATE()))
@@ -819,59 +821,92 @@ void forecast_posts::add_post(const date_interval_t& period, post_t& post)
void forecast_posts::flush()
{
posts_list passed;
- date_t last;
+ date_t last = CURRENT_DATE();
+
+ // If there are period transactions to apply in a continuing series until
+ // the forecast condition is met, generate those transactions now. Note
+ // that no matter what, we abandon forecasting beyond the next 5 years.
+ //
+ // It works like this:
+ //
+ // Earlier, in forecast_posts::add_period_xacts, we cut up all the periodic
+ // transactions into their components postings, so that we have N "periodic
+ // postings". For example, if the user had this:
+ //
+ // ~ daily
+ // Expenses:Food $10
+ // Expenses:Auto:Gas $20
+ // ~ monthly
+ // Expenses:Food $100
+ // Expenses:Auto:Gas $200
+ //
+ // We now have 4 periodic postings in `pending_posts'.
+ //
+ // Each periodic postings gets its own copy of its parent transaction's
+ // period, which is modified as we go. This is found in the second member
+ // of the pending_posts_list for each posting.
+ //
+ // The algorithm below works by iterating through the N periodic postings
+ // over and over, until each of them mets the termination critera for the
+ // forecast and is removed from the set.
while (pending_posts.size() > 0) {
+ // At each step through the loop, we find the first periodic posting whose
+ // period contains the earliest starting date.
pending_posts_list::iterator least = pending_posts.begin();
for (pending_posts_list::iterator i = ++pending_posts.begin();
i != pending_posts.end();
- i++)
+ i++) {
if (*(*i).first.start < *(*least).first.start)
least = i;
+ }
date_t& begin = *(*least).first.start;
+ if ((*least).first.end)
+ assert(begin < *(*least).first.end);
+
+ // If the next date in the series for this periodic posting is more than 5
+ // years beyond the last valid post we generated, drop it from further
+ // consideration.
+ date_t next = *(*least).first.next;
+ assert(next > begin);
- if ((*least).first.end && begin >= *(*least).first.end) {
+ if ((next - last).days() > 365 * 5) {
+ DEBUG("filters.forecast",
+ "Forecast transaction exceeds 5 years beyond today");
pending_posts.erase(least);
- passed.remove((*least).second);
continue;
}
- post_t& post = *(*least).second;
+ begin = next;
+ ++(*least).first;
+ // `post' refers to the posting defined in the period transaction. We
+ // make a copy of it within a temporary transaction with the payee
+ // "Forecast transaction".
+ post_t& post = *(*least).second;
xact_t& xact = temps.create_xact();
- xact.payee = _("Forecast transaction");
- xact._date = begin;
-
+ xact.payee = _("Forecast transaction");
+ xact._date = begin;
post_t& temp = temps.copy_post(post, xact);
- date_t next = *(*least).first.next;
- ++(*least).first;
-
- if (next < begin || (is_valid(last) && (next - last).days() > 365 * 5))
- break;
- begin = next;
-
+ // Submit the generated posting
+ DEBUG("filters.forecast",
+ "Forecast transaction: " << temp.date()
+ << " " << temp.account->fullname()
+ << " " << temp.amount);
item_handler<post_t>::operator()(temp);
+ // If the generated posting matches the user's report query, check whether
+ // it also fails to match the continuation condition for the forecast. If
+ // it does, drop this periodic posting from consideration.
if (temp.has_xdata() && temp.xdata().has_flags(POST_EXT_MATCHES)) {
+ DEBUG("filters.forecast", " matches report query");
bind_scope_t bound_scope(context, temp);
- if (! pred(bound_scope))
- break;
- last = temp.date();
- passed.clear();
- } else {
- bool found = false;
- foreach (post_t * x, passed)
- if (x == &post) {
- found = true;
- break;
- }
-
- if (! found) {
- passed.push_back(&post);
- if (passed.size() >= pending_posts.size())
- break;
+ if (! pred(bound_scope)) {
+ DEBUG("filters.forecast", " fails to match continuation criteria");
+ pending_posts.erase(least);
+ continue;
}
}
}
diff --git a/src/global.cc b/src/global.cc
index 2ce73bae..19cab1c8 100644
--- a/src/global.cc
+++ b/src/global.cc
@@ -418,6 +418,9 @@ void global_scope_t::normalize_report_options(const string& verb)
report_t& rep(report());
+ if (! rep.HANDLED(no_color))
+ rep.HANDLER(color).on_only(string("?normalize"));
+
// jww (2009-02-09): These globals are a hack, but hard to avoid.
item_t::use_effective_date = (rep.HANDLED(effective) &&
! rep.HANDLED(actual_dates));
diff --git a/src/iterators.cc b/src/iterators.cc
index 020f70b0..e9560cc0 100644
--- a/src/iterators.cc
+++ b/src/iterators.cc
@@ -108,24 +108,19 @@ void posts_commodities_iterator::reset(journal_t& journal)
if (i != xacts_by_commodity.end()) {
xact = (*i).second;
} else {
- xact_temps.push_back(new xact_t);
- xact = xact_temps.back();
+ xact = &temps.create_xact();
+ xact_temps.push_back(xact);
xact->payee = symbol;
xact->_date = hpair.first.date();
xacts_by_commodity.insert
(std::pair<string, xact_t *>(symbol, xact));
}
- post_temps.push_back(post_t(account));
- post_t& temp = post_temps.back();
+ post_t& temp = temps.create_post(*xact, account);
temp._date = hpair.first.date();
- temp.xact = xact;
temp.amount = hpair.second;
- temp.set_flags(ITEM_GENERATED | ITEM_TEMP);
temp.xdata().datetime = hpair.first;
-
- xact->add_post(&temp);
}
}
}
diff --git a/src/iterators.h b/src/iterators.h
index a1563539..8aa1b451 100644
--- a/src/iterators.h
+++ b/src/iterators.h
@@ -49,6 +49,7 @@
#include "xact.h"
#include "post.h"
#include "account.h"
+#include "temps.h"
namespace ledger {
@@ -172,9 +173,7 @@ protected:
journal_posts_iterator journal_posts;
xacts_iterator xacts;
xact_posts_iterator posts;
-
- std::list<post_t> post_temps;
- std::list<account_t> acct_temps;
+ temporaries_t temps;
xacts_list xact_temps;
public:
@@ -187,8 +186,6 @@ public:
}
virtual ~posts_commodities_iterator() throw() {
TRACE_DTOR(posts_commodities_iterator);
- foreach (xact_t * xact, xact_temps)
- checked_delete(xact);
}
void reset(journal_t& journal);
diff --git a/src/report.cc b/src/report.cc
index e6194541..62b54ad1 100644
--- a/src/report.cc
+++ b/src/report.cc
@@ -446,7 +446,7 @@ option_t<report_t> * report_t::lookup_option(const char * p)
OPT_CH(cleared);
break;
case 'D':
- OPT_CH(deviation);
+ OPT_CH(daily);
break;
case 'E':
OPT_CH(empty);
@@ -650,6 +650,7 @@ option_t<report_t> * report_t::lookup_option(const char * p)
OPT(unbudgeted);
else OPT(uncleared);
else OPT(unround);
+ else OPT(unsorted);
break;
case 'w':
OPT(weekly);
diff --git a/src/report.h b/src/report.h
index 31f65c4f..294af19a 100644
--- a/src/report.h
+++ b/src/report.h
@@ -290,6 +290,7 @@ public:
HANDLER(unbudgeted).report(out);
HANDLER(uncleared).report(out);
HANDLER(unround).report(out);
+ HANDLER(unsorted).report(out);
HANDLER(weekly).report(out);
HANDLER(wide).report(out);
HANDLER(yearly).report(out);
@@ -450,7 +451,7 @@ public:
parent->HANDLER(limit_).on(string("--current"), "date<=today");
});
- OPTION_(report_t, daily, DO() {
+ OPTION_(report_t, daily, DO() { // -D
parent->HANDLER(period_).on(string("--daily"), "daily");
});
@@ -463,7 +464,7 @@ public:
string("depth<=") + args.get<string>(1));
});
- OPTION_(report_t, deviation, DO() { // -D
+ OPTION_(report_t, deviation, DO() {
parent->HANDLER(display_total_)
.set_expr(string("--deviation"), "amount_expr-total_expr/count");
});
@@ -628,7 +629,32 @@ public:
});
OPTION(report_t, output_); // -o
- OPTION(report_t, pager_);
+
+ OPTION__
+ (report_t, pager_,
+ CTOR(report_t, pager_) {
+ if (! std::getenv("PAGER")) {
+ bool have_less = false;
+ if (exists(path("/opt/local/bin/less")) ||
+ exists(path("/usr/local/bin/less")) ||
+ exists(path("/usr/bin/less")))
+ have_less = true;
+
+ if (have_less) {
+ on(none, "less");
+ setenv("LESS", "--quit-if-one-screen -R", 0);
+ }
+ }
+ }
+ virtual void on_with(const optional<string>& whence, const value_t& text) {
+ string cmd(text.to_string());
+ if (cmd == "" || cmd == "false" || cmd == "off" ||
+ cmd == "none" || cmd == "no" || cmd == "disable")
+ option_t<report_t>::off();
+ else
+ option_t<report_t>::on_with(whence, text);
+ });
+
OPTION(report_t, payee_as_account);
OPTION_(report_t, pending, DO() { // -C
@@ -690,12 +716,12 @@ public:
" \"\") %(payee)%(xact.comment)\n"
" %(xact.uncleared ?"
" (cleared ? \"* \" : (pending ? \"! \" : \"\")) : \"\")"
- "%-34(account)"
- " %12(calculated ? \"\" : justify(scrub(amount), 12, -1, true))"
+ "%(calculated ? account : justify(account, 34, -1, false))"
+ "%(calculated ? \"\" : \" \" + justify(scrub(amount), 12, -1, true))"
"%(has_cost & !cost_calculated ?"
" \" @ \" + justify(scrub(abs(cost / amount)), 0) : \"\")"
"%(comment)\n%/"
- " %$7%$8 %$9%$A%$B\n%/\n");
+ " %$7%$8%$9%$A%$B\n%/\n");
});
OPTION_(report_t, quantity, DO() { // -O
@@ -821,6 +847,8 @@ public:
.set_expr(string("--unround"), "unrounded(total_expr)");
});
+ OPTION(report_t, unsorted);
+
OPTION_(report_t, weekly, DO() { // -W
parent->HANDLER(period_).on(string("--weekly"), "weekly");
});
diff --git a/src/session.cc b/src/session.cc
index b46d545e..2e728dd6 100644
--- a/src/session.cc
+++ b/src/session.cc
@@ -121,8 +121,16 @@ std::size_t session_t::read_journal(const path& pathname,
std::size_t session_t::read_data(const string& master_account)
{
- if (HANDLER(file_).data_files.empty())
- throw_(parse_error, "No journal file was specified (please use -f)");
+ if (HANDLER(file_).data_files.empty()) {
+ path file;
+ if (const char * home_var = std::getenv("HOME"))
+ file = path(home_var) / ".ledger";
+
+ if (! file.empty() && exists(file))
+ HANDLER(file_).data_files.push_back(file);
+ else
+ throw_(parse_error, "No journal file was specified (please use -f)");
+ }
std::size_t xact_count = 0;
diff --git a/src/temps.cc b/src/temps.cc
index a9ecc2a1..f2dee159 100644
--- a/src/temps.cc
+++ b/src/temps.cc
@@ -31,6 +31,9 @@
#include <system.hh>
+#include "xact.h"
+#include "post.h"
+#include "account.h"
#include "temps.h"
namespace ledger {
diff --git a/src/temps.h b/src/temps.h
index acd9cbd7..646f4dcd 100644
--- a/src/temps.h
+++ b/src/temps.h
@@ -46,10 +46,6 @@
#ifndef _TEMPS_H
#define _TEMPS_H
-#include "xact.h"
-#include "post.h"
-#include "account.h"
-
namespace ledger {
class temporaries_t
diff --git a/src/textual.cc b/src/textual.cc
index 26500596..4daecc79 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -1014,21 +1014,8 @@ post_t * instance_t::parse_post(char * line,
if (! diff.is_zero()) {
if (! post->amount.is_null()) {
diff -= post->amount;
- if (! diff.is_zero()) {
-#if 1
+ if (! diff.is_zero())
throw_(parse_error, _("Balance assertion off by %1") << diff);
-#else
- // This code, rather than issuing an error if a balance assignment
- // fails, creates a balancing transaction that causes the
- // assertion to be true.
- post_t * temp = new post_t(post->account, diff,
- ITEM_GENERATED | POST_CALCULATED);
- xact->add_post(temp);
-
- DEBUG("textual.parse", "line " << linenum << ": "
- << "Created balancing posting");
-#endif
- }
} else {
post->amount = diff;
DEBUG("textual.parse", "line " << linenum << ": "
diff --git a/src/times.h b/src/times.h
index 035d86cd..69e3af51 100644
--- a/src/times.h
+++ b/src/times.h
@@ -69,11 +69,11 @@ inline bool is_valid(const date_t& moment) {
extern optional<datetime_t> epoch;
#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
-#define CURRENT_TIME() \
- (epoch ? *epoch : boost::posix_time::microsec_clock::universal_time())
+#define TRUE_CURRENT_TIME() (boost::posix_time::microsec_clock::universal_time())
+#define CURRENT_TIME() (epoch ? *epoch : TRUE_CURRENT_TIME())
#else
-#define CURRENT_TIME() \
- (epoch ? *epoch : boost::posix_time::second_clock::universal_time())
+#define TRUE_CURRENT_TIME() (boost::posix_time::second_clock::universal_time())
+#define CURRENT_TIME() (epoch ? *epoch : TRUE_CURRENT_TIME())
#endif
#define CURRENT_DATE() \
(epoch ? epoch->date() : boost::gregorian::day_clock::universal_day())
diff --git a/src/utils.cc b/src/utils.cc
index 85a7aa46..c68737dc 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -190,8 +190,15 @@ static void trace_delete_func(void * ptr, const char * which)
i = freed_memory->find(ptr);
if (i != freed_memory->end())
VERIFY(! "Freeing a block of memory twice");
+#if 0
+ // There can be memory allocated by Boost or the standard library, which
+ // was allocated before memory tracing got turned on, that the system
+ // might free for some coincidental reason. As such, we can't rely on
+ // this check being valid. I've seen cases where processes ran to
+ // completion with it on, and then others where valid processes failed.
else
VERIFY(! "Freeing an unknown block of memory");
+#endif
memory_tracing_active = true;
return;
}
@@ -531,14 +538,15 @@ bool logger_func(log_level_t level)
{
if (! logger_has_run) {
logger_has_run = true;
- logger_start = CURRENT_TIME();
+ logger_start = TRUE_CURRENT_TIME();
IF_VERIFY()
*_log_stream << " TIME OBJSZ MEMSZ" << std::endl;
}
*_log_stream << std::right << std::setw(5)
- << (CURRENT_TIME() - logger_start).total_milliseconds() << "ms";
+ << (TRUE_CURRENT_TIME() -
+ logger_start).total_milliseconds() << "ms";
#if defined(VERIFY_ON)
IF_VERIFY() {
@@ -616,7 +624,7 @@ struct timer_t
bool active;
timer_t(log_level_t _level, std::string _description)
- : level(_level), begin(CURRENT_TIME()),
+ : level(_level), begin(TRUE_CURRENT_TIME()),
spent(time_duration(0, 0, 0, 0)),
description(_description), active(true) {}
};
@@ -637,7 +645,7 @@ void start_timer(const char * name, log_level_t lvl)
timers.insert(timer_map::value_type(name, timer_t(lvl, _log_buffer.str())));
} else {
assert((*i).second.description == _log_buffer.str());
- (*i).second.begin = CURRENT_TIME();
+ (*i).second.begin = TRUE_CURRENT_TIME();
(*i).second.active = true;
}
_log_buffer.str("");
@@ -657,7 +665,7 @@ void stop_timer(const char * name)
timer_map::iterator i = timers.find(name);
assert(i != timers.end());
- (*i).second.spent += CURRENT_TIME() - (*i).second.begin;
+ (*i).second.spent += TRUE_CURRENT_TIME() - (*i).second.begin;
(*i).second.active = false;
#if defined(VERIFY_ON)
@@ -682,7 +690,7 @@ void finish_timer(const char * name)
time_duration spent = (*i).second.spent;
if ((*i).second.active) {
- spent = CURRENT_TIME() - (*i).second.begin;
+ spent = TRUE_CURRENT_TIME() - (*i).second.begin;
(*i).second.active = false;
}
diff --git a/src/xact.cc b/src/xact.cc
index 6ea8d8f9..9f118ec2 100644
--- a/src/xact.cc
+++ b/src/xact.cc
@@ -49,16 +49,23 @@ xact_base_t::~xact_base_t()
{
TRACE_DTOR(xact_base_t);
- foreach (post_t * post, posts) {
- // If the posting is a temporary, it will be destructed when the
- // temporary is.
- if (! post->has_flags(ITEM_TEMP))
+ if (! has_flags(ITEM_TEMP)) {
+ foreach (post_t * post, posts) {
+ // If the posting is a temporary, it will be destructed when the
+ // temporary is.
+ assert(! post->has_flags(ITEM_TEMP));
checked_delete(post);
+ }
}
}
void xact_base_t::add_post(post_t * post)
{
+ // You can add temporary postings to transactions, but not real postings to
+ // temporary transactions.
+ if (! post->has_flags(ITEM_TEMP))
+ assert(! has_flags(ITEM_TEMP));
+
posts.push_back(post);
}
diff --git a/test/LedgerHarness.py b/test/LedgerHarness.py
index cc3b04cd..cd8beca8 100755
--- a/test/LedgerHarness.py
+++ b/test/LedgerHarness.py
@@ -48,9 +48,8 @@ class LedgerHarness:
if columns:
insert += ' --columns=80'
- command = re.sub('\$ledger',
- '%s%s --args-only' % (self.ledger, insert),
- command)
+ command = re.sub('\$ledger', '%s%s --args-only --no-color --pager=none' % \
+ (self.ledger, insert), command)
return Popen(command, shell=True, close_fds=True, env=env,
stdin=PIPE, stdout=PIPE, stderr=PIPE)
diff --git a/test/baseline/opt-by-payee.test b/test/baseline/opt-by-payee.test
index 2c70ecfb..ec8d0a73 100644
--- a/test/baseline/opt-by-payee.test
+++ b/test/baseline/opt-by-payee.test
@@ -192,29 +192,29 @@ reg --by-payee not @End
Expenses:Books $120.00
Assets:Cash
>>>1
-08-Apr-01 April Assets:Cash $-80.00 $-80.00
- Expenses:Books $80.00 0
-08-Aug-01 August Assets:Cash $-160.00 $-160.00
- Expenses:Books $160.00 0
-08-Dec-01 December Assets:Cash $-240.00 $-240.00
- Expenses:Books $240.00 0
-08-Feb-01 February Assets:Cash $-40.00 $-40.00
- Expenses:Books $40.00 0
08-Jan-01 January Assets:Cash $-20.00 $-20.00
Expenses:Books $20.00 0
-08-Jul-01 July Assets:Cash $-140.00 $-140.00
- Expenses:Books $140.00 0
-08-Jun-01 June Assets:Cash $-120.00 $-120.00
- Expenses:Books $120.00 0
+08-Feb-01 February Assets:Cash $-40.00 $-40.00
+ Expenses:Books $40.00 0
08-Mar-01 March Assets:Cash $-60.00 $-60.00
Expenses:Books $60.00 0
+08-Apr-01 April Assets:Cash $-80.00 $-80.00
+ Expenses:Books $80.00 0
08-May-01 May Assets:Cash $-100.00 $-100.00
Expenses:Books $100.00 0
-08-Nov-01 November Assets:Cash $-220.00 $-220.00
- Expenses:Books $220.00 0
-08-Oct-01 October Assets:Cash $-200.00 $-200.00
- Expenses:Books $200.00 0
+08-Jun-01 June Assets:Cash $-120.00 $-120.00
+ Expenses:Books $120.00 0
+08-Jul-01 July Assets:Cash $-140.00 $-140.00
+ Expenses:Books $140.00 0
+08-Aug-01 August Assets:Cash $-160.00 $-160.00
+ Expenses:Books $160.00 0
08-Sep-01 September Assets:Cash $-180.00 $-180.00
Expenses:Books $180.00 0
+08-Oct-01 October Assets:Cash $-200.00 $-200.00
+ Expenses:Books $200.00 0
+08-Nov-01 November Assets:Cash $-220.00 $-220.00
+ Expenses:Books $220.00 0
+08-Dec-01 December Assets:Cash $-240.00 $-240.00
+ Expenses:Books $240.00 0
>>>2
=== 0
diff --git a/test/baseline/opt-effective.test b/test/baseline/opt-effective.test
index 0ce08550..adf9f8af 100644
--- a/test/baseline/opt-effective.test
+++ b/test/baseline/opt-effective.test
@@ -14,8 +14,8 @@ reg --effective
>>>1
08-Jan-01 January Expenses:Books $10.00 $10.00
Assets:Cash $-10.00 0
-08-Feb-01 End of January Expenses:Books $10.00 $10.00
-08-Jan-01 End of January Assets:Cash $-10.00 0
+08-Jan-01 End of January Assets:Cash $-10.00 $-10.00
+08-Feb-01 End of January Expenses:Books $10.00 0
08-Feb-01 February Expenses:Books $20.00 $20.00
Assets:Cash $-20.00 0
>>>2
diff --git a/test/baseline/opt-forecast-while.test b/test/baseline/opt-forecast-while.test
index e3f1c57a..aebb127f 100644
--- a/test/baseline/opt-forecast-while.test
+++ b/test/baseline/opt-forecast-while.test
@@ -229,57 +229,57 @@ reg --now=2009/03/21 --forecast-while='total < $3500' books
09-Apr-01 April Expenses:Books $40.00 $1720.00
09-Apr-30 End of April Expenses:Books $40.00 $1760.00
09-May-01 May Expenses:Books $50.00 $1810.00
-09-May-31 End of May Expenses:Books $50.00 $1860.00
-09-Jun-01 June Expenses:Books $60.00 $1920.00
-09-Jun-30 End of June Expenses:Books $60.00 $1980.00
-09-Jul-01 July Expenses:Books $70.00 $2050.00
-09-Jul-31 End of July Expenses:Books $70.00 $2120.00
-09-Aug-01 August Expenses:Books $80.00 $2200.00
-09-Aug-31 End of August Expenses:Books $80.00 $2280.00
-09-Sep-01 September Expenses:Books $90.00 $2370.00
-09-Sep-30 End of September Expenses:Books $90.00 $2460.00
-09-Oct-01 October Expenses:Books $100.00 $2560.00
-09-Oct-31 End of October Expenses:Books $100.00 $2660.00
-09-Nov-01 November Expenses:Books $110.00 $2770.00
-09-Nov-30 End of November Expenses:Books $110.00 $2880.00
-09-Dec-01 December Expenses:Books $120.00 $3000.00
-09-Dec-31 End of December Expenses:Books $120.00 $3120.00
-09-Apr-01 Forecast transaction Expenses:Books $10.00 $3130.00
-09-May-01 Forecast transaction Expenses:Books $10.00 $3140.00
-09-Jun-01 Forecast transaction Expenses:Books $10.00 $3150.00
-09-Jul-01 Forecast transaction Expenses:Books $10.00 $3160.00
-09-Aug-01 Forecast transaction Expenses:Books $10.00 $3170.00
-09-Sep-01 Forecast transaction Expenses:Books $10.00 $3180.00
-09-Oct-01 Forecast transaction Expenses:Books $10.00 $3190.00
-09-Nov-01 Forecast transaction Expenses:Books $10.00 $3200.00
-09-Dec-01 Forecast transaction Expenses:Books $10.00 $3210.00
-10-Jan-01 Forecast transaction Expenses:Books $10.00 $3220.00
-10-Feb-01 Forecast transaction Expenses:Books $10.00 $3230.00
-10-Mar-01 Forecast transaction Expenses:Books $10.00 $3240.00
-10-Apr-01 Forecast transaction Expenses:Books $10.00 $3250.00
-10-May-01 Forecast transaction Expenses:Books $10.00 $3260.00
-10-Jun-01 Forecast transaction Expenses:Books $10.00 $3270.00
-10-Jul-01 Forecast transaction Expenses:Books $10.00 $3280.00
-10-Aug-01 Forecast transaction Expenses:Books $10.00 $3290.00
-10-Sep-01 Forecast transaction Expenses:Books $10.00 $3300.00
-10-Oct-01 Forecast transaction Expenses:Books $10.00 $3310.00
-10-Nov-01 Forecast transaction Expenses:Books $10.00 $3320.00
-10-Dec-01 Forecast transaction Expenses:Books $10.00 $3330.00
-11-Jan-01 Forecast transaction Expenses:Books $10.00 $3340.00
-11-Feb-01 Forecast transaction Expenses:Books $10.00 $3350.00
-11-Mar-01 Forecast transaction Expenses:Books $10.00 $3360.00
-11-Apr-01 Forecast transaction Expenses:Books $10.00 $3370.00
-11-May-01 Forecast transaction Expenses:Books $10.00 $3380.00
-11-Jun-01 Forecast transaction Expenses:Books $10.00 $3390.00
-11-Jul-01 Forecast transaction Expenses:Books $10.00 $3400.00
-11-Aug-01 Forecast transaction Expenses:Books $10.00 $3410.00
-11-Sep-01 Forecast transaction Expenses:Books $10.00 $3420.00
-11-Oct-01 Forecast transaction Expenses:Books $10.00 $3430.00
-11-Nov-01 Forecast transaction Expenses:Books $10.00 $3440.00
-11-Dec-01 Forecast transaction Expenses:Books $10.00 $3450.00
-12-Jan-01 Forecast transaction Expenses:Books $10.00 $3460.00
-12-Feb-01 Forecast transaction Expenses:Books $10.00 $3470.00
-12-Mar-01 Forecast transaction Expenses:Books $10.00 $3480.00
-12-Apr-01 Forecast transaction Expenses:Books $10.00 $3490.00
+09-May-01 Forecast transaction Expenses:Books $10.00 $1820.00
+09-May-31 End of May Expenses:Books $50.00 $1870.00
+09-Jun-01 June Expenses:Books $60.00 $1930.00
+09-Jun-01 Forecast transaction Expenses:Books $10.00 $1940.00
+09-Jun-30 End of June Expenses:Books $60.00 $2000.00
+09-Jul-01 July Expenses:Books $70.00 $2070.00
+09-Jul-01 Forecast transaction Expenses:Books $10.00 $2080.00
+09-Jul-31 End of July Expenses:Books $70.00 $2150.00
+09-Aug-01 August Expenses:Books $80.00 $2230.00
+09-Aug-01 Forecast transaction Expenses:Books $10.00 $2240.00
+09-Aug-31 End of August Expenses:Books $80.00 $2320.00
+09-Sep-01 September Expenses:Books $90.00 $2410.00
+09-Sep-01 Forecast transaction Expenses:Books $10.00 $2420.00
+09-Sep-30 End of September Expenses:Books $90.00 $2510.00
+09-Oct-01 October Expenses:Books $100.00 $2610.00
+09-Oct-01 Forecast transaction Expenses:Books $10.00 $2620.00
+09-Oct-31 End of October Expenses:Books $100.00 $2720.00
+09-Nov-01 November Expenses:Books $110.00 $2830.00
+09-Nov-01 Forecast transaction Expenses:Books $10.00 $2840.00
+09-Nov-30 End of November Expenses:Books $110.00 $2950.00
+09-Dec-01 December Expenses:Books $120.00 $3070.00
+09-Dec-01 Forecast transaction Expenses:Books $10.00 $3080.00
+09-Dec-31 End of December Expenses:Books $120.00 $3200.00
+10-Jan-01 Forecast transaction Expenses:Books $10.00 $3210.00
+10-Feb-01 Forecast transaction Expenses:Books $10.00 $3220.00
+10-Mar-01 Forecast transaction Expenses:Books $10.00 $3230.00
+10-Apr-01 Forecast transaction Expenses:Books $10.00 $3240.00
+10-May-01 Forecast transaction Expenses:Books $10.00 $3250.00
+10-Jun-01 Forecast transaction Expenses:Books $10.00 $3260.00
+10-Jul-01 Forecast transaction Expenses:Books $10.00 $3270.00
+10-Aug-01 Forecast transaction Expenses:Books $10.00 $3280.00
+10-Sep-01 Forecast transaction Expenses:Books $10.00 $3290.00
+10-Oct-01 Forecast transaction Expenses:Books $10.00 $3300.00
+10-Nov-01 Forecast transaction Expenses:Books $10.00 $3310.00
+10-Dec-01 Forecast transaction Expenses:Books $10.00 $3320.00
+11-Jan-01 Forecast transaction Expenses:Books $10.00 $3330.00
+11-Feb-01 Forecast transaction Expenses:Books $10.00 $3340.00
+11-Mar-01 Forecast transaction Expenses:Books $10.00 $3350.00
+11-Apr-01 Forecast transaction Expenses:Books $10.00 $3360.00
+11-May-01 Forecast transaction Expenses:Books $10.00 $3370.00
+11-Jun-01 Forecast transaction Expenses:Books $10.00 $3380.00
+11-Jul-01 Forecast transaction Expenses:Books $10.00 $3390.00
+11-Aug-01 Forecast transaction Expenses:Books $10.00 $3400.00
+11-Sep-01 Forecast transaction Expenses:Books $10.00 $3410.00
+11-Oct-01 Forecast transaction Expenses:Books $10.00 $3420.00
+11-Nov-01 Forecast transaction Expenses:Books $10.00 $3430.00
+11-Dec-01 Forecast transaction Expenses:Books $10.00 $3440.00
+12-Jan-01 Forecast transaction Expenses:Books $10.00 $3450.00
+12-Feb-01 Forecast transaction Expenses:Books $10.00 $3460.00
+12-Mar-01 Forecast transaction Expenses:Books $10.00 $3470.00
+12-Apr-01 Forecast transaction Expenses:Books $10.00 $3480.00
+12-May-01 Forecast transaction Expenses:Books $10.00 $3490.00
>>>2
=== 0
diff --git a/test/baseline/opt-lot-dates.test b/test/baseline/opt-lot-dates.test
index bf6dee0b..2415fb27 100644
--- a/test/baseline/opt-lot-dates.test
+++ b/test/baseline/opt-lot-dates.test
@@ -1,4 +1,4 @@
-reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-dates
+reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-dates --unsorted
<<<
C 1.00s = 100c
C 1.00G = 100s
diff --git a/test/baseline/opt-lot-prices.test b/test/baseline/opt-lot-prices.test
index 22a792cc..22aa5ab5 100644
--- a/test/baseline/opt-lot-prices.test
+++ b/test/baseline/opt-lot-prices.test
@@ -1,4 +1,4 @@
-reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-prices
+reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-prices --unsorted
<<<
C 1.00s = 100c
C 1.00G = 100s
diff --git a/test/baseline/opt-lots.test b/test/baseline/opt-lots.test
index 0dd331f7..916a2b2e 100644
--- a/test/baseline/opt-lots.test
+++ b/test/baseline/opt-lots.test
@@ -1,4 +1,4 @@
-reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lots
+reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lots --unsorted
<<<
C 1.00s = 100c
C 1.00G = 100s
diff --git a/test/baseline/opt-lots_basis.test b/test/baseline/opt-lots_basis.test
index d392fe33..51235473 100644
--- a/test/baseline/opt-lots_basis.test
+++ b/test/baseline/opt-lots_basis.test
@@ -871,12 +871,6 @@ D 1.00G
Expenses:Fees:Mail 30c 1.50G
Expenses:Fees:Mail 30c 1.51G
Assets:Tajer -1.51G 0
-06-Mar-27 Player Assets:Tajer 160.00G 160.00G
- Assets:Tajer:Items -160.00G 0
- Expenses:Capital Loss 40.00G 40.00G
- Equity:Capital Losses -40.00G 0
-06-Mar-27 Player Expenses:Fees:Mail 30c 30c
- Assets:Tajer -30c 0
06-Mar-26 Player Expenses:Items 54.00G 54.00G
Expenses:Items 10.00G 64.00G
Expenses:Fees:Bank 10.00G 74.00G
@@ -884,6 +878,12 @@ D 1.00G
Expenses:Fees:Mail 3.30s 74.10G
Expenses:Fees:Mail 30c 74.10G
Assets:Tajer -74.10G 0
+06-Mar-27 Player Assets:Tajer 160.00G 160.00G
+ Assets:Tajer:Items -160.00G 0
+ Expenses:Capital Loss 40.00G 40.00G
+ Equity:Capital Losses -40.00G 0
+06-Mar-27 Player Expenses:Fees:Mail 30c 30c
+ Assets:Tajer -30c 0
06-Apr-01 Auction House Assets:Tajer:Items 155.00G 155.00G
Assets:Tajer -155.00G 0
>>>2
diff --git a/test/baseline/opt-lots_basis_base.test b/test/baseline/opt-lots_basis_base.test
index e3aca02d..2fa1fdb1 100644
--- a/test/baseline/opt-lots_basis_base.test
+++ b/test/baseline/opt-lots_basis_base.test
@@ -872,12 +872,6 @@ D 1.00G
Expenses:Fees:Mail 30c 15030c
Expenses:Fees:Mail 30c 15060c
Assets:Tajer -15060c 0
-06-Mar-27 Player Assets:Tajer 1600000c 1600000c
- Assets:Tajer:Items -1600000c 0
- Expenses:Capital Loss 400000c 400000c
- Equity:Capital Losses -400000c 0
-06-Mar-27 Player Expenses:Fees:Mail 30c 30c
- Assets:Tajer -30c 0
06-Mar-26 Player Expenses:Items 540000c 540000c
Expenses:Items 100000c 640000c
Expenses:Fees:Bank 100000c 740000c
@@ -885,6 +879,12 @@ D 1.00G
Expenses:Fees:Mail 330c 740960c
Expenses:Fees:Mail 30c 740990c
Assets:Tajer -740990c 0
+06-Mar-27 Player Assets:Tajer 1600000c 1600000c
+ Assets:Tajer:Items -1600000c 0
+ Expenses:Capital Loss 400000c 400000c
+ Equity:Capital Losses -400000c 0
+06-Mar-27 Player Expenses:Fees:Mail 30c 30c
+ Assets:Tajer -30c 0
06-Apr-01 Auction House Assets:Tajer:Items 1550000c 1550000c
Assets:Tajer -1550000c 0
>>>2
diff --git a/test/baseline/opt-strict.test b/test/baseline/opt-strict.test
index a0e593b2..1917d946 100644
--- a/test/baseline/opt-strict.test
+++ b/test/baseline/opt-strict.test
@@ -14,10 +14,10 @@ reg --strict
>>>1
07-Feb-02 Foo Expenses:Food $10.00 $10.00
Assets:Cash $-10.00 0
-07-Feb-03 Bar Expenses:Food $20.00 $20.00
- Assets:Cash $-20.00 0
07-Feb-02 Baz Expenses:Foodx $30.00 $30.00
Assets:Cash $-30.00 0
+07-Feb-03 Bar Expenses:Food $20.00 $20.00
+ Assets:Cash $-20.00 0
>>>2
Warning: "$FILE", line 10: Unknown account 'Expenses:Foodx'
=== 0
diff --git a/test/regress/793F6BF0.test b/test/regress/793F6BF0.test
index a4e1234c..754ddca3 100644
--- a/test/regress/793F6BF0.test
+++ b/test/regress/793F6BF0.test
@@ -47,6 +47,6 @@ N $
>>>1
2009/03/15 Book Store
Expenses:Books $10.00
- Liabilities:MasterCard
+ Liabilities:MasterCard
>>>2
=== 0
diff --git a/test/regress/B68FFB0D.test b/test/regress/B68FFB0D.test
index 3a43df4c..2dd2086c 100644
--- a/test/regress/B68FFB0D.test
+++ b/test/regress/B68FFB0D.test
@@ -10,6 +10,6 @@ D $1,000.00
2009/01/01 Sample
assets 134.123 FOO @ $8.88
assets 100 BAR @ $8.88
- equity
+ equity
>>>2
=== 0