From 061bf4882ee77590cbdb2fc86d0b6f43a6c06e8b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 7 Jul 2013 09:07:10 -0400 Subject: [PATCH] Bug #1300 - Encode/decode pairing is now properly balanced. --- ChangeLog | 1 + src/Task.cpp | 13 ++++++++----- test/roundtrip.t | 33 +++++++++++++++++++-------------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index a34fd80c4..bd50240c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -50,6 +50,7 @@ Bugs Wilk). + #1263 The 'waiting' report properly lists only pending tasks with a wait date (thanks to Fidel Mato). + + #1300 Encode/decode pairing is now properly balanced. + Fixed bug so that 'limit:page' now considers footnote messages. ------ old releases ------------------------------ diff --git a/src/Task.cpp b/src/Task.cpp index 067920a1f..4de6055c7 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -461,6 +461,7 @@ void Task::parse (const std::string& input) } //////////////////////////////////////////////////////////////////////////////// +// Note that all fields undergo encode/decode. void Task::parseJSON (const std::string& line) { // Parse the whole thing. @@ -477,7 +478,6 @@ void Task::parseJSON (const std::string& line) { // If the attribute is a recognized column. std::string type = Task::attributes[i->first]; - if (type != "") { // Any specified id is ignored. @@ -509,6 +509,10 @@ void Task::parseJSON (const std::string& line) } } + // Strings are decoded. + else if (type == "string") + set (i->first, json::decode (unquoteText (i->second->dump ()))); + // Other types are simply added. else set (i->first, unquoteText (i->second->dump ())); @@ -540,8 +544,7 @@ void Task::parseJSON (const std::string& line) throw format (STRING_TASK_NO_DESC, line); std::string name = "annotation_" + Date (when->_data).toEpochString (); - - annos.insert (std::make_pair (name, what->_data)); + annos.insert (std::make_pair (name, json::decode (what->_data))); } setAnnotations (annos); @@ -559,7 +562,7 @@ void Task::parseJSON (const std::string& line) << "' --> preserved\n"; context.debug (message.str ()); #endif - set (i->first, unquoteText (i->second->dump ())); + set (i->first, json::decode (unquoteText (i->second->dump ()))); } } } @@ -1964,4 +1967,4 @@ bool Task::next_mod_group (const A3& input, Arg& arg, unsigned int& pos) return false; } -//////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////// diff --git a/test/roundtrip.t b/test/roundtrip.t index 0153d56dd..802a68af5 100755 --- a/test/roundtrip.t +++ b/test/roundtrip.t @@ -28,7 +28,7 @@ use strict; use warnings; -use Test::More tests => 4; +use Test::More tests => 5; # Create the rc file. if (open my $fh, '>', 'roundtrip.rc') @@ -43,36 +43,41 @@ if (open my $fh, '>', 'roundtrip.rc') } # Add two tasks. -qx{../src/task rc:roundtrip.rc add priority:H project:A one 2>&1}; +qx{../src/task rc:roundtrip.rc add priority:H project:A one/1 2>&1}; qx{../src/task rc:roundtrip.rc add +tag1 +tag2 two 2>&1}; # trip 1. -qx{../src/task rc:roundtrip.rc export > ./roundtrip.txt 2>&1}; +qx{../src/task rc:roundtrip.rc export > ./roundtrip1.json 2>&1}; unlink 'pending.data', 'completed.data', 'undo.data'; -qx{../src/task rc:roundtrip.rc rc.debug:1 import ./roundtrip.txt 2>&1}; +qx{../src/task rc:roundtrip.rc rc.debug:1 import ./roundtrip1.json 2>&1}; # trip 2. -qx{../src/task rc:roundtrip.rc export > ./roundtrip.txt 2>&1}; +qx{../src/task rc:roundtrip.rc export > ./roundtrip2.json 2>&1}; unlink 'pending.data', 'completed.data', 'undo.data'; -qx{../src/task rc:roundtrip.rc import ./roundtrip.txt 2>&1}; +qx{../src/task rc:roundtrip.rc import ./roundtrip2.json 2>&1}; # Exammine. # ID Project Pri Added Started Due Recur Countdown Age Deps Tags Description # -- ------- --- -------- ------- --- ----- --------- --- ---- --------- --------- -# 1 A H 8/7/2010 - one +# 1 A H 8/7/2010 - one/1 # 2 8/7/2010 - tag1 tag2 two my $output = qx{../src/task rc:roundtrip.rc long 2>&1}; -like ($output, qr/1.+A.+H.+\d+\/\d+\/\d+.+(?:-|\d+).+one/, '2 round trips task 1 identical'); +like ($output, qr/1.+A.+H.+\d+\/\d+\/\d+.+(?:-|\d+).+one\/1/, '2 round trips task 1 identical'); like ($output, qr/2.+\d+\/\d+\/\d+.+(?:-|\d+).+tag1\stag2\stwo/, '2 round trips task 2 identical'); +# Compare the actual JSON files. +$output = qx{diff ./roundtrip1.json ./roundtrip2.json 2>&1}; +like ($output, qr/^$/, 'JSON files roundtrip1.json and roundtrip2.json identical'); + # Cleanup. -unlink qw(roundtrip.txt pending.data completed.data undo.data backlog.data roundtrip.rc); -ok (! -r 'roundtrip.txt' && - ! -r 'pending.data' && - ! -r 'completed.data' && - ! -r 'undo.data' && - ! -r 'backlog.data' && +unlink qw(roundtrip1.json roundtrip2.json pending.data completed.data undo.data backlog.data roundtrip.rc); +ok (! -r 'roundtrip1.json' && + ! -r 'roundtrip2.json' && + ! -r 'pending.data' && + ! -r 'completed.data' && + ! -r 'undo.data' && + ! -r 'backlog.data' && ! -r 'roundtrip.rc', 'Cleanup'); exit 0;