rfs 0.1

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.
Files changed (57) hide show
  1. data/MIT-LICENSE +7 -0
  2. data/Rakefile.rb +193 -0
  3. data/bin/RenameFileSet.rbw +14 -0
  4. data/bin/rfs.rb +214 -0
  5. data/bin/rfsd.rb +8 -0
  6. data/description.txt +24 -0
  7. data/lib/RenameFileSet.bak.rb +372 -0
  8. data/lib/errors.rb +15 -0
  9. data/lib/filters.rb +68 -0
  10. data/lib/gui.rb +216 -0
  11. data/lib/innate/array.rb +104 -0
  12. data/lib/innate/coverage.rb +315 -0
  13. data/lib/innate/debug.rb +12 -0
  14. data/lib/innate/debugger.rb +944 -0
  15. data/lib/innate/file.rb +5 -0
  16. data/lib/innate/filelines.rb +148 -0
  17. data/lib/innate/kernel.rb +41 -0
  18. data/lib/innate/metaid.rb +30 -0
  19. data/lib/innate/mkdirs.rb +12 -0
  20. data/lib/innate/regexp.rb +80 -0
  21. data/lib/innate/reload.rb +11 -0
  22. data/lib/innate/roman.rb +72 -0
  23. data/lib/innate/scriptlines.rb +60 -0
  24. data/lib/innate/string.rb +56 -0
  25. data/lib/innate/test/all_tests.rb +11 -0
  26. data/lib/innate/test/files/mkdirs_dummy.file +1 -0
  27. data/lib/innate/test/files/reloadtarget.rb +5 -0
  28. data/lib/innate/test/files/reloadtarget1.rb +5 -0
  29. data/lib/innate/test/files/reloadtarget2.rb +5 -0
  30. data/lib/innate/test/test_coverage.rb +13 -0
  31. data/lib/innate/test/testarray.rb +98 -0
  32. data/lib/innate/test/testfile.rb +15 -0
  33. data/lib/innate/test/testfilelines.rb +106 -0
  34. data/lib/innate/test/testkernel.rb +30 -0
  35. data/lib/innate/test/testmkdirs.rb +19 -0
  36. data/lib/innate/test/testregexp.rb +86 -0
  37. data/lib/innate/test/testreload.rb +61 -0
  38. data/lib/innate/test/testroman.rb +54 -0
  39. data/lib/innate/test/testscriptlines.rb +39 -0
  40. data/lib/innate/test/teststring.rb +52 -0
  41. data/lib/innate/test/testtitlecase.rb +20 -0
  42. data/lib/innate/titlecase.rb +64 -0
  43. data/lib/innate/tracerequire.rb +22 -0
  44. data/lib/namesource.rb +53 -0
  45. data/lib/options.rb +64 -0
  46. data/lib/providers.rb +93 -0
  47. data/lib/regexp.rb +56 -0
  48. data/lib/rename_functions.rb +142 -0
  49. data/lib/renamer.rb +210 -0
  50. data/lib/results.rb +83 -0
  51. data/lib/test/test_helper.rb +147 -0
  52. data/tests/dir/file1 +0 -0
  53. data/tests/dir/file2 +0 -0
  54. data/tests/dir/file3 +0 -0
  55. data/tests/test_helper.rb +147 -0
  56. data/tests/test_rename_functions.rb +605 -0
  57. metadata +105 -0
