devver-germinate 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/.gitignore +2 -0
  2. data/History.txt +4 -0
  3. data/README.rdoc +132 -0
  4. data/Rakefile +43 -0
  5. data/bin/germ +133 -0
  6. data/cucumber.yml +2 -0
  7. data/examples/basic.rb +118 -0
  8. data/examples/short.rb +17 -0
  9. data/features/author-formats-article.feature +108 -0
  10. data/features/author-lists-info.feature +45 -0
  11. data/features/author-publishes-article-source.feature +5 -0
  12. data/features/author-publishes-article.feature +5 -0
  13. data/features/author-republishes-article.feature +5 -0
  14. data/features/author-selects-hunks.feature +26 -0
  15. data/features/author-updates-article-source.feature +5 -0
  16. data/features/author-views-stuff.feature +48 -0
  17. data/features/bin/quoter +6 -0
  18. data/features/bin/sorter +4 -0
  19. data/features/example_articles/code_samples.rb +89 -0
  20. data/features/example_articles/escaping.txt +12 -0
  21. data/features/example_articles/hello.rb +9 -0
  22. data/features/example_articles/pipelines.txt +25 -0
  23. data/features/example_articles/regexen.rb +24 -0
  24. data/features/example_articles/sample_offsets.rb +18 -0
  25. data/features/example_articles/specials.rb +19 -0
  26. data/features/example_articles/wrapping.rb +8 -0
  27. data/features/example_output/code_samples.txt +186 -0
  28. data/features/example_output/escaping.out +5 -0
  29. data/features/example_output/hello.txt +1 -0
  30. data/features/example_output/pipelines.out +28 -0
  31. data/features/example_output/regexen.txt +22 -0
  32. data/features/example_output/sample_offsets.txt +15 -0
  33. data/features/example_output/specials.txt +36 -0
  34. data/features/example_output/wrapping.txt +3 -0
  35. data/features/step_definitions/germinate.rb +30 -0
  36. data/features/support/env.rb +18 -0
  37. data/germinate.gemspec +55 -0
  38. data/lib/germinate.rb +54 -0
  39. data/lib/germinate/application.rb +62 -0
  40. data/lib/germinate/article_editor.rb +20 -0
  41. data/lib/germinate/article_formatter.rb +75 -0
  42. data/lib/germinate/formatter.rb +119 -0
  43. data/lib/germinate/hunk.rb +149 -0
  44. data/lib/germinate/implicit_insertion.rb +9 -0
  45. data/lib/germinate/insertion.rb +15 -0
  46. data/lib/germinate/librarian.rb +179 -0
  47. data/lib/germinate/pipeline.rb +11 -0
  48. data/lib/germinate/process.rb +67 -0
  49. data/lib/germinate/reader.rb +212 -0
  50. data/lib/germinate/selector.rb +95 -0
  51. data/lib/germinate/shared_style_attributes.rb +23 -0
  52. data/lib/germinate/text_transforms.rb +90 -0
  53. data/spec/germinate/application_spec.rb +14 -0
  54. data/spec/germinate/article_editor_spec.rb +97 -0
  55. data/spec/germinate/article_formatter_spec.rb +153 -0
  56. data/spec/germinate/code_hunk_spec.rb +45 -0
  57. data/spec/germinate/formatter_spec.rb +160 -0
  58. data/spec/germinate/hunk_spec.rb +77 -0
  59. data/spec/germinate/implicit_insertion_spec.rb +33 -0
  60. data/spec/germinate/insertion_spec.rb +18 -0
  61. data/spec/germinate/librarian_spec.rb +336 -0
  62. data/spec/germinate/pipeline_spec.rb +24 -0
  63. data/spec/germinate/process_spec.rb +64 -0
  64. data/spec/germinate/reader_spec.rb +306 -0
  65. data/spec/germinate/selector_spec.rb +65 -0
  66. data/spec/germinate/text_hunk_spec.rb +53 -0
  67. data/spec/germinate/text_transforms_spec.rb +154 -0
  68. data/spec/germinate_spec.rb +8 -0
  69. data/spec/spec.opts +1 -0
  70. data/spec/spec_helper.rb +16 -0
  71. data/tasks/ann.rake +80 -0
  72. data/tasks/bones.rake +20 -0
  73. data/tasks/cucumber.rake +5 -0
  74. data/tasks/gem.rake +201 -0
  75. data/tasks/git.rake +40 -0
  76. data/tasks/notes.rake +27 -0
  77. data/tasks/post_load.rake +34 -0
  78. data/tasks/rdoc.rake +51 -0
  79. data/tasks/rubyforge.rake +55 -0
  80. data/tasks/setup.rb +292 -0
  81. data/tasks/spec.rake +54 -0
  82. data/tasks/svn.rake +47 -0
  83. data/tasks/test.rake +40 -0
  84. data/tasks/zentest.rake +36 -0
  85. data/test/test_germinate.rb +0 -0
  86. metadata +209 -0
