aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am31
-rw-r--r--test/README121
-rwxr-xr-xtest/appointment-001.sh19
-rw-r--r--test/data/apts660
-rw-r--r--test/data/conf75
-rw-r--r--test/data/todo197
-rwxr-xr-xtest/day-001.sh14
-rwxr-xr-xtest/day-002.sh39
-rwxr-xr-xtest/day-003.sh14
-rwxr-xr-xtest/next-001.sh17
-rwxr-xr-xtest/range-001.sh19
-rwxr-xr-xtest/range-002.sh37
-rwxr-xr-xtest/range-003.sh14
-rwxr-xr-xtest/run-test-001.sh7
-rwxr-xr-xtest/run-test-002.sh9
-rw-r--r--test/run-test.c229
-rwxr-xr-xtest/search-001.sh26
-rwxr-xr-xtest/todo-001.sh12
-rwxr-xr-xtest/todo-002.sh10
-rwxr-xr-xtest/todo-003.sh12
-rwxr-xr-xtest/true-001.sh3
21 files changed, 1565 insertions, 0 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
new file mode 100644
index 0000000..85c8a1d
--- /dev/null
+++ b/test/Makefile.am
@@ -0,0 +1,31 @@
+AUTOMAKE_OPTIONS = foreign
+
+TESTS = \
+ true-001.sh \
+ run-test-001.sh \
+ run-test-002.sh \
+ todo-001.sh \
+ todo-002.sh \
+ todo-003.sh \
+ day-001.sh \
+ day-002.sh \
+ day-003.sh \
+ range-001.sh \
+ range-002.sh \
+ range-003.sh \
+ appointment-001.sh \
+ next-001.sh \
+ search-001.sh
+
+TESTS_ENVIRONMENT = \
+ CALCURSE='$(top_builddir)/src/calcurse' \
+ DATA_DIR='$(top_srcdir)/test/data/'
+
+AM_CFLAGS = -std=c99 -pedantic -D_POSIX_C_SOURCE=200809L
+
+check_PROGRAMS = run-test
+check_SCRIPTS = $(TESTS)
+
+run_test_SOURCES = run-test.c
+
+EXTRA_DIST = $(TESTS) data/apts data/conf data/todo
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..f0fd06a
--- /dev/null
+++ b/test/README
@@ -0,0 +1,121 @@
+calcurse Test Suite
+===================
+
+This directory holds of a couple of test cases and some helpers to simplify the
+task of creating new tests. Test cases are intended to test a specified set of
+behaviors and to avoid reintroduction of bugs that have already been fixed. The
+idea is that a new test should be added for each bug report that is received
+and for each bug that is fixed in the development branch.
+
+Running tests
+-------------
+
+The easiest way to run tests is running `make check`. This will prepare and
+compile all needed components and start all test cases. A summary is displayed
+when all tests are finished.
+
+You can also run tests manually. Test cases are usually shell scripts or
+binaries. To run an individual test, just invoke the corresponding executable.
+Note that some tests require the `CALCURSE` and `DATA_DIR` environment
+variables to be set, where `CALCURSE` should point to a valid calcurse binary
+and `DATA_DIR` should point to a valid data directory. We usually use the data
+directory `data/`, which is contained in the `test/` directory, for test cases:
+
+ $ CALCURSE=../src/calcurse DATA_DIR=data/ ./next-001.sh
+ Running ./next-001.sh... ok
+
+Passing another data directory might cause some failures since many tests are
+adapted for the `test/` directory provided by the test suite:
+
+ $ CALCURSE=../src/calcurse DATA_DIR="$HOME/.calcurse/" ./next-001.sh
+ Running ./next-001.sh... FAIL
+
+Writing tests
+-------------
+
+Writing test cases is as simple as creating a new shell script and adding some
+test code. Success and failure are reported by setting the exit status. Setting
+the exit status to `0` indicates success, a non-zero value indicates failure
+(which reflects the usual exit code semantics of POSIX systems).
+
+To enable a test, just add it to the `TESTS` variable in `test/Makefile.am`. If
+your test case is written in a non-interpretable language, you may need to add
+some compilation directives as well. Please note that we only accept
+POSIX-compatible shell scripts and C in mainline, so please avoid using other
+languages if you plan to get your test case integrated upstream.
+
+If your test case invokes the calcurse binary, please continue reading the
+following sections, also.
+
+The `run-test` helper
+---------------------
+
+The `run-test` helper is a simple C program that makes writing script-based
+test cases much easier. Tests for the calcurse command line interface usually
+invoke the calcurse binary with some special command line options and compare
+the output with a hardcoded set of expected results. Unfortunately, comparing
+the output of two commands is not exactly easy in POSIX shell: this is where
+the `run-test` helper comes in handy.
+
+If you run the `run-test` helper, you can pass one or more executable files as
+parameters. The helper then invokes each of the specified scripts twice: Once
+passing `actual` as a command line parameter and once passing `expected`. It
+then compares the outputs of both invocations and checks if they are equal or
+not. If the `actual`/`expected` outputs differ for one of the programs passed
+to `run-test`, if displays `FAIL` and exits with a non-zero exit status. It
+returns success otherwise.
+
+Here is a simple example on how to use `run-test`:
+
+ #!/bin/sh
+
+ if [ "$1" = 'actual' ]; then
+ echo 'obrocodobro' | sed 's/o/a/g'
+ elif [ "$1" = 'expected' ]; then
+ echo 'abracadabra'
+ else
+ ./run-test "$0"
+ fi
+
+If the script is run without any parameters, it simply invokes `run-test`,
+passing itself as a command line parameter (see the `else` branch). `run-test`
+then reruns the script, passing `actual` as the first parameter. This starts
+the actual test (see the `if` branch). It reruns the script a second time,
+passing `expected` as the first parameter which results in the script printing
+the expected result for this test (see the `elif` branch). Finally, `run-test`
+compares both outputs, prints a message indicating whether they are equal and
+sets the exit status accordingly. This exit status is then passed on to the
+original instance of the test script and returned since `./run-test "$0"` is
+the last command that is run if the script is invoked without any parameters.
+
+You should stick to this strategy whenever you want to check the output of a
+non-interactive calcurse instance in a test. Check the following tests for some
+more examples:
+
+* `todo-001.sh`
+* `todo-002.sh`
+* `todo-003.sh`
+
+Using libfaketime
+-----------------
+
+Some tests might require faking current date and time. We currently use
+libfaketime to achieve this. Check the following files for examples:
+
+* `appointment-001.sh`
+* `next-001.sh`
+* `range-001.sh`
+* `range-002.sh`
+* `range-003.sh`
+
+NOTE: Please do not forget to check for libfaketime presence at the beginning
+of your test. Otherwise, your test is likely to fail on systems that are not
+supported by libfaketime.
+
+Additional notes
+----------------
+
+Most tests, that invoke the calcurse binary, pass the `--read-only` parameter
+to make sure the data directory is not modified by calcurse, preventing
+unexpected side effects. Please follow this guideline if you plan to submit
+your patch upstream.
diff --git a/test/appointment-001.sh b/test/appointment-001.sh
new file mode 100755
index 0000000..27813b3
--- /dev/null
+++ b/test/appointment-001.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '2011-02-25 23:42' "$CALCURSE" --read-only -D "$DATA_DIR" -a
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+02/25/11:
+ * Socket ghastlier
+ - ..:.. -> ..:..
+ Covenants useful smoker's
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/data/apts b/test/data/apts
new file mode 100644
index 0000000..33de89b
--- /dev/null
+++ b/test/data/apts
@@ -0,0 +1,660 @@
+12/27/1911 @ 01:18 -> 12/29/1911 @ 18:52 |Outsmarts Leoncavallo's daunting
+02/10/1912 @ 20:36 -> 02/14/1912 @ 21:46 |Relieving uncleanliest footnoting unscrewed
+04/28/1912 @ 02:54 -> 04/30/1912 @ 16:47 |Visit repel egotism antidepressant Idahos
+07/10/1912 @ 17:47 -> 07/13/1912 @ 03:18 |Impersonating integer broils blame
+09/27/1912 @ 16:07 -> 10/02/1912 @ 07:24 |Wedgwood's dilating
+10/28/1913 @ 11:18 -> 11/01/1913 @ 17:07 |Deviation perspire
+12/23/1913 @ 07:25 -> 12/23/1913 @ 17:46 |Nintendo stapler jellyfish vaporous
+09/08/1914 @ 07:41 -> 09/11/1914 @ 18:15 |Panelling
+03/22/1915 @ 07:21 -> 03/25/1915 @ 20:57 |Veritable intercom's
+08/12/1915 @ 23:57 -> 08/16/1915 @ 23:02 |Meddlers presides prefabricates Disneyland's
+08/27/1915 @ 07:34 -> 08/29/1915 @ 23:36 |EverReady's tramping patches napped
+06/16/1916 @ 15:56 -> 06/19/1916 @ 15:05 |Rediscovery's Barnaby's lummox's shan't
+06/19/1916 @ 15:35 -> 06/23/1916 @ 09:00 |Lu gastric Valenti bankruptcy's intents
+10/01/1916 @ 08:13 -> 10/02/1916 @ 11:56 |Appropriately Potemkin's hassocks snappier Millay
+12/12/1916 @ 12:04 -> 12/15/1916 @ 08:31 |Thefts infrastructure's chides
+01/20/1917 @ 07:12 -> 01/20/1917 @ 12:19 |Outfit Hannah
+07/22/1917 @ 04:28 -> 07/22/1917 @ 10:04 |Shallowness's tap's enjoining chewy obligation's
+07/30/1917 @ 08:34 -> 08/04/1917 @ 11:53 |Stephan
+03/25/1918 @ 11:14 -> 03/29/1918 @ 14:57 |Butterfat Cherry's aviators albs fattier
+01/26/1919 @ 17:43 -> 01/26/1919 @ 23:18 |Creakiest cocking disporting polyhedron auditions
+03/21/1919 @ 19:33 -> 03/23/1919 @ 03:37 |Stethoscopes Singer's vermouth pincers
+04/01/1919 @ 23:51 -> 04/03/1919 @ 09:19 |Doughtiest
+05/14/1919 @ 05:55 -> 05/16/1919 @ 22:47 |Aviation's O'Neill welding
+06/21/1919 @ 01:48 -> 06/22/1919 @ 01:07 |Marquis grid sprinkling's
+06/30/1919 @ 13:48 -> 07/03/1919 @ 06:08 |Barracudas
+07/05/1919 @ 09:09 -> 07/10/1919 @ 10:56 |Lea's mullion remove connects collation's
+09/07/1919 @ 20:52 -> 09/11/1919 @ 17:11 |Alps hotshot
+01/21/1921 @ 19:57 -> 01/22/1921 @ 18:42 |Gunk
+05/01/1921 @ 20:50 -> 05/01/1921 @ 20:57 |Citibank
+06/19/1921 @ 08:01 -> 06/22/1921 @ 10:20 |Coziness sloshed retyping southwards intensified
+08/02/1921 @ 16:46 -> 08/04/1921 @ 22:17 |Malawi's undefinable Copacabana hungered
+08/04/1921 @ 00:58 -> 08/04/1921 @ 09:07 |Bagpipes dole shores
+01/16/1922 @ 13:01 -> 01/17/1922 @ 14:32 |Gravies
+06/23/1922 @ 13:56 -> 06/25/1922 @ 02:12 |Funnelling creation's regionalisms skivvied jaunted
+07/08/1922 @ 17:13 -> 07/09/1922 @ 08:03 |Alleluia Freetown's
+07/14/1922 @ 05:26 -> 07/19/1922 @ 11:28 |Pittsburgh's joined overbearing propellant's
+03/07/1923 @ 17:37 -> 03/09/1923 @ 22:27 |Impulsion Sheffield's Swanson's
+05/17/1923 @ 13:01 -> 05/19/1923 @ 04:23 |Disconnections
+07/06/1923 @ 18:38 -> 07/09/1923 @ 13:26 |Sightseeing yarns
+08/07/1923 @ 17:38 -> 08/11/1923 @ 03:34 |Tc's
+12/20/1923 @ 11:05 -> 12/21/1923 @ 09:31 |Chanter snuffs Hymen
+03/19/1924 @ 10:11 -> 03/20/1924 @ 04:34 |Powder imagines devastating
+07/11/1924 @ 18:34 -> 07/13/1924 @ 09:32 |Manley's Telemann
+01/24/1926 @ 09:39 -> 01/28/1926 @ 00:32 |Freebases improvidence maggot gestation's
+06/30/1926 @ 17:36 -> 07/01/1926 @ 22:54 |Antibody poor Atlantes
+07/24/1926 @ 13:52 -> 07/28/1926 @ 14:48 |Piety's
+08/19/1926 @ 21:46 -> 08/21/1926 @ 00:07 |Incur hearties outlining sensationalists
+09/15/1926 @ 09:13 -> 09/17/1926 @ 08:27 |Theocritus's
+03/17/1927 @ 05:31 -> 03/17/1927 @ 17:55 |Closets scrape addictive consummations
+05/27/1927 @ 12:40 -> 05/28/1927 @ 10:43 |Pharaoh Montoya bloods acclamation yesteryear's
+06/05/1927 @ 15:47 -> 06/07/1927 @ 00:26 |Pawned subplot's Dzerzhinsky
+11/18/1927 @ 13:33 -> 11/21/1927 @ 19:10 |Splurges
+06/05/1928 @ 13:34 -> 06/06/1928 @ 17:32 |Auricle's precognition cytoplasm
+07/02/1928 @ 05:14 -> 07/03/1928 @ 00:20 |Saboteurs crassest moderator's waif's fear's
+10/24/1928 @ 02:11 -> 10/28/1928 @ 16:48 |Restorers indifferent Schwinger's Valentino's bowing
+11/01/1928 @ 09:39 -> 11/05/1928 @ 02:18 |Dalmatians lionizing colonist hustle tawdrier
+11/05/1928 @ 06:20 -> 11/08/1928 @ 17:22 |Boob's pied sorest
+12/28/1928 @ 01:34 -> 12/28/1928 @ 01:43 |Intermezzo's cockerel
+04/30/1929 @ 02:40 -> 05/02/1929 @ 13:42 |Unnecessarily imploring rebut Cuvier
+08/29/1929 @ 08:55 -> 08/31/1929 @ 09:04 |Motherland distances cornbread reflect
+09/16/1929 @ 11:58 -> 09/19/1929 @ 18:10 |Misstate ghoul
+05/13/1930 @ 20:14 -> 05/15/1930 @ 01:57 |Groan's crabbed fifty's Mugabe
+09/07/1930 @ 21:39 -> 09/11/1930 @ 14:25 |Surpasses received Kidd Midway consoled
+11/06/1930 @ 05:01 -> 11/09/1930 @ 15:37 |Seafaring ravined petunia's babe's hose
+06/24/1931 @ 20:40 -> 06/28/1931 @ 08:56 |Stiffening hodgepodges embarkation's
+07/18/1931 @ 00:40 -> 07/21/1931 @ 21:13 |Colony explosions Gienah's
+11/07/1931 @ 09:33 -> 11/10/1931 @ 07:30 |Intoxicant's Rex amphetamine's curacy's cardiologists
+11/28/1931 @ 13:19 -> 11/29/1931 @ 10:56 |Sawdusting vicariously brunette's
+03/22/1932 @ 07:58 -> 03/23/1932 @ 15:26 |Mailboxes pigment's jasmine
+05/06/1932 @ 19:31 -> 05/08/1932 @ 15:08 |Felix's possibles debilitation's
+12/07/1932 @ 14:30 -> 12/10/1932 @ 10:24 |Electioneering truces
+03/18/1933 @ 16:50 -> 03/22/1933 @ 13:55 |Rotisseries powwowed abutment's crash evacuee's
+08/24/1933 @ 09:24 -> 08/25/1933 @ 13:22 |Usage
+12/28/1933 @ 10:48 -> 12/28/1933 @ 13:14 |Martial knitted woodenness's GE glassful's
+01/12/1934 @ 00:25 -> 01/14/1934 @ 16:05 |Languors uncommonly magnetizing cataclysm
+06/23/1934 @ 07:35 -> 06/28/1934 @ 00:23 |Pogromed
+06/26/1934 @ 12:56 -> 07/01/1934 @ 00:06 |Outburst Delilah upbeat hooky ideologies
+08/06/1934 @ 20:27 -> 08/09/1934 @ 08:18 |Effectuates kilogram region's Debby's
+10/06/1934 @ 06:31 -> 10/11/1934 @ 01:13 |Leftest tire's propagation
+10/21/1934 @ 18:18 -> 10/21/1934 @ 23:06 |Delta applause's backside allusion Lamb's
+11/21/1934 @ 01:28 -> 11/25/1934 @ 12:28 |Milling discontinuances migration's introducing
+11/29/1934 @ 21:28 -> 12/01/1934 @ 11:52 |Porpoise Angora's overwrite
+04/19/1935 @ 01:32 -> 04/20/1935 @ 09:03 |Elbowing ricked
+07/18/1935 @ 08:15 -> 07/22/1935 @ 18:48 |Anaerobic filmmakers
+08/08/1935 @ 21:02 -> 08/10/1935 @ 02:18 |Isherwood's yearning's Modesto's forswearing
+10/06/1935 @ 15:39 -> 10/11/1935 @ 07:45 |Mannerism's Koppel's Philippe's
+11/06/1935 @ 22:58 -> 11/10/1935 @ 12:09 |Flog impacts
+05/03/1936 @ 12:03 -> 05/07/1936 @ 06:07 |Pluralities Capitol
+07/15/1936 @ 11:02 -> 07/17/1936 @ 19:10 |Sancta nones
+08/05/1936 @ 14:13 -> 08/06/1936 @ 04:38 |Rustbelt slacking valedictorians
+01/04/1937 @ 11:54 -> 01/04/1937 @ 14:31 |Gynecological Babur barking
+05/20/1937 @ 04:24 -> 05/20/1937 @ 05:31 |Mayra's Muscovy grumble
+02/08/1938 @ 12:02 -> 02/12/1938 @ 14:25 |Graveyards aha leftover's intrusted tobacco
+02/15/1938 @ 11:18 -> 02/16/1938 @ 18:50 |Pt vulcanize Chayefsky Harlan cerebella
+03/31/1938 @ 18:28 -> 04/01/1938 @ 12:12 |Musicologist's Lorie Indiana monograming
+04/28/1938 @ 14:00 -> 05/01/1938 @ 17:35 |Stalingrad stagnating flame stacked
+07/18/1938 @ 08:36 -> 07/21/1938 @ 10:02 |Vacuum lingering cantaloup
+09/10/1938 @ 15:13 -> 09/11/1938 @ 13:50 |Unpleasant loudly ingredients owning
+12/30/1938 @ 01:27 -> 12/30/1938 @ 18:30 |Exigent circumventing pundit Dietrich pertinents
+11/27/1939 @ 22:21 -> 11/28/1939 @ 18:06 |Novice greasier
+12/02/1939 @ 06:49 -> 12/06/1939 @ 05:46 |Lunchtimes compression Mazola's
+02/27/1940 @ 09:29 -> 02/27/1940 @ 10:01 |Somnambulism Appomattox's ductile shades
+01/21/1941 @ 00:48 -> 01/21/1941 @ 04:20 |Dysentery Oldfield phonograph lavendered
+08/01/1941 @ 01:14 -> 08/02/1941 @ 09:11 |Garrotes species sandpapering
+11/12/1941 @ 15:08 -> 11/13/1941 @ 05:37 |Gutierrez's discarding adjudicators astutest Alyce's
+06/18/1942 @ 19:24 -> 06/19/1942 @ 09:01 |Lanyard
+06/28/1942 @ 14:03 -> 06/30/1942 @ 02:29 |Panoramic murderesses
+09/22/1942 @ 00:58 -> 09/26/1942 @ 21:44 |Malplaquet's Benelux pantsuit
+12/06/1942 @ 09:46 -> 12/07/1942 @ 04:33 |Manuel glorified four
+09/02/1943 @ 18:01 -> 09/03/1943 @ 10:39 |Decriminalized Bacon
+12/15/1943 @ 15:40 -> 12/18/1943 @ 22:57 |Laundress Galibi's equine
+01/30/1944 @ 01:51 -> 01/30/1944 @ 03:52 |Attenuates rarefying Pomeranian vivisection's laughably
+03/18/1944 @ 17:11 -> 03/20/1944 @ 11:57 |Laundry's Cote's
+06/28/1944 @ 23:38 -> 06/29/1944 @ 13:04 |Film's colonizer
+04/20/1945 @ 12:03 -> 04/22/1945 @ 13:53 |Chandragupta shrimp payoff barometric zone's
+06/08/1945 @ 11:23 -> 06/13/1945 @ 02:29 |Fling Jinnah
+03/06/1946 @ 11:55 -> 03/11/1946 @ 04:52 |Drowning snailing drawbacks
+03/17/1946 @ 12:16 -> 03/19/1946 @ 14:30 |Needles awnings roughhouses
+03/19/1946 @ 21:06 -> 03/22/1946 @ 12:43 |Magpie's doohickey
+06/22/1946 @ 19:16 -> 06/23/1946 @ 19:02 |Dobbin's spiked
+10/23/1946 @ 15:44 -> 10/26/1946 @ 17:49 |Nauru Worcester
+07/28/1947 @ 19:04 -> 08/03/1947 @ 02:17 |Manufacturer preterit's delectable fulcrum
+03/25/1948 @ 11:07 -> 03/28/1948 @ 01:40 |Shaggiest Chan astrakhan marten
+06/15/1948 @ 14:24 -> 06/17/1948 @ 19:03 |Cabrini directer pennies
+05/25/1949 @ 11:16 -> 05/26/1949 @ 12:58 |Anybodies keystroke's
+08/07/1949 @ 21:47 -> 08/08/1949 @ 13:21 |Ormolu Stephenson diatoms
+10/23/1949 @ 19:18 -> 10/27/1949 @ 02:41 |Smouldering hales curios refinished dogmatic
+10/28/1949 @ 03:45 -> 10/31/1949 @ 22:17 |Principals six Geller's
+06/24/1950 @ 10:34 -> 06/28/1950 @ 12:35 |Disembowels
+07/11/1950 @ 03:22 -> 07/12/1950 @ 17:20 |Coiffing Trent cosmologies penalizes minuteness's
+07/20/1950 @ 14:25 -> 07/24/1950 @ 02:35 |Recreant eclipsed
+10/13/1950 @ 21:53 -> 10/17/1950 @ 14:07 |Dredger
+10/30/1950 @ 14:11 -> 10/31/1950 @ 15:34 |Unleashing tusk's incidences
+12/10/1951 @ 05:28 -> 12/10/1951 @ 20:02 |Linemen
+09/03/1952 @ 05:06 -> 09/03/1952 @ 11:52 |Simmons
+11/05/1952 @ 15:24 -> 11/06/1952 @ 21:10 |Sheers quiche mixture's proprietorship's cone
+12/04/1952 @ 02:54 -> 12/05/1952 @ 18:40 |Unreal collaboration jabots pigeoned analytics
+09/04/1953 @ 09:24 -> 09/08/1953 @ 06:57 |Contentedness's perpendicular atmosphere
+11/13/1953 @ 09:24 -> 11/17/1953 @ 03:12 |Hilbert's
+04/01/1954 @ 05:40 -> 04/02/1954 @ 21:14 |Think equipment's sturdiness's birdbath's
+06/16/1954 @ 01:30 -> 06/21/1954 @ 00:11 |Quotients prerequisite
+02/06/1955 @ 07:45 -> 02/10/1955 @ 08:35 |Jami's shard's
+07/19/1955 @ 04:27 -> 07/20/1955 @ 12:47 |Nanjing Apollonian heath's undeclared zinnia
+08/13/1955 @ 15:47 -> 08/14/1955 @ 06:57 |Agglomerations wire Prescott's Mexicali extremer
+09/18/1956 @ 21:45 -> 09/21/1956 @ 14:34 |Vouched Woodrow's
+01/28/1957 @ 02:11 -> 01/28/1957 @ 07:56 |Intolerable cheekiness's reorganized blustering
+05/13/1957 @ 17:09 -> 05/15/1957 @ 21:05 |Preferential blobbed Na
+09/13/1957 @ 09:37 -> 09/16/1957 @ 11:59 |Reflexive
+01/07/1958 @ 04:17 -> 01/07/1958 @ 18:53 |Slaver's bewared
+05/13/1958 @ 09:54 -> 05/18/1958 @ 05:05 |Gentlest madcaps recaptures vestibule's
+01/14/1959 @ 17:00 -> 01/18/1959 @ 19:12 |Stepchildren
+05/21/1959 @ 23:01 -> 05/24/1959 @ 10:46 |Tailwind's preaches dappling ventricle's
+07/19/1959 @ 10:37 -> 07/22/1959 @ 14:24 |Slingshot Cognac's insulate
+01/03/1960 @ 05:18 -> 01/06/1960 @ 02:14 |Wren's carcinoma's jellied plateau engine's
+03/06/1960 @ 21:51 -> 03/07/1960 @ 13:27 |Assessor cigar Bridges mutiny's freezing
+04/13/1960 @ 20:14 -> 04/15/1960 @ 05:02 |Rios Hormel's
+11/28/1960 @ 20:04 -> 11/28/1960 @ 22:29 |Sporran's extraordinaries Scotsmen findings
+12/24/1960 @ 01:08 -> 12/27/1960 @ 20:51 |Meadows Alfredo valentine
+08/01/1961 @ 08:23 -> 08/01/1961 @ 14:11 |Pavlova's misogynist munch instability temps
+08/01/1962 @ 05:08 -> 08/03/1962 @ 15:28 |Betrothals Sexton's At's winced pilings
+08/10/1962 @ 00:32 -> 08/10/1962 @ 07:04 |Quadruplets Karl dicks
+03/13/1963 @ 06:02 -> 03/17/1963 @ 16:26 |Revitalization's Estelle's term
+03/13/1963 @ 12:23 -> 03/14/1963 @ 21:32 |Moss executors
+11/17/1963 @ 04:36 -> 11/21/1963 @ 00:04 |Overdid glassware charioteered
+05/18/1964 @ 08:46 -> 05/20/1964 @ 21:54 |Demonstrated Shaffer's bobbling
+07/13/1964 @ 18:48 -> 07/15/1964 @ 03:11 |Wingspans positing
+07/20/1964 @ 06:56 -> 07/20/1964 @ 22:49 |Gizzard's galvanizing
+09/09/1965 @ 20:38 -> 09/11/1965 @ 07:58 |Locomotion
+01/18/1966 @ 00:24 -> 01/18/1966 @ 05:11 |Vamoose Madeira bishopric misstatement's
+08/07/1966 @ 13:43 -> 08/12/1966 @ 08:03 |Parallelled penned samba's positron
+08/23/1966 @ 09:52 -> 08/24/1966 @ 14:31 |Scrapes Cameroon's attorney Garbo's
+09/24/1966 @ 03:39 -> 09/26/1966 @ 06:34 |Theater hosted condescend
+02/22/1967 @ 22:10 -> 02/24/1967 @ 16:39 |Crossness Angelina's
+09/09/1967 @ 10:23 -> 09/13/1967 @ 14:27 |Conservatory's crestfallen pluralized ornamental
+10/26/1967 @ 01:46 -> 10/29/1967 @ 11:17 |Accelerated
+02/10/1968 @ 11:09 -> 02/14/1968 @ 02:02 |Factions Sharpe's
+05/08/1968 @ 06:25 -> 05/09/1968 @ 16:11 |Nesselrode's hiss preached shebangs
+06/04/1969 @ 02:13 -> 06/04/1969 @ 10:49 |Wavelet
+06/04/1969 @ 02:18 -> 06/09/1969 @ 05:29 |Dike's daylight's subtotalling indignation
+06/07/1969 @ 22:31 -> 06/10/1969 @ 16:15 |Sex's seaway witch's vagina's
+11/15/1969 @ 19:40 -> 11/17/1969 @ 14:24 |Hullabaloos brute's Fern's Milken's
+01/23/1970 @ 18:06 -> 01/27/1970 @ 15:14 |Cowpoke's irrelevance
+07/20/1970 @ 18:04 -> 07/23/1970 @ 22:25 |Undergrad's gondolas
+11/02/1970 @ 15:52 -> 11/05/1970 @ 00:19 |Venting Shoshone's mockingbird fondly
+11/15/1970 @ 23:51 -> 11/17/1970 @ 06:04 |Leftovers
+11/30/1970 @ 20:13 -> 12/05/1970 @ 21:53 |Rhapsodizes protuberances whiplashes
+06/02/1971 @ 01:13 -> 06/03/1971 @ 19:30 |Arbitration's
+08/25/1971 @ 20:19 -> 08/27/1971 @ 19:16 |Consequently
+11/15/1971 @ 06:06 -> 11/15/1971 @ 17:09 |Undercharging denseness acquitted arsonists euthanasia's
+01/24/1972 @ 11:48 -> 01/28/1972 @ 20:16 |Ballsiest janitor
+05/05/1972 @ 07:27 -> 05/05/1972 @ 09:42 |Molders saddening tenaciously Pruitt
+09/28/1972 @ 07:26 -> 10/01/1972 @ 13:48 |Yank Armstrong skull's
+10/19/1972 @ 11:35 -> 10/21/1972 @ 18:55 |Sadat billowed canvasser walrus Anabaptist
+10/19/1972 @ 17:12 -> 10/22/1972 @ 05:39 |Clocks chance twiggiest cobra's sparest
+10/26/1972 @ 19:47 -> 10/29/1972 @ 10:51 |Fibulae
+04/13/1973 @ 23:53 -> 04/17/1973 @ 11:55 |Desalinated Kirby
+06/22/1973 @ 06:55 -> 06/24/1973 @ 20:44 |Gibed conduit
+10/05/1973 @ 05:46 -> 10/08/1973 @ 09:47 |Merriam Babel's Noreen pesetas
+01/05/1974 @ 22:10 -> 01/06/1974 @ 10:56 |Busters scenic detoxified unfamiliar
+01/15/1974 @ 10:29 -> 01/20/1974 @ 05:05 |Butterfly's examine unplugs sprucer dictations
+01/24/1974 @ 05:57 -> 01/25/1974 @ 08:56 |Hefner's Marie's Mafias putt's enquiring
+02/06/1974 @ 14:33 -> 02/10/1974 @ 18:59 |Issuance's lassoed beasts breakfasted confusingly
+11/23/1974 @ 21:06 -> 11/24/1974 @ 12:30 |Squadron's
+06/18/1975 @ 01:01 -> 06/23/1975 @ 08:17 |Trolleys Cameron pianist spelt southwestern
+09/18/1975 @ 23:43 -> 09/19/1975 @ 09:11 |Unbuckles misfitted Cheshire disgracing
+05/21/1976 @ 02:28 -> 05/23/1976 @ 09:35 |Premised graduations
+07/31/1976 @ 21:40 -> 08/05/1976 @ 00:55 |Suffocation healthfulness rallied amulets satisfactorily
+09/27/1976 @ 09:04 -> 09/30/1976 @ 09:21 |Adheres disintegrated harpoon's marooning peg
+12/18/1976 @ 03:04 -> 12/21/1976 @ 02:02 |Pooching cuttlefishes imposture thorny
+01/11/1977 @ 08:14 -> 01/13/1977 @ 09:51 |Landlords gabbles builder's laureating
+03/09/1977 @ 01:24 -> 03/12/1977 @ 16:59 |Potboiler idiomatically
+03/21/1977 @ 00:47 -> 03/21/1977 @ 17:00 |Deducible mailer Consuelo winging chameleon
+12/09/1977 @ 20:35 -> 12/13/1977 @ 15:44 |Sosa swings
+03/24/1978 @ 11:32 -> 03/27/1978 @ 17:26 |Wars Gregorio
+02/13/1979 @ 20:48 -> 02/16/1979 @ 08:19 |Fidgets liquoring syphilis
+03/15/1979 @ 07:42 -> 03/18/1979 @ 20:29 |Parking shoestrings disharmony's lassie
+06/22/1979 @ 18:16 -> 06/26/1979 @ 11:16 |Stieglitz indiscreet visions buntings watchtower
+08/20/1979 @ 12:01 -> 08/25/1979 @ 02:19 |Flushest Nate listen
+11/20/1980 @ 17:22 -> 11/25/1980 @ 02:19 |Probability's inflexible mes sluggards
+01/07/1981 @ 20:55 -> 01/09/1981 @ 23:19 |Flange internee inspector's
+03/31/1981 @ 18:26 -> 04/05/1981 @ 07:44 |Sextets commits expectant
+07/20/1982 @ 14:09 -> 07/23/1982 @ 21:59 |Vauban
+10/12/1982 @ 08:50 -> 10/16/1982 @ 20:45 |Maltreated emulates popularize
+10/25/1982 @ 07:17 -> 10/27/1982 @ 08:53 |Homeboy Velázquez Caesarean Mobil's Cheyenne's
+12/13/1982 @ 22:30 -> 12/19/1982 @ 01:55 |Trellises binned hanky's Eurasia's destinies
+12/31/1982 @ 01:21 -> 01/02/1983 @ 17:36 |Gyration's antiperspirant's
+06/20/1983 @ 12:23 -> 06/24/1983 @ 17:32 |Deerskin
+07/07/1983 @ 23:24 -> 07/11/1983 @ 02:42 |Gunnysacks heiress's cantons chase Polynesia's
+11/01/1983 @ 23:44 -> 11/05/1983 @ 21:00 |Alexander cashier rays lackey filaments
+11/16/1983 @ 21:22 -> 11/17/1983 @ 06:34 |Deflects reprinting flotillas marksmen haughtiness
+01/01/1984 @ 23:49 -> 01/03/1984 @ 12:56 |Dissolutes Mobile's Ramsay's
+02/11/1984 @ 18:24 -> 02/11/1984 @ 19:51 |Liqueur's lauds plighted
+12/18/1985 @ 13:45 -> 12/19/1985 @ 02:48 |Filled pyrotechnics apostolic disorders
+02/06/1986 @ 12:52 -> 02/06/1986 @ 16:07 |Concentric defense's
+05/17/1986 @ 03:08 -> 05/21/1986 @ 01:12 |Render
+12/18/1986 @ 02:38 -> 12/18/1986 @ 19:00 |Touchdowns Emory Doubleday's
+12/24/1986 @ 11:06 -> 12/29/1986 @ 06:49 |Pontiffs horsewomen
+01/03/1987 @ 23:12 -> 01/05/1987 @ 21:09 |Wraparounds tittling azimuth's
+04/28/1987 @ 21:52 -> 05/03/1987 @ 12:14 |Commentary
+08/03/1987 @ 21:11 -> 08/05/1987 @ 12:00 |Pinafore
+10/30/1987 @ 22:05 -> 11/01/1987 @ 09:32 |Scourges
+11/10/1987 @ 20:57 -> 11/15/1987 @ 22:00 |Orchards
+12/20/1987 @ 08:50 -> 12/25/1987 @ 12:25 |Scapula's remounted scientist's Bonaventure
+01/03/1988 @ 07:50 -> 01/07/1988 @ 15:22 |Idiom's propriety's averaging
+07/07/1988 @ 13:29 -> 07/08/1988 @ 16:32 |Bushelled
+09/11/1988 @ 04:09 -> 09/12/1988 @ 08:42 |Confrontational Olin's hoppers cede
+12/20/1988 @ 13:08 -> 12/25/1988 @ 18:58 |Handouts that's
+12/22/1988 @ 00:37 -> 12/27/1988 @ 07:42 |Uptight Greta's embellishment candider inquisitively
+04/03/1989 @ 21:28 -> 04/04/1989 @ 16:15 |Klondiked undergoes plagiarize immediate
+04/07/1989 @ 16:08 -> 04/10/1989 @ 16:16 |Flickers manly scrawniest commitments impeaches
+05/05/1989 @ 03:46 -> 05/07/1989 @ 11:48 |Caesura's teeters rainy Neva
+05/24/1990 @ 04:53 -> 05/27/1990 @ 12:13 |Mamma's bullshit's agglutinating
+11/19/1990 @ 01:05 -> 11/21/1990 @ 11:00 |Krasnodar nick Jewell's
+11/19/1990 @ 20:16 -> 11/25/1990 @ 02:42 |Boomed
+08/30/1991 @ 00:12 -> 09/02/1991 @ 04:26 |Elwood soups motherhood's
+10/25/1991 @ 14:11 -> 10/29/1991 @ 02:31 |Tyrannizing
+05/19/1992 @ 04:00 -> 05/19/1992 @ 20:21 |Linkage ebbing naval aspect's unfailing
+07/10/1992 @ 23:56 -> 07/12/1992 @ 17:03 |Vying
+10/17/1992 @ 03:20 -> 10/19/1992 @ 13:54 |Hal aster roadway gristly
+12/28/1992 @ 02:03 -> 12/30/1992 @ 13:21 |Sharks length's
+02/05/1994 @ 23:07 -> 02/10/1994 @ 19:24 |Ameba's rested
+07/15/1994 @ 13:55 -> 07/19/1994 @ 03:34 |Comically
+09/18/1994 @ 23:20 -> 09/22/1994 @ 20:30 |Modeling Troy vixen's articulating evolutionary
+10/27/1995 @ 03:19 -> 10/29/1995 @ 10:55 |Hindered collapse marched emphasis's
+06/26/1996 @ 18:41 -> 06/30/1996 @ 02:34 |Hear peephole's
+04/07/1997 @ 23:10 -> 04/10/1997 @ 06:55 |Folio's
+06/12/1997 @ 16:27 -> 06/16/1997 @ 18:19 |Instantaneously toast's agreements warp
+06/19/1997 @ 08:37 -> 06/24/1997 @ 06:56 |Undefined weeder sophism's allegory's sandpapers
+07/21/1997 @ 12:35 -> 07/24/1997 @ 23:14 |Collided passerby sextants landlocked prudish
+08/09/1997 @ 15:38 -> 08/12/1997 @ 05:17 |Transfixt Udall numbing subvert
+09/08/1997 @ 23:21 -> 09/11/1997 @ 02:18 |Debbie Bolshevist ending
+05/04/1998 @ 11:27 -> 05/06/1998 @ 17:19 |Optimism Arcturus's effectuating ratcheted
+09/07/1998 @ 05:25 -> 09/12/1998 @ 03:42 |Deliriums
+01/10/1999 @ 05:11 -> 01/13/1999 @ 02:03 |Holographs Rambo's
+02/03/1999 @ 05:07 -> 02/07/1999 @ 02:36 |Louisianans jimmying artistes leased
+05/20/1999 @ 03:37 -> 05/21/1999 @ 17:01 |Freeholder's
+10/01/1999 @ 05:42 -> 10/04/1999 @ 04:09 |Notepaper's Abernathy's
+11/17/1999 @ 19:43 -> 11/21/1999 @ 22:14 |Suicidal shirtwaist
+12/19/1999 @ 18:55 -> 12/20/1999 @ 20:30 |Libellers
+10/19/2000 @ 22:39 -> 10/20/2000 @ 04:55 |Plodder's moulting smokestacks instruments vagrancy's
+05/30/2001 @ 10:07 -> 06/01/2001 @ 22:58 |Bulimia yank
+12/02/2001 @ 22:03 -> 12/06/2001 @ 10:51 |Serviettes
+01/24/2002 @ 09:14 -> 01/29/2002 @ 06:28 |Biddy
+06/02/2002 @ 06:15 -> 06/05/2002 @ 15:12 |Thermoplastic Monroe's atrocity's Brandy's demoralizes
+09/20/2002 @ 05:40 -> 09/24/2002 @ 21:32 |Guinevere's inspired limitation's
+12/12/2002 @ 23:48 -> 12/14/2002 @ 04:07 |Disconcerted Osage observational
+12/31/2002 @ 19:41 -> 01/01/2003 @ 12:21 |Tithes gig's
+03/02/2003 @ 02:20 -> 03/03/2003 @ 21:24 |Editor's hazels epiglottises repercussion
+03/23/2003 @ 20:46 -> 03/26/2003 @ 23:11 |Planter's Gambia Vietnamese
+08/27/2003 @ 03:52 -> 08/30/2003 @ 10:56 |Dossier's MacArthur
+01/11/2004 @ 15:57 -> 01/15/2004 @ 19:29 |Spindliest
+05/10/2004 @ 09:21 -> 05/12/2004 @ 22:19 |Abrupt upbeats
+05/14/2004 @ 17:37 -> 05/15/2004 @ 10:39 |Ordure's
+07/02/2004 @ 20:21 -> 07/05/2004 @ 06:23 |Respectful superhighway
+07/03/2004 @ 15:53 -> 07/03/2004 @ 17:39 |Magdalena unzip modernest Shapiro's Guerra
+09/15/2005 @ 05:22 -> 09/19/2005 @ 02:03 |Newsed tarpons Boniface jocular
+05/29/2006 @ 11:54 -> 06/03/2006 @ 02:31 |Sunsetting
+02/17/2007 @ 18:09 -> 02/21/2007 @ 11:20 |Zorn centennial Domitian's nations overwrites
+04/03/2007 @ 10:23 -> 04/04/2007 @ 04:01 |Humerus's organdy's Borobudur's escapist evaluations
+05/17/2007 @ 05:37 -> 05/18/2007 @ 10:26 |Tallow's woodcarving Beijing potables
+07/28/2007 @ 00:10 -> 07/31/2007 @ 00:52 |Dispirits composting willies hygrometers presaged
+03/04/2008 @ 07:26 -> 03/06/2008 @ 18:45 |Deformation boggling brooms Episcopals trademarking
+09/20/2008 @ 13:10 -> 09/25/2008 @ 09:28 |Recombining mantilla's lisped revisits
+07/11/2009 @ 11:18 -> 07/14/2009 @ 12:43 |Sclerosis
+08/17/2009 @ 01:46 -> 08/20/2009 @ 15:21 |Awkward
+08/21/2009 @ 14:26 -> 08/22/2009 @ 08:26 |Defender's Chengdu cashew's Regor Deanne's
+02/25/2010 @ 10:25 -> 02/27/2010 @ 05:20 |Optimums Hafiz's
+07/15/2010 @ 08:43 -> 07/16/2010 @ 15:41 |Cyanide
+07/20/2010 @ 11:56 -> 07/22/2010 @ 20:21 |Croup commode's geographical Ferber's Aguilar's
+02/22/2011 @ 11:23 -> 02/26/2011 @ 07:21 |Covenants useful smoker's
+06/15/2011 @ 05:21 -> 06/20/2011 @ 05:07 |Formative blissful experimentation's
+07/14/2011 @ 09:43 -> 07/17/2011 @ 23:13 |Opens Tutankhamen's
+04/02/2012 @ 03:57 -> 04/03/2012 @ 00:10 |Reexamines mugger's zephyr's morn's
+04/07/2012 @ 16:05 -> 04/10/2012 @ 07:50 |Transpiration's sellout bleeds infusions spent
+01/01/2013 @ 11:53 -> 01/05/2013 @ 21:24 |Rectum's charged cucumbers bashes outpatient's
+02/10/2013 @ 21:23 -> 02/16/2013 @ 00:05 |Montezuma hairpins insetting Kochab's
+08/19/2013 @ 18:34 -> 08/19/2013 @ 22:38 |Meteoroids
+08/25/2013 @ 18:11 -> 08/29/2013 @ 13:50 |Lobotomy's quicksand familiarize Syracuse intermediary
+04/22/2014 @ 23:15 -> 04/25/2014 @ 08:47 |Eastman vomited policemen fallacy adverbs
+06/28/2014 @ 05:11 -> 07/02/2014 @ 10:33 |Bellyful's apportions
+10/07/2014 @ 23:24 -> 10/12/2014 @ 00:19 |Misgoverned
+01/15/2015 @ 15:38 -> 01/19/2015 @ 04:48 |Electrocutes cob truncates intrigued
+05/28/2015 @ 07:38 -> 05/29/2015 @ 04:49 |Remount fragrance's
+06/24/1912 [1] Flurry's docks courteously McKinley's apse's
+07/01/1912 [1] Abrogates fraud's empty
+07/16/1912 [1] Truckles vicissitudes
+09/07/1943 [1] Transplant philologist's
+04/29/1944 [1] Debases ammunition's fructifying tatty localing
+08/02/1944 [1] Rescinds
+10/29/1944 [1] Ascension's eighths democrat's wailing
+01/14/1945 [1] Bevelling
+08/01/1945 [1] Mortgagee doctrines robe's valedictories hermaphrodites
+10/25/1945 [1] Amplitude's punctuating extraditing Mulroney
+10/28/1945 [1] Canteens
+06/10/1946 [1] Vows
+03/30/1947 [1] Beaumont's Rothko
+04/13/1947 [1] Jimmy derivation topographical evoking
+09/14/1947 [1] Ga
+04/30/1948 [1] Capitalization's flutist's
+06/21/1948 [1] Besieger's spasmed Alcatraz's
+08/13/1948 [1] Kaboom
+10/26/1948 [1] Mummifying
+02/02/1949 [1] Gadding Syria's
+03/08/1949 [1] Unbridled Omayyad peacemaker's holocaust's
+10/18/1949 [1] Sewing's juror trusted patrimony's
+10/31/1949 [1] Cheever lily aerospace's fluffs
+02/03/1950 [1] Congratulate legendary renovations unison's suburbanite
+01/02/1951 [1] Savorier libertarians
+01/21/1951 [1] Package uptown missive sphere moreover
+03/07/1951 [1] Inmate mortgagee's stings
+04/19/1951 [1] Borobudur's Clinton's censor
+07/11/1951 [1] Lens Marcella's delimiter southerner's
+07/31/1951 [1] Cockerel's
+01/24/1952 [1] Mississauga Popper trachea's
+05/10/1952 [1] Paroxysm flashiness's
+07/19/1952 [1] Alcyone's temerity reclaimed Segre's soloing
+09/17/1952 [1] Propaganda humanism Louisianians
+11/10/1952 [1] Harper's mantissa's nautiluses
+12/15/1952 [1] Brueghel's buddy Batista offensiveness
+01/09/1953 [1] Visage Methodist Pontianak's
+02/07/1953 [1] Roquefort's
+07/13/1953 [1] Gandhian parsecs biathlon's reinstated
+07/25/1953 [1] Depot carboy's unbosom
+08/09/1953 [1] Gullet neighbor indelicacies
+02/05/1954 [1] Drains defacement's
+06/17/1954 [1] Virulently restrained
+07/28/1954 [1] Sup soggy radishes Kinko
+11/26/1954 [1] Firetrap's Ethernet
+12/21/1954 [1] Airlifted womankind's Suetonius pities repatriation
+12/22/1954 [1] Maurine Fanny's
+02/06/1955 [1] Asphalt Aurora squidded pawnbroker leeward
+02/20/1956 [1] Falter
+09/06/1956 [1] Bisquick gimpiest imperialist
+03/29/1957 [1] Conservators Coriolanus's
+08/31/1957 [1] Socking parallaxes wellsprings kickiest escapades
+11/08/1957 [1] Miniaturizing jail
+11/21/1957 [1] Flintiest poplin's Clemson
+08/13/1958 [1] Stiffen Swedenborg Hungarians
+09/16/1958 [1] About stabilizing causals hesitates Bacardi's
+12/21/1958 [1] Seymour Minnesotans qualms grungiest
+04/21/1959 [1] Rime departing
+05/21/1959 [1] Sectioning subleased Crecy's sloppiest
+09/17/1959 [1] Beacon annuities pollywog's
+11/21/1959 [1] Decency choreographers
+06/21/1960 [1] Rosendo stipulates painter's
+10/03/1960 [1] Convocations Klimt haft overstuffed whereon
+12/10/1960 [1] Buber's habitual unholiest slue
+03/27/1961 [1] Suffragists ova's marathoners creamery's
+08/31/1961 [1] Cheesecake's pelts deicer normalcy
+11/28/1961 [1] Nebula aureole's dictatorship's
+06/13/1962 [1] Wire's pained
+07/19/1962 [1] Salacious outskirt cloakroom's
+10/21/1962 [1] Matricide's Underwood's
+12/04/1962 [1] Sickness smudgiest legmen
+08/04/1963 [1] McKnight's
+09/04/1963 [1] Praised meltdowns Somalis
+12/20/1963 [1] Instrumented Cordelia
+05/22/1964 [1] Macedonian Bloomingdale's
+06/27/1964 [1] Propagated basement
+10/22/1964 [1] Yerevan's stinting teak apostate registrants
+12/15/1964 [1] Whaler ants blooding vogue leopards
+01/02/1965 [1] Accumulated Lucretia's Himalaya's driveway
+03/24/1965 [1] Letha's
+09/15/1965 [1] Plumes sensuous exigencies
+12/08/1965 [1] Console
+01/28/1966 [1] Samples preventible
+02/08/1966 [1] Unpronounceable presuppose
+03/15/1966 [1] Nominating comma cohered Catullus networking
+05/06/1966 [1] Offenbach compatible insight redistrict
+06/17/1966 [1] Antagonized kickers jockstrap's Minolta's
+10/23/1966 [1] Copacabana
+12/09/1966 [1] Uninterrupted handmaids incalculably flatly
+12/30/1966 [1] Glimmerings relocatable differentiation Chesterfield's charcoal's
+04/16/1967 [1] Vendor's exhausted Essie's rod
+07/17/1967 [1] Squirrelled
+07/20/1967 [1] Circumnavigation wackos gays inert nonuser
+08/28/1967 [1] Trays Toltec's habituation
+02/13/1968 [1] Murmuring sextons publisher's Ur's
+04/13/1968 [1] Conduces
+05/23/1968 [1] Protoplasm Afghan's
+09/04/1968 [1] Castor's blarneyed
+09/29/1968 [1] Wideness payees Shylock's Wycherley's smallest
+01/08/1969 [1] Ageism debased gore excursion's
+01/11/1969 [1] Dalian's brashness's deciding plagiarized Senior
+01/19/1969 [1] Telecommutes Verdun's tonsillectomy
+02/02/1969 [1] Croatia rococo's Cuvier's acknowledgment's
+02/17/1969 [1] Closet drooled rollicking Amsterdam's Hegira
+03/14/1969 [1] Uric Brazilian consult sweatiest
+04/15/1969 [1] Struggle Blankenship's outcroppings
+07/17/1969 [1] Meaner Martial
+12/16/1969 [1] Skunk safekeepings canapé extraneous Brandeis's
+03/17/1970 [1] Score
+03/24/1970 [1] Macerate Isis brakeman Poltava
+07/18/1970 [1] Menstruate bottled
+12/16/1970 [1] Frothed dialog
+12/28/1970 [1] Anther
+01/29/1971 [1] Handicapper reversals
+05/17/1971 [1] Aquinas
+12/06/1971 [1] Loot lighthearted blindsiding Cleopatra tasty
+04/12/1972 [1] Sponges prosperity's noncooperation
+06/12/1972 [1] Stoplights vane's patients
+06/14/1972 [1] Declaims fretting dissatisfaction's
+09/24/1972 [1] Ravishing vulgarizes
+10/19/1972 [1] Superiority's baptistery's antedate
+11/07/1972 [1] Malignant duckbills mites peroxide's
+10/19/1973 [1] Squishiest avalanches lark's muezzin's
+01/21/1974 [1] Bismark's
+02/03/1974 [1] Kyushu websites exhortation Melba's automaton's
+05/09/1974 [1] Jehoshaphat albino overkilling Desdemona's
+07/05/1974 [1] Tanked genitive
+11/12/1974 [1] Cautiousness calamines lithium's fervidly chaperone's
+01/15/1975 [1] Wringer unblocked audio's
+02/18/1975 [1] Kebab's disarm Dramamine whittler lassitude's
+04/21/1975 [1] Maroons loan's waist's daffodil
+09/18/1975 [1] Hickey undetermined spray
+12/23/1975 [1] Subordinating Cathay shambles
+09/04/1976 [1] Silks blaze
+10/27/1976 [1] Venturesome revoking debit
+10/29/1976 [1] Inge scherzo's
+12/28/1976 [1] Psychopath's unsure
+01/23/1977 [1] Ally homographs raccoon's transubstantiation
+02/08/1977 [1] Executable jiggles pickup reanimating grommet's
+06/28/1977 [1] Politicized crape
+08/30/1977 [1] Stylist's spooking Krupp's waterbeds gadfly
+09/20/1977 [1] Ito's kegging resoundingly lore's
+02/12/1978 [1] Cocky wasting menaces
+05/06/1978 [1] Nurserymen keened acidifies Buford's
+09/20/1978 [1] Rectifier's
+09/22/1978 [1] Florine's gymnasia
+02/06/1980 [1] Overreaches suborbital Madeleine
+05/19/1980 [1] Overstatement synergy's
+08/24/1980 [1] Efface herbicide Ramiro's
+09/20/1980 [1] Unlikely testify Trondheim's
+09/25/1980 [1] Jingoist's
+03/26/1981 [1] Traverse
+04/30/1981 [1] Settee's
+05/09/1981 [1] Exhortations jelly's cabal
+05/29/1981 [1] Extruding moseyed effusions auditor
+07/21/1981 [1] Tobacco hypocrisy's slacks
+08/05/1981 [1] Gabon's collying pays
+11/11/1981 [1] Pickerel aboding aptness Poland
+01/24/1982 [1] Farm's
+02/03/1982 [1] Pantyhose
+02/10/1982 [1] Knopf's Rachelle's Opel's innovation
+02/17/1982 [1] Undergarments Elnora's
+03/11/1982 [1] Husserl's Cd occurrences Jill's
+10/14/1982 [1] Flamingo Sèvres selfsame disavowing
+07/15/1983 [1] Electromagnetic implication's attachment's demagogue plighted
+11/19/1983 [1] Nocturne
+01/19/1984 [1] Deputation
+06/05/1984 [1] Breaching Calvinists actuality's advertisement baritones
+06/29/1984 [1] Miscalculated diluted
+10/16/1984 [1] Ionosphere contiguity noisiness's
+02/28/1985 [1] Mac requires corona mending's carpenters
+05/28/1985 [1] Sandbox processor's overdraft's
+12/15/1985 [1] Spruce
+01/04/1986 [1] Atherosclerosis reinvents legerdemain's notation's
+02/16/1986 [1] Narcissist
+05/31/1986 [1] Fun jetting marquis felicity decathlon's
+09/22/1986 [1] Bellhops June's bushing
+12/20/1986 [1] Cockeyed weekending Chartres
+01/30/1987 [1] Cornrowing heartburn's Lynn's cup resin
+04/24/1987 [1] Guyana Punjabi's roisterer
+07/11/1987 [1] Copped contract knacker's
+07/19/1987 [1] Fencer's birthmark's reconstruct compellingly dissipates
+10/03/1987 [1] Arden continents
+12/04/1987 [1] Towns
+01/20/1988 [1] Impetuously seeing's
+08/18/1988 [1] Abhorrent cranial Cato surplice
+09/12/1988 [1] Undecipherable Esperanza's
+09/02/1989 [1] Imitations
+12/22/1989 [1] Transmigrate
+02/18/1990 [1] Precedence JFK distributing
+06/21/1990 [1] Azimuth exhibits
+08/30/1990 [1] Horsetails Heinlein's
+12/14/1990 [1] Annoyances valuation
+03/06/1991 [1] Knob delimit
+05/21/1991 [1] Patriarchies churns vulcanized
+01/25/1992 [1] Rag's province warding
+12/08/1992 [1] Calking Thurmond's
+05/07/1993 [1] Sledged sextants chance's
+09/29/1993 [1] Masaryk diminuendo's Bond Moor's Bran's
+10/04/1993 [1] Farthest sticklers chutes ragouts
+10/16/1993 [1] Marcella Lindbergh firmware covers
+06/03/1994 [1] Humps racier teat's cross stencil
+08/20/1994 [1] Griffin's coauthor's
+05/14/1995 [1] Curs nerdiest
+02/29/1996 [1] Moo deviants snares overgrow
+11/25/1996 [1] Pleasantries endears Wharton's encroaches
+03/23/1997 [1] Kenneling G retorting branching's art
+07/07/1997 [1] Shillelagh keens tritely Rodin's
+11/12/1997 [1] Taklamakan
+12/14/1997 [1] Speakeasies lashing's cancellations Boleyn's
+05/04/1998 [1] Resplendently dose insufficiency's day's
+05/24/1998 [1] Expeditionary
+08/29/1998 [1] Deleted richer Japura's whetstone's
+11/02/1998 [1] Truncating reproof's restating dignity's chi's
+11/07/1998 [1] Meaty bubbles establishing versification
+12/20/1998 [1] Gladlier friendliest
+03/20/1999 [1] Floating consonant's hobbyhorse's Tahiti scimitar
+05/30/1999 [1] Raid insulation colorfully mandibles
+04/07/2000 [1] Chapping bequeaths satellites
+05/17/2000 [1] Her Peron gavels footbridge's bacchanal's
+07/10/2000 [1] Leaved mime's saltwater
+08/04/2000 [1] Margins charting edgy personae
+01/25/2001 [1] Accurateness hoed flakiness's
+02/26/2001 [1] Toolboxes circularized
+12/08/2001 [1] Overspill's Waikiki's cowlicks redirecting
+08/06/2003 [1] Carbide's downscales glamorized geometrical mitten
+09/01/2003 [1] Pedagoguing doll's outlet's
+01/15/2004 [1] Communities packers pinch
+06/21/2004 [1] Rush's
+07/03/2004 [1] Chariot Hornblower's
+11/09/2004 [1] Unforgivable exhorting demolish irrecoverable clearing
+11/21/2004 [1] Silicone
+12/07/2004 [1] Rheumier easiest Andrew's abbots
+04/10/2005 [1] Cindy's palette gnash
+10/19/2005 [1] Mazes
+03/13/2006 [1] Midwinter unobstructed Ginger's incumbents
+06/08/2006 [1] Eulogistic decoding groveling Alcibiades plankton
+06/27/2006 [1] Randomizes berthing hurdles
+07/21/2006 [1] Montaigne's reverie's niceness beats goading
+08/19/2006 [1] Northerner rebuffing impalas rooftops
+09/27/2006 [1] Cargo reversion Khan's Episcopalian semicircle
+08/24/2007 [1] Elucidations ritzy panting
+04/30/2008 [1] Accountability
+10/06/2008 [1] Cosponsor chored
+11/24/2008 [1] Wizard's Galahad's
+12/17/2008 [1] Incivility erratically Hermite
+02/14/2009 [1] Harpsichord mortgagers oldened
+02/14/2009 [1] Pliers Suzanne Johns Olga's tripling
+03/13/2009 [1] Environmentalist malts toxicology's Gadsden's
+03/25/2009 [1] Administered warranty whirling
+09/18/2009 [1] Methanol ilks
+12/08/2009 [1] Poetic cadre abasement campground's extinguish
+02/26/2010 [1] Maturer wantoning
+08/16/2010 [1] Esau's brainchildren
+08/21/2010 [1] Agreeably Brigham's misalignment
+11/12/2010 [1] Humidified Rockford's keynote churlish
+02/25/2011 [1] Socket ghastlier
+04/10/2011 [1] Detrimental
+05/05/2011 [1] Access imbibe
+09/02/2011 [1] Gorgas flaunts parched
+12/28/2011 [1] Collaboration Tenochtitlan's rapscallion psychologist's extincting
+05/20/2012 [1] Trots lorry
+06/03/2012 [1] Hoorayed assignment
+06/11/2012 [1] Ah drifter's
+04/26/2013 [1] Donald's
+07/19/2013 [1] Woodcutter sanctimonious nightfall's crews
+03/03/2014 [1] Uncoupling cabarets gondolier's
+08/22/2014 [1] Pelleted discrepancies
+10/15/2014 [1] Fizzling
+03/14/2015 [1] Damneder poking markdown quagmire's
+01/10/2016 [1] Hireling spellers
+08/30/2016 [1] Gaffe's shrinks
+10/01/2016 [1] Plenipotentiaries snooker calcified fileting Bessemer's
+12/18/2016 [1] Acidity vaults
+02/24/2017 [1] Psyched Sondra's
+03/12/2017 [1] Nark sacristan's
+04/06/2017 [1] Titanium
+06/22/2017 [1] Tub grenadier's longing's gram's
+08/19/2017 [1] Twaddling
+06/07/2018 [1] Uppity
+06/28/2018 [1] Retarded Ginsburg's nonce's
+12/17/2018 [1] Succored desperadoes ascend
+03/02/2019 [1] Silence Joy's keener consciousnesses
+04/07/2019 [1] Beck's Ariosto's
+04/30/2019 [1] Stepsister's
+08/25/2020 [1] Ideas Gershwin
+11/07/2020 [1] Slackening slovenlier reel
+11/12/2020 [1] Oration's
+12/29/2020 [1] Keep
+03/02/2021 [1] Stockyard's consummation equivocates
+03/31/2021 [1] Irruptions blatant Monteverdi's medicinals Woolworth
+04/18/2021 [1] Assailing
+08/08/2021 [1] Interfaith overwhelmingly afflicts posteriors Erasmus's
+04/03/2022 [1] Inundating yuckiest technician tetrahedron's foresails
+08/15/2022 [1] Heralded F stroked
+10/09/2022 [1] Sixes unafraid decoded
+11/28/2022 [1] Stupefied blips
+06/26/2023 [1] Supplicate Terri
+10/11/2023 [1] Boyishness's intuitive cask's Armageddon's
+06/21/2024 [1] Sepulcher Bacall
+06/27/2024 [1] Slivering
+08/05/2024 [1] Dempsey's Intel's
+04/04/2025 [1] Directorate inoffensive
+04/25/2025 [1] Waddle saintliness's Mercia's denseness
+05/15/2025 [1] Intensity hydrology Peel power
+11/19/2025 [1] Wingspans affluence's
+02/20/2026 [1] Dicky impersonator
+03/20/2026 [1] Boneless rilling
+05/11/2026 [1] Carnations nigger's
+11/17/2026 [1] Barrios slicker's thirty's
+03/26/2027 [1] Dizziest Kerry Ndjamena's pizzicato
+04/06/2027 [1] Parenthetical chemotherapy
+10/02/2027 [1] Provender's limericks
+03/21/2028 [1] Dent nape's unevener irradiated denizen's
+03/23/2028 [1] Tailgated gawkiness's
+05/07/2028 [1] Elope hammerings complexioned
+07/15/2028 [1] Describe hooter Surat's paramedicals
+09/11/2028 [1] Inc videotaped sixteenth eyeliner
+09/12/2028 [1] Resend sake sundries rumbaing
+11/03/2029 [1] Blisters willful
+11/07/2029 [1] Mascaraing assertive vulnerably pruned
+11/30/2029 [1] O'Hara wrench elm
+01/08/2030 [1] Cashier's sherbet earwax's stiffeners
+05/07/2030 [1] Compatibles Joyner asynchronous
+07/01/2030 [1] Empire's entwine
+03/25/2031 [1] Proverbially unwarranted effectiveness
+04/16/2031 [1] Nosedives pennon's disburse scalloping
+07/01/2031 [1] Surrealist guppy unabated Gwendoline
+07/21/2031 [1] Casting's carelessness Anselmo's
+10/03/2031 [1] Autos
+11/09/2031 [1] Cockscomb's
+12/18/2031 [1] Succumb Key's Cossacks blackness
+01/24/2032 [1] Sidelined yell
+01/31/2032 [1] Thebes determining glutting manorial Barbra
+04/27/2032 [1] Cringing Osborne
+05/26/2032 [1] Confine lames
+08/03/2032 [1] Ceremonial straw's antelope's Mercer Kathiawar's
diff --git a/test/data/conf b/test/data/conf
new file mode 100644
index 0000000..de5efd0
--- /dev/null
+++ b/test/data/conf
@@ -0,0 +1,75 @@
+#
+# Calcurse configuration file
+#
+# This file sets the configuration options used by Calcurse. These
+# options are usually set from within Calcurse. A line beginning with
+# a space or tab is considered to be a continuation of the previous line.
+# For a variable to be unset its value must be blank, followed by an
+# empty line. To set a variable to the empty string its value should be "".
+# Lines beginning with "#" are comments, and ignored by Calcurse.
+
+# If this option is set to yes, automatic save is done when quitting
+general.autosave=yes
+
+# If this option is set to yes, the GC is run automatically when quitting
+general.autogc=no
+
+# If not null, perform automatic saves every 'periodic_save' minutes
+general.periodicsave=0
+
+# If this option is set to yes, confirmation is required before quitting
+general.confirmquit=yes
+
+# If this option is set to yes, confirmation is required before deleting an event
+general.confirmdelete=yes
+
+# If this option is set to yes, messages about loaded and saved data will not be displayed
+general.systemdialogs=no
+
+# If this option is set to yes, progress bar appearing when saving data will not be displayed
+general.progressbar=no
+
+# Default calendar view (0)monthly (1)weekly:
+appearance.calendarview=0
+
+# If this option is set to yes, monday is the first day of the week, else it is sunday
+general.firstdayofweek=monday
+
+# This is the color theme used for menus :
+appearance.theme=red on default
+
+# This is the layout of the calendar :
+appearance.layout=1
+
+# Width ( percentage, 0 being minimun width, fp) of the side bar :
+appearance.sidebarwidth=1
+
+# If this option is set to yes, notify-bar will be displayed :
+appearance.notifybar=yes
+
+# Format of the date to be displayed inside notify-bar :
+format.notifydate=%a %F
+
+# Format of the time to be displayed inside notify-bar :
+format.notifytime=%T
+
+# Warn user if he has an appointment within next 'notify-bar_warning' seconds :
+notification.warning=300
+
+# Command used to notify user of an upcoming appointment :
+notification.command=printf '\a'
+
+# Notify all appointments instead of flagged ones only
+notification.notifyall=no
+
+# Format of the date to be displayed in non-interactive mode :
+format.outputdate=%D
+
+# Format to be used when entering a date (1)mm/dd/yyyy (2)dd/mm/yyyy (3)yyyy/mm/dd) (4)yyyy-mm-dd:
+format.inputdate=1
+
+# If this option is set to yes, calcurse will run in background to get notifications after exiting
+daemon.enable=no
+
+# If this option is set to yes, activity will be logged when running in background
+daemon.log=no
diff --git a/test/data/todo b/test/data/todo
new file mode 100644
index 0000000..6f1c0e0
--- /dev/null
+++ b/test/data/todo
@@ -0,0 +1,197 @@
+[7] Wheeling predictor aggrieve dentist's vegetable
+[-8] Stine's Napier's
+[9] Gloriously slams
+[-6] Reigning
+[5] Television
+[3] Aladdin ancestoring matzohs
+[-8] Holloway's turnip's
+[1] Nary parabled Louvre's fleetest mered
+[-7] Josef heir's flake
+[-4] Spins Mondrian's velveteen
+[-7] Phone's backrest's
+[2] Surgical handlers fodder Crimea
+[-1] Finality surging studentship inversely terry
+[-3] Knitwear's cruet
+[-6] Scalper board coalescence's speedsters Tabatha's
+[6] Apprehend domino Olivier's
+[7] Acid bicepses magnetizing Trotsky's
+[-9] Tugboat warrantying
+[4] Restrictive Gresham clinch thunderhead
+[1] Stench's approximates torus's gymnast's
+[-5] Sixteen's
+[-6] Pear bauble clemency's heartbreaks compresses
+[-8] Bytes asters
+[2] Freebasing Oppenheimer
+[8] Secessionists Keogh's
+[-6] Mass analog's Pharaoh's sensationalists
+[-7] Dissidence
+[4] Unbuttoned horsemen beggar's commander Griffin
+[-6] Computations Yangtze slowpokes sourly bearskin's
+[2] Finesses Sebastian's nightclubbed
+[6] Rectangle mascots examiner blah screechy
+[-3] Electrolyte equities infrastructure's
+[2] Daydreamed
+[5] Globed
+[-2] Stores shamefaced slithering
+[5] Reverend
+[7] Proposed trespassed Bultmann
+[3] Maui
+[7] Restarts poisoner's Patterson's bucktooth
+[3] Dislodged washboard inhabitant's
+[5] Unsafer ingenuousness's supine
+[-4] Ripeness's nirvana
+[-7] Invigorating desserts copy's abbé
+[-5] Shorthorns straddle carbons
+[6] Lading
+[-2] Drawling secretary's
+[6] Ransom tablet
+[3] Unbarring
+[1] Uncorks aggression's Charmaine
+[-1] Donor's mummers dunning
+[-4] Leafiest tomcats crematoria Teletypes quires
+[-7] Koshered numismatics's
+[3] Wavelet's anapests flan
+[8] Stroke farmyard's deterrent urned
+[-6] Gunsmiths
+[8] Chileans smirk footholds
+[4] Erasmus pawnshop unmasked Andromache transgression's
+[4] Heighten squirted
+[-7] Hoodwinks Hector Playboy's fizzy
+[1] Fillmore's ricks Federico kiloton's steamy
+[5] Thor songwriters hookup
+[-1] Chatty
+[-6] Insensitivity shrill vainly Schindler's installs
+[1] Originality channeled romantically
+[-2] Advil
+[9] Beefburger's
+[2] Chorals incurred rediscovery's dioxide's firstly
+[8] Designed breach salarying
+[1] Phantom's Tagore
+[-4] Harriet worlds
+[5] Thereby
+[-2] Edgewise
+[8] Pleasanter
+[1] Kindness redundant
+[5] Soto's thrones tracing's
+[-2] Jenner's cymbal's
+[8] Surreals Zachery demonstrative athlete's
+[-9] Roommate
+[-1] Amening Hofstadter's excellently
+[-4] Refining wildest
+[2] Sudan's Ger's
+[3] Yukon's expletives
+[6] Cox foretold electroencephalogram gargoyle individualizing
+[6] Speedier buzzer Natalia
+[2] Sphinx telepathy's
+[1] Nahum run debauches chambers
+[-7] Extortion cacophonies
+[4] Maharajas
+[3] Virtuosi incompatible
+[7] Timex's Semarang undercarriage gladiator
+[-6] Meditates choreographing
+[-2] Indianapolis career
+[-8] Sensuality's pushover's bookkeeper's democrat's Establishment's
+[-7] Sputtering Liz gentle
+[8] Consonances wounding petties confessors blaze's
+[-8] Pentateuch's acquiting clumsiest
+[4] Angstrom
+[7] Watson sepsis's depoliticizing wried La's
+[-6] Terrapins
+[9] Seasons
+[-5] Bumpier drolly Sallust maws
+[1] Overstayed
+[-9] Sheer
+[6] Arrayed jewelling
+[8] Distrusted crinkly tels
+[8] Wilier allegro dine dead
+[-3] Sores brokerage prerecorded Clifton's
+[8] Anyone Rowena's rumbled
+[-1] Chairlift's abstruse Baikal mattresses dowry's
+[5] Diaz's disrespected washtub's
+[6] Eisner's conditioning
+[-7] Ape's
+[-9] Flirts provocative Liechtenstein mozzarella butterfat's
+[3] Homeopathy triennials potteries ovoid
+[2] Perpetrators hypnotize Iliad's personalizes dike
+[5] Olympia's Esperanto's
+[2] Receptors instil unripe
+[7] Groggier
+[-9] Journalists
+[-8] Creator
+[2] Brownsville
+[-2] Breadwinner sulfides
+[-7] Canoe impenetrable scrolled
+[4] Figurehead's nurture
+[7] Colombia Brahe's Johnston's spectacle jailors
+[-5] Strawberries syllogism
+[-1] Skimping brotherliness underscoring provendered
+[-2] Augment Husserl's unselfishness apostle
+[-2] Angle manipulates
+[-8] Other attempts
+[-6] Cook's scouring eh perimeter tomahawked
+[1] Metropolises leg's ultimated inseminating minaret's
+[2] Streptomycin's characterization's mercies entry's montage
+[1] Hooky niggards
+[-8] Embroidered Burton's cleave
+[1] Sharon preponderances hostessing inimitable
+[8] Briefcase
+[-9] Sparta's reappraisals whiniest Jocasta's curator's
+[-9] Becalm careers carotids
+[4] Inundate
+[6] Butchery piling's infomercial
+[3] Delineated
+[5] Unfinished surfs
+[-8] Recourse's
+[-6] Airtight overshot contest's ostentation
+[8] Roadshow bit's confection pastors wenches
+[-2] Saussure unselfish
+[-3] Guy insulation's maria's
+[7] Observers
+[-2] Decomposition's registry inboards crowbars
+[-1] Dahomey's facilitation's
+[-8] Ehrlich laced countertenor's convergence's choices
+[-2] Crochet
+[1] Defiance's cliffhangers battery
+[6] Multiplex
+[6] Springfield directs framer's empties
+[-3] Blunderbuss's
+[-4] Flusters allegiance's
+[-5] Trawled
+[5] Carrousels Avalon's
+[7] Constantine's ladings
+[-1] Regencies requires monkeyshines pornographic
+[7] Trolling
+[1] Promontory's mutts silk disc's foot
+[8] Vibrating
+[-8] Homeyness hibernates sambas fierceness's
+[8] Noise's quadruplicating multimedia Lyell
+[3] Equilaterals shes minibuses nudity consolidates
+[6] Hernia coccyges Orlon's Nirenberg
+[-2] Soakings Armagnac sexuality's homelier pests
+[7] Peso chalk's abiding
+[-6] Portraiture littoral leavening
+[-9] Boatman fleetingly radiator
+[3] Sissy husks
+[-7] Swearers gauntlets deepness acclaims stimulate
+[-1] Comedown
+[-9] Jubal's
+[1] Town vigor alphabetical concluded
+[-2] Baroda gazpacho's jolliness resupplies
+[-9] Asked
+[3] Chandrasekhar's gunfire's Earp's
+[-3] Bickering's shorts eagerness
+[-6] Ambiances Gagarin's milksops gargle
+[-5] Rainforest rediscovered Bohemia
+[-3] Syntactics smokehouses downward Quirinal reoccupy
+[-9] Succored sweetbriers
+[-4] Profess dismemberment fly syndicate
+[-4] Billeting
+[-9] Streetwalker's
+[4] Haberdashery's rates tentative eBay's McCoy
+[-3] Al's butterflying ovulate recitatives lumbered
+[2] Eye treads Eng's Peron baize
+[3] Podded
+[-9] Plunderer heightened spindlier transiting
+[-7] Pared
+[-5] Blueprint's gemstone's ceremony anteater's
+[3] Quarters
diff --git a/test/day-001.sh b/test/day-001.sh
new file mode 100755
index 0000000..614f6e3
--- /dev/null
+++ b/test/day-001.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if [ "$1" = 'actual' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -d02/25/2011
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+02/25/11:
+ * Socket ghastlier
+ - ..:.. -> ..:..
+ Covenants useful smoker's
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/day-002.sh b/test/day-002.sh
new file mode 100755
index 0000000..66ebabd
--- /dev/null
+++ b/test/day-002.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '1912-06-23' "$CALCURSE" --read-only -D "$DATA_DIR"/ -d42
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+06/24/12:
+ * Flurry's docks courteously McKinley's apse's
+
+07/01/12:
+ * Abrogates fraud's empty
+
+07/10/12:
+ - 17:47 -> ..:..
+ Impersonating integer broils blame
+
+07/11/12:
+ - ..:.. -> ..:..
+ Impersonating integer broils blame
+
+07/12/12:
+ - ..:.. -> ..:..
+ Impersonating integer broils blame
+
+07/13/12:
+ - ..:.. -> 03:18
+ Impersonating integer broils blame
+
+07/16/12:
+ * Truckles vicissitudes
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/day-003.sh b/test/day-003.sh
new file mode 100755
index 0000000..7534cd8
--- /dev/null
+++ b/test/day-003.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '1912-06-23' "$CALCURSE" --read-only -D "$DATA_DIR"/ -d42
+elif [ "$1" = 'expected' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -s06/23/1912 -r42
+else
+ ./run-test "$0"
+fi
diff --git a/test/next-001.sh b/test/next-001.sh
new file mode 100755
index 0000000..85ebd63
--- /dev/null
+++ b/test/next-001.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '1912-07-10 04:10' "$CALCURSE" --read-only -D "$DATA_DIR" -n
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+next appointment:
+ [13:37] Impersonating integer broils blame
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/range-001.sh b/test/range-001.sh
new file mode 100755
index 0000000..8f23876
--- /dev/null
+++ b/test/range-001.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '2011-02-25 00:00:00' "$CALCURSE" --read-only -D "$DATA_DIR"/ -r
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+02/25/11:
+ * Socket ghastlier
+ - ..:.. -> ..:..
+ Covenants useful smoker's
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/range-002.sh b/test/range-002.sh
new file mode 100755
index 0000000..0610017
--- /dev/null
+++ b/test/range-002.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '2000-01-01 00:00:00' "$CALCURSE" --read-only -D "$DATA_DIR"/ -r400
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+04/07/00:
+ * Chapping bequeaths satellites
+
+05/17/00:
+ * Her Peron gavels footbridge's bacchanal's
+
+07/10/00:
+ * Leaved mime's saltwater
+
+08/04/00:
+ * Margins charting edgy personae
+
+10/19/00:
+ - 22:39 -> ..:..
+ Plodder's moulting smokestacks instruments vagrancy's
+
+10/20/00:
+ - ..:.. -> 04:55
+ Plodder's moulting smokestacks instruments vagrancy's
+
+01/25/01:
+ * Accurateness hoed flakiness's
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/range-003.sh b/test/range-003.sh
new file mode 100755
index 0000000..a291208
--- /dev/null
+++ b/test/range-003.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ faketime '2000-01-01 00:00:00' "$CALCURSE" --read-only -D "$DATA_DIR"/ -r400
+elif [ "$1" = 'expected' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -s01/01/2000 -r400
+else
+ ./run-test "$0"
+fi
diff --git a/test/run-test-001.sh b/test/run-test-001.sh
new file mode 100755
index 0000000..9c1a962
--- /dev/null
+++ b/test/run-test-001.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+if [ "$1" = 'actual' -o "$1" = 'expected' ]; then
+ echo 42
+else
+ ./run-test "$0"
+fi
diff --git a/test/run-test-002.sh b/test/run-test-002.sh
new file mode 100755
index 0000000..6a10101
--- /dev/null
+++ b/test/run-test-002.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+if [ "$1" = 'actual' ]; then
+ echo 23
+elif [ "$1" = 'expected' ]; then
+ echo 42
+else
+ ./run-test "!$0"
+fi
diff --git a/test/run-test.c b/test/run-test.c
new file mode 100644
index 0000000..c779be7
--- /dev/null
+++ b/test/run-test.c
@@ -0,0 +1,229 @@
+/*
+ * Calcurse - text-based organizer
+ *
+ * Copyright (c) 2004-2012 calcurse Development Team <misc@calcurse.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Send your feedback or comments to : misc@calcurse.org
+ * Calcurse home page : http://calcurse.org
+ *
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/wait.h>
+
+/*
+ * Fork and execute an external process.
+ *
+ * If pfdin and/or pfdout point to a valid address, a pipe is created and the
+ * appropriate file descriptors are written to pfdin/pfdout.
+ */
+static int
+fork_exec(int *pfdin, int *pfdout, const char *path, char *const *arg)
+{
+ int pin[2], pout[2];
+ int pid;
+
+ if (pfdin && (pipe(pin) == -1))
+ return 0;
+ if (pfdout && (pipe(pout) == -1))
+ return 0;
+
+ if ((pid = fork()) == 0) {
+ if (pfdout) {
+ if (dup2(pout[0], STDIN_FILENO) < 0)
+ _exit(127);
+ close(pout[0]);
+ close(pout[1]);
+ }
+
+ if (pfdin) {
+ if (dup2(pin[1], STDOUT_FILENO) < 0)
+ _exit(127);
+ close(pin[0]);
+ close(pin[1]);
+ }
+
+ execvp(path, arg);
+ _exit(127);
+ } else {
+ if (pfdin)
+ close(pin[1]);
+ if (pfdout)
+ close(pout[0]);
+
+ if (pid > 0) {
+ if (pfdin) {
+ fcntl(pin[0], F_SETFD, FD_CLOEXEC);
+ *pfdin = pin[0];
+ }
+ if (pfdout) {
+ fcntl(pout[1], F_SETFD, FD_CLOEXEC);
+ *pfdout = pout[1];
+ }
+ } else {
+ if (pfdin)
+ close(pin[0]);
+ if (pfdout)
+ close(pout[1]);
+ return 0;
+ }
+ }
+ return pid;
+}
+
+/* Wait for a child process to terminate. */
+static int child_wait(int *pfdin, int *pfdout, int pid)
+{
+ int stat;
+
+ if (pfdin)
+ close(*pfdin);
+ if (pfdout)
+ close(*pfdout);
+
+ waitpid(pid, &stat, 0);
+ return stat;
+}
+
+/* Print error message and bail out. */
+static void die(const char *format, ...)
+{
+ va_list arg;
+
+ va_start(arg, format);
+ fprintf(stderr, "error: ");
+ vfprintf(stderr, format, arg);
+ va_end(arg);
+
+ exit(1);
+}
+
+/* Print usage message. */
+static void usage(void)
+{
+ printf("usage: run-test [-h|--help] <test>...\n");
+}
+
+/* Run test with a specific name. */
+static int run_test(const char *name, int expect_failure)
+{
+ char filename[BUFSIZ];
+ char *arg1[3], *arg2[3];
+ int pid1 = -1, pin1, pid2 = -1, pin2;
+ FILE *fpin1 = NULL, *fpin2 = NULL;
+ char buf1[BUFSIZ], buf2[BUFSIZ];
+ int ret = 1;
+
+ if (snprintf(filename, BUFSIZ, "./%s", name) >= BUFSIZ)
+ die("file name too long\n");
+
+ if (access(filename, F_OK) != 0) {
+ if (snprintf(filename, BUFSIZ, "./%s.sh", name) >= BUFSIZ)
+ die("file name too long\n");
+
+ if (access(filename, F_OK) != 0)
+ die("test not found: %s\n", name);
+ }
+
+ if (access(filename, X_OK) != 0)
+ die("script is not executable: %s\n", filename);
+
+ arg1[0] = arg2[0] = filename;
+ arg1[1] = "expected";
+ arg2[1] = "actual";
+ arg1[2] = arg2[2] = NULL;
+
+ printf("Running %s...", name);
+
+ if ((pid1 = fork_exec(&pin1, NULL, *arg1, arg1)) < 0)
+ die("failed to execute %s: %s\n", filename, strerror(errno));
+
+ if ((pid2 = fork_exec(&pin2, NULL, *arg2, arg2)) < 0)
+ die("failed to execute %s: %s\n", filename, strerror(errno));
+
+ fpin1 = fdopen(pin1, "r");
+ fpin2 = fdopen(pin2, "r");
+
+ while (fgets(buf1, BUFSIZ, fpin1)) {
+ if (!fgets(buf2, BUFSIZ, fpin2) || strcmp(buf1, buf2) != 0) {
+ ret = 0;
+ break;
+ }
+ }
+
+ if (fpin1)
+ fclose(fpin1);
+ if (fpin2)
+ fclose(fpin2);
+
+ if (child_wait(&pin1, NULL, pid1) != 0)
+ ret = 0;
+ if (child_wait(&pin2, NULL, pid2) != 0)
+ ret = 0;
+
+ if (expect_failure)
+ ret = 1 - ret;
+
+ if (ret == 1)
+ printf(" ok\n");
+ else
+ printf(" FAIL\n");
+
+ return ret;
+}
+
+int main(int argc, char **argv)
+{
+ int i;
+
+ if (!argv[1])
+ die("no tests specified, bailing out\n");
+ else if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
+ usage();
+ return 0;
+ }
+
+ for (i = 1; i < argc; i++) {
+ if (*argv[i] == '!') {
+ if (!run_test(argv[i] + 1, 1))
+ return 1;
+ } else {
+ if (!run_test(argv[i], 0))
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/test/search-001.sh b/test/search-001.sh
new file mode 100755
index 0000000..2d8f7e8
--- /dev/null
+++ b/test/search-001.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+if [ ! -x "$(command -v faketime)" ]; then
+ echo "libfaketime not found - skipping $0..."
+ exit 1
+fi
+
+if [ "$1" = 'actual' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -s01/01/1902 -r36500 \
+ -S '^[KMS]an.*or'
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+12/06/42:
+ - 09:46 -> ..:..
+ Manuel glorified four
+
+12/07/42:
+ - ..:.. -> 04:33
+ Manuel glorified four
+
+05/28/85:
+ * Sandbox processor's overdraft's
+EOD
+else
+ ./run-test "$0"
+fi
diff --git a/test/todo-001.sh b/test/todo-001.sh
new file mode 100755
index 0000000..db6b6ca
--- /dev/null
+++ b/test/todo-001.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+if [ "$1" = 'actual' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -t | sort
+elif [ "$1" = 'expected' ]; then
+ (
+ echo 'to do:'
+ sed '/^\[-/d; s/^\[\([0-9]\)\] \(.*\)/\1. \2/' "$DATA_DIR"/todo
+ ) | sort
+else
+ ./run-test "$0"
+fi
diff --git a/test/todo-002.sh b/test/todo-002.sh
new file mode 100755
index 0000000..a91d06d
--- /dev/null
+++ b/test/todo-002.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+if [ "$1" = 'actual' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -t3
+elif [ "$1" = 'expected' ]; then
+ echo 'to do:'
+ sed -n 's/^\[3\] \(.*\)/3. \1/p' "$DATA_DIR"/todo
+else
+ ./run-test "$0"
+fi
diff --git a/test/todo-003.sh b/test/todo-003.sh
new file mode 100755
index 0000000..2dcb2d3
--- /dev/null
+++ b/test/todo-003.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+if [ "$1" = 'actual' ]; then
+ "$CALCURSE" --read-only -D "$DATA_DIR"/ -t0 | sort -n
+elif [ "$1" = 'expected' ]; then
+ (
+ echo 'completed tasks:'
+ sed -n 's/^\[-\([0-9]\)\] \(.*\)/\1. \2/p' "$DATA_DIR"/todo
+ ) | sort -n
+else
+ ./run-test "$0"
+fi
diff --git a/test/true-001.sh b/test/true-001.sh
new file mode 100755
index 0000000..296ef78
--- /dev/null
+++ b/test/true-001.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+true