tailor 0.1.5 → 1.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/.gitignore +9 -1
  2. data/.rspec +2 -1
  3. data/.tailor +6 -0
  4. data/Gemfile.lock +47 -78
  5. data/{ChangeLog.rdoc → History.rdoc} +0 -0
  6. data/README.rdoc +157 -24
  7. data/Rakefile +0 -9
  8. data/bin/tailor +16 -69
  9. data/features/configurable.feature +78 -0
  10. data/features/horizontal_spacing.feature +262 -0
  11. data/features/indentation.feature +17 -21
  12. data/features/indentation/bad_files_with_no_trailing_newline.feature +90 -0
  13. data/features/indentation/good_files_with_no_trailing_newline.feature +206 -0
  14. data/features/name_detection.feature +72 -0
  15. data/features/step_definitions/indentation_steps.rb +10 -133
  16. data/features/support/env.rb +7 -15
  17. data/features/support/file_cases/horizontal_spacing_cases.rb +265 -0
  18. data/features/support/file_cases/indentation_cases.rb +972 -0
  19. data/features/support/file_cases/naming_cases.rb +52 -0
  20. data/features/support/file_cases/vertical_spacing_cases.rb +70 -0
  21. data/features/support/hooks.rb +8 -0
  22. data/features/support/{1_file_with_bad_operator_spacing → legacy}/bad_op_spacing.rb +0 -0
  23. data/features/support/{1_file_with_bad_ternary_colon_spacing → legacy}/bad_ternary_colon_spacing.rb +0 -0
  24. data/features/support/{1_long_file_with_indentation/my_project.rb → legacy/long_file_with_indentation.rb} +1 -1
  25. data/features/support/world.rb +14 -0
  26. data/features/vertical_spacing.feature +114 -0
  27. data/lib/ext/string_ext.rb +5 -0
  28. data/lib/tailor.rb +6 -252
  29. data/lib/tailor/cli.rb +49 -0
  30. data/lib/tailor/cli/options.rb +251 -0
  31. data/lib/tailor/composite_observable.rb +56 -0
  32. data/lib/tailor/configuration.rb +263 -0
  33. data/lib/tailor/critic.rb +162 -0
  34. data/lib/tailor/formatters/text.rb +126 -0
  35. data/lib/tailor/lexed_line.rb +246 -0
  36. data/lib/tailor/lexer.rb +428 -0
  37. data/lib/tailor/lexer/token.rb +103 -0
  38. data/lib/tailor/lexer_constants.rb +75 -0
  39. data/lib/tailor/logger.rb +28 -0
  40. data/lib/tailor/problem.rb +100 -0
  41. data/lib/tailor/reporter.rb +48 -0
  42. data/lib/tailor/ruler.rb +39 -0
  43. data/lib/tailor/rulers.rb +7 -0
  44. data/lib/tailor/rulers/allow_camel_case_methods_ruler.rb +30 -0
  45. data/lib/tailor/rulers/allow_hard_tabs_ruler.rb +22 -0
  46. data/lib/tailor/rulers/allow_screaming_snake_case_classes_ruler.rb +32 -0
  47. data/lib/tailor/rulers/allow_trailing_line_spaces_ruler.rb +33 -0
  48. data/lib/tailor/rulers/indentation_spaces_ruler.rb +199 -0
  49. data/lib/tailor/rulers/indentation_spaces_ruler/indentation_manager.rb +362 -0
  50. data/lib/tailor/rulers/max_code_lines_in_class_ruler.rb +84 -0
  51. data/lib/tailor/rulers/max_code_lines_in_method_ruler.rb +84 -0
  52. data/lib/tailor/rulers/max_line_length_ruler.rb +31 -0
  53. data/lib/tailor/rulers/spaces_after_comma_ruler.rb +83 -0
  54. data/lib/tailor/rulers/spaces_after_lbrace_ruler.rb +114 -0
  55. data/lib/tailor/rulers/spaces_after_lbracket_ruler.rb +123 -0
  56. data/lib/tailor/rulers/spaces_after_lparen_ruler.rb +116 -0
  57. data/lib/tailor/rulers/spaces_before_comma_ruler.rb +67 -0
  58. data/lib/tailor/rulers/spaces_before_lbrace_ruler.rb +93 -0
  59. data/lib/tailor/rulers/spaces_before_rbrace_ruler.rb +98 -0
  60. data/lib/tailor/rulers/spaces_before_rbracket_ruler.rb +70 -0
  61. data/lib/tailor/rulers/spaces_before_rparen_ruler.rb +70 -0
  62. data/lib/tailor/rulers/spaces_in_empty_braces_ruler.rb +94 -0
  63. data/lib/tailor/rulers/trailing_newlines_ruler.rb +36 -0
  64. data/lib/tailor/runtime_error.rb +3 -0
  65. data/lib/tailor/tailorrc.erb +88 -0
  66. data/lib/tailor/version.rb +2 -2
  67. data/spec/spec_helper.rb +7 -5
  68. data/spec/tailor/cli_spec.rb +94 -0
  69. data/spec/tailor/configuration_spec.rb +147 -0
  70. data/spec/tailor/critic_spec.rb +63 -0
  71. data/spec/tailor/lexed_line_spec.rb +569 -0
  72. data/spec/tailor/lexer/token_spec.rb +46 -0
  73. data/spec/tailor/lexer_spec.rb +181 -0
  74. data/spec/tailor/options_spec.rb +6 -0
  75. data/spec/tailor/problem_spec.rb +74 -0
  76. data/spec/tailor/reporter_spec.rb +53 -0
  77. data/spec/tailor/ruler_spec.rb +56 -0
  78. data/spec/tailor/rulers/indentation_spaces_ruler/indentation_manager_spec.rb +454 -0
  79. data/spec/tailor/rulers/indentation_spaces_ruler_spec.rb +128 -0
  80. data/spec/tailor/rulers/spaces_after_comma_spec.rb +31 -0
  81. data/spec/tailor/rulers/spaces_after_lbrace_ruler_spec.rb +145 -0
  82. data/spec/tailor/rulers/spaces_before_lbrace_ruler_spec.rb +63 -0
  83. data/spec/tailor/rulers/spaces_before_rbrace_ruler_spec.rb +63 -0
  84. data/spec/tailor/rulers_spec.rb +9 -0
  85. data/spec/tailor/version_spec.rb +6 -0
  86. data/spec/tailor_spec.rb +9 -21
  87. data/tailor.gemspec +22 -35
  88. data/tasks/features.rake +7 -0
  89. data/tasks/roodi.rake +9 -0
  90. data/tasks/roodi_config.yaml +14 -0
  91. data/tasks/spec.rake +16 -0
  92. data/tasks/yard.rake +14 -0
  93. metadata +224 -77
  94. data/features/case_checking.feature +0 -38
  95. data/features/spacing.feature +0 -97
  96. data/features/spacing/commas.feature +0 -44
  97. data/features/step_definitions/case_checking_steps.rb +0 -42
  98. data/features/step_definitions/spacing_steps.rb +0 -156
  99. data/features/support/1_file_with_bad_comma_spacing/bad_comma_spacing.rb +0 -43
  100. data/features/support/1_file_with_bad_curly_brace_spacing/bad_curly_brace_spacing.rb +0 -60
  101. data/features/support/1_file_with_bad_parenthesis/bad_parenthesis.rb +0 -4
  102. data/features/support/1_file_with_bad_square_brackets/bad_square_brackets.rb +0 -62
  103. data/features/support/1_file_with_camel_case_class/camel_case_class.rb +0 -5
  104. data/features/support/1_file_with_camel_case_method/camel_case_method.rb +0 -3
  105. data/features/support/1_file_with_hard_tabs/hard_tab.rb +0 -3
  106. data/features/support/1_file_with_long_lines/long_lines.rb +0 -5
  107. data/features/support/1_file_with_snake_case_class/snake_case_class.rb +0 -5
  108. data/features/support/1_file_with_snake_case_method/snake_case_method.rb +0 -3
  109. data/features/support/1_file_with_trailing_whitespace/trailing_whitespace.rb +0 -5
  110. data/features/support/1_good_simple_file/simple_project.rb +0 -5
  111. data/features/support/common.rb +0 -102
  112. data/features/support/matchers.rb +0 -11
  113. data/lib/tailor/file_line.rb +0 -220
  114. data/lib/tailor/indentation.rb +0 -245
  115. data/lib/tailor/spacing.rb +0 -237
  116. data/spec/file_line_spec.rb +0 -70
  117. data/spec/indentation_spec.rb +0 -259
  118. data/spec/spacing/colon_spacing_spec.rb +0 -71
  119. data/spec/spacing/comma_spacing_spec.rb +0 -159
  120. data/spec/spacing/curly_brace_spacing_spec.rb +0 -257
  121. data/spec/spacing/parentheses_spacing_spec.rb +0 -28
  122. data/spec/spacing/square_bracket_spacing_spec.rb +0 -116
  123. data/spec/spacing_spec.rb +0 -167
  124. data/tasks/metrics.rake +0 -23