@@ -0,0 +1,147 @@
1
+ $TESTING ||= true
2
+ #require 'innate/tracerequire'
3
+ require 'innate/debug'
4
+ require 'innate/reload'
5
+ require 'pp'
6
+ require 'test/unit'
7
+ $:.unshift '../lib'
8
+ require 'renamer'
9
+ require 'cursor/indexed'
10
+
11
+
12
+ class RenamerMock < Renamer
13
+ attr_reader :renames
14
+
15
+ def run(name, options, &block)
16
+ @onrename = block
17
+ @renames = []
18
+ @yielded = true
19
+ p = options[:file_provider]
20
+ if p.methods.include? "on_after"
21
+ p.on_after do
22
+ unless @onrename and @yielded
23
+ @onrename.call :result => @result, :result_type => @result_type, :result_path => @result_path, :result_file => @result_file
24
+ @yielded = true
25
+ end
26
+ end
27
+ end
28
+ super(name, options) do |rtype, result, path, file|
29
+ @result = result
30
+ @result_type = rtype
31
+ @result_path = path
32
+ @result_file = file
33
+ @yielded = false
34
+ end
35
+ end
36
+
37
+ def rename(path, oldfn, newfn, full_path = false)
38
+ super
39
+ if @onrename
40
+ r = @onrename.call(:path => path,
41
+ :oldfn => oldfn,
42
+ :newfn => newfn,
43
+ :full_path => full_path,
44
+ :result => @result,
45
+ :result_type => @result_type,
46
+ :result_path => @result_path,
47
+ :result_file => @result_file,
48
+ :confirm => @confirm)
49
+ @yielded = true
50
+ end
51
+ end
52
+
53
+ alias actual_rename_orig actual_rename
54
+
55
+ def actual_rename(o, n)
56
+ @renames << [o, n]
57
+ end
58
+
59
+ alias actual_delete_orig actual_delete
60
+
61
+ def actual_delete(fn)
62
+ @renames << [fn, :deleted]
63
+ end
64
+ end
65
+
66
+
67
+ module FileProviderTestEvents
68
+ def self.extended(base)
69
+ base.class.class_eval do
70
+ alias_method :each_before_fpte, :each
71
+ end
72
+ end
73
+
74
+ def each
75
+ each_before_fpte do |path, file|
76
+ before path, file
77
+ yield path, file
78
+ after path, file
79
+ end
80
+ end
81
+
82
+ def on_before &block
83
+ @on_before = [block]
84
+ end
85
+
86
+ def on_after &block
87
+ @on_after = [block]
88
+ end
89
+
90
+ def before p, f
91
+ return unless @on_before
92
+ @on_before.each do |m|
93
+ m.call p, f if m
94
+ end
95
+ end
96
+
97
+ def after p, f
98
+ return unless @on_before
99
+ @on_after.each do |m|
100
+ m.call p, f if m
101
+ end
102
+ end
103
+ end
104
+
105
+ class BaseTest < Test::Unit::TestCase
106
+ def setup
107
+ new_files( %w{ dir/. dir/.. dir/file1 dir/file2 dir/file3 } )
108
+ @r = RenamerMock.new
109
+ end
110
+
111
+ def new_files(files)
112
+ @files = Provider::File::Array.new(files)
113
+ add_file_events
114
+ end
115
+
116
+ def add_file_events
117
+ @files.extend FileProviderTestEvents
118
+ @files.on_before do |p, f|
119
+ @path = p
120
+ @file = f
121
+ @full_name = fp File.join(p, f)
122
+ end
123
+ end
124
+
125
+ def fp(path)
126
+ File.expand_path path
127
+ end
128
+
129
+ def test_shutup; end
130
+
131
+ def r(action, name = :rename_replace, expected_yields = nil, options = {})
132
+ options[:file_provider] ||= @files
133
+ options[:action] ||= action
134
+ options[:filter] = Filter.add options[:filter], Filter.new(/^\.+$/) unless options[:test_r_nofilter]
135
+ yc = 0
136
+ @r.run name, options do |h|
137
+ yc += 1
138
+ yield h if block_given?
139
+ end
140
+ if options[:test_r_count]
141
+ raise 'exception raised' if expected_yields and expected_yields != yc
142
+ else
143
+ assert_equal expected_yields, yc, 'Expected yields from renamer' if expected_yields
144
+ end
145
+ end
146
+ end
147
+
data/tests/dir/file1 ADDED
File without changes
data/tests/dir/file2 ADDED
File without changes
data/tests/dir/file3 ADDED
File without changes
@@ -0,0 +1,147 @@
1
+ $TESTING ||= true
2
+ #require 'innate/tracerequire'
3
+ require 'innate/debug'
4
+ require 'innate/reload'
5
+ require 'pp'
6
+ require 'test/unit'
7
+ $:.unshift '../lib'
8
+ require 'renamer'
9
+ require 'cursor/indexed'
10
+
11
+
12
+ class RenamerMock < Renamer
13
+ attr_reader :renames
14
+
15
+ def run(name, options, &block)
16
+ @onrename = block
17
+ @renames = []
18
+ @yielded = true
19
+ p = options[:file_provider]
20
+ if p.methods.include? "on_after"
21
+ p.on_after do
22
+ unless @onrename and @yielded
23
+ @onrename.call :result => @result, :result_type => @result_type, :result_path => @result_path, :result_file => @result_file
24
+ @yielded = true
25
+ end
26
+ end
27
+ end
28
+ super(name, options) do |rtype, result, path, file|
29
+ @result = result
30
+ @result_type = rtype
31
+ @result_path = path
32
+ @result_file = file
33
+ @yielded = false
34
+ end
35
+ end
36
+
37
+ def rename(path, oldfn, newfn, full_path = false)
38
+ super
39
+ if @onrename
40
+ r = @onrename.call(:path => path,
41
+ :oldfn => oldfn,
42
+ :newfn => newfn,
43
+ :full_path => full_path,
44
+ :result => @result,
45
+ :result_type => @result_type,
46
+ :result_path => @result_path,
47
+ :result_file => @result_file,
48
+ :confirm => @confirm)
49
+ @yielded = true
50
+ end
51
+ end
52
+
53
+ alias actual_rename_orig actual_rename
54
+
55
+ def actual_rename(o, n)
56
+ @renames << [o, n]
57
+ end
58
+
59
+ alias actual_delete_orig actual_delete
60
+
61
+ def actual_delete(fn)
62
+ @renames << [fn, :deleted]
63
+ end
64
+ end
65
+
66
+
67
+ module FileProviderTestEvents
68
+ def self.extended(base)
69
+ base.class.class_eval do
70
+ alias_method :each_before_fpte, :each
71
+ end
72
+ end
73
+
74
+ def each
75
+ each_before_fpte do |path, file|
76
+ before path, file
77
+ yield path, file
78
+ after path, file
79
+ end
80
+ end
81
+
82
+ def on_before &block
83
+ @on_before = [block]
84
+ end
85
+
86
+ def on_after &block
87
+ @on_after = [block]
88
+ end
89
+
90
+ def before p, f
91
+ return unless @on_before
92
+ @on_before.each do |m|
93
+ m.call p, f if m
94
+ end
95
+ end
96
+
97
+ def after p, f
98
+ return unless @on_before
99
+ @on_after.each do |m|
100
+ m.call p, f if m
101
+ end
102
+ end
103
+ end
104
+
105
+ class BaseTest < Test::Unit::TestCase
106
+ def setup
107
+ new_files( %w{ dir/. dir/.. dir/file1 dir/file2 dir/file3 } )
108
+ @r = RenamerMock.new
109
+ end
110
+
111
+ def new_files(files)
112
+ @files = Provider::File::Array.new(files)
113
+ add_file_events
114
+ end
115
+
116
+ def add_file_events
117
+ @files.extend FileProviderTestEvents
118
+ @files.on_before do |p, f|
119
+ @path = p
120
+ @file = f
121
+ @full_name = fp File.join(p, f)
122
+ end
123
+ end
124
+
125
+ def fp(path)
126
+ File.expand_path path
127
+ end
128
+
129
+ def test_shutup; end
130
+
131
+ def r(action, name = :rename_replace, expected_yields = nil, options = {})
132
+ options[:file_provider] ||= @files
133
+ options[:action] ||= action
134
+ options[:filter] = Filter.add options[:filter], Filter.new(/^\.+$/) unless options[:test_r_nofilter]
135
+ yc = 0
136
+ @r.run name, options do |h|
137
+ yc += 1
138
+ yield h if block_given?
139
+ end
140
+ if options[:test_r_count]
141
+ raise 'exception raised' if expected_yields and expected_yields != yc
142
+ else
143
+ assert_equal expected_yields, yc, 'Expected yields from renamer' if expected_yields
144
+ end
145
+ end
146
+ end
147
+
@@ -0,0 +1,605 @@
1
+ require 'test/test_helper'
2
+
3
+ class TestBasics < BaseTest
4
+ def test_list
5
+ r :list, :rename_replace, 5, :test_r_nofilter => true do |h|
6
+ if ['.', '..'].include? @file
7
+ assert_equal @file + '/', h[:result]
8
+ else
9
+ assert_equal @file, h[:result]
10
+ end
11
+ end
12
+ end
13
+
14
+ def test_wrong_iterations
15
+ assert_raise(RuntimeError) {
16
+ r :list, :rename_replace, 1000, :test_r_count => true do |h|
17
+ if ['.', '..'].include? @file
18
+ assert_equal @file + '/', h[:result]
19
+ else
20
+ assert_equal @file, h[:result]
21
+ end
22
+ end
23
+ }
24
+ end
25
+
26
+ def test_bad_action
27
+ assert_raise(ActionError) {
28
+ r :no, :rename_replace
29
+ }
30
+ end
31
+
32
+ def test_bad_method
33
+ assert_raise(NameError) {
34
+ r :preview, :foo_bar
35
+ }
36
+ end
37
+
38
+ def test_missing_option
39
+ assert_raise(MissingOptionError) {
40
+ r :preview, :rename_replace
41
+ }
42
+ end
43
+ def test_missing_option1
44
+ # this doesn't raise MissingOptionError because the error is caught and given as result feedback
45
+ r :preview, :rename_replace, 3, :search => /file/ do |h|
46
+ assert_match(/MissingOptionError/, h[:result])
47
+ end
48
+ end
49
+ def test_missing_option2
50
+ assert_raise(MissingOptionError) {
51
+ r :preview, :rename_replace, nil, :replace => 'good'
52
+ }
53
+ end
54
+
55
+ def test_bad_search
56
+ assert_raise(BadOptionValueError) {
57
+ r :preview, :rename_replace, nil, :search => 3
58
+ }
59
+ end
60
+ def test_bad_search1
61
+ # this doesn't raise BadOptionValueError because the error is caught and given as result feedback
62
+ r :preview, :rename_replace, 3, :search => /file/, :replace => /aeu/ do |h|
63
+ assert_match(/BadOptionValueError/, h[:result])
64
+ end
65
+ end
66
+ end
67
+
68
+
69
+ class TestReplace < BaseTest
70
+ def rr(expected_yields = nil, options = {}, &b)
71
+ r :preview, :rename_replace, expected_yields, options, &b
72
+ end
73
+
74
+ def test_replace
75
+ rr 0, :search => (/none/)
76
+ rr 1, :search => (/1/), :replace => '9' do |h|
77
+ assert_equal 'file9', h[:result]
78
+ end
79
+ end
80
+
81
+ def test_replace_commit
82
+ r :commit, :rename_replace, 3, :search => (/file/), :replace => 'boob' do |h|
83
+ assert_match(/boob[1-3]/, h[:result])
84
+ end
85
+ assert_equal [["dir/file1", "dir/boob1"],
86
+ ["dir/file2", "dir/boob2"],
87
+ ["dir/file3", "dir/boob3"]], @r.renames
88
+ end
89
+
90
+ def test_replace_cap
91
+ rr 3, :search => (/(f)ile/), :replace => 'sm' do |h|
92
+ assert_match(/smile[1-3]/, h[:result])
93
+ end
94
+ end
95
+
96
+ def test_replace_caps
97
+ rr 3, :search => (/((f)(i)(l)(e)(\d))/),
98
+ :replace => '->%6%5%4%3%2<-' do |h|
99
+ assert_match(/->[1-3]elif<-/, h[:result])
100
+ end
101
+ end
102
+
103
+ def test_replace_other_cap
104
+ rr 3, :search => (/((f)(i)(l)(e)(\d))/),
105
+ :replace => '%6%5%4%3%2',
106
+ :capture_num => 2 do |h|
107
+ assert_match(/[1-3]elifile[1-3]/, h[:result])
108
+ end
109
+ end
110
+ end
111
+
112
+
113
+ class TestFilter < BaseTest
114
+ def rr(expected_yields = nil, options = {}, &b)
115
+ r :preview, :rename_replace, expected_yields, options, &b
116
+ end
117
+
118
+ def test_filter
119
+ rr 2, :search => (/(.*)\d/), :replace => 'new', :filter => Filter.new(/2/) do |h|
120
+ assert_match(/new[13]/, h[:newfn])
121
+ end
122
+ end
123
+
124
+ def test_filter2
125
+ rr(5, :search => (/(.*)\d/), :replace => 'new', :filter => Filter.new(/2/),
126
+ :verbose => true) do |h|
127
+ if h[:newfn]
128
+ assert_match(/new[13]/, h[:newfn])
129
+ else
130
+ assert_match(/filtered: (\.\.?|file2)/, h[:result])
131
+ end
132
+ end
133
+ end
134
+
135
+ def test_filter3
136
+ rr(5, :search => (/(.*)\d/), :replace => 'new', :filter => FilterNonMatches.new(/2/),
137
+ :verbose => true) do |h|
138
+ if h[:newfn]
139
+ assert_equal 'new2' , h[:newfn]
140
+ else
141
+ assert_match(/filtered: (\.\.?|file[13])/, h[:result])
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+
148
+ class TestConfirm < BaseTest
149
+ def rr(expected_yields = nil, options = {}, &b)
150
+ r :commit, :rename_replace, expected_yields, options, &b
151
+ end
152
+
153
+ def test_confirm_yes
154
+ confirms = 0
155
+ rr 3, :confirm => (proc {|path, oldfn, newfn, full_name, exists, default|
156
+ confirms += 1
157
+ assert_equal 'dir', path
158
+ assert_match(/file[1-3]/, oldfn)
159
+ assert_match(/new[1-3]/, newfn)
160
+ assert_equal false, full_name
161
+ assert_equal((oldfn[-1] == ?1) ? :yes : :yes, default)
162
+ :yes
163
+ }),
164
+ :search => (/file/), :replace => 'new' do |h|
165
+ assert_match(/new[123]/, h[:newfn])
166
+ assert_equal :ok, h[:result_type]
167
+ assert_equal h[:newfn], h[:result]
168
+ assert_equal h[:confirm], :yes
169
+ end
170
+ assert_equal 3, confirms
171
+ end
172
+
173
+ def test_confirm_all
174
+ confirms = 0
175
+ rr 3, :confirm => (proc {|path, oldfn, newfn, full_name, exists, default|
176
+ confirms += 1
177
+ assert_equal :yes, default
178
+ :all
179
+ }),
180
+ :search => (/file/), :replace => 'new' do |h|
181
+ assert_match(/new[123]/, h[:newfn])
182
+ assert_equal :ok, h[:result_type]
183
+ assert_equal h[:newfn], h[:result]
184
+ assert_equal h[:confirm], :all
185
+ end
186
+ assert_equal 1, confirms
187
+ end
188
+
189
+ def test_confirm_no
190
+ confirms = 0
191
+ rr 3, :confirm => (proc {|path, oldfn, newfn, full_name, exists, default|
192
+ confirms += 1
193
+ assert_equal((oldfn[-1] == ?1) ? :yes : :no, default)
194
+ :no
195
+ }),
196
+ :search => (/file/), :replace => 'new' do |h|
197
+ assert_match(/new[123]/, h[:newfn])
198
+ assert_equal :skipped, h[:result_type]
199
+ assert_equal h[:oldfn], h[:result]
200
+ assert_equal h[:confirm], :no
201
+ end
202
+ assert_equal 3, confirms
203
+ end
204
+
205
+ def test_confirm_cancel
206
+ confirms = 0
207
+ rr 0, :confirm => (proc {|path, oldfn, newfn, full_name, exists, default|
208
+ confirms += 1
209
+ assert_equal :yes, default
210
+ :cancel
211
+ }),
212
+ :search => (/file/), :replace => 'new' do |h|
213
+ fail
214
+ end
215
+ assert_equal 1, confirms
216
+ end
217
+
218
+ def test_confirm_exists
219
+ raise NotImplementedError.new
220
+ end
221
+ end
222
+
223
+
224
+ class TestFilesTxt < BaseTest
225
+ def rr(ey, o, &b)
226
+ r :preview, :rename_name_source, ey, o, &b
227
+ end
228
+
229
+ def t(s, items, results)
230
+ rr 3, :search => s,
231
+ :source => NameStreamSource.new(StringIO.new(items.join("\n"))) do |h|
232
+ assert_equal results.read1next, h[:newfn]
233
+ end
234
+ end
235
+
236
+ def test_nocap
237
+ items = %w{ the_first the_second the_third }
238
+ results = items.to_cursor
239
+ t(/.*/, items, results)
240
+ end
241
+
242
+ def test_cap
243
+ items = %w{ the_first the_second the_third }
244
+ results = %w{ filethe_first1 filethe_second2 filethe_third3 }.to_cursor
245
+ t(/file()/, items, results)
246
+ end
247
+
248
+ def test_not_enough
249
+ items = %w{ the_first the_second }
250
+ results = ['filethe_first1', 'filethe_second2', 'file--no data--3'].to_cursor
251
+ assert_raise(EOFError) {
252
+ t(/file()/, items, results)
253
+ }
254
+ end
255
+
256
+ def test_too_many
257
+ items = %w{ the_first the_second the_third the_extra }
258
+ results = %w{ filethe_first1 filethe_second2 filethe_third3 nevergethere }.to_cursor
259
+ t(/file()/, items, results)
260
+ end
261
+
262
+ def test_real_file
263
+ raise NotImplementedError.new
264
+ end
265
+
266
+ def test_real_file_recursive
267
+ raise NotImplementedError.new
268
+ end
269
+ end
270
+
271
+
272
+ class TestAdd < BaseTest
273
+ def rr(ey = nil, o = {}, &b)
274
+ r :preview, :rename_add, ey, o, &b
275
+ end
276
+
277
+ def test_add
278
+ rr 3, :search => (/\d/), :add => 5, :action => :commit do |h|
279
+ assert_equal h[:oldfn].succ.succ.succ.succ.succ, h[:newfn]
280
+ end
281
+ #make sure it went in reverse
282
+ assert_equal [['dir/file3', 'dir/file8'],
283
+ ['dir/file2', 'dir/file7'],
284
+ ['dir/file1', 'dir/file6']], @r.renames
285
+ end
286
+
287
+ def test_add_neg
288
+ c = %w{ file-2 file-1 file0 }.to_cursor
289
+ rr 3, :search => (/\d/), :add => -3, :action => :commit do |h|
290
+ assert_equal c.read1next, h[:newfn]
291
+ end
292
+ #make sure it went in reverse
293
+ assert_equal [['dir/file1', 'dir/file-2'],
294
+ ['dir/file2', 'dir/file-1'],
295
+ ['dir/file3', 'dir/file0']], @r.renames
296
+ end
297
+
298
+ def test_add_cap
299
+ rr 3, :search => (/(\d)/), :add => 5 do |h|
300
+ assert_equal h[:oldfn].succ.succ.succ.succ.succ, h[:newfn]
301
+ end
302
+ end
303
+
304
+ def test_missing_add
305
+ assert_raise MissingOptionError do
306
+ rr(3, :search => (/(\d)/)) { |h| fail "shouldn't get here" }
307
+ end
308
+ assert_raise BadOptionValueError do
309
+ rr(3, :search => (/(\d)/), :add => 'something') { |h| fail "shouldn't get here" }
310
+ end
311
+ end
312
+ end
313
+
314
+
315
+ class TestCount < BaseTest
316
+ def test_count
317
+ count = 0
318
+ r :preview, :rename_count, 3, :search => /()./ do |h|
319
+ count += 1
320
+ assert_equal "#{count}#{h[:oldfn]}", h[:newfn]
321
+ end
322
+ end
323
+ end
324
+
325
+
326
+ class TestFullName < BaseTest
327
+ def rr(ey = nil, o = {}, &b)
328
+ r :preview, :rename_from_full_name, ey, o, &b
329
+ end
330
+
331
+ def test_no_cap
332
+ rr 3, :search => (/file/), :pattern => (/dir/) do |h|
333
+ assert_match(/dir[1-3]/, h[:newfn], h[:result])
334
+ end
335
+ end
336
+
337
+ def test_cap
338
+ rr 3, :search => (/(file)/), :pattern => (/(dir)/) do |h|
339
+ assert_match(/dir[1-3]/, h[:newfn])
340
+ end
341
+ end
342
+ end
343
+
344
+
345
+ class TestMoveUp < BaseTest
346
+ def rr(ey = nil, o = {}, &b)
347
+ r :preview, :rename_move_up, ey, o, &b
348
+ end
349
+
350
+ def test_match
351
+ rr 3, :search => (/./) do |h|
352
+ assert_match(%r{^\./file[1-3]$}, h[:newfn], h[:result])
353
+ end
354
+ end
355
+
356
+ def test_no_match
357
+ rr 0, :search => (/nothing/)
358
+ end
359
+ end
360
+
361
+
362
+ class TestRoman < BaseTest
363
+ def rr(ey, o, &b)
364
+ r :preview, :rename_roman, ey, o, &b
365
+ end
366
+
367
+ def test_to_roman
368
+ count = 0
369
+ rr 3, :search => (/(\d)/) do |h|
370
+ count += 1
371
+ rn = 'file' + case count
372
+ when 1; 'I'
373
+ when 2; 'II'
374
+ when 3; 'III'
375
+ end
376
+ assert_equal rn, h[:newfn]
377
+ end
378
+ end
379
+
380
+ def test_from_roman
381
+ rr 1, :search => (/of (roman)/i), :file_provider =>
382
+ TestFileProvider.new(['glory/great war of mcmxiv']) do |h|
383
+ assert_equal 'great war of 1914', h[:result]
384
+ end
385
+ end
386
+ end
387
+
388
+
389
+ class TestMarkChange < BaseTest
390
+ def rr(ey, o, &b)
391
+ r :preview, :rename_mark_change, ey, o, &b
392
+ end
393
+
394
+ def setup
395
+ super
396
+ @changes = %w{ SECTION1.1 SECTION2.1
397
+ SECTION3.5 SECTION4.1 }.to_cursor
398
+ new_files(%w{ section1.1
399
+ section1.2 section1.3
400
+ section2.1 section3.5 hello section3.6
401
+ section4.1 section4.2 })
402
+ end
403
+
404
+ def test_changes
405
+ rr 4, :search => (/section(\d)\./), :replace_pattern => (/section/),
406
+ :replace_text => 'SECTION' do |h|
407
+ if h[:newfn]
408
+ assert_equal @changes.read1next, h[:newfn]
409
+ end
410
+ end
411
+ end
412
+
413
+ def test_changes_rcap
414
+ rr 4, :search => (/section(\d)\./), :replace_pattern => (/(\w*)\d\./),
415
+ :replace_text => 'SECTION' do |h|
416
+ if h[:newfn]
417
+ assert_equal @changes.read1next, h[:newfn]
418
+ end
419
+ end
420
+ end
421
+
422
+ def test_changes_rcap_other
423
+ rr 4, :search => (/section(\d)\./), :replace_pattern => (/()()()(\w*)\d\./),
424
+ :replace_text => 'SECTION',
425
+ :capture_num => 4 do |h|
426
+ if h[:newfn]
427
+ assert_equal @changes.read1next, h[:newfn]
428
+ end
429
+ end
430
+ end
431
+
432
+ def test_changes_no_cap
433
+ rr 4, :search => (/\d/), :replace_pattern => (/section/),
434
+ :replace_text => 'SECTION' do |h|
435
+ if h[:newfn]
436
+ assert_equal @changes.read1next, h[:newfn]
437
+ end
438
+ end
439
+ end
440
+ end
441
+
442
+
443
+ class TestTapeNumbers < BaseTest
444
+ def t(r)
445
+ results = %w{ tape1 tape2 tape3 tape4}.to_cursor
446
+ new_files(%w{ tape1A tape1B tape2a tape2b })
447
+ r(:preview, :rename_tape_numbers, 4, :search => r) do |h|
448
+ assert_equal results.read1next, h[:newfn]
449
+ end
450
+ end
451
+
452
+ def test_cap
453
+ t(/tape(..)/)
454
+ end
455
+
456
+ def test_no_cap
457
+ t(/\d./)
458
+ end
459
+ end
460
+
461
+
462
+ class TestCapitalize < BaseTest
463
+ def rr(ey, o, &b)
464
+ new_files(
465
+ ['this sentence should be capitalized',
466
+ 'here is another one. the best is to see what will happen! is it good?',
467
+ 'how many more do i need here? a few.',
468
+ "i'll have to get this done soon, it may get boring..."])
469
+ r :preview, :rename_capitalize, ey, o, &b
470
+ end
471
+
472
+ def test_capitalize
473
+ changes = ['This Sentence Should Be Capitalized',
474
+ 'Here is Another One. The Best is to See What Will Happen! Is it Good?',
475
+ 'How Many More Do I Need Here? A Few.',
476
+ "I'll Have to Get This Done Soon, it May Get Boring..."].to_cursor
477
+ rr 4, :search => (/.*/) do |h|
478
+ assert_equal changes.read1next, h[:newfn]
479
+ end
480
+ end
481
+ end
482
+
483
+
484
+ class TestFill < BaseTest
485
+ def t(re, f, res = nil)
486
+ new_files(%w{ first1.1 section1.2 section1.3
487
+ second2.1 third3.5 hello section3.6
488
+ fourth4.1 section4.2 })
489
+ results = res || (%w{ first1.1 first1.2 first1.3
490
+ second2.1 third3.5 third3.6
491
+ fourth4.1 fourth4.2 }).to_cursor
492
+ r :preview, :rename_fill, 9, :search => re, :fill => f do |h|
493
+ if h[:newfn]
494
+ assert_equal results.read1next, h[:newfn]
495
+ elsif h[:result] == '* No capture to fill * hello'
496
+ # ok...
497
+ else
498
+ assert_equal 'source: ' + results.read1next, h[:result]
499
+ end
500
+ end
501
+ end
502
+
503
+ def test_cap_nocap
504
+ t(/(.*?)\d/, /section/)
505
+ end
506
+ def test_nocap_nocap
507
+ t(/first|second|third|fourth/, /section/)
508
+ end
509
+ def test_cap_cap
510
+ t(/(.*?)\d/, /(section)/)
511
+ end
512
+ def test_cap_cap2
513
+ t(/(.*?)\d/, /section()/, %w{ first1.1 sectionfirst1.2 sectionfirst1.3
514
+ second2.1 third3.5 sectionthird3.6
515
+ fourth4.1 sectionfourth4.2 }.to_cursor)
516
+ end
517
+ end
518
+
519
+
520
+ class TestDelete < BaseTest
521
+ def teardown
522
+ super
523
+ unless File.exists? 'dir'
524
+ Dir.mkdir 'dir'
525
+ end
526
+ %w{file1 file2 file3}.each do |f|
527
+ fn = File.join('dir', f)
528
+ unless File.exists? fn
529
+ File.open(fn, 'w') {|f| f.puts fn }
530
+ end
531
+ end
532
+ end
533
+
534
+ def rr(expected_yields = nil, options = {}, &b)
535
+ r :preview, :rename_remove, expected_yields, options, &b
536
+ end
537
+
538
+ def test_delete_file
539
+ rr 1, :search => (/^file2$/), :action => :commit do |h|
540
+ assert_equal [["dir/file2", :deleted]], @r.renames
541
+ assert_equal :ok, h[:result_type]
542
+ assert_equal '<<file2>>', h[:result]
543
+ assert_equal 'dir', h[:result_path]
544
+ assert_equal 'file2', h[:result_file]
545
+ end
546
+ end
547
+
548
+ def test_delete_dir_not_empty_sim
549
+ new_files(%w{ . .. dir })
550
+ rr 1, :search => (/^dir$/), :action => :commit do |h|
551
+ assert_equal [["./dir", :deleted]], @r.renames
552
+ assert_equal :ok, h[:result_type]
553
+ assert_equal '<<dir>>', h[:result]
554
+ assert_equal '.', h[:result_path]
555
+ assert_equal 'dir', h[:result_file]
556
+ end
557
+ end
558
+
559
+ def test_delete_dir_not_empty_real
560
+ new_files(%w{ . .. dir })
561
+ class << @r
562
+ alias actual_delete actual_delete_orig
563
+ end
564
+ rr 1, :search => (/^dir$/), :action => :commit do |h|
565
+ assert_equal :fileerror, h[:result_type]
566
+ assert_equal "Errno::ENOTEMPTY: Directory not empty - ./dir", h[:result]
567
+ assert_equal '.', h[:result_path]
568
+ assert_equal 'dir', h[:result_file]
569
+ end
570
+ end
571
+
572
+ def test_delete_dir_not_empty_real
573
+ new_files(%w{ . .. dir })
574
+ class << @r
575
+ alias actual_delete actual_delete_orig
576
+ end
577
+ rr 1, :search => (/^dir$/), :action => :commit do |h|
578
+ assert_equal :fileerror, h[:result_type]
579
+ assert_equal "Errno::ENOTEMPTY: Directory not empty - ./dir", h[:result]
580
+ assert_equal '.', h[:result_path]
581
+ assert_equal 'dir', h[:result_file]
582
+ end
583
+ end
584
+
585
+ def test_delete_recursive
586
+ @files = Provider::File::Recursive.new(['.'])
587
+ add_file_events
588
+ class << @r
589
+ #alias actual_delete actual_delete_orig
590
+ end
591
+ c = %w{ ./dir/file1 ./dir/file2 ./dir/file3 ./dir }.to_cursor
592
+ rr 4, :search => (/^(dir|file[1-3])$/), :action => :commit do |h|
593
+ assert_equal :ok, h[:result_type]
594
+ p, f = File.split c.read1next
595
+ assert_equal p, h[:result_path]
596
+ assert_equal f, h[:result_file]
597
+ end
598
+ c.pos = 0
599
+ @r.renames.each do |a|
600
+ fn, r = a
601
+ assert_equal c.read1next, fn
602
+ assert_equal :deleted, r
603
+ end
604
+ end
605
+ end