@@ -0,0 +1,45 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
3
+
4
+ module Germinate
5
+ describe CodeHunk do
6
+ before :each do
7
+ @it = CodeHunk.new(["foo", "bar"])
8
+ end
9
+
10
+ context "when visited by a formatter" do
11
+ before :each do
12
+ @formatter = stub("Formatter")
13
+ end
14
+
15
+ it "should call #formate_code! for self" do
16
+ @formatter.should_receive(:format_code!).with(@it, anything)
17
+ @it.format_with(@formatter)
18
+ end
19
+ end
20
+
21
+ describe "with a nested hunk" do
22
+ before :each do
23
+ @formatter = stub("Formatter")
24
+ @comment_prefix = ">>"
25
+ @nested_hunk = stub("Nested Hunk", :empty? => false)
26
+ contents = [
27
+ "foo",
28
+ "bar",
29
+ @nested_hunk,
30
+ "baz"
31
+ ]
32
+ @it = CodeHunk.new(contents,
33
+ :comment_prefix => @comment_prefix)
34
+ end
35
+
36
+ it "should pass formatter on to nested hunks" do
37
+ @formatter.should_receive(:format_code!).with(["foo", "bar"], ">>").ordered
38
+ @nested_hunk.should_receive(:format_with).with(@formatter).ordered
39
+ @formatter.should_receive(:format_code!).with(["baz"], ">>").ordered
40
+ @it.format_with(@formatter)
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,160 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
3
+
4
+ module Germinate
5
+ describe Formatter do
6
+ before :each do
7
+ @output = StringIO.new
8
+ @it = Formatter.new(@output)
9
+ end
10
+
11
+ it "should start in the :initial state" do
12
+ @it.state.should == :initial
13
+ end
14
+
15
+
16
+ def output_string
17
+ @output.rewind
18
+ @output.string
19
+ end
20
+
21
+ context "which has been started" do
22
+ before :each do
23
+ @it.start!
24
+ end
25
+
26
+ it "should be in the :code state" do
27
+ @it.state.should == :code
28
+ end
29
+
30
+ it "should ignore initial lines" do
31
+ @it.add_line!("TEST")
32
+ output_string.should == ""
33
+ end
34
+
35
+ end
36
+
37
+ context "after the :TEXT: keyword" do
38
+ before :each do
39
+ @it.start!
40
+ @it.add_line!(":TEXT:\n")
41
+ end
42
+
43
+ it "should be in the :paragraph state" do
44
+ @it.state.should == :paragraph
45
+ end
46
+
47
+ it "should start outputting text" do
48
+ @it.add_line!("check 1 2 3\n")
49
+ @it.add_line!("\n")
50
+ output_string.should == "check 1 2 3\n"
51
+ end
52
+ end
53
+
54
+ context "after the :TEXT: keyword followed by :CUT:" do
55
+ before :each do
56
+ @it.start!
57
+ @it.add_line!(":TEXT:\n")
58
+ @it.add_line!(":CUT:\n")
59
+ end
60
+
61
+ it "should be in the :code state" do
62
+ @it.state.should == :code
63
+ end
64
+
65
+ it "should stop outputting text" do
66
+ @it.add_line!("check 1 2 3\n")
67
+ output_string.should == ""
68
+ end
69
+ end
70
+
71
+ context "after a :TEXT: keyword prefixed with '#'" do
72
+ before :each do
73
+ @it.start!
74
+ @it.add_line!("# :TEXT:\n")
75
+ end
76
+
77
+ it "should be in the :paragraph state" do
78
+ @it.state.should == :paragraph
79
+ end
80
+
81
+ it "should have a comment prefix of '#'" do
82
+ @it.comment_prefix.should == '#'
83
+ end
84
+
85
+ it "should strip '#' prefixes from text" do
86
+ @it.add_line!("# Line 1\n")
87
+ @it.add_line!(" ## Line 2\n")
88
+ @it.add_line!("\n")
89
+ output_string.should == "Line 1 Line 2\n"
90
+ end
91
+
92
+ it "should ignore uncommented lines" do
93
+ @it.add_line!("; Not a comment #")
94
+ output_string.should == ""
95
+ end
96
+
97
+ it "should ignore blank lines" do
98
+ @it.add_line!(" \t\n")
99
+ output_string.should == ""
100
+ end
101
+
102
+ it "should ignore commented blank lines" do
103
+ @it.add_line!("# \t\n")
104
+ output_string.should == ""
105
+ end
106
+ end
107
+
108
+ context "after a :TEXT: keyword prefixed with ';'" do
109
+ before :each do
110
+ @it.start!
111
+ @it.add_line!(" ; :TEXT:\n")
112
+ end
113
+
114
+ it "should have a comment prefix of ';'" do
115
+ @it.comment_prefix.should == ';'
116
+ end
117
+
118
+ it "should strip ';' prefixes from text" do
119
+ @it.add_line!("; Line 1\n")
120
+ @it.add_line!(" ;; Line 2\n")
121
+ @it.add_line!(";\n")
122
+ output_string.should == "Line 1 Line 2\n"
123
+ end
124
+
125
+ it "should ignore lines with '#' prefixes" do
126
+ @it.add_line!("# Line 1\n")
127
+ output_string.should == ""
128
+ end
129
+ end
130
+
131
+ context "in a text section " do
132
+ before :each do
133
+ @it.start!
134
+ @it.add_line!("# :TEXT:\n")
135
+ end
136
+
137
+ it "should join adjacent lines" do
138
+ @it.add_line!("# foo\n")
139
+ @it.add_line!("# bar\n")
140
+ @it.add_line!("\n")
141
+ output_string.should == "foo bar\n"
142
+ end
143
+ end
144
+
145
+ context "in a linebreak section" do
146
+ before :each do
147
+ @it.start!
148
+ @it.add_line!("# :TEXT:\n")
149
+ @it.add_line!("# P1\n")
150
+ @it.add_line!("\n")
151
+ end
152
+
153
+ it "should finish the section with a double newline" do
154
+ @it.add_line!("# P2\n")
155
+ @it.add_line!("\n")
156
+ output_string.should == "P1\n\nP2\n"
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,77 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
3
+
4
+ module Germinate
5
+ describe Hunk, "(attributes)" do
6
+ Germinate::SharedStyleAttributes.fattrs.each do |attribute|
7
+ it "should support the #{attribute} style attribute" do
8
+ @it = Germinate::Hunk.new([], attribute => "test")
9
+ @it.send(attribute).should == "test"
10
+ end
11
+
12
+ it "should pass the #{attribute} attribute on to duplicates" do
13
+ @it = Germinate::Hunk.new([], attribute => "test")
14
+ @it.dup.send(attribute).should == "test"
15
+ end
16
+
17
+ it "should pass the #{attribute} attribute on to clones" do
18
+ @it = Germinate::Hunk.new([], attribute => "test")
19
+ @it.clone.send(attribute).should == "test"
20
+ end
21
+
22
+ it "should pass the #{attribute} attribute on to slices" do
23
+ @it = Germinate::Hunk.new([], attribute => "test")
24
+ @it[0..-1].send(attribute).should == "test"
25
+ @it.slice(0..-1).send(attribute).should == "test"
26
+ end
27
+
28
+ it "should copy #{attribute} from given template" do
29
+ @template = Object.new
30
+ @template.extend SharedStyleAttributes
31
+ @template.send(attribute, "test")
32
+ @it = Germinate::Hunk.new([], @template)
33
+ @it.send(attribute).should == "test"
34
+ end
35
+ end
36
+ end
37
+
38
+ describe Hunk do
39
+ before :each do
40
+ @it = Hunk.new
41
+ end
42
+
43
+ context "with an insertion" do
44
+ before :each do
45
+ @nested_hunk = stub("Nested Hunk")
46
+ @insertion = stub("Insertion", :resolve => @nested_hunk)
47
+ @it << "line 1"
48
+ @it << @insertion
49
+ @it << "line 2"
50
+ end
51
+
52
+ it "should be able to resolve the insertion" do
53
+ @it.resolve_insertions.should == [
54
+ "line 1",
55
+ @nested_hunk,
56
+ "line 2"
57
+ ]
58
+ end
59
+ end
60
+
61
+ describe "with some content" do
62
+ before :each do
63
+ @it.push("foo", "bar", "foo", "baz")
64
+ end
65
+
66
+ it "should be able to find indexes of elements matching a regex" do
67
+ @it.index_matching(/ba/).should == 1
68
+ @it.index_matching(/fo/).should == 0
69
+ @it.index_matching(/fo/, 1).should == 2
70
+ @it.index_matching(/fo/, 2).should == 2
71
+ @it.index_matching(/fo/, 3).should be_nil
72
+ @it.index_matching(/za/, 3).should be_nil
73
+ end
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
3
+
4
+ module Germinate
5
+ describe ImplicitInsertion do
6
+ before :each do
7
+ @hunk = stub("Hunk")
8
+ @library = stub("Library")
9
+ @selector = stub("Selector")
10
+ @it = Germinate::ImplicitInsertion.new(@selector, @library)
11
+ end
12
+
13
+ context "when the librarian can find the selection" do
14
+ before :each do
15
+ @library.stub!(:[]).and_return(@hunk)
16
+ end
17
+
18
+ it "should resolve to the hunk the librarian returns" do
19
+ @it.resolve.should equal(@hunk)
20
+ end
21
+ end
22
+
23
+ context "when the librarian cannot find the selection" do
24
+ before :each do
25
+ @library.stub!(:[]).and_raise(IndexError.new)
26
+ end
27
+
28
+ it "should resolve to a null hunk" do
29
+ @it.resolve.should be_a_kind_of(NullHunk)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
3
+
4
+ module Germinate
5
+ describe Insertion, "given a library and a selector" do
6
+ before :each do
7
+ @hunk = stub("Hunk")
8
+ @library = stub("Library", :[] => @hunk)
9
+ @selector = stub("Selector")
10
+ @it = Germinate::Insertion.new(@selector, @library)
11
+ end
12
+
13
+ it "should use the library to resolve itself" do
14
+ @library.should_receive(:[]).with(@selector).and_return(@hunk)
15
+ @it.resolve.should == @hunk
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,336 @@
1
+ require 'rubygems'
2
+ require 'arrayfields'
3
+
4
+ require File.expand_path(
5
+ File.join(File.dirname(__FILE__), %w[.. .. lib germinate]))
6
+
7
+
8
+ module Germinate
9
+ describe Librarian do
10
+ before :each do
11
+ @it = Librarian.new
12
+ end
13
+
14
+ context "by default" do
15
+ it "should not have a comment prefix" do
16
+ @it.comment_prefix.should == nil
17
+ @it.comment_prefix_known?.should be_false
18
+ end
19
+
20
+ it "should not have code brackets" do
21
+ @it.code_open_bracket.should be_nil
22
+ @it.code_close_bracket.should be_nil
23
+ end
24
+ end
25
+
26
+ Germinate::SharedStyleAttributes.fattrs.each do |attribute|
27
+ it "should pass the #{attribute} attribute on to text hunks" do
28
+ @it.send(attribute, "#{attribute}_test")
29
+ @it.add_text!("first", "hello")
30
+ @it.section("first").send(attribute).should == "#{attribute}_test"
31
+ end
32
+
33
+ it "should pass the #{attribute} attribute on to code hunks" do
34
+ @it.send(attribute, "#{attribute}_test")
35
+ @it.add_code!("first", "hello")
36
+ @it.sample("first").send(attribute).should == "#{attribute}_test"
37
+ end
38
+ end
39
+
40
+ context "given a comment prefix" do
41
+ before :each do
42
+ @it.comment_prefix = "||"
43
+ end
44
+
45
+ it "should remember the comment prefix" do
46
+ @it.comment_prefix.should == "||"
47
+ end
48
+
49
+ it "should know it has a comment prefix" do
50
+ @it.comment_prefix_known?.should be_true
51
+ end
52
+ end
53
+
54
+ context "given code brackets" do
55
+ before :each do
56
+ @it.code_open_bracket = "{"
57
+ @it.code_close_bracket = "}"
58
+ end
59
+
60
+ it "should remember the open bracket" do
61
+ @it.code_open_bracket.should == "{"
62
+ end
63
+
64
+ it "should remember the close bracket" do
65
+ @it.code_close_bracket.should == "}"
66
+ end
67
+
68
+ end
69
+
70
+ context "given custom code attributes" do
71
+ before :each do
72
+ @it.set_code_attributes!(
73
+ "sample1",
74
+ :code_open_bracket => "<<",
75
+ :code_close_bracket => ">>")
76
+ end
77
+
78
+ it "should create the sample (if needed) and assign the attributes" do
79
+ @it.sample("sample1").code_open_bracket.should == "<<"
80
+ @it.sample("sample1").code_close_bracket.should == ">>"
81
+ end
82
+ end
83
+
84
+ context "given an insertion in my_section with selector @my_selector" do
85
+ before :each do
86
+ @it.add_insertion!("my_section", "@my_selector")
87
+ end
88
+
89
+ it "should add an Insertion to the named section" do
90
+ @it.section("my_section").last.should be_a_kind_of(Insertion)
91
+ end
92
+
93
+ it "should give the insertion the selector @my_selector" do
94
+ @it.section("my_section").last.selector.to_s.should == "@my_selector"
95
+ end
96
+
97
+ it "should give the insertion a reference to the library" do
98
+ @it.section("my_section").last.library.should == @it
99
+ end
100
+ end
101
+
102
+ context "given a process to file" do
103
+ before :each do
104
+ @it.add_process!("myproc", "cowsay")
105
+ end
106
+
107
+ it "should make the process available as a Process object" do
108
+ @it.process("myproc").should be_a_kind_of(Germinate::Process)
109
+ end
110
+
111
+ it "should store the process name" do
112
+ @it.process("myproc").name.should == "myproc"
113
+ end
114
+
115
+ it "should store the process command" do
116
+ @it.process("myproc").command.should == "cowsay"
117
+ end
118
+
119
+ it "should include the process when listing known processes" do
120
+ @it.process_names.should include("myproc")
121
+ end
122
+ end
123
+
124
+ context "given a code sample and some processes" do
125
+ before :each do
126
+ @output_a = ["line 1a", "line 2a"]
127
+ @output_b = ["line 1b", "line 2b"]
128
+ @process_a = stub("Process A", :call => @output_a)
129
+ @process_b = stub("Process B", :call => @output_b)
130
+ Germinate::Process.stub!(:new).
131
+ with("foo", "aaa").
132
+ and_return(@process_a)
133
+ Germinate::Process.stub!(:new).
134
+ with("bar", "bbb").
135
+ and_return(@process_b)
136
+
137
+ @it.add_code!("A", "line 1")
138
+ @it.add_code!("A", "line 2")
139
+ @it.add_process!("foo", "aaa")
140
+ @it.add_process!("bar", "bbb")
141
+ end
142
+
143
+ context "when the processes are included in a selection" do
144
+ before :each do
145
+ @selector = "@A|foo|bar"
146
+ end
147
+
148
+ it "should call the processes on the selected text" do
149
+ @process_a.should_receive(:call).with(["line 1", "line 2"]).
150
+ and_return(@output_a)
151
+ @process_b.should_receive(:call).with(@output_a).
152
+ and_return(@output_b)
153
+
154
+ @it[@selector].should == ["line 1b", "line 2b"]
155
+ end
156
+ end
157
+ end
158
+
159
+ context "given an assortment of lines" do
160
+ before :each do
161
+ @it.add_front_matter!("FM 1")
162
+ @it.add_front_matter!("FM 2")
163
+ @it.add_control!("CONTROL 1")
164
+ @it.add_text!("SECTION1", "TEXT 1")
165
+ @it.add_text!("SECTION1", "TEXT 2")
166
+ @it.add_control!("CONTROL 2")
167
+ @it.add_code!("SECTION1", "CODE 1")
168
+ @it.add_control!("CONTROL 3")
169
+ @it.add_text!("SECTION2", "TEXT 3")
170
+ @it.add_text!("SECTION2", "TEXT 4")
171
+ @it.add_code!("SECTION2", "CODE 2")
172
+ @it.add_code!("SECTION2", "CODE 2l2")
173
+ @it.add_code!("SECTION2", "CODE 2l3")
174
+ @it.add_code!("SECTION2", "CODE 2l4")
175
+ end
176
+
177
+ it "should be able to retrieve all the lines in order" do
178
+ @it.lines.should == [
179
+ "FM 1",
180
+ "FM 2",
181
+ "CONTROL 1",
182
+ "TEXT 1",
183
+ "TEXT 2",
184
+ "CONTROL 2",
185
+ "CODE 1",
186
+ "CONTROL 3",
187
+ "TEXT 3",
188
+ "TEXT 4",
189
+ "CODE 2",
190
+ "CODE 2l2",
191
+ "CODE 2l3",
192
+ "CODE 2l4",
193
+ ]
194
+ end
195
+
196
+ it "should be able to retrieve text lines" do
197
+ @it.text_lines.should == [
198
+ "TEXT 1",
199
+ "TEXT 2",
200
+ "TEXT 3",
201
+ "TEXT 4"
202
+ ]
203
+ end
204
+
205
+ it "should be able to retrieve code lines" do
206
+ @it.code_lines.should == [
207
+ "CODE 1",
208
+ "CODE 2",
209
+ "CODE 2l2",
210
+ "CODE 2l3",
211
+ "CODE 2l4",
212
+ ]
213
+ end
214
+
215
+ it "should be able to retrieve front matter" do
216
+ @it.front_matter_lines.should == [
217
+ "FM 1",
218
+ "FM 2",
219
+ ]
220
+ end
221
+
222
+ it "should be able to retrieve text by section" do
223
+ @it.section("SECTION1").should == [
224
+ "TEXT 1",
225
+ "TEXT 2"
226
+ ]
227
+ @it.section("SECTION2").should == [
228
+ "TEXT 3",
229
+ "TEXT 4"
230
+ ]
231
+ end
232
+
233
+ it "should be able to retrieve code by sample name" do
234
+ @it.sample("SECTION1").should == [
235
+ "CODE 1"
236
+ ]
237
+ @it.sample("SECTION2").should == [
238
+ "CODE 2",
239
+ "CODE 2l2",
240
+ "CODE 2l3",
241
+ "CODE 2l4",
242
+ ]
243
+ end
244
+
245
+ it "should be able to return a list of section names" do
246
+ @it.section_names.should == [
247
+ "SECTION1",
248
+ "SECTION2"
249
+ ]
250
+ end
251
+
252
+ it "should be able to return a list of sample names" do
253
+ @it.sample_names.should == [
254
+ "SECTION1",
255
+ "SECTION2"
256
+ ]
257
+ end
258
+
259
+ it "should be able to tell if a section exists" do
260
+ @it.should have_section("SECTION1")
261
+ @it.should_not have_section("SECTION5")
262
+ end
263
+
264
+ it "should be able to tell if a sample exists" do
265
+ @it.should have_sample("SECTION1")
266
+ @it.should_not have_sample("SECTION5")
267
+ end
268
+
269
+ it "should be able to retrieve lines using a selector" do
270
+ @it[Selector.new("@SECTION1", nil)].should == ["CODE 1"]
271
+ @it["@SECTION1"].should == ["CODE 1"]
272
+ end
273
+
274
+ SELECTOR_EXAMPLES = [
275
+ # Selector Expected Excerpt Expected Type
276
+ [ "@SECTION1", ["CODE 1"], CodeHunk ],
277
+ [ "@SECTION2:1", ["CODE 2"], CodeHunk ],
278
+ [ "@SECTION2:2..3", ["CODE 2l2", "CODE 2l3"], CodeHunk ],
279
+ [ "@SECTION2:2,2", ["CODE 2l2", "CODE 2l3"], CodeHunk ],
280
+ [ "@SECTION2:/l2/../l3/", ["CODE 2l2", "CODE 2l3"], CodeHunk ],
281
+ [ "@SECTION2:/l2/.../l3/", ["CODE 2l2"], CodeHunk ],
282
+ [ "@SECTION2:/2/,3", [
283
+ "CODE 2",
284
+ "CODE 2l2",
285
+ "CODE 2l3"], CodeHunk ],
286
+ [ "@SECTION2:/l2/..-1", [
287
+ "CODE 2l2",
288
+ "CODE 2l3",
289
+ "CODE 2l4"], CodeHunk ],
290
+ [ "$CODE", [
291
+ "CODE 1",
292
+ "CODE 2",
293
+ "CODE 2l2",
294
+ "CODE 2l3",
295
+ "CODE 2l4", ], CodeHunk
296
+ ],
297
+ [ "$SOURCE", [
298
+ "FM 1",
299
+ "FM 2",
300
+ "CONTROL 1",
301
+ "TEXT 1",
302
+ "TEXT 2",
303
+ "CONTROL 2",
304
+ "CODE 1",
305
+ "CONTROL 3",
306
+ "TEXT 3",
307
+ "TEXT 4",
308
+ "CODE 2",
309
+ "CODE 2l2",
310
+ "CODE 2l3",
311
+ "CODE 2l4",
312
+ ], CodeHunk
313
+ ],
314
+ [ "$TEXT", [
315
+ "TEXT 1",
316
+ "TEXT 2",
317
+ "TEXT 3",
318
+ "TEXT 4"
319
+ ], CodeHunk
320
+ ],
321
+
322
+ ]
323
+
324
+ SELECTOR_EXAMPLES.each do |example|
325
+ example.fields = [:selector, :hunk, :type]
326
+ it "should be able to locate #{example[:selector]}" do
327
+ @it[example[:selector]].should == example[:hunk]
328
+ end
329
+
330
+ it "should return #{example[:selector]} as #{example[:type]}" do
331
+ @it[example[:selector]].should be_a_kind_of(example[:type])
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end