todorb 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/tests/Makefile ADDED
@@ -0,0 +1,2 @@
1
+ test:
2
+ $(MAKE) -C .. test
data/tests/README ADDED
@@ -0,0 +1,313 @@
1
+ todorb.rb tests
2
+ ===============
3
+
4
+ This directory holds test scripts for todorb.rb . The
5
+ first part of this short document describes how to run the tests
6
+ and read their output.
7
+
8
+ When fixing the tools or adding enhancements, you are strongly
9
+ encouraged to add tests in this directory to cover what you are
10
+ trying to fix or enhance. The later part of this short document
11
+ describes how your test scripts should be organized.
12
+
13
+
14
+ Running Tests
15
+ -------------
16
+
17
+ The easiest way to run tests is to say "make test" from the top-level.
18
+ This runs all the tests.
19
+
20
+ rm -rf tests/test-results "tests/trash directory"*
21
+ cd tests && sh t0000-config.sh
22
+ * ok 1: no config file
23
+ * ok 2: config file (default location 1)
24
+ * ok 3: config file (default location 2)
25
+ * ok 4: config file (command line)
26
+ * ok 5: config file (env variable)
27
+ * passed all 5 test(s)
28
+ cd tests && sh t0001-null.sh
29
+ * ok 1: null ls
30
+ * passed all 1 test(s)
31
+ rm -rf tests/test-results
32
+
33
+ Or you can run each test individually from command line, like
34
+ this:
35
+
36
+ $ ./t0001-null.sh
37
+ * ok 1: null ls
38
+ * passed all 1 test(s)
39
+
40
+ You can pass --verbose (or -v), --debug (or -d), and --immediate
41
+ (or -i) command line argument to the test, or by setting GIT_TEST_OPTS
42
+ appropriately before running "make".
43
+
44
+ --verbose::
45
+ This makes the test more verbose. Specifically, the
46
+ command being run and their output if any are also
47
+ output.
48
+
49
+ --debug::
50
+ This may help the person who is developing a new test.
51
+ It causes the command defined with test_debug to run.
52
+
53
+ --immediate::
54
+ This causes the test to immediately exit upon the first
55
+ failed test.
56
+
57
+ --long-tests::
58
+ This causes additional long-running tests to be run (where
59
+ available), for more exhaustive testing.
60
+
61
+ --tee::
62
+ In addition to printing the test output to the terminal,
63
+ write it to files named 't/test-results/$TEST_NAME.out'.
64
+ As the names depend on the tests' file names, it is safe to
65
+ run the tests with this option in parallel.
66
+
67
+ Skipping Tests
68
+ --------------
69
+
70
+ In some environments, certain tests have no way of succeeding
71
+ due to platform limitation, such as lack of 'unzip' program, or
72
+ filesystem that do not allow arbitrary sequence of non-NUL bytes
73
+ as pathnames.
74
+
75
+ You should be able to say something like
76
+
77
+ $ SKIP_TESTS=t0000.2 sh ./t0000-config.sh
78
+
79
+ and even:
80
+
81
+ $ SKIP_TESTS='t[0-4]??? t91?? t9200.8' make
82
+
83
+ to omit such tests. The value of the environment variable is a
84
+ SP separated list of patterns that tells which tests to skip,
85
+ and either can match the "t[0-9]{4}" part to skip the whole
86
+ test, or t[0-9]{4} followed by ".$number" to say which
87
+ particular test to skip.
88
+
89
+ Note that some tests in the existing test suite rely on previous
90
+ test item, so you cannot arbitrarily disable one and expect the
91
+ remainder of test to check what the test originally was intended
92
+ to check.
93
+
94
+
95
+ Naming Tests
96
+ ------------
97
+
98
+ The test files are named as:
99
+
100
+ tNNNN-commandname-details.sh
101
+
102
+ where N is a decimal digit.
103
+
104
+ First digit tells the family:
105
+
106
+ 0 - the absolute basics and global stuff
107
+ 1 - basic every-day usage
108
+ 2 - add ins
109
+
110
+ Second digit tells the particular command we are testing.
111
+
112
+ Third digit (optionally) tells the particular switch or group of switches
113
+ we are testing.
114
+
115
+ If you create files under tests/ directory (i.e. here) that is not
116
+ the top-level test script, never name the file to match the above
117
+ pattern. The Makefile here considers all such files as the
118
+ top-level test script and tries to run all of them. A care is
119
+ especially needed if you are creating a common test library
120
+ file, similar to test-lib.sh, because such a library file may
121
+ not be suitable for standalone execution.
122
+
123
+
124
+ Writing Tests
125
+ -------------
126
+
127
+ The test script is written as a shell script. It should start
128
+ with the standard "#!/bin/sh" with copyright notices, and an
129
+ assignment to variable 'test_description', like this:
130
+
131
+ #!/bin/sh
132
+ #
133
+ # Copyright (c) 2005 Junio C Hamano
134
+ #
135
+
136
+ test_description='xxx test (option --frotz)
137
+
138
+ This test registers the following structure in the cache
139
+ and tries to run git-ls-files with option --frotz.'
140
+
141
+
142
+ Source 'test-lib.sh'
143
+ --------------------
144
+
145
+ After assigning test_description, the test script should source
146
+ test-lib.sh like this:
147
+
148
+ . ./test-lib.sh
149
+
150
+ This test harness library does the following things:
151
+
152
+ - If the script is invoked with command line argument --help
153
+ (or -h), it shows the test_description and exits.
154
+
155
+ - Creates an empty test directory with an empty todo file
156
+ database and chdir(2) into it. This directory is 't/trash directory'
157
+ if you must know, but I do not think you care.
158
+
159
+ - Defines standard test helper functions for your scripts to
160
+ use. These functions are designed to make all scripts behave
161
+ consistently when command line arguments --verbose (or -v),
162
+ --debug (or -d), and --immediate (or -i) is given.
163
+
164
+
165
+ End with test_done
166
+ ------------------
167
+
168
+ Your script will be a sequence of tests, using helper functions
169
+ from the test harness library. At the end of the script, call
170
+ 'test_done'.
171
+
172
+
173
+ Test harness library
174
+ --------------------
175
+
176
+ There are a handful helper functions defined in the test harness
177
+ library for your script to use.
178
+
179
+ - test_todo_session <message> < transcript
180
+
181
+ This takes a single string as a parameter, which is treated
182
+ as a base description of what is being tested, and then
183
+ reads from standard input a transcript of todorb.rb commands
184
+ and expected output. Each command is run in the current
185
+ test environment and the output is compared with the
186
+ expected output. (See below for how to generate transcripts
187
+ easily.)
188
+
189
+ - test_tick [interval]
190
+
191
+ The test harness has an internal view of time which is
192
+ implemented by wrapping the date command. This takes a single
193
+ optional positive integer parameter which indicates how much
194
+ to advance the internal time. The default value is one day.
195
+
196
+ - test_expect_success <message> <script>
197
+
198
+ This takes two strings as parameter, and evaluates the
199
+ <script>. If it yields success, test is considered
200
+ successful. <message> should state what it is testing.
201
+
202
+ Example:
203
+
204
+ test_expect_success \
205
+ 'git-write-tree should be able to write an empty tree.' \
206
+ 'tree=$(git-write-tree)'
207
+
208
+ - test_expect_failure <message> <script>
209
+
210
+ This is NOT the opposite of test_expect_success, but is used
211
+ to mark a test that demonstrates a known breakage. Unlike
212
+ the usual test_expect_success tests, which say "ok" on
213
+ success and "FAIL" on failure, this will say "FIXED" on
214
+ success and "still broken" on failure. Failures from these
215
+ tests won't cause -i (immediate) to stop.
216
+
217
+ - test_debug <script>
218
+
219
+ This takes a single argument, <script>, and evaluates it only
220
+ when the test script is started with --debug command line
221
+ argument. This is primarily meant for use during the
222
+ development of a new test script.
223
+
224
+ - test_done
225
+
226
+ Your test script must have test_done at the end. Its purpose
227
+ is to summarize successes and failures in the test script and
228
+ exit with an appropriate error code.
229
+
230
+
231
+ Generating test transcripts
232
+ ---------------------------
233
+
234
+ You can generate test scripts from screenshots as following:
235
+
236
+ $ ./testshell.sh
237
+
238
+ You'll be in a special test environment with an empty TODO2.txt
239
+ and the dates and timestamps will be artificially fixed.
240
+
241
+ Then the session can be used to make a unit test thanks to
242
+ test_todo_session, see the existing tests as examples.
243
+
244
+ Be careful to replace all occurences of the full path to the test
245
+ directory by $HOME as testshell.sh will explain you when you execute it
246
+ otherwise the tests will work properly only on your own computer.
247
+
248
+ Don't use "script" as this would log every keystroke, not only what's
249
+ visible!!
250
+
251
+ ***NOTE***
252
+
253
+ I am not clear how to generate transcripts using the above.
254
+ The script rtest2.sh actually generates a fully working test case/suite.
255
+ You may interactively enter actions and the action and result will get
256
+ written into a test script.
257
+ -- rkumar 2009-12-21 23:43
258
+
259
+ Credits
260
+ -------
261
+
262
+ This test framework was derived from the framework used by
263
+ git itself, written originally by Junio Hamano and licensed
264
+ for use under the GPL. It was specialized for todo.txt-cli
265
+ by Emil Sit and Philippe Teuwen.
266
+ Further modified for todorb.rb by Rahul Kumar.
267
+
268
+ ./rtest2.sh --load dataset1.txt "listing"
269
+ then type commands in there.
270
+ NOTE that a blank line in output terminates what "expect" file gets so test will fail.
271
+
272
+
273
+ Issues and Drawbacks with this framework
274
+ ----------------------------------------
275
+
276
+ This framework uses the standard output of a command as the expected
277
+ result. This usually means the message reported to the user on success or
278
+ failure. If we change the message, the test breaks. Similarly, any
279
+ change to the formatting of a listing breaks *many* tests.
280
+
281
+ The actual result in the file is not being checked, only the informational
282
+ message. To circumvent the problem of recreating test cases whenever output
283
+ changes, one may pipe the commands from a broken test file to rtest2.sh and create
284
+ a fresh file.
285
+ grep '^>>> ' t0001-broken.sh \
286
+ | sed 's/^>>> *//' \
287
+ | ./rtest2.sh --load data1.txt "listing"
288
+
289
+ Note that any data created on top of the broken test file, is to be saved and passed
290
+ in the --load parameter to rtest2.sh.
291
+
292
+ Date related:
293
+ -------------
294
+ This script works fine with shell scripts that use "date" to derive
295
+ date. There's a nice hack in the bin directorythat is created at runtime
296
+ in the trash folder. However, my ruby prog does not use "date". It uses
297
+ Time.now(). So the add method which appends a date appends actual date
298
+ not the fake date 12345000.
299
+
300
+ Fix for ruby programs:
301
+ t = Time.now
302
+ ut = ENV["TODO_TEST_TIME"]
303
+ t = Time.at(ut.to_i) if ut
304
+
305
+ Add the line of picking up unix time stamp from env and using that, if it's there.
306
+
307
+ Testing for failure returned by method
308
+ === 1
309
+ === -1
310
+ prior to output
311
+ PLEASE be sure to unset any TODO_ env variables prior to test, such as
312
+ TODO_SHOW_ALL or else tests will fail when its not set!
313
+ ## vim:tw=72:ai:formatoptions=tcqln:nocindent
@@ -0,0 +1,34 @@
1
+ #!/bin/sh
2
+
3
+ fixed=0
4
+ success=0
5
+ failed=0
6
+ broken=0
7
+ total=0
8
+
9
+ for file
10
+ do
11
+ while read type value
12
+ do
13
+ case $type in
14
+ '')
15
+ continue ;;
16
+ fixed)
17
+ fixed=$(($fixed + $value)) ;;
18
+ success)
19
+ success=$(($success + $value)) ;;
20
+ failed)
21
+ failed=$(($failed + $value)) ;;
22
+ broken)
23
+ broken=$(($broken + $value)) ;;
24
+ total)
25
+ total=$(($total + $value)) ;;
26
+ esac
27
+ done <"$file"
28
+ done
29
+
30
+ printf "%-8s%d\n" fixed $fixed
31
+ printf "%-8s%d\n" success $success
32
+ printf "%-8s%d\n" failed $failed
33
+ printf "%-8s%d\n" broken $broken
34
+ printf "%-8s%d\n" total $total
data/tests/clean.sh ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ rm -rf trashdir*
3
+ rm -rf test-results/
@@ -0,0 +1,14 @@
1
+ 1 [x] if no TODO file give proper message to add task (2010-06-14)
2
+ 2 [x] what if no serial_number file? (2010-06-14)
3
+ 3 [x] Add a close for status close (2010-06-14)
4
+ 3.1 [ ] hello there new a u 3 (2010-06-15)
5
+ 3.1.1 [ ] hello there new a u 3 (2010-06-15)
6
+ 3.1.2 [ ] hello there new a u 3 (2010-06-15)
7
+ 3.1.3 [ ] hello there new a u 3 (2010-06-15)
8
+ 3.2 [ ] hello there new a u 3.2 (2010-06-15)
9
+ 3.2.1 [ ] hello there new a u 3.2.1 (2010-06-15)
10
+ 3.2.1.1 [ ] hello there new a u 3.2.1.1 (2010-06-15)
11
+ 4 [ ] start rubyforge project for todorb (2010-06-14)
12
+ 5 [ ] list: if dir given then show full path of TODO2.txt at end (2010-06-14)
13
+ 6 [ ] allow for ENV VARS such as verbose, plain, force (2010-06-15)
14
+ 7 [ ] list: search terms with - + and = (2010-06-15)
data/tests/recreate.sh ADDED
@@ -0,0 +1,33 @@
1
+ #!/bin/bash
2
+ #*******************************************************#
3
+ # recreate.sh
4
+ # written by Rahul Kumar #
5
+ # 2009/12/01 #
6
+ # recreate a failed test - pass the name of the earlier#
7
+ # test program. In some cases, you may have to rename #
8
+ # transcript.txt to the testcase since cp -i failes #
9
+ #*******************************************************#
10
+
11
+ # oldfile is the old test cases such as t0001-add.sh
12
+ oldfile="$1"
13
+ [ ! -f "$oldfile" ] && { echo "Could not find $oldfile"; exit -1 ; }
14
+
15
+ LOADSTR=
16
+ if grep -q CATEOF "$oldfile"; then
17
+ sed -n '/<<CATEOF/,/^CATEOF/p' "$oldfile" | grep -v "CATEOF" > data.1
18
+ LOADSTR='--load data.1'
19
+ echo found data, saved as data.1
20
+ wc -l data.1
21
+ fi
22
+ str=$( echo "$oldfile" | sed 's/^t[0-9]*-//;s/.sh$//' )
23
+ echo "Using suffix:$str"
24
+ read -p "press enter "
25
+ grep '^>>> ' "$oldfile" | sed 's/^>>> //'
26
+ read -p "press enter "
27
+ grep '^>>> ' "$oldfile" | sed 's/^>>> //' | ./rtest2.sh $LOADSTR "$str"
28
+
29
+ echo
30
+ echo renaming old file with O prefix
31
+ mv "$oldfile" O$oldfile
32
+ echo "If you don't find a test case, then rename transcript.txt to $oldfile"
33
+ echo "cp transcript.txt $oldfile"
data/tests/rtest2.sh ADDED
@@ -0,0 +1,124 @@
1
+ #!/bin/bash
2
+ #*******************************************************#
3
+ # gentest.sh #
4
+ # written by Rahul Kumar #
5
+ # December 21, 2009 #
6
+ # #
7
+ # generates a test case #
8
+ #*******************************************************#
9
+ # @param - test descriptor - short name
10
+ #+ will be used in test_desc and filename suffix
11
+ #
12
+ # If testing for error, and command returns 1
13
+ #+ place "=== 1" on first line or result
14
+
15
+ while [[ $1 = -* ]]; do
16
+ case "$1" in
17
+ -L|--load)
18
+ # load a file containing TODO2.txt data to test against
19
+ dataset=../$2
20
+ shift
21
+ shift
22
+ ;;
23
+ *)
24
+ echo "Error: Unknown option: $1" >&2 # rem _
25
+ exit 1
26
+ ;;
27
+ esac
28
+ done
29
+
30
+ if [[ -z "$1" ]]; then
31
+ echo -n "Test Description (short, no spaces): " 1>&2
32
+ read td
33
+ else
34
+ td="$1"
35
+ fi
36
+ # for generating a serial number
37
+ APP="todorb-test"
38
+
39
+ PS1=">>>"
40
+ out="$(pwd)/transcript.txt"
41
+ test_description="Testing of $td"
42
+ filesuffix=$( echo "$td" | sed 's/ /_/g' )
43
+
44
+
45
+ . ./test-lib.sh
46
+ trap - EXIT
47
+ if [[ ! -z "$dataset" ]]; then
48
+ if [[ ! -f "$dataset" ]]; then
49
+ echo "Can't find file $dataset"
50
+ exit 1
51
+ else
52
+ wc -l "$dataset"
53
+ fi
54
+ fi
55
+ if [[ ! -z "$dataset" ]]; then
56
+ cp "${dataset}" TODO2.txt
57
+ pre+=$( echo -e "cat > TODO2.txt <<CATEOF")
58
+ pre+="\n"
59
+ pre+=$(cat TODO2.txt)
60
+ pre+=$( echo -e "\nCATEOF\n" )
61
+ fi
62
+ str=""
63
+ > "$out"
64
+
65
+ history -r .rtest2.history
66
+ ## get user input, stop when user enters 'bye'
67
+ while read -ep ">>> " line
68
+ do
69
+ # echo -n ">>> "
70
+ # read line
71
+ [ -z "$line" ] && { echo "bye to quit"; continue; }
72
+ [[ "$line" = "bye" ]] && break;
73
+ [ -n "$line" ] && history -s "$line"
74
+
75
+ ## user can execute test_tick in current shell
76
+ [[ "$line" = *test_tick* ]] && {
77
+ times=$( expr "$line" : 'test_tick \(.*\)' )
78
+ # should be multiples of 86400 or at least more than 86400
79
+ test_tick $times;
80
+ }
81
+
82
+ if grep -q "^list" <<< "$line"; then
83
+ line=$( echo "$line" | sed 's/^list/t --sort-serial list/')
84
+ fi
85
+ if grep -q "^ls" <<< "$line"; then
86
+ line=$( echo "$line" | sed 's/^ls/t --sort-serial --no-colors list/')
87
+ fi
88
+ line=$(echo "$line" | sed 's/--ss /--sort-serial /')
89
+ line=$(echo "$line" | sed 's/--nc /--no-colors /')
90
+ #[[ "$line" = "list" ]] && line="t --sort-serial list";
91
+ #[[ "$line" = "ls" ]] && line="t --sort-serial --no-colors list";
92
+ line=$(echo "$line" | sed 's/^t /todorb /')
93
+ echo ">>> $line" >> $out
94
+ eval "$line" | tee -a "$out"
95
+ echo "" >> $out
96
+ done
97
+
98
+ ## generate the test case transcript
99
+ str="$( cat $out )"
100
+ > "$out"
101
+ cat > "$out" <<EOF
102
+ #!/bin/sh
103
+ test_description="Testing out $td "
104
+ . ./test-lib.sh
105
+
106
+
107
+ EOF
108
+ echo -e "$pre" >> "$out"
109
+ echo "" >> "$out"
110
+ echo "test_todo_session \"Testing of $td\" <<EOF" >> "$out"
111
+ echo "$str" >> "$out"
112
+ echo "" >> "$out"
113
+ echo "EOF" >> "$out"
114
+ echo "test_done" >> "$out"
115
+
116
+ # try to create a decent file name
117
+ serno=$( get_serial_number -a "$APP" -d "../" )
118
+ serno=$( printf "%04s" "$serno" )
119
+ filename="../t${serno}-${filesuffix}.sh"
120
+ echo "trying to copy $out to $filename"
121
+ chmod +x "$out"
122
+ cp -i "$out" "$filename" < /dev/tty
123
+ chmod +x "$filename"
124
+ echo "Please rename $filename to prevent possible overwriting"