shark 0.0.0.5.2 → 0.0.0.5.3

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/src/shark.rb CHANGED
@@ -1,543 +1,579 @@
1
- #Shark is a simple testing tool for testing file system operations. It is still under development
2
-
3
- require 'optparse'
4
- require 'fileutils'
5
-
6
- class Shark
7
-
8
- def initialize(a1,a2,a3)
9
-
10
- @features_directory = a1
11
-
12
- @files_directory = a2
13
-
14
- @base_path = a3
15
-
16
- end
17
-
18
- def start_test
19
-
20
- def read_file_line_by_line(input_path)
21
-
22
- file_id = open(input_path)
23
-
24
- file_line_by_line = file_id.readlines()
25
-
26
- file_id.close
27
-
28
- return file_line_by_line
29
-
30
- end
31
-
32
- def find_file_name(input_path, file_extension)
33
-
34
- extension_remover = input_path.split(file_extension)
35
-
36
- remaining_string = extension_remover[0].reverse
37
-
38
- path_finder = remaining_string.index("/")
39
-
40
- remaining_string = remaining_string.reverse
41
-
42
- return remaining_string[remaining_string.length-path_finder..-1]
43
-
44
- end
45
-
46
- def parse_feature(input_feature_contents)
47
-
48
- #This method extracts scenarios from a feature file
49
-
50
- #Input:
51
- #input_feature_contents => An array containing the contents of a feature file
52
-
53
- #Output:
54
- #feature_name => Name and description of the feature described in the file
55
- #modified_scenarios => An array containing scenario descriptions and scenario steps
56
-
57
- def find_all_matching_indices(input_string,pattern)
58
-
59
- locations = []
60
-
61
- index = input_string.index(pattern)
62
-
63
- while index != nil
64
-
65
- locations << index
66
-
67
- index = input_string.index(pattern,index+1)
68
-
69
-
70
- end
71
-
72
- return locations
73
-
74
-
75
- end
76
-
77
- while input_feature_contents[0].eql?("\n")
78
-
79
- input_feature_contents.delete_at(0)
80
-
81
- end
82
-
83
- feature_contents_string = input_feature_contents.join
84
-
85
- feature_name = ""
86
-
87
- if feature_contents_string.include?("Scenario:")
88
-
89
- feature_name = feature_contents_string[feature_contents_string.index("Feature:")...feature_contents_string.index("Scenario:")].rstrip
90
-
91
- else
92
-
93
- feature_name = feature_contents_string.rstrip
94
-
95
- end
96
-
97
- scenarios = []
98
-
99
- scenarios_index = find_all_matching_indices(feature_contents_string,"Scenario:")
100
-
101
- scenarios_index << -1
102
-
103
- for x in 0...scenarios_index.length-1
104
-
105
- scenario = feature_contents_string[scenarios_index[x]...scenarios_index[x+1]]
106
-
107
- scenarios << [scenario.lstrip]
108
-
109
- end
110
-
111
- modified_scenarios = scenarios.dup
112
-
113
- scenario_names = []
114
-
115
- scenarios.each_with_index do |s,index|
116
-
117
- scenario_steps = s[0].split(" ")[1..-1]
118
-
119
- scenario_names << s[0].split(" ")[0]
120
-
121
- modified_scenarios[index] << scenario_steps
122
-
123
- end
124
-
125
- return feature_name,scenario_names,modified_scenarios
126
-
127
- end
128
-
129
- def parse_and_test_steps(input_steps,test_files_directory,configuration,config_variables,base_path)
130
-
131
- #This method parses the steps for a given scenario and produces a result using the following keywords
132
-
133
- #Keywords
134
-
135
- #Input
136
- #File
137
- #When
138
- #Run
139
- #Output
140
- #Equal
141
-
142
- #Input:
143
- #input_steps => An array containing the steps
144
-
145
- #Output:
146
- #test_result => A string and a boolean containing the results of the test
147
-
148
- def read_file_line_by_line(input_path)
149
-
150
- file_id = open(input_path)
151
-
152
- file_line_by_line = file_id.readlines()
153
-
154
- file_id.close
155
-
156
- return file_line_by_line
157
-
158
- end
159
-
160
- input_procedures = input_steps.reject {|element| !element.include?("$input")}
161
-
162
- input_file_names = []
163
-
164
- input_procedures.each do |procedure|
165
-
166
- if procedure.include? "$file"
167
-
168
- opening_quotes = procedure.index("\"")
169
-
170
- file_name = procedure[opening_quotes...procedure.index("\"",opening_quotes+1)]
171
-
172
- input_file_names << file_name
173
-
174
- end
175
-
176
- end
177
-
178
- input_file_contents = input_steps.dup
179
-
180
- test_files_directory = test_files_directory.sub(Dir.pwd,"").sub("/","")
181
-
182
- input_file_names = input_file_names.collect{|element| test_files_directory+element[1..-1]}
183
-
184
- run_procedures = input_file_contents.reject{ |element| !element.include?("$run")}
185
-
186
- run_keywords = ["$cliusage"]
187
-
188
- configuration_vars = config_variables.keys
189
-
190
- modified_keyword_usage = nil
191
-
192
- executable_statements = [[]]*configuration_vars.length
193
-
194
- run_keywords.each do |keyword|
195
-
196
- keyword_usage = configuration.reject { |element| !element.include?(keyword)}
197
-
198
- modified_keyword_usage = keyword_usage.dup
199
-
200
- keyword_usage.each_with_index do |line,index|
201
-
202
- configuration_vars.each_with_index do |var,var_index|
203
-
204
- modified_keyword_usage[index] = modified_keyword_usage[index].gsub(var,"#{config_variables[var]}")
205
-
206
- statement_split = modified_keyword_usage[index].split("=>")
207
-
208
- executable_statements[var_index] << statement_split[1].lstrip.rstrip
209
-
210
- end
211
-
212
- end
213
-
214
- end
215
-
216
- configuration_vars.each_with_index do |var,index|
217
-
218
- current_var_run_procedures = run_procedures.reject{|element| !element.include?(var)}
219
-
220
- current_var_run_procedures.each do |run|
221
-
222
- current_executable_statements = executable_statements[index]
223
-
224
- current_executable_statements.each do |executable|
225
-
226
- input_file_names.each do |file_name|
227
-
228
- current_executable_statement = executable.gsub("$file",file_name)
229
-
230
- cli_output = `#{current_executable_statement.strip.lstrip.rstrip}`
231
-
232
- end
233
-
234
- end
235
-
236
- end
237
-
238
-
239
- end
240
-
241
- output_procedures = input_steps.reject {|element| !element.include?("$output")}
242
-
243
- matching_file_names = []
244
-
245
- output_file_names = []
246
-
247
- output_procedures.each do |procedure|
248
-
249
- if procedure.include?("$equal") and procedure.include?("$file")
250
-
251
- opening_quotes = procedure.index("\"")
252
-
253
- file_name = procedure[opening_quotes...procedure.index("\"",opening_quotes+1)]
254
-
255
- matching_file_names << file_name
256
-
257
- else
258
-
259
- opening_quotes = procedure.index("\"")
260
-
261
- file_name = procedure[opening_quotes...procedure.index("\"",opening_quotes+1)]
262
-
263
- output_file_names << file_name
264
-
265
- end
266
-
267
- end
268
-
269
- output_file_names = output_file_names.collect {|element| test_files_directory + element[1..-1]}
270
-
271
- matching_file_names = matching_file_names.collect {|element| test_files_directory+element[1..-1]}
272
-
273
- output_file_contents = output_file_names.collect{ |element| read_file_line_by_line(element)}
274
-
275
- matching_file_contents = matching_file_names.collect{ |element| read_file_line_by_line(element)}
276
-
277
- test_results = []
278
-
279
- false_results = []
280
-
281
- matching_file_contents.each_with_index do |matching_file,matching_index|
282
-
283
- false_results << [matching_file_names[matching_index]]
284
-
285
- output_file_contents.each_with_index do |output_file,index|
286
-
287
- if matching_file.eql?(output_file)
288
-
289
- test_results << true
290
-
291
- else
292
-
293
- test_results << false
294
-
295
- false_results[-1] << [output_file_names[index]]
296
-
297
- end
298
-
299
- end
300
-
301
- end
302
-
303
- if test_results.include?(false)
304
-
305
- output_string = "\nThe test failed!\n\nA detailed breakdown of the failing files have been given below."
306
-
307
- output_string = output_string + "\n\n"
308
-
309
- detailed_fail_list = ""
310
-
311
- false_results.each do |result|
312
-
313
- detailed_fail_list = detailed_fail_list + "The following files failed in comparison with #{result[0]}"
314
-
315
- failed_files = result[1]
316
-
317
- failed_files.each do |file|
318
-
319
- detailed_fail_list = detailed_fail_list + "\n\n" + "* #{file}\n"
320
-
321
- end
322
-
323
- end
324
-
325
- return output_string = output_string + detailed_fail_list
326
-
327
- else
328
-
329
- return "\nYour test file(s) passed the feature test.\n\n"
330
-
331
- end
332
-
333
- end
334
-
335
- def extract_configurations(feature_contents)
336
-
337
- config_start_index = 0
338
-
339
- feature_contents.each_with_index do |line,index|
340
-
341
- if line.include?("Configurations:")
342
-
343
- config_start_index = index
344
-
345
- end
346
-
347
- end
348
-
349
- modified_feature_contents = feature_contents[0...config_start_index]
350
-
351
- configurations = feature_contents[config_start_index..-1]
352
-
353
- configuration_variables = configurations.join.match(/~\w{1,}/).to_a
354
-
355
- configuration_variable_index = [[]]*configuration_variables.length
356
-
357
- configurations.each_with_index do |line,index|
358
-
359
- configuration_variables.each_with_index do |variable,var_index|
360
-
361
- if line.include?(variable)
362
-
363
- configuration_variable_index[var_index] << index
364
-
365
- end
366
-
367
- end
368
-
369
- end
370
-
371
- def reset_test_files_directory(original_file_list,after_file_list)
372
-
373
- added_files = after_file_list-original_file_list
374
-
375
- added_files.each do |file_name|
376
-
377
- File.delete(file_name)
378
-
379
- end
380
-
381
- end
382
-
383
- configuration_variable_index = configuration_variable_index.collect{ |element| element[0]}
384
-
385
- configuration_variable_index << configurations.length-1
386
-
387
- modified_configurations = configurations.dup
388
-
389
- for x in 0...configuration_variable_index.length-1
390
-
391
- current_index = configuration_variable_index[x]
392
-
393
- current_variable = configuration_variables[x]
394
-
395
- for y in current_index..configuration_variable_index[x+1]
396
-
397
- modified_configurations[y] = configurations[y].gsub(":v",current_variable)
398
-
399
- end
400
-
401
- end
402
-
403
- configuration_var_values = []
404
-
405
- configuration_variable_index.delete_at(1)
406
-
407
- configuration_variable_index.each do |index|
408
-
409
- var_split = modified_configurations[index].split("=>")
410
-
411
- var_value = var_split[1].lstrip.rstrip
412
-
413
- configuration_var_values << var_value
414
-
415
- end
416
-
417
- configuration_values = Hash[configuration_variables.zip(configuration_var_values)]
418
-
419
- return modified_feature_contents,modified_configurations,configuration_values
420
-
421
- end
422
-
423
- list_of_features = []
424
-
425
- Dir.foreach(@features_directory) { |x| list_of_features << @features_directory+"#{x}" }
426
-
427
- initial_files_list = []
428
-
429
- Dir.foreach(@files_directory) { |x| initial_files_list << @files_directory+"#{x}" }
430
-
431
- list_of_features = list_of_features.reject { |path| !path.include?(".feature")}
432
-
433
- list_of_features.each do |feature_path|
434
-
435
- feature_contents = read_file_line_by_line(feature_path)
436
-
437
- feature_contents,configurations,config_values = extract_configurations(feature_contents)
438
-
439
- feature_name,scenario_names,scenarios = parse_feature(feature_contents)
440
-
441
- puts feature_name
442
-
443
- scenarios.each_with_index do |scenario,index|
444
-
445
- puts "\n#{scenario_names[index]}"
446
-
447
- scenario[1] = scenario[1].collect{|element| element.sub("input","$input")}
448
-
449
- scenario[1] = scenario[1].collect{|element| element.sub("file","$file")}
450
-
451
- scenario[1] = scenario[1].collect{|element| element.sub("run","$run")}
452
-
453
- scenario[1] = scenario[1].collect{|element| element.sub("output","$output")}
454
-
455
- scenario[1] = scenario[1].collect{|element| element.sub("equal","$equal")}
456
-
457
- output = parse_and_test_steps(scenario[1],@files_directory,configurations,config_values,@base_path)
458
-
459
- puts output
460
-
461
- end
462
-
463
- puts "\n"
464
-
465
- end
466
-
467
- after_files_list = []
468
-
469
- Dir.foreach(@files_directory) { |x| after_files_list << @files_directory+"#{x}" }
470
-
471
- reset_test_files_directory(initial_files_list,after_files_list)
472
-
473
- end
474
-
475
- end
476
-
477
- def create_mac_executable(input_file)
478
-
479
- def read_file_line_by_line(input_path)
480
-
481
- file_id = open(input_path)
482
-
483
- file_line_by_line = file_id.readlines()
484
-
485
- file_id.close
486
-
487
- return file_line_by_line
488
-
489
- end
490
-
491
- mac_file_contents = ["#!/usr/bin/env ruby\n\n"] + read_file_line_by_line(input_file)
492
-
493
- mac_file_path = input_file.sub(".rb","")
494
-
495
- file_id = open(mac_file_path,"w")
496
-
497
- file_id.write(mac_file_contents.join)
498
-
499
- file_id.close
500
-
501
- end
502
-
503
- OptionParser.new do |opts|
504
-
505
- opts.banner = "Usage: shark [options]"
506
-
507
- opts.on("-t", "--test", "Start Test") do
508
-
509
- current_directory = Dir.pwd + "/shark/"
510
-
511
- base_path = Dir.pwd
512
-
513
- features_directory = current_directory + "features/"
514
-
515
- test_files_directory = current_directory + "test_files/"
516
-
517
- tester = Shark.new(features_directory, test_files_directory, base_path)
518
-
519
- tester.start_test()
520
-
521
- end
522
-
523
- opts.on("-i","--init","Initialize Shark in this project") do
524
-
525
- FileUtils.mkdir_p "Shark\\features"
526
-
527
- FileUtils.mkdir_p "Shark\\test_files"
528
-
529
- puts "Shark has been successfully initialized!"
530
-
531
- end
532
-
533
- opts.on("-m", "--buildmac", "Builds Mac Executables") do
534
-
535
- file_path = Dir.pwd + "/shark.rb"
536
-
537
- create_mac_executable(file_path)
538
-
539
- puts "Build Successful!"
540
-
541
- end
542
-
1
+ #Shark is a simple testing tool for testing file system operations. It is still under development
2
+
3
+ require 'optparse'
4
+ require 'fileutils'
5
+
6
+ class Shark
7
+
8
+ def initialize(a1,a2,a3)
9
+
10
+ @features_directory = a1
11
+
12
+ @files_directory = a2
13
+
14
+ @base_path = a3
15
+
16
+ end
17
+
18
+ def start_test
19
+
20
+ def read_file_line_by_line(input_path)
21
+
22
+ file_id = open(input_path)
23
+
24
+ file_line_by_line = file_id.readlines()
25
+
26
+ file_id.close
27
+
28
+ return file_line_by_line
29
+
30
+ end
31
+
32
+ def find_file_name(input_path, file_extension)
33
+
34
+ extension_remover = input_path.split(file_extension)
35
+
36
+ remaining_string = extension_remover[0].reverse
37
+
38
+ path_finder = remaining_string.index("/")
39
+
40
+ remaining_string = remaining_string.reverse
41
+
42
+ return remaining_string[remaining_string.length-path_finder..-1]
43
+
44
+ end
45
+
46
+ def parse_feature(input_feature_contents)
47
+
48
+ #This method extracts scenarios from a feature file
49
+
50
+ #Input:
51
+ #input_feature_contents => An array containing the contents of a feature file
52
+
53
+ #Output:
54
+ #feature_name => Name and description of the feature described in the file
55
+ #modified_scenarios => An array containing scenario descriptions and scenario steps
56
+
57
+ def find_all_matching_indices(input_string,pattern)
58
+
59
+ locations = []
60
+
61
+ index = input_string.index(pattern)
62
+
63
+ while index != nil
64
+
65
+ locations << index
66
+
67
+ index = input_string.index(pattern,index+1)
68
+
69
+
70
+ end
71
+
72
+ return locations
73
+
74
+
75
+ end
76
+
77
+ while input_feature_contents[0].eql?("\n")
78
+
79
+ input_feature_contents.delete_at(0)
80
+
81
+ end
82
+
83
+ feature_contents_string = input_feature_contents.join
84
+
85
+ feature_name = ""
86
+
87
+ if feature_contents_string.include?("Scenario:")
88
+
89
+ feature_name = feature_contents_string[feature_contents_string.index("Feature:")...feature_contents_string.index("Scenario:")].rstrip
90
+
91
+ else
92
+
93
+ feature_name = feature_contents_string.rstrip
94
+
95
+ end
96
+
97
+ scenarios = []
98
+
99
+ scenarios_index = find_all_matching_indices(feature_contents_string,"Scenario:")
100
+
101
+ scenarios_index << -1
102
+
103
+ for x in 0...scenarios_index.length-1
104
+
105
+ scenario = feature_contents_string[scenarios_index[x]...scenarios_index[x+1]]
106
+
107
+ scenarios << [scenario.lstrip]
108
+
109
+ end
110
+
111
+ modified_scenarios = scenarios.dup
112
+
113
+ scenario_names = []
114
+
115
+ scenarios.each_with_index do |s,index|
116
+
117
+ scenario_steps = s[0].split(" ")[1..-1]
118
+
119
+ scenario_names << s[0].split(" ")[0]
120
+
121
+ modified_scenarios[index] << scenario_steps
122
+
123
+ end
124
+
125
+ return feature_name,scenario_names,modified_scenarios
126
+
127
+ end
128
+
129
+ def parse_and_test_steps(input_steps,test_files_directory,configuration,config_variables,base_path)
130
+
131
+ #This method parses the steps for a given scenario and produces a result using the following keywords
132
+
133
+ #Keywords
134
+
135
+ #Input
136
+ #File
137
+ #When
138
+ #Run
139
+ #Output
140
+ #Equal
141
+
142
+ #Input:
143
+ #input_steps => An array containing the steps
144
+
145
+ #Output:
146
+ #test_result => A string and a boolean containing the results of the test
147
+
148
+ def read_file_line_by_line(input_path)
149
+
150
+ file_id = open(input_path)
151
+
152
+ file_line_by_line = file_id.readlines()
153
+
154
+ file_id.close
155
+
156
+ return file_line_by_line
157
+
158
+ end
159
+
160
+ input_procedures = input_steps.reject {|element| !element.include?("$input")}
161
+
162
+ input_file_names = []
163
+
164
+ input_procedures.each do |procedure|
165
+
166
+ if procedure.include? "$file"
167
+
168
+ opening_quotes = procedure.index("\"")
169
+
170
+ file_name = procedure[opening_quotes...procedure.index("\"",opening_quotes+1)]
171
+
172
+ input_file_names << file_name
173
+
174
+ end
175
+
176
+ end
177
+
178
+ input_file_contents = input_steps.dup
179
+
180
+ test_files_directory = test_files_directory.sub(Dir.pwd,"").sub("/","")
181
+
182
+ input_file_names = input_file_names.collect{|element| test_files_directory+element[1..-1]}
183
+
184
+ run_procedures = input_file_contents.reject{ |element| !element.include?("$run")}
185
+
186
+ run_keywords = ["$cliusage"]
187
+
188
+ configuration_vars = config_variables.keys
189
+
190
+ modified_keyword_usage = nil
191
+
192
+ executable_statements = [[]]*configuration_vars.length
193
+
194
+ run_keywords.each do |keyword|
195
+
196
+ keyword_usage = configuration.reject { |element| !element.include?(keyword)}
197
+
198
+ modified_keyword_usage = keyword_usage.dup
199
+
200
+ keyword_usage.each_with_index do |line,index|
201
+
202
+ configuration_vars.each_with_index do |var,var_index|
203
+
204
+ modified_keyword_usage[index] = modified_keyword_usage[index].gsub(var,"#{config_variables[var]}")
205
+
206
+ statement_split = modified_keyword_usage[index].split("=>")
207
+
208
+ executable_statements[var_index] << statement_split[1].lstrip.rstrip
209
+
210
+ end
211
+
212
+ end
213
+
214
+ end
215
+
216
+ configuration_vars.each_with_index do |var,index|
217
+
218
+ current_var_run_procedures = run_procedures.reject{|element| !element.include?(var)}
219
+
220
+ current_var_run_procedures.each do |run|
221
+
222
+ current_executable_statements = executable_statements[index]
223
+
224
+ current_executable_statements.each do |executable|
225
+
226
+ input_file_names.each do |file_name|
227
+
228
+ current_executable_statement = executable.gsub("$file",file_name)
229
+
230
+ cli_output = `#{current_executable_statement.strip.lstrip.rstrip}`
231
+
232
+ end
233
+
234
+ end
235
+
236
+ end
237
+
238
+
239
+ end
240
+
241
+ output_procedures = input_steps.reject {|element| !element.include?("$output")}
242
+
243
+ matching_file_names = []
244
+
245
+ output_file_names = []
246
+
247
+ output_procedures.each do |procedure|
248
+
249
+ if procedure.include?("$equal") and procedure.include?("$file")
250
+
251
+ opening_quotes = procedure.index("\"")
252
+
253
+ file_name = procedure[opening_quotes...procedure.index("\"",opening_quotes+1)]
254
+
255
+ matching_file_names << file_name
256
+
257
+ else
258
+
259
+ opening_quotes = procedure.index("\"")
260
+
261
+ file_name = procedure[opening_quotes...procedure.index("\"",opening_quotes+1)]
262
+
263
+ output_file_names << file_name
264
+
265
+ end
266
+
267
+ end
268
+
269
+ output_file_names = output_file_names.collect {|element| test_files_directory + element[1..-1]}
270
+
271
+ matching_file_names = matching_file_names.collect {|element| test_files_directory+element[1..-1]}
272
+
273
+ output_file_contents = output_file_names.collect{ |element| read_file_line_by_line(element)}
274
+
275
+ matching_file_contents = matching_file_names.collect{ |element| read_file_line_by_line(element)}
276
+
277
+ test_results = []
278
+
279
+ false_results = []
280
+
281
+ matching_file_contents.each_with_index do |matching_file,matching_index|
282
+
283
+ false_results << [matching_file_names[matching_index]]
284
+
285
+ output_file_contents.each_with_index do |output_file,index|
286
+
287
+ if matching_file.eql?(output_file)
288
+
289
+ test_results << true
290
+
291
+ else
292
+
293
+ test_results << false
294
+
295
+ false_results[-1] << [output_file_names[index]]
296
+
297
+ end
298
+
299
+ end
300
+
301
+ end
302
+
303
+ if test_results.include?(false)
304
+
305
+ output_string = "\nThe test failed!\n\nA detailed breakdown of the failing files have been given below."
306
+
307
+ output_string = output_string + "\n\n"
308
+
309
+ detailed_fail_list = ""
310
+
311
+ false_results.each do |result|
312
+
313
+ detailed_fail_list = detailed_fail_list + "The following files failed in comparison with #{result[0]}"
314
+
315
+ failed_files = result[1]
316
+
317
+ failed_files.each do |file|
318
+
319
+ detailed_fail_list = detailed_fail_list + "\n\n" + "* #{file}\n"
320
+
321
+ end
322
+
323
+ end
324
+
325
+ return output_string = output_string + detailed_fail_list, false
326
+
327
+ else
328
+
329
+ return "\nYour test file(s) passed the feature test.\n\n", true
330
+
331
+ end
332
+
333
+ end
334
+
335
+ def extract_configurations(feature_contents)
336
+
337
+ config_start_index = 0
338
+
339
+ feature_contents.each_with_index do |line,index|
340
+
341
+ if line.include?("Configurations:")
342
+
343
+ config_start_index = index
344
+
345
+ end
346
+
347
+ end
348
+
349
+ modified_feature_contents = feature_contents[0...config_start_index]
350
+
351
+ configurations = feature_contents[config_start_index..-1]
352
+
353
+ configuration_variables = configurations.join.match(/~\w{1,}/).to_a
354
+
355
+ configuration_variable_index = [[]]*configuration_variables.length
356
+
357
+ configurations.each_with_index do |line,index|
358
+
359
+ configuration_variables.each_with_index do |variable,var_index|
360
+
361
+ if line.include?(variable)
362
+
363
+ configuration_variable_index[var_index] << index
364
+
365
+ end
366
+
367
+ end
368
+
369
+ end
370
+
371
+ def reset_test_files_directory(original_file_list,after_file_list)
372
+
373
+ added_files = after_file_list-original_file_list
374
+
375
+ added_files.each do |file_name|
376
+
377
+ File.delete(file_name)
378
+
379
+ end
380
+
381
+ end
382
+
383
+ configuration_variable_index = configuration_variable_index.collect{ |element| element[0]}
384
+
385
+ configuration_variable_index << configurations.length-1
386
+
387
+ modified_configurations = configurations.dup
388
+
389
+ for x in 0...configuration_variable_index.length-1
390
+
391
+ current_index = configuration_variable_index[x]
392
+
393
+ current_variable = configuration_variables[x]
394
+
395
+ for y in current_index..configuration_variable_index[x+1]
396
+
397
+ modified_configurations[y] = configurations[y].gsub(":v",current_variable)
398
+
399
+ end
400
+
401
+ end
402
+
403
+ configuration_var_values = []
404
+
405
+ configuration_variable_index.delete_at(1)
406
+
407
+ configuration_variable_index.each do |index|
408
+
409
+ var_split = modified_configurations[index].split("=>")
410
+
411
+ var_value = var_split[1].lstrip.rstrip
412
+
413
+ configuration_var_values << var_value
414
+
415
+ end
416
+
417
+ configuration_values = Hash[configuration_variables.zip(configuration_var_values)]
418
+
419
+ return modified_feature_contents,modified_configurations,configuration_values
420
+
421
+ end
422
+
423
+ list_of_features = []
424
+
425
+ Dir.foreach(@features_directory) { |x| list_of_features << @features_directory+"#{x}" }
426
+
427
+ initial_files_list = []
428
+
429
+ Dir.foreach(@files_directory) { |x| initial_files_list << @files_directory+"#{x}" }
430
+
431
+ list_of_features = list_of_features.reject { |path| !path.include?(".feature")}
432
+
433
+ test_results = []
434
+
435
+ failed_tests = []
436
+
437
+ list_of_features.each do |feature_path|
438
+
439
+ feature_contents = read_file_line_by_line(feature_path)
440
+
441
+ feature_contents,configurations,config_values = extract_configurations(feature_contents)
442
+
443
+ feature_name,scenario_names,scenarios = parse_feature(feature_contents)
444
+
445
+ puts feature_name
446
+
447
+ scenarios.each_with_index do |scenario,index|
448
+
449
+ puts "\n#{scenario_names[index]}"
450
+
451
+ scenario[1] = scenario[1].collect{|element| element.sub("input","$input")}
452
+
453
+ scenario[1] = scenario[1].collect{|element| element.sub("file","$file")}
454
+
455
+ scenario[1] = scenario[1].collect{|element| element.sub("run","$run")}
456
+
457
+ scenario[1] = scenario[1].collect{|element| element.sub("output","$output")}
458
+
459
+ scenario[1] = scenario[1].collect{|element| element.sub("equal","$equal")}
460
+
461
+ output,test_result = parse_and_test_steps(scenario[1],@files_directory,configurations,config_values,@base_path)
462
+
463
+ test_results << test_result
464
+
465
+ unless test_result
466
+
467
+ failed_tests << feature_name
468
+
469
+ end
470
+
471
+ puts output
472
+
473
+ end
474
+
475
+ puts "\n"
476
+
477
+ end
478
+
479
+ puts "Test Statistics:\n\n"
480
+
481
+ puts "Total Number of Tests: #{test_results.length}\n"
482
+
483
+ puts "Passing: #{test_results.length-failed_tests.length}\n"
484
+
485
+ unless failed_tests.empty?
486
+
487
+ puts "Failing: #{failed_tests.length}\n"
488
+
489
+ puts "The following feature tests failed:\n\n"
490
+
491
+ failed_tests.each do |tes|
492
+
493
+ puts tes + "\n"
494
+
495
+ end
496
+
497
+ else
498
+
499
+ puts "All of your tests passed!\n"
500
+
501
+ end
502
+
503
+ after_files_list = []
504
+
505
+ Dir.foreach(@files_directory) { |x| after_files_list << @files_directory+"#{x}" }
506
+
507
+ reset_test_files_directory(initial_files_list,after_files_list)
508
+
509
+ end
510
+
511
+ end
512
+
513
+ def create_mac_executable(input_file)
514
+
515
+ def read_file_line_by_line(input_path)
516
+
517
+ file_id = open(input_path)
518
+
519
+ file_line_by_line = file_id.readlines()
520
+
521
+ file_id.close
522
+
523
+ return file_line_by_line
524
+
525
+ end
526
+
527
+ mac_file_contents = ["#!/usr/bin/env ruby\n\n"] + read_file_line_by_line(input_file)
528
+
529
+ mac_file_path = input_file.sub(".rb","")
530
+
531
+ file_id = open(mac_file_path,"w")
532
+
533
+ file_id.write(mac_file_contents.join)
534
+
535
+ file_id.close
536
+
537
+ end
538
+
539
+ OptionParser.new do |opts|
540
+
541
+ opts.banner = "Usage: shark [options]"
542
+
543
+ opts.on("-t", "--test", "Start Test") do
544
+
545
+ current_directory = Dir.pwd + "/shark/"
546
+
547
+ base_path = Dir.pwd
548
+
549
+ features_directory = current_directory + "features/"
550
+
551
+ test_files_directory = current_directory + "test_files/"
552
+
553
+ tester = Shark.new(features_directory, test_files_directory, base_path)
554
+
555
+ tester.start_test()
556
+
557
+ end
558
+
559
+ opts.on("-i","--init","Initialize Shark in this project") do
560
+
561
+ FileUtils.mkdir_p "Shark\\features"
562
+
563
+ FileUtils.mkdir_p "Shark\\test_files"
564
+
565
+ puts "Shark has been successfully initialized!"
566
+
567
+ end
568
+
569
+ opts.on("-m", "--buildmac", "Builds Mac Executables") do
570
+
571
+ file_path = Dir.pwd + "/shark.rb"
572
+
573
+ create_mac_executable(file_path)
574
+
575
+ puts "Build Successful!"
576
+
577
+ end
578
+
543
579
  end.parse!