@@ -0,0 +1,569 @@
1
+ require_relative '../spec_helper'
2
+ require 'tailor/lexed_line'
3
+
4
+ describe Tailor::LexedLine do
5
+ before do
6
+ Tailor::Logger.stub(:log)
7
+ end
8
+
9
+ subject { Tailor::LexedLine.new(lexed_output, 1) }
10
+
11
+ describe "#initialize" do
12
+ let(:lexed_output) do
13
+ [
14
+ [[1, 0], :on_ident, "require"],
15
+ [[1, 7], :on_sp, " "],
16
+ [[1, 8], :on_tstring_beg, "'"],
17
+ [[1, 9], :on_tstring_content, "log_switch"],
18
+ [[1, 19], :on_tstring_end, "'"],
19
+ [[1, 20], :on_nl, "\n"],
20
+ [[2, 0], :on_ident, "require_relative"],
21
+ [[2, 16], :on_sp, " "],
22
+ [[2, 17], :on_tstring_beg, "'"],
23
+ [[2, 18], :on_tstring_content, "tailor/runtime_error"],
24
+ [[2, 38], :on_tstring_end, "'"],
25
+ [[2, 39], :on_nl, "\n"]
26
+ ]
27
+ end
28
+
29
+ it "returns all lexed output from line 1 when self.lineno is 1" do
30
+ line = Tailor::LexedLine.new(lexed_output, 1)
31
+
32
+ line.should == [
33
+ [[1, 0], :on_ident, "require"],
34
+ [[1, 7], :on_sp, " "],
35
+ [[1, 8], :on_tstring_beg, "'"],
36
+ [[1, 9], :on_tstring_content, "log_switch"],
37
+ [[1, 19], :on_tstring_end, "'"],
38
+ [[1, 20], :on_nl, "\n"]
39
+ ]
40
+ end
41
+ end
42
+
43
+ describe "#only_spaces?" do
44
+ context '0 length line, no \n ending' do
45
+ let(:lexed_output) { [[[1, 0], :on_sp, " "]] }
46
+
47
+ it "should return true" do
48
+ subject.only_spaces?.should be_true
49
+ end
50
+ end
51
+
52
+ context '0 length line, with \n ending' do
53
+ let(:lexed_output) { [[[1, 0], :on_nl, "\n"]] }
54
+
55
+ it "should return true" do
56
+ subject.only_spaces?.should be_true
57
+ end
58
+ end
59
+
60
+ context 'comment line, starting at column 0' do
61
+ let(:lexed_output) { [[[1, 0], :on_comment, "# comment"]] }
62
+
63
+ it "should return false" do
64
+ subject.only_spaces?.should be_false
65
+ end
66
+ end
67
+
68
+ context 'comment line, starting at column 2' do
69
+ let(:lexed_output) do
70
+ [
71
+ [[1, 0], :on_sp, " "],
72
+ [[1, 2], :on_comment, "# comment"]
73
+ ]
74
+ end
75
+
76
+ it "should return false" do
77
+ subject.only_spaces?.should be_false
78
+ end
79
+ end
80
+
81
+ context 'code line, starting at column 2' do
82
+ let(:lexed_output) do
83
+ [
84
+ [[1, 0], :on_ident, "puts"],
85
+ [[1, 4], :on_sp, " "],
86
+ [[1, 5], :on_tstring_beg, "'"],
87
+ [[1, 6], :on_tstring_content, "thing"],
88
+ [[1, 11], :on_tstring_end, "'"],
89
+ [[1, 12], :on_nl, "\n"]
90
+ ]
91
+ end
92
+
93
+ it "should return false" do
94
+ subject.only_spaces?.should be_false
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "#ends_with_op?" do
100
+ context "line ends with a +, then \\n" do
101
+ let(:lexed_output) do
102
+ [
103
+ [[1, 0], :on_ident, "thing"],
104
+ [[1, 5], :on_sp, " "],
105
+ [[1, 6], :on_op, "="],
106
+ [[1, 7], :on_sp, " "],
107
+ [[1, 8], :on_int, "1"],
108
+ [[1, 9], :on_sp, " "],
109
+ [[1, 10], :on_op, "+"],
110
+ [[1, 11], :on_ignored_nl, "\n"],
111
+ [[1, 11], :on_ignored_nl, "\n"]
112
+ ]
113
+ end
114
+
115
+ it "returns true" do
116
+ subject.ends_with_op?.should be_true
117
+ end
118
+ end
119
+
120
+ context "line ends with not an operator, then \\n" do
121
+ let(:lexed_output) do
122
+ [
123
+ [[1, 0], :on_ident, "thing"],
124
+ [[1, 5], :on_sp, " "],
125
+ [[1, 6], :on_op, "="],
126
+ [[1, 7], :on_sp, " "],
127
+ [[1, 8], :on_int, "1"],
128
+ [[1, 11], :on_nl, "\n"]
129
+ ]
130
+ end
131
+
132
+ it "returns false" do
133
+ subject.ends_with_op?.should be_false
134
+ end
135
+ end
136
+ end
137
+
138
+ describe "#ends_with_modifier_kw?" do
139
+ context "ends_with_kw? is false" do
140
+ let(:lexed_output) do
141
+ [
142
+ [[1, 0], :on_ident, "thing"],
143
+ [[1, 5], :on_sp, " "],
144
+ [[1, 6], :on_op, "="],
145
+ [[1, 7], :on_sp, " "],
146
+ [[1, 8], :on_int, "1"],
147
+ [[1, 9], :on_ignored_nl, "\n"]
148
+ ]
149
+ end
150
+
151
+ before { subject.stub(:ends_with_kw?).and_return true }
152
+
153
+ it "returns false" do
154
+ subject.ends_with_modifier_kw?.should be_false
155
+ end
156
+ end
157
+
158
+ context "#ends_with_kw? is true" do
159
+ let(:lexed_output) do
160
+ [
161
+ [[1, 0], :on_ident, "thing"],
162
+ [[1, 5], :on_sp, " "],
163
+ [[1, 6], :on_op, "="],
164
+ [[1, 7], :on_sp, " "],
165
+ [[1, 8], :on_int, "1"],
166
+ [[1, 9], :on_sp, " "],
167
+ [[1, 10], :on_kw, "if"],
168
+ [[1, 12], :on_ignored_nl, "\n"]
169
+ ]
170
+ end
171
+
172
+ let(:token) { double "Token" }
173
+
174
+ context "the keyword is a modifier" do
175
+ before do
176
+ token.stub(:modifier_keyword?).and_return true
177
+ Tailor::Lexer::Token.stub(:new).and_return token
178
+ subject.stub(:ends_with_kw?).and_return true
179
+ end
180
+
181
+ after { Tailor::Lexer::Token.unstub(:new) }
182
+
183
+ it "returns true" do
184
+ subject.ends_with_modifier_kw?.should be_true
185
+ end
186
+ end
187
+
188
+ context "the keyword is not a modifier" do
189
+ before do
190
+ token.stub(:modifier_keyword?).and_return false
191
+ Tailor::Lexer::Token.stub(:new).and_return token
192
+ subject.stub(:ends_with_kw?).and_return true
193
+ end
194
+
195
+ after { Tailor::Lexer::Token.unstub(:new) }
196
+
197
+ it "returns true" do
198
+ subject.ends_with_modifier_kw?.should be_false
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ describe "#does_line_end_with" do
205
+ let(:lexed_output) do
206
+ [
207
+ [[1, 0], :on_kw, "def"],
208
+ [[1, 3], :on_sp, " "],
209
+ [[1, 4], :on_ident, "thing"],
210
+ [[1, 9], :on_sp, " "],
211
+ [[1, 10], :on_nl, "\n"]
212
+ ]
213
+ end
214
+
215
+ context "line ends with the event" do
216
+ it "returns true" do
217
+ subject.does_line_end_with(:on_sp).should be_true
218
+ end
219
+ end
220
+
221
+ context "line does not even with event" do
222
+ it "returns false" do
223
+ subject.does_line_end_with(:on_kw).should be_false
224
+ end
225
+ end
226
+ end
227
+
228
+ describe "#loop_with_do?" do
229
+ context "line is 'while true do\\n'" do
230
+ let(:lexed_output) do
231
+ [[[1, 0], :on_kw, "while"], [[1, 5], :on_sp, " "], [[1, 6], :on_kw, "true"], [[1, 10], :on_sp, " "], [[1, 11], :on_kw, "do"], [[1, 13], :on_ignored_nl, "\n"]]
232
+ end
233
+
234
+ it "returns true" do
235
+ subject.loop_with_do?.should be_true
236
+ end
237
+ end
238
+
239
+ context "line is 'while true\\n'" do
240
+ let(:lexed_output) do
241
+ [[[1, 0], :on_kw, "while"], [[1, 5], :on_sp, " "], [[1, 6], :on_kw, "true"], [[1, 10], :on_sp, " "], [[1, 11], :on_ignored_nl, "\n"]]
242
+ end
243
+
244
+ it "returns false" do
245
+ subject.loop_with_do?.should be_false
246
+ end
247
+ end
248
+
249
+ context "line is 'until true do\\n'" do
250
+ let(:lexed_output) do
251
+ [[[1, 0], :on_kw, "until"], [[1, 5], :on_sp, " "], [[1, 6], :on_kw, "true"], [[1, 10], :on_sp, " "], [[1, 11], :on_kw, "do"], [[1, 13], :on_ignored_nl, "\n"]]
252
+ end
253
+
254
+ it "returns true" do
255
+ subject.loop_with_do?.should be_true
256
+ end
257
+ end
258
+
259
+ context "line is 'until true\\n'" do
260
+ let(:lexed_output) do
261
+ [[[1, 0], :on_kw, "until"], [[1, 5], :on_sp, " "], [[1, 6], :on_kw, "true"], [[1, 10], :on_sp, " "], [[1, 11], :on_ignored_nl, "\n"]]
262
+ end
263
+
264
+ it "returns false" do
265
+ subject.loop_with_do?.should be_false
266
+ end
267
+ end
268
+
269
+ context "line is 'for i in 1..5 do\\n'" do
270
+ let(:lexed_output) do
271
+ [[[1, 0], :on_kw, "for"], [[1, 3], :on_sp, " "], [[1, 4], :on_ident, "i"], [[1, 5], :on_sp, " "], [[1, 6], :on_kw, "in"], [[1, 8], :on_sp, " "], [[1, 9], :on_int, "1"], [[1, 10], :on_op, ".."], [[1, 12], :on_int, "5"], [[1, 13], :on_sp, " "], [[1, 14], :on_kw, "do"], [[1, 16], :on_ignored_nl, "\n"]]
272
+ end
273
+
274
+ it "returns true" do
275
+ subject.loop_with_do?.should be_true
276
+ end
277
+ end
278
+
279
+ context "line is 'for i in 1..5\\n'" do
280
+ let(:lexed_output) do
281
+ [[[1, 0], :on_kw, "for"], [[1, 3], :on_sp, " "], [[1, 4], :on_ident, "i"], [[1, 5], :on_sp, " "], [[1, 6], :on_kw, "in"], [[1, 8], :on_sp, " "], [[1, 9], :on_int, "1"], [[1, 10], :on_op, ".."], [[1, 12], :on_int, "5"], [[1, 13], :on_sp, " "], [[1, 14], :on_ignored_nl, "\n"]]
282
+ end
283
+
284
+ it "returns false" do
285
+ subject.loop_with_do?.should be_false
286
+ end
287
+ end
288
+ end
289
+
290
+ describe "#first_non_space_element" do
291
+ context "lexed line contains only spaces" do
292
+ let(:lexed_output) { [[[1, 0], :on_sp, " "]] }
293
+
294
+ it "returns nil" do
295
+ subject.first_non_space_element.should be_nil
296
+ end
297
+ end
298
+
299
+ context "lexed line contains only \\n" do
300
+ let(:lexed_output) { [[[1, 0], :on_ignored_nl, "\n"]] }
301
+
302
+ it "returns nil" do
303
+ subject.first_non_space_element.should be_nil
304
+ end
305
+ end
306
+
307
+ context "lexed line contains ' }\\n'" do
308
+ let(:lexed_output) { [[[1, 0], :on_sp, " "], [[1, 2], :on_rbrace, "}"], [[1, 3], :on_nl, "\n"]] }
309
+
310
+ it "returns nil" do
311
+ subject.first_non_space_element.should == [[1, 2], :on_rbrace, "}"]
312
+ end
313
+ end
314
+ end
315
+
316
+ describe "#event_at" do
317
+ let(:lexed_output) { [[[1, 0], :on_sp, " "]] }
318
+
319
+ context "self contains an event at the given column" do
320
+ it "returns that event" do
321
+ subject.event_at(0).should == lexed_output.first
322
+ end
323
+ end
324
+
325
+ context "self does not contain an event at the given column" do
326
+ it "returns nil" do
327
+ subject.event_at(1234).should be_nil
328
+ end
329
+ end
330
+ end
331
+
332
+ describe "#event_index" do
333
+ let(:lexed_output) { [[[1, 0], :on_sp, " "]] }
334
+
335
+ context "#event_at returns nil" do
336
+ before { subject.stub(:event_at).and_return nil }
337
+ specify { subject.event_index(1234).should be_nil }
338
+ end
339
+
340
+ context "#event_at returns a valid column" do
341
+ it "returns the event" do
342
+ subject.event_index(0).should be_zero
343
+ end
344
+ end
345
+ end
346
+
347
+ describe "#to_s" do
348
+ let(:lexed_output) do
349
+ [
350
+ [[1, 0], :on_kw, "def"],
351
+ [[1, 3], :on_sp, " "],
352
+ [[1, 4], :on_ident, "thing"],
353
+ [[1, 9], :on_sp, " "],
354
+ [[1, 10], :on_nl, "\n"]
355
+ ]
356
+ end
357
+
358
+ it "returns the String made up of self's tokens" do
359
+ subject.to_s.should == "def thing \n"
360
+ end
361
+ end
362
+
363
+ describe "#remove_comment_at" do
364
+ context "stuff before comment is an incomplete statement" do
365
+ context "spaces before comment" do
366
+ let(:lexed_output) do
367
+ [
368
+ [[1, 0], :on_kw, "def"],
369
+ [[1, 3], :on_sp, " "],
370
+ [[1, 4], :on_ident, "thing"],
371
+ [[1, 9], :on_sp, " "],
372
+ [[1, 10], :on_ident, "one"],
373
+ [[1, 13], :on_comma, ","],
374
+ [[1, 14], :on_sp, " "],
375
+ [[1, 16], :on_comment, "# comment\n"]
376
+ ]
377
+ end
378
+
379
+ let(:file_text) do
380
+ "def thing one, # comment\n two\nend\n"
381
+ end
382
+
383
+ it "replaces the comment with an :on_ignored_nl" do
384
+ subject.remove_trailing_comment(file_text).should == [
385
+ [[1, 0], :on_kw, "def"],
386
+ [[1, 3], :on_sp, " "],
387
+ [[1, 4], :on_ident, "thing"],
388
+ [[1, 9], :on_sp, " "],
389
+ [[1, 10], :on_ident, "one"],
390
+ [[1, 13], :on_comma, ","],
391
+ [[1, 14], :on_ignored_nl, "\n"]
392
+ ]
393
+ end
394
+ end
395
+
396
+ context "no spaces before comment" do
397
+ let(:lexed_output) do
398
+ [
399
+ [[1, 0], :on_kw, "def"],
400
+ [[1, 3], :on_sp, " "],
401
+ [[1, 4], :on_ident, "thing"],
402
+ [[1, 9], :on_sp, " "],
403
+ [[1, 10], :on_ident, "one"],
404
+ [[1, 13], :on_comma, ","],
405
+ [[1, 14], :on_comment, "# comment\n"]
406
+ ]
407
+ end
408
+
409
+ let(:file_text) do
410
+ "def thing one,# comment\n two\nend\n"
411
+ end
412
+
413
+ it "replaces the comment with an :on_ignored_nl" do
414
+ subject.remove_trailing_comment(file_text).should == [
415
+ [[1, 0], :on_kw, "def"],
416
+ [[1, 3], :on_sp, " "],
417
+ [[1, 4], :on_ident, "thing"],
418
+ [[1, 9], :on_sp, " "],
419
+ [[1, 10], :on_ident, "one"],
420
+ [[1, 13], :on_comma, ","],
421
+ [[1, 14], :on_ignored_nl, "\n"]
422
+ ]
423
+ end
424
+ end
425
+ end
426
+
427
+ context "stuff before comment is a complete statement" do
428
+ context "spaces before comment" do
429
+ let(:lexed_output) do
430
+ [
431
+ [[1, 0], :on_kw, "def"],
432
+ [[1, 3], :on_sp, " "],
433
+ [[1, 4], :on_ident, "thing"],
434
+ [[1, 9], :on_sp, " "],
435
+ [[1, 10], :on_ident, "one"],
436
+ [[1, 13], :on_sp, " "],
437
+ [[1, 15], :on_comment, "# comment\n"]
438
+ ]
439
+ end
440
+
441
+ let(:file_text) do
442
+ "def thing one # comment\n\nend\n"
443
+ end
444
+
445
+ it "replaces the comment with an :on_nl" do
446
+ subject.remove_trailing_comment(file_text).should == [
447
+ [[1, 0], :on_kw, "def"],
448
+ [[1, 3], :on_sp, " "],
449
+ [[1, 4], :on_ident, "thing"],
450
+ [[1, 9], :on_sp, " "],
451
+ [[1, 10], :on_ident, "one"],
452
+ [[1, 13], :on_nl, "\n"]
453
+ ]
454
+ end
455
+ end
456
+
457
+ context "no spaces before comment" do
458
+ let(:lexed_output) do
459
+ [
460
+ [[1, 0], :on_kw, "def"],
461
+ [[1, 3], :on_sp, " "],
462
+ [[1, 4], :on_ident, "thing"],
463
+ [[1, 9], :on_sp, " "],
464
+ [[1, 10], :on_ident, "one"],
465
+ [[1, 13], :on_comment, "# comment\n"]
466
+ ]
467
+ end
468
+
469
+ let(:file_text) do
470
+ "def thing one# comment\n \nend\n"
471
+ end
472
+
473
+ it "replaces the comment with an :on_nl" do
474
+ subject.remove_trailing_comment(file_text).should == [
475
+ [[1, 0], :on_kw, "def"],
476
+ [[1, 3], :on_sp, " "],
477
+ [[1, 4], :on_ident, "thing"],
478
+ [[1, 9], :on_sp, " "],
479
+ [[1, 10], :on_ident, "one"],
480
+ [[1, 13], :on_nl, "\n"]
481
+ ]
482
+ end
483
+
484
+ it "returns a LexedLine" do
485
+ subject.remove_trailing_comment(file_text).should be_a Tailor::LexedLine
486
+ end
487
+ end
488
+ end
489
+ end
490
+
491
+ describe "#end_of_multi-line_string?" do
492
+ context "lexed output is from the end of a multi-line % statement" do
493
+ let(:lexed_output) do
494
+ [[[1, 11], :on_tstring_end, "}"], [[1, 12], :on_nl, "\n"]]
495
+ end
496
+
497
+ it "returns true" do
498
+ subject.end_of_multi_line_string?.should be_true
499
+ end
500
+ end
501
+
502
+ context "lexed output is not from the end of a multi-line % statement" do
503
+ let(:lexed_output) do
504
+ [[[1, 11], :on_comma, ","], [[1, 12], :on_nl, "\n"]]
505
+ end
506
+
507
+ it "returns true" do
508
+ subject.end_of_multi_line_string?.should be_false
509
+ end
510
+ end
511
+
512
+ context "lexed output contains start AND end of a multi-line % statement" do
513
+ let(:lexed_output) do
514
+ [
515
+ [[1, 0], :on_tstring_beg, "%Q{"],
516
+ [[1, 3], :on_tstring_content, "this is a t string! suckaaaaaa!"],
517
+ [[1, 32], :on_tstring_end, "}"]
518
+ ]
519
+ end
520
+
521
+ it "returns true" do
522
+ subject.end_of_multi_line_string?.should be_false
523
+ end
524
+ end
525
+ end
526
+
527
+ describe "#is_line_only_a" do
528
+ let(:lexed_output) do
529
+ [[[1, 11], :on_comma, ","], [[1, 12], :on_nl, "\n"]]
530
+ end
531
+
532
+ context "last event is not the event passed in" do
533
+ let(:last_event) do
534
+ [[[1, 11], :on_comma, ","]]
535
+ end
536
+
537
+ before do
538
+ subject.stub(:last_non_line_feed_event).and_return last_event
539
+ end
540
+
541
+ specify { subject.is_line_only_a(:on_period).should be_false }
542
+ end
543
+
544
+ context "last event is the last event passed in" do
545
+ context "there is only space before the last event" do
546
+ let(:lexed_output) do
547
+ [
548
+ [[1, 0], :on_sp, ' '],
549
+ [[1, 11], :on_comma, ","],
550
+ [[1, 12], :on_nl, "\n"]]
551
+ end
552
+
553
+ specify { subject.is_line_only_a(:on_comma).should be_true }
554
+ end
555
+
556
+ context "there is non-spaces before the last event" do
557
+ let(:lexed_output) do
558
+ [
559
+ [[1, 0], :on_sp, " "],
560
+ [[1, 8], :on_ident, "one"],
561
+ [[1, 11], :on_comma, ","],
562
+ [[1, 12], :on_nl, "\n"]]
563
+ end
564
+
565
+ specify { subject.is_line_only_a(:on_comma).should be_false }
566
+ end
567
+ end
568
+ end
569
+ end