//////////////////////////////////////////////////////////////////////////////// // task - a command line task list manager. // // Copyright 2006 - 2009, Paul Beckingham. // All rights reserved. // // 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, write to the // // Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, // Boston, MA // 02110-1301 // USA // //////////////////////////////////////////////////////////////////////////////// #include #include #include "main.h" #include "test.h" Context context; //////////////////////////////////////////////////////////////////////////////// void get (std::vector & pending, std::vector & completed) { TDB tdb; tdb.location ("."); tdb.lock (); tdb.loadPending (pending, context.filter); tdb.loadCompleted (completed, context.filter); tdb.unlock (); } //////////////////////////////////////////////////////////////////////////////// int main (int argc, char** argv) { UnitTest t (22); try { // Remove any residual test file. unlink ("./pending.data"); unlink ("./completed.data"); // Try reading an empty database. Filter filter; std::vector all; std::vector pending; std::vector completed; get (pending, completed); t.ok (pending.size () == 0, "TDB Read empty pending"); t.ok (completed.size () == 0, "TDB Read empty completed"); // Add without commit. TDB tdb; tdb.location ("."); tdb.lock (); Task task ("[name:\"value\"]"); tdb.add (task); tdb.unlock (); pending.clear (); completed.clear (); get (pending, completed); t.ok (pending.size () == 0, "TDB add -> no commit -> empty"); t.ok (completed.size () == 0, "TDB add -> no commit -> empty"); // Add with commit. tdb.lock (); tdb.add (task); tdb.commit (); tdb.unlock (); get (pending, completed); t.ok (pending.size () == 1, "TDB add -> commit -> saved"); t.is (pending[0].get ("name"), "value", "TDB load name=value"); t.is (pending[0].id, 1, "TDB load verification id=1"); t.ok (completed.size () == 0, "TDB add -> commit -> saved"); // Update with commit. tdb.lock (); pending.clear (); completed.clear (); tdb.load (all, context.filter); all[0].set ("name", "value2"); tdb.update (all[0]); tdb.commit (); tdb.unlock (); pending.clear (); completed.clear (); get (pending, completed); t.ok (all.size () == 1, "TDB update -> commit -> saved"); t.is (all[0].get ("name"), "value2", "TDB load name=value2"); t.is (all[0].id, 1, "TDB load verification id=1"); // GC. tdb.lock (); all.clear (); tdb.loadPending (all, context.filter); all[0].setStatus (Task::completed); tdb.update (all[0]); Task t2 ("[foo:\"bar\" status:\"pending\"]"); tdb.add (t2); tdb.commit (); tdb.unlock (); pending.clear (); completed.clear (); get (pending, completed); t.is (pending.size (), (size_t)2, "TDB before gc pending #2"); t.is (pending[0].id, 1, "TDB before gc pending id 1"); t.is (pending[0].getStatus (), Task::completed, "TDB before gc pending status completed"); t.is (pending[1].id, 2, "TDB before gc pending id 2"); t.is (pending[1].getStatus (), Task::pending, "TDB before gc pending status pending"); t.is (completed.size (), (size_t)0, "TDB before gc completed 0"); tdb.gc (); pending.clear (); completed.clear (); get (pending, completed); t.is (pending.size (), (size_t)1, "TDB after gc pending #1"); t.is (pending[0].id, 1, "TDB after gc pending id 2"); t.is (pending[0].getStatus (), Task::pending, "TDB after gc pending status pending"); t.is (completed.size (), (size_t)1, "TDB after gc completed #1"); t.is (completed[0].getStatus (), Task::completed, "TDB after gc completed status completed"); } catch (std::string& error) { t.diag (error); return -1; } catch (...) { t.diag ("Unknown error."); return -2; } /* unlink ("./pending.data"); unlink ("./completed.data"); */ return 0; } ////////////////////////////////////////////////////////////////////////////////