cornucopia 0.1.12

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 (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +51 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +16 -0
  6. data/LICENSE.TXT +22 -0
  7. data/README.md +341 -0
  8. data/Rakefile +18 -0
  9. data/cornucopia.gemspec +39 -0
  10. data/lib/cornucopia.rb +18 -0
  11. data/lib/cornucopia/capybara/finder_diagnostics.rb +536 -0
  12. data/lib/cornucopia/capybara/finder_extensions.rb +89 -0
  13. data/lib/cornucopia/capybara/install_finder_extensions.rb +105 -0
  14. data/lib/cornucopia/capybara/install_matcher_extensions.rb +39 -0
  15. data/lib/cornucopia/capybara/matcher_extensions.rb +83 -0
  16. data/lib/cornucopia/capybara/page_diagnostics.rb +228 -0
  17. data/lib/cornucopia/cucumber_hooks.rb +38 -0
  18. data/lib/cornucopia/factory_girl/dynamic_association.rb +14 -0
  19. data/lib/cornucopia/rspec_hooks.rb +37 -0
  20. data/lib/cornucopia/site_prism/element_extensions.rb +273 -0
  21. data/lib/cornucopia/site_prism/install_element_extensions.rb +23 -0
  22. data/lib/cornucopia/site_prism/page_application.rb +126 -0
  23. data/lib/cornucopia/source_files/collapse.gif +0 -0
  24. data/lib/cornucopia/source_files/cornucopia.css +162 -0
  25. data/lib/cornucopia/source_files/expand.gif +0 -0
  26. data/lib/cornucopia/source_files/index_base.html +10 -0
  27. data/lib/cornucopia/source_files/index_contents.html +2 -0
  28. data/lib/cornucopia/source_files/more_info.js +87 -0
  29. data/lib/cornucopia/source_files/report_base.html +10 -0
  30. data/lib/cornucopia/source_files/report_contents.html +3 -0
  31. data/lib/cornucopia/spinach_hooks.rb +51 -0
  32. data/lib/cornucopia/util/configuration.rb +493 -0
  33. data/lib/cornucopia/util/configured_report.rb +520 -0
  34. data/lib/cornucopia/util/file_asset.rb +46 -0
  35. data/lib/cornucopia/util/generic_settings.rb +37 -0
  36. data/lib/cornucopia/util/log_capture.rb +97 -0
  37. data/lib/cornucopia/util/pretty_formatter.rb +580 -0
  38. data/lib/cornucopia/util/report_builder.rb +474 -0
  39. data/lib/cornucopia/util/report_formatters.rb +11 -0
  40. data/lib/cornucopia/util/report_table.rb +195 -0
  41. data/lib/cornucopia/version.rb +3 -0
  42. data/lib/tasks/cornucopia_tasks.rake +4 -0
  43. data/spec/dummy/README.rdoc +28 -0
  44. data/spec/dummy/Rakefile +6 -0
  45. data/spec/dummy/app/assets/images/.keep +0 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  47. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  48. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  49. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  50. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  51. data/spec/dummy/app/mailers/.keep +0 -0
  52. data/spec/dummy/app/models/.keep +0 -0
  53. data/spec/dummy/app/models/concerns/.keep +0 -0
  54. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  55. data/spec/dummy/bin/bundle +3 -0
  56. data/spec/dummy/bin/rails +4 -0
  57. data/spec/dummy/bin/rake +4 -0
  58. data/spec/dummy/config.ru +4 -0
  59. data/spec/dummy/config/application.rb +27 -0
  60. data/spec/dummy/config/boot.rb +5 -0
  61. data/spec/dummy/config/cucumber.yml +8 -0
  62. data/spec/dummy/config/database.yml +37 -0
  63. data/spec/dummy/config/environment.rb +5 -0
  64. data/spec/dummy/config/environments/development.rb +29 -0
  65. data/spec/dummy/config/environments/production.rb +80 -0
  66. data/spec/dummy/config/environments/test.rb +36 -0
  67. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  68. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/spec/dummy/config/initializers/inflections.rb +16 -0
  70. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  71. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  72. data/spec/dummy/config/initializers/session_store.rb +3 -0
  73. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  74. data/spec/dummy/config/locales/en.yml +23 -0
  75. data/spec/dummy/config/routes.rb +56 -0
  76. data/spec/dummy/db/schema.rb +16 -0
  77. data/spec/dummy/features/support/env.rb +66 -0
  78. data/spec/dummy/lib/assets/.keep +0 -0
  79. data/spec/dummy/lib/tasks/cucumber.rake +65 -0
  80. data/spec/dummy/public/404.html +58 -0
  81. data/spec/dummy/public/422.html +58 -0
  82. data/spec/dummy/public/500.html +57 -0
  83. data/spec/dummy/public/favicon.ico +0 -0
  84. data/spec/dummy/script/cucumber +10 -0
  85. data/spec/fixtures/sample_page.html +150 -0
  86. data/spec/lib/capybara/finder_diagnostics_spec.rb +517 -0
  87. data/spec/lib/capybara/finder_extensions_spec.rb +328 -0
  88. data/spec/lib/capybara/page_diagnostics_spec.rb +277 -0
  89. data/spec/lib/site_prism/element_extensions_spec.rb +290 -0
  90. data/spec/lib/site_prism/page_application_spec.rb +81 -0
  91. data/spec/lib/util/configuration_spec.rb +254 -0
  92. data/spec/lib/util/configured_report_spec.rb +1058 -0
  93. data/spec/lib/util/file_asset_spec.rb +86 -0
  94. data/spec/lib/util/generic_settings_spec.rb +48 -0
  95. data/spec/lib/util/log_capture_spec.rb +151 -0
  96. data/spec/lib/util/pretty_formatter_spec.rb +694 -0
  97. data/spec/lib/util/report_builder_spec.rb +983 -0
  98. data/spec/lib/util/report_formatters_spec.rb +13 -0
  99. data/spec/lib/util/report_table_exception_spec.rb +21 -0
  100. data/spec/lib/util/report_table_spec.rb +319 -0
  101. data/spec/pages/cornucopia_report_app.rb +10 -0
  102. data/spec/pages/google/email_page.rb +22 -0
  103. data/spec/pages/google/login_page.rb +25 -0
  104. data/spec/rails_helper.rb +43 -0
  105. data/spec/sample_report.rb +45 -0
  106. data/spec/spec_helper.rb +81 -0
  107. metadata +410 -0
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+ require "tempfile"
3
+ require ::File.expand_path("../../../lib/cornucopia/util/file_asset", File.dirname(__FILE__))
4
+
5
+ describe Cornucopia::Util::FileAsset do
6
+ let(:asset) { Cornucopia::Util::FileAsset.new("index_contents.html") }
7
+
8
+ around(:each) do |example|
9
+ begin
10
+ FileUtils.mkdir_p(File.join(File.dirname(__FILE__), "test_file_output"))
11
+
12
+ example.run
13
+ ensure
14
+ FileUtils.rm_rf(File.join(File.dirname(__FILE__), "test_file_output"))
15
+ end
16
+ end
17
+
18
+ it "returns the path to the default asset path" do
19
+ expect(asset.path).to be == File.absolute_path(File.join(File.dirname(__FILE__), "../../../lib/cornucopia/source_files/index_contents.html"))
20
+ end
21
+
22
+ it "copies base files" do
23
+ asset.create_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
24
+
25
+ copy_file = File.read(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
26
+ source_file = File.read(asset.path)
27
+
28
+ expect(copy_file).to be == source_file
29
+ end
30
+
31
+ it "allows for an overridden file asset" do
32
+ asset.body = "This is a specialized asset"
33
+
34
+ asset.create_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
35
+
36
+ copy_file = File.read(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
37
+
38
+ expect(copy_file).to be == "This is a specialized asset"
39
+ end
40
+
41
+ it "allows a separate file source" do
42
+ alt_asset = Cornucopia::Util::FileAsset.new("report_base.html")
43
+
44
+ asset.source_file = alt_asset.path
45
+
46
+ asset.create_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
47
+
48
+ copy_file = File.read(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
49
+ source_file = File.read(alt_asset.path)
50
+
51
+ expect(copy_file).to be == source_file
52
+ end
53
+
54
+ it "adds files if they don't exist" do
55
+ asset.add_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
56
+
57
+ copy_file = File.read(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
58
+ source_file = File.read(asset.path)
59
+
60
+ expect(copy_file).to be == source_file
61
+ end
62
+
63
+ it "does not add a file if it already exists" do
64
+ alt_asset = Cornucopia::Util::FileAsset.new("report_base.html")
65
+
66
+ alt_asset.add_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
67
+ asset.add_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
68
+
69
+ copy_file = File.read(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
70
+ source_file = File.read(alt_asset.path)
71
+
72
+ expect(copy_file).to be == source_file
73
+ end
74
+
75
+ it "shares and caches file assets" do
76
+ cached = Cornucopia::Util::FileAsset.asset("index_contents.html")
77
+ cached.body = "This is a specialized asset"
78
+
79
+ alt_cached = Cornucopia::Util::FileAsset.asset("index_contents.html")
80
+
81
+ alt_cached.add_file(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
82
+ copy_file = File.read(File.join(File.dirname(__FILE__), "test_file_output/copy_file_test.html"))
83
+
84
+ expect(copy_file).to be == "This is a specialized asset"
85
+ end
86
+ end
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+ require ::File.expand_path("../../../lib/cornucopia/util/generic_settings", File.dirname(__FILE__))
3
+
4
+ describe Cornucopia::Util::GenericSettings do
5
+ let(:subject) { Cornucopia::Util::GenericSettings.new }
6
+
7
+ class Object
8
+ def method_missing(method_sym, *arguments, &block)
9
+ if method_sym == :___stupid_missing_message
10
+ "Missing message"
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ def respond_to?(method_sym, include_private = false)
17
+ if method_sym == :___stupid_missing_message
18
+ true
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+
25
+ it "responds_to? anything" do
26
+ expect(subject.respond_to?(Faker::Lorem.word)).to be_truthy
27
+ end
28
+
29
+ it "calls the super implementation of somthing if it exists" do
30
+ expect(subject.object_id).to be
31
+ end
32
+
33
+ it "looks for a value in a hash if it isn't recognized" do
34
+ expect(subject.send(Faker::Lorem.word)).not_to be
35
+ end
36
+
37
+ it "will store a value in anything that isn't a base function" do
38
+ stored_value = Faker::Lorem.paragraphs
39
+ value_name = Faker::Lorem.word
40
+
41
+ subject.send("#{value_name}=", stored_value)
42
+ expect(subject.send(value_name)).to be == stored_value
43
+ end
44
+
45
+ it "calls the super method" do
46
+ expect(subject.___stupid_missing_message).to be == "Missing message"
47
+ end
48
+ end
@@ -0,0 +1,151 @@
1
+ require 'spec_helper'
2
+ require ::File.expand_path("../../../lib/cornucopia/util/log_capture", File.dirname(__FILE__))
3
+
4
+ describe Cornucopia::Util::LogCapture do
5
+ let(:file_name) { Rails.root.join("sample_log.log") }
6
+
7
+ around(:each) do |example|
8
+ expect(File.directory?(Rails.root.join("cornucopia_report/"))).to be_falsey
9
+ expect(File.directory?(Rails.root.join("spec/cornucopia_report/"))).to be_falsey
10
+ expect(File.directory?(Rails.root.join("features/cornucopia_report/"))).to be_falsey
11
+ expect(File.exists?(file_name)).to be_falsey
12
+
13
+ begin
14
+ example.run
15
+ ensure
16
+ if (Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report"))
17
+ Cornucopia::Util::ReportBuilder.current_report.close
18
+ end
19
+
20
+ FileUtils.rm_rf Rails.root.join("cornucopia_report/")
21
+ FileUtils.rm_rf Rails.root.join("spec/cornucopia_report/")
22
+ FileUtils.rm_rf Rails.root.join("features/cornucopia_report/")
23
+ FileUtils.rm_rf Rails.root.join("features") if Dir[Rails.root.join("features/*")].empty?
24
+ FileUtils.rm_rf file_name
25
+ end
26
+ end
27
+
28
+ describe "#highlight_log_output" do
29
+ it "should color error lines" do
30
+ error_line = Cornucopia::Util::LogCapture.highlight_log_output("Completed 404 this is an error")
31
+ expect(error_line).to be_html_safe
32
+ expect(error_line).to match(/\>Completed 404 this is an error\</)
33
+ expect(error_line).to match(/^\<span/)
34
+ expect(error_line).to match(/\<\/span\>$/)
35
+ expect(error_line).to match(/completed-error/)
36
+ end
37
+
38
+ it "should color success lines" do
39
+ error_line = Cornucopia::Util::LogCapture.highlight_log_output("Completed 302 this is a redirect")
40
+ expect(error_line).to be_html_safe
41
+ expect(error_line).to match(/\>Completed 302 this is a redirect\</)
42
+ expect(error_line).to match(/^\<span/)
43
+ expect(error_line).to match(/\<\/span\>$/)
44
+ expect(error_line).to match(/completed-other/)
45
+ end
46
+
47
+ it "should color both error and success lines" do
48
+ error_line = Cornucopia::Util::LogCapture.highlight_log_output("Completed 404 this is an error\nCompleted 302 this is a redirect")
49
+ expect(error_line).to be_html_safe
50
+ expect(error_line).to match(/\>Completed 404 this is an error\</)
51
+ expect(error_line).to match(/^\<span/)
52
+ expect(error_line).to match(/\<\/span\>$/)
53
+ expect(error_line).to match(/completed-error/)
54
+ expect(error_line).to match(/\>Completed 302 this is a redirect\</)
55
+ expect(error_line).to match(/^\<span/)
56
+ expect(error_line).to match(/\<\/span\>$/)
57
+ expect(error_line).to match(/completed-other/)
58
+ end
59
+ end
60
+
61
+ describe "#output_log_file" do
62
+ it "fetches the last 500 lines of a file" do
63
+ lines = Faker::Lorem.sentences(rand(600..1000))
64
+ File.open(file_name, "a:UTF-8") do |write_file|
65
+ write_file.write(lines.join("\n"))
66
+ end
67
+
68
+ report_table = Cornucopia::Util::ReportTable.new do |table|
69
+ Cornucopia::Util::LogCapture.output_log_file(table, file_name)
70
+ end
71
+
72
+ expect(report_table.full_table).to match /#{lines[-500..-1].join("\n")}/
73
+ expect(report_table.full_table).to_not match /#{lines[-501..-1].join("\n")}/
74
+ end
75
+
76
+ it "fetches the last 500 lines of a file even if it has to fetch multiple times" do
77
+ lines = (0..rand(600..1000)).to_a.map { Faker::Lorem.sentences(rand(5..10)).join(" ") }
78
+ File.open(file_name, "a:UTF-8") do |write_file|
79
+ write_file.write(lines.join("\n"))
80
+ end
81
+
82
+ report_table = Cornucopia::Util::ReportTable.new do |table|
83
+ Cornucopia::Util::LogCapture.output_log_file(table, file_name)
84
+ end
85
+
86
+ expect(report_table.full_table).to match /#{lines[-500..-1].join("\n")}/
87
+ expect(report_table.full_table).to_not match /#{lines[-501..-1].join("\n")}/
88
+ end
89
+ end
90
+
91
+ describe "#capture_logs" do
92
+ after(:each) do
93
+ Cornucopia::Util::Configuration.remove_log_file("sample_log.log")
94
+ end
95
+
96
+ it "starts a new report if it is not passed a table" do
97
+ expect(Cornucopia::Util::ReportBuilder).to receive(:current_report).and_call_original
98
+ expect(Cornucopia::Util::LogCapture).to receive(:capture_logs).twice.and_call_original
99
+ Cornucopia::Util::Configuration.add_log_file("sample_log.log")
100
+
101
+ lines = Faker::Lorem.sentences(rand(600..1000))
102
+ File.open(file_name, "a:UTF-8") do |write_file|
103
+ write_file.write(lines.join("\n"))
104
+ end
105
+
106
+ Cornucopia::Util::LogCapture.capture_logs(nil)
107
+
108
+ report_data = File.read(Rails.root.join("cornucopia_report/cornucopia_report/report_contents.html"))
109
+ expect(report_data).to match /#{lines[-500..-1].join("\n")}/
110
+ expect(report_data).to_not match /#{lines[-501..-1].join("\n")}/
111
+ end
112
+
113
+ it "goes up one level if you are in spec or features" do
114
+ expect(Cornucopia::Util::ReportBuilder).to receive(:current_report).and_call_original
115
+ expect(Cornucopia::Util::LogCapture).to receive(:capture_logs).twice.and_call_original
116
+ Cornucopia::Util::Configuration.add_log_file("sample_log.log")
117
+
118
+ lines = Faker::Lorem.sentences(rand(600..1000))
119
+ File.open(file_name, "a:UTF-8") do |write_file|
120
+ write_file.write(lines.join("\n"))
121
+ end
122
+
123
+ new_root = Rails.root.join(%w(features features).sample).to_s
124
+ expect(Rails).to receive(:root).at_least(1).and_return(new_root)
125
+ Cornucopia::Util::LogCapture.capture_logs(nil)
126
+
127
+ report_data = File.read(File.join(new_root, "cornucopia_report/cornucopia_report/report_contents.html"))
128
+ expect(report_data).to match /#{lines[-500..-1].join("\n")}/
129
+ expect(report_data).to_not match /#{lines[-501..-1].join("\n")}/
130
+ end
131
+
132
+ it "does not require Rails" do
133
+ expect(Cornucopia::Util::ReportBuilder).to receive(:current_report).and_call_original
134
+ expect(Cornucopia::Util::LogCapture).to receive(:capture_logs).twice.and_call_original
135
+ Cornucopia::Util::Configuration.add_log_file("sample_log.log")
136
+ FileUtils.cd Rails.root.to_s
137
+ expect(Object).to receive(:const_defined?).at_least(1).with("Rails").and_return(false)
138
+
139
+ lines = Faker::Lorem.sentences(rand(600..1000))
140
+ File.open(file_name, "a:UTF-8") do |write_file|
141
+ write_file.write(lines.join("\n"))
142
+ end
143
+
144
+ Cornucopia::Util::LogCapture.capture_logs(nil)
145
+
146
+ report_data = File.read(Rails.root.join("cornucopia_report/cornucopia_report/report_contents.html"))
147
+ expect(report_data).to match /#{lines[-500..-1].join("\n")}/
148
+ expect(report_data).to_not match /#{lines[-501..-1].join("\n")}/
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,694 @@
1
+ require 'spec_helper'
2
+ require ::File.expand_path("../../../lib/cornucopia/util/pretty_formatter", File.dirname(__FILE__))
3
+
4
+ describe Cornucopia::Util::PrettyFormatter do
5
+ let(:formatted_string) { "#<AClass\nmy_variable = \"a value \",\n \"another\"=0>" }
6
+ let(:simple_class) { "#<AClass>" }
7
+ let(:simple_variable) { "#<AClass \"variable\"=\"value\", something = something else>" }
8
+ let(:simple_variable_expectations) { "#<AClass\n \"variable\" = \"value\",\n something = something else\n>" }
9
+ let(:simple_array) { "#<AClass \"array\" = [[a,b,c],\"value\", something here, \"\\\"some\\\\thing\\\"\", a_value]>" }
10
+ let(:simple_array_expectations) { "#<AClass\n \"array\" =\n [\n [\n a,\n b,\n c\n ],\n \"value\",\n something here,\n \"\\\"some\\\\thing\\\"\",\n a_value\n ]\n>" }
11
+ let(:simple_hash) { "#<AClass \"hash\" = {:value => something here, \"\\\"some\\\\thing\\\"\" => a value, symbol: :symbol_also } >" }
12
+ let(:simple_hash_expectations) { "#<AClass\n \"hash\" =\n {\n :value => something here,\n \"\\\"some\\\\thing\\\"\" => a value,\n symbol: :symbol_also\n }\n>" }
13
+
14
+ it "doesn't format a formatted string" do
15
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(formatted_string)
16
+ expect(pretty).to be == formatted_string
17
+
18
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(formatted_string.gsub(/\n/, " "))
19
+ expect(pretty).to_not be == formatted_string
20
+ end
21
+
22
+ describe "bad states" do
23
+ ["\"", "{", "["].each do |test_char|
24
+ it "gives up if it finds bad characters = #{test_char}" do
25
+ test_string = "#<ACl#{test_char}ass \"variable\"=\"value\", something = something else>"
26
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
27
+ expect(pretty).to be == "\n#{test_string}"
28
+ end
29
+ end
30
+
31
+ it "knows what to do with a comma" do
32
+ test_string = "#<AClass \"variable\", something = , something else>"
33
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
34
+ expect(pretty).to be == "#<AClass\n \"variable\" ,something =,\n something \nelse>"
35
+ end
36
+
37
+ it "knows what to do with a comma after a =>" do
38
+ test_string = "#<AClass \"variable\" = { :hash =>,>"
39
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
40
+ expect(pretty).to be == "#<AClass\n \"variable\" =\n {\n :hash => ,\n>"
41
+ end
42
+
43
+ it "knows what to do with a comma instead of a =>" do
44
+ test_string = "#<AClass \"variable\" = { :hash,>"
45
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
46
+ expect(pretty).to be == "#<AClass\n \"variable\" =\n {\n :hash , \n>"
47
+ end
48
+
49
+ it "is a test" do
50
+ test_string = "#<AClass hash: value>"
51
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
52
+ expect(pretty).to be == "#<AClass\n hash: value\n>"
53
+ end
54
+
55
+ it "breaks if a hash is invalid" do
56
+ test_string = "#<AClass {\"variable\" = >,}>"
57
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
58
+ expect(pretty).to be == "#<AClass\n {\n \"variable\" \n= >,}>"
59
+
60
+ test_string = "#<AClass {\"variable\" => \"VALUE\" t}>"
61
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_string)
62
+ expect(pretty).to be == "#<AClass\n {\n \"variable\" => \"VALUE\"\nt}>"
63
+ end
64
+ end
65
+
66
+ it "formats a simple class" do
67
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(simple_class)
68
+ expect(pretty).to be == simple_class
69
+ end
70
+
71
+ it "formats a simple variable" do
72
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(simple_variable)
73
+ expect(pretty).to be == simple_variable_expectations
74
+ end
75
+
76
+ it "formats a simple class in bigger text" do
77
+ pre_text = rand(0..1) == 0 ? "#{Faker::Lorem.sentence}\n" : ""
78
+ post_text = rand(0..1) == 0 ? "\n#{Faker::Lorem.sentence}" : ""
79
+ pretty = Cornucopia::Util::PrettyFormatter.format_string("#{pre_text[0..-2]}#{simple_variable}#{post_text[1..-1]}")
80
+
81
+ expect(pretty).to be == expectation_in_text(simple_variable_expectations, pre_text, post_text)
82
+ end
83
+
84
+ it "formats an array" do
85
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(simple_array)
86
+ expect(pretty).to be == simple_array_expectations
87
+ end
88
+
89
+ it "formats a simple array in bigger text" do
90
+ pre_text = rand(0..1) == 0 ? "#{Faker::Lorem.sentence}\n" : ""
91
+ post_text = rand(0..1) == 0 ? "\n#{Faker::Lorem.sentence}" : ""
92
+ pretty = Cornucopia::Util::PrettyFormatter.format_string("#{pre_text[0..-2]}#{simple_array}#{post_text[1..-1]}")
93
+
94
+ expect(pretty).to be == expectation_in_text(simple_array_expectations, pre_text, post_text)
95
+ end
96
+
97
+ it "formats an hash" do
98
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(simple_hash)
99
+ expect(pretty).to be == simple_hash_expectations
100
+ end
101
+
102
+ it "formats a simple hash in bigger text" do
103
+ pre_text = rand(0..1) == 0 ? "#{Faker::Lorem.sentence}\n" : ""
104
+ post_text = rand(0..1) == 0 ? "\n#{Faker::Lorem.sentence}" : ""
105
+ pretty = Cornucopia::Util::PrettyFormatter.format_string("#{pre_text[0..-2]}#{simple_hash}#{post_text[1..-1]}")
106
+
107
+ expect(pretty).to be == expectation_in_text(simple_hash_expectations, pre_text, post_text)
108
+ end
109
+
110
+ it "formats a known problem string 1" do
111
+ format_value = "#<class @silencers=#<class @silencers=[#<Proc:0x007f8d9f2a15f0@/Users/elittell/.rvm/gems/ruby-1.9.3-p327@homerun/gems/railties-3.2.13/lib/rails/backtrace_cleaner.rb:15>]>, \"HTTP_HO\"=\"HTTP_HO\">"
112
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
113
+
114
+ expect(pretty).to be == "#<class\n @silencers =\n #<class\n @silencers =\n [\n #<Proc:0x007f8d9f2a15f0@/Users/elittell/.rvm/gems/ruby-1.9.3-p327@homerun/gems/railties-3.2.13/lib/rails/backtrace_cleaner.rb:15>\n ]\n >,\n \"HTTP_HO\" = \"HTTP_HO\"\n>"
115
+ end
116
+
117
+ it "formats an implied hash" do
118
+ format_value = "#<DbInjector::Deal id: 1, slug: \"6ff445f3\", type: \"daily-deal\">"
119
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
120
+
121
+ expect(pretty).to be == "#<DbInjector::Deal\n id: 1,\n slug: \"6ff445f3\",\n type: \"daily-deal\"\n>"
122
+
123
+ format_value = "".html_safe + "#<DbInjector::Deal id: 1, slug: \"6ff445f3\", type: \"daily-deal\">"
124
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
125
+
126
+ expect(pretty).to be == "#&lt;DbInjector::Deal\n id: 1,\n slug: &quot;6ff445f3&quot;,\n type: &quot;daily-deal&quot;\n&gt;"
127
+ expect(pretty).to be_html_safe
128
+ end
129
+
130
+ it "formats an implied hash" do
131
+ format_value = "#<DbInjector::Deal id: 1, slug: \"6ff445f3\", type: \"daily-deal\"> fred"
132
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
133
+
134
+ expect(pretty).to be == "#<DbInjector::Deal\n id: 1,\n slug: \"6ff445f3\",\n type: \"daily-deal\"\n>\n fred"
135
+
136
+ format_value = "".html_safe + "#<DbInjector::Deal id: 1, slug: \"6ff445f3\", type: \"daily-deal\"> fred"
137
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
138
+
139
+ expect(pretty).to be == "#&lt;DbInjector::Deal\n id: 1,\n slug: &quot;6ff445f3&quot;,\n type: &quot;daily-deal&quot;\n&gt;\n fred"
140
+ expect(pretty).to be_html_safe
141
+ end
142
+
143
+ it "formats an implied hash with a hash-rocket" do
144
+ format_value = "#<DbInjector::Deal id => 1, slug => \"6ff445f3\", type => \"daily-deal\">"
145
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
146
+
147
+ expect(pretty).to be == "#<DbInjector::Deal\n id => 1,\n slug => \"6ff445f3\",\n type => \"daily-deal\"\n>"
148
+
149
+ format_value = "".html_safe + "#<DbInjector::Deal id => 1, slug => \"6ff445f3\", type => \"daily-deal\">"
150
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
151
+
152
+ expect(pretty).to be == "#&lt;DbInjector::Deal\n id =&gt; 1,\n slug =&gt; &quot;6ff445f3&quot;,\n type =&gt; &quot;daily-deal&quot;\n&gt;"
153
+ expect(pretty).to be_html_safe
154
+ end
155
+
156
+ it "formats parameters" do
157
+ format_value = "Parameters: { \"id\" => \"value\", \"deal\"=>{\"affinity_score\"=>nil, \"buy_button_clicks\"=>6 }, \"custom_data\"=>{\"custom_data\"=>{}} }"
158
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
159
+ expected = "Parameters:\n {\n \"id\" => \"value\",\n \"deal\" =>\n {\n \"affinity_score\" => nil,\n \"buy_button_clicks\" => 6\n },\n \"custom_data\" =>\n {\n \"custom_data\" =>\n {\n }\n }\n }"
160
+
161
+ expect(pretty).to be == expected
162
+
163
+ format_value = "".html_safe + format_value
164
+ expected = "".html_safe + expected
165
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
166
+
167
+ expect(pretty).to be == expected
168
+ expect(pretty).to be_html_safe
169
+ end
170
+
171
+ it "formats parameters embedded in text" do
172
+ format_value = "this is some expectation_in_text Parameters: { \"id\" => \"value\", \"deal\"=>{\"affinity_score\"=>nil, \"buy_button_clicks\"=>6 }, \"custom_data\"=>{\"custom_data\"=>{}} } this is some expectation_in_text"
173
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
174
+ expected = "this is some expectation_in_text\n Parameters:\n {\n \"id\" => \"value\",\n \"deal\" =>\n {\n \"affinity_score\" => nil,\n \"buy_button_clicks\" => 6\n },\n \"custom_data\" =>\n {\n \"custom_data\" =>\n {\n }\n }\n }\n this is some expectation_in_text"
175
+
176
+ expect(pretty).to be == expected
177
+
178
+ format_value = "".html_safe + format_value
179
+ expected = "".html_safe + expected
180
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
181
+
182
+ expect(pretty).to be == expected
183
+ expect(pretty).to be_html_safe
184
+ end
185
+
186
+ it "formats multiple parameters embedded in text" do
187
+ format_value = "this is some expectation_in_text Parameters: { \"id\" => \"value\", \"deal\"=>{\"affinity_score\"=>nil, \"buy_button_clicks\"=>6 }, \"custom_data\"=>{\"custom_data\"=>{}} } this is some expectation_in_textthis is some expectation_in_text Parameters: { \"id\" => \"value\", \"deal\"=>{\"affinity_score\"=>nil, \"buy_button_clicks\"=>6 }, \"custom_data\"=>{\"custom_data\"=>{}} } this is some expectation_in_text"
188
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
189
+ expected = "this is some expectation_in_text\n Parameters:\n {\n \"id\" => \"value\",\n \"deal\" =>\n {\n \"affinity_score\" => nil,\n \"buy_button_clicks\" => 6\n },\n \"custom_data\" =>\n {\n \"custom_data\" =>\n {\n }\n }\n }\n this is some expectation_in_textthis is some expectation_in_text\n Parameters:\n {\n \"id\" => \"value\",\n \"deal\" =>\n {\n \"affinity_score\" => nil,\n \"buy_button_clicks\" => 6\n },\n \"custom_data\" =>\n {\n \"custom_data\" =>\n {\n }\n }\n }\n this is some expectation_in_text"
190
+
191
+ expect(pretty).to be == expected
192
+
193
+ format_value = "".html_safe + format_value
194
+ expected = "".html_safe + expected
195
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
196
+
197
+ expect(pretty).to be == expected
198
+ expect(pretty).to be_html_safe
199
+ end
200
+
201
+ it "formats bad parameters embedded in text" do
202
+ format_value = "[PartnerScope] Set to: chameleon_basic\nProcessing by DealsController#show as HTML\n Parameters: {\";id\"=>\"5e2a61bd\"}\nGET http://admin-homerun.localhost:3001//api/v2/deals/5e2a61bd.json?include=all"
203
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
204
+ expected = "[PartnerScope] Set to: chameleon_basic\nProcessing by DealsController#show as HTML\n Parameters:\n {\n \";id\" => \"5e2a61bd\"\n }\n\nGET http://admin-homerun.localhost:3001//api/v2/deals/5e2a61bd.json?include=all"
205
+
206
+ expect(pretty).to be == expected
207
+
208
+ format_value = ("".html_safe + format_value).to_s
209
+ expected = "".html_safe + expected
210
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
211
+
212
+ expect(pretty).to be == expected
213
+ expect(pretty).to be_html_safe
214
+ end
215
+
216
+ it "formats Parameters: {}" do
217
+ format_value = "Parameters:{}"
218
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
219
+ expected = "Parameters:\n {\n }"
220
+
221
+ expect(pretty).to be == expected
222
+
223
+ format_value = ("".html_safe + format_value).to_s
224
+ expected = "".html_safe + expected
225
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(format_value)
226
+
227
+ expect(pretty).to be == expected
228
+ expect(pretty).to be_html_safe
229
+ end
230
+
231
+ describe "helpers" do
232
+ [:parameters,
233
+ :embedded_class,
234
+ :class,
235
+ :class_with_value,
236
+ :implied_hash,
237
+ :hash,
238
+ :array].each do |value_type|
239
+ it "can create a #{value_type} value" do
240
+ create_value(0, value_type)
241
+ end
242
+ end
243
+
244
+ [:whitespace,
245
+ :value_name_simple,
246
+ :value_method,
247
+ :value_name_string,
248
+ :hash_key_string,
249
+ :value_string,
250
+ :value_name_complex_string,
251
+ :value_complex_string,
252
+ :hash_key_complex_string,
253
+ :value_simple,
254
+ :hash_key_symbol,
255
+ :hash_key_reversed_symbol
256
+ ].each do |value_type|
257
+ it "can create a #{value_type} simple value" do
258
+ create_simple_value(0, value_type)
259
+ end
260
+ end
261
+ end
262
+
263
+ describe "tests" do
264
+ it "formats a complicated value" do
265
+ test_value, expected_value = create_value(0, [:class, :embedded_class, :implied_hash, :parameters].sample)
266
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_value)
267
+ expect(pretty).to be == expected_value
268
+ end
269
+
270
+ it "formats an html_safe complicated value" do
271
+ test_value, expected_value = create_value(0, [:class, :embedded_class, :implied_hash, :parameters].sample)
272
+ test_value = "".html_safe + test_value
273
+ expected_value = "".html_safe + expected_value
274
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_value)
275
+ expect(pretty).to be == expected_value
276
+ expect(pretty).to be_html_safe
277
+ end
278
+ end
279
+
280
+ # (1..100).to_a.each do |index|
281
+ (1..10).to_a.each do |index|
282
+ it "formats a complicated value (#{index})" do
283
+ test_value, expected_value = create_value(0, [:class, :embedded_class, :implied_hash, :parameters].sample)
284
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_value)
285
+ expect(pretty).to be == expected_value
286
+ end
287
+
288
+ it "formats an html_safe complicated value (#{index})" do
289
+ test_value, expected_value = create_value(0, [:class, :embedded_class, :implied_hash, :parameters].sample)
290
+ test_value = "".html_safe + test_value
291
+ expected_value = "".html_safe + expected_value
292
+ pretty = Cornucopia::Util::PrettyFormatter.format_string(test_value)
293
+ expect(pretty).to be == expected_value
294
+ expect(pretty).to be_html_safe
295
+ end
296
+ end
297
+ end
298
+
299
+ def create_simple_value(type, options = {})
300
+ case type
301
+ when :whitespace
302
+ if rand(0..10) == 0
303
+ simple_val = ""
304
+ else
305
+ simple_val = " " * rand(1..10)
306
+ simple_val += "\t" * rand(0..10)
307
+ unless options[:spaces_only]
308
+ simple_val += "\n" * rand(0..10)
309
+ simple_val += "\r" * rand(0..10)
310
+ end
311
+ simple_val = simple_val.split("").sample(100).join("")
312
+ end
313
+
314
+ when :value_name_simple, :value_method
315
+ simple_val = Faker::Lorem.word
316
+ simple_val = "#{simple_val}?" if rand(0..1) == 0
317
+ simple_val = "@#{simple_val}" if rand(0..1) == 0
318
+
319
+ when :value_name_string, :hash_key_string, :value_string
320
+ simple_val = "\"#{Faker::Lorem.sentence}\""
321
+
322
+ when :value_name_complex_string, :value_complex_string, :hash_key_complex_string
323
+ simple_val = "'#{'{}<>[]\"\#~?/`!@#$%^&*()-_=+`'}".split("").sample(rand(5..10)).join("")
324
+ simple_val = "#{simple_val}#{Faker::Lorem.word}".split("").join("")
325
+ simple_val = "#{Faker::Lorem.sentence} #{simple_val}".split(" ").join(" ")
326
+ simple_val = simple_val.gsub(/([\\\"])/, "\\\\\\1")
327
+ simple_val = "\"#{simple_val}\""
328
+
329
+ when :value_simple
330
+ case [:number, :float, :date, :date_time, :string, :word].sample
331
+ when :number
332
+ simple_val = rand(-9999999999..9999999999)
333
+
334
+ when :float
335
+ simple_val = rand * (10 ** rand(0..15))
336
+
337
+ when :date
338
+ simple_val = Date.today + rand(-99999..99999).days
339
+
340
+ when :date_time
341
+ simple_val = DateTime.now + rand(-9999999999..9999999999).seconds
342
+
343
+ when :string
344
+ simple_val = Faker::Lorem.sentence
345
+
346
+ when :word
347
+ simple_val = Faker::Lorem.word
348
+ end
349
+
350
+ when :hash_key_symbol
351
+ simple_val = ":#{Faker::Lorem.word}"
352
+
353
+ when :hash_key_reversed_symbol
354
+ simple_val = "#{Faker::Lorem.word}:"
355
+ end
356
+
357
+ simple_val.to_s
358
+ end
359
+
360
+ def create_value(level, type, options = {})
361
+ case type
362
+ when :parameters
363
+ sub_options = options.merge({ spaces_only: true })
364
+
365
+ pre_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
366
+ post_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
367
+
368
+ unless pre_value.blank?
369
+ if rand(0..1) == 0
370
+ pre_value << create_simple_value(:whitespace, options)
371
+ end
372
+ end
373
+
374
+ unless post_value.blank?
375
+ if rand(0..1) == 0
376
+ post_value = "#{create_simple_value(:whitespace, options)}#{post_value}"
377
+ end
378
+ end
379
+
380
+ if pre_value.blank?
381
+ val, expected = create_value(level + 1, :hash, sub_options)
382
+ else
383
+ val, expected = create_value(level + 2, :hash, sub_options)
384
+ end
385
+ unless post_value.blank?
386
+ post_value = "\n#{post_value}"
387
+ end
388
+
389
+ value_val = "#{pre_value}Parameters:#{create_simple_value(:whitespace, sub_options)}#{val}#{post_value}"
390
+ value_expect = "#{pre_value.rstrip}#{pre_value.rstrip.blank? ? "" : "\n "}Parameters:\n#{expected}\n#{post_value.rstrip}"
391
+
392
+ rand(0..5).times do
393
+ pre_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
394
+ post_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
395
+
396
+ if rand(0..1) == 0
397
+ val = create_simple_value(:whitespace, options)
398
+ value_val << val
399
+ value_expect << val
400
+ end
401
+
402
+ if rand(0..1) == 0
403
+ val = Faker::Lorem.sentence
404
+ value_val << val
405
+ value_expect << val
406
+
407
+ if rand(0..1) == 0
408
+ val = create_simple_value(:whitespace, options)
409
+ value_val << val
410
+ value_expect << val
411
+ end
412
+ end
413
+
414
+ if pre_value.blank?
415
+ if rand(0..1) == 0
416
+ pre_value << create_simple_value(:whitespace, options)
417
+ end
418
+ end
419
+
420
+ unless post_value.blank?
421
+ if rand(0..1) == 0
422
+ post_value = "#{create_simple_value(:whitespace, options)}#{post_value}"
423
+ end
424
+ end
425
+ unless post_value.blank?
426
+ post_value = "\n#{post_value}"
427
+ end
428
+ if pre_value.rstrip.blank?
429
+ value_expect.rstrip!
430
+ end
431
+
432
+ val, expected = create_value(level + 2, :hash, sub_options)
433
+
434
+ value_val << "#{pre_value}Parameters:#{create_simple_value(:whitespace, sub_options)}#{val}#{post_value}"
435
+ value_expect << "#{pre_value.rstrip}\n Parameters:\n#{expected}\n#{post_value.rstrip}"
436
+ end
437
+
438
+ value_expect.rstrip!
439
+
440
+ when :embedded_class
441
+ pre_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
442
+ post_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
443
+
444
+ unless pre_value.blank?
445
+ if rand(0..1) == 0
446
+ pre_value << create_simple_value(:whitespace, options)
447
+ end
448
+ end
449
+
450
+ unless post_value.blank?
451
+ if rand(0..1) == 0
452
+ post_value = "#{create_simple_value(:whitespace, options)}#{post_value}"
453
+ end
454
+ end
455
+
456
+ if pre_value.blank?
457
+ val, expected = create_value(level, :class_with_value, options)
458
+ else
459
+ val, expected = create_value(level + 1, :class_with_value, options)
460
+ end
461
+ unless post_value.blank?
462
+ post_value = "\n#{post_value}"
463
+ end
464
+
465
+ value_val = "#{pre_value}#{val}#{post_value}"
466
+ value_expect = "#{pre_value.rstrip}#{pre_value.rstrip.blank? ? "" : "\n"}#{expected}\n#{post_value.rstrip}"
467
+
468
+ rand(0..5).times do
469
+ pre_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
470
+ post_value = rand(0..1) == 0 ? Faker::Lorem.sentence : ""
471
+
472
+ if rand(0..1) == 0
473
+ val = create_simple_value(:whitespace, options)
474
+ value_val << val
475
+ value_expect << val
476
+ end
477
+
478
+ if rand(0..1) == 0
479
+ val = Faker::Lorem.sentence
480
+ value_val << val
481
+ value_expect << val
482
+
483
+ if rand(0..1) == 0
484
+ val = create_simple_value(:whitespace, options)
485
+ value_val << val
486
+ value_expect << val
487
+ end
488
+ end
489
+
490
+ if pre_value.blank?
491
+ if rand(0..1) == 0
492
+ pre_value << create_simple_value(:whitespace, options)
493
+ end
494
+ end
495
+
496
+ unless post_value.blank?
497
+ if rand(0..1) == 0
498
+ post_value = "#{create_simple_value(:whitespace, options)}#{post_value}"
499
+ end
500
+ end
501
+ unless post_value.blank?
502
+ post_value = "\n#{post_value}"
503
+ end
504
+ if pre_value.rstrip.blank?
505
+ value_expect.rstrip!
506
+ end
507
+
508
+ val, expected = create_value(level + 1, :class, options)
509
+
510
+ value_val << "#{pre_value}#{val}#{post_value}"
511
+ value_expect << "#{pre_value.rstrip}\n#{expected}\n#{post_value.rstrip}"
512
+ end
513
+
514
+ value_expect.rstrip!
515
+
516
+ when :class, :class_with_value
517
+ name = create_simple_value(:value_name_simple, options)
518
+ value_val = "\#<#{name}#{" " * rand(1..10)}"
519
+ value_expect = "#{" " * level}\#<#{name}"
520
+ append_value = ""
521
+ append_expect = "\n"
522
+
523
+ range_start = type == :class ? 0 : 1
524
+
525
+ rand(range_start..5).times do
526
+ name = create_simple_value([:value_name_complex_string, :value_name_simple, :value_name_string].sample, options)
527
+ val_type = [:class, :value, :hash, :array].sample
528
+ val_type = :value if level > 4 || rand(0.1) == 0
529
+
530
+ case val_type
531
+ when :class, :hash, :array
532
+ val, expected = create_value(level + 2, val_type, options)
533
+
534
+ when :value
535
+ val = create_simple_value([:value_simple, :value_string, :value_method, :value_complex_string].sample, options)
536
+ expected = val
537
+ end
538
+
539
+ value_val << "#{append_value}#{name}#{create_simple_value(:whitespace, options)}=#{create_simple_value(:whitespace, options)}#{val}"
540
+ if val_type == :value
541
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} = #{expected}"
542
+ else
543
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} =\n#{expected}"
544
+ end
545
+
546
+ append_value = ",#{create_simple_value(:whitespace, options)}"
547
+ append_expect = ",\n"
548
+ end
549
+
550
+ unless append_expect.empty?
551
+ append_expect = append_expect[1..-1]
552
+ end
553
+ unless append_expect.empty?
554
+ append_expect << " " * level
555
+ end
556
+
557
+ value_val << "#{" " * rand(0..10)}>"
558
+ value_expect << "#{append_expect}>"
559
+
560
+ when :implied_hash
561
+ options.merge!({ spaces_only: true })
562
+
563
+ name = create_simple_value(:value_name_simple, options)
564
+ value_val = "\#<#{name}#{" " * rand(1..10)}"
565
+ value_expect = "#{" " * level}\#<#{name}"
566
+ append_value = ""
567
+ append_expect = "\n"
568
+
569
+ rand(1..5).times do
570
+ hash_type = [:hash_key_reversed_symbol, :hash_key_symbol].sample
571
+ name = create_simple_value(hash_type, options)
572
+ val_type = [:class, :value, :hash, :array].sample
573
+ val_type = :value if level > 4 || rand(0.1) == 0
574
+
575
+ case val_type
576
+ when :class, :hash, :array
577
+ val, expected = create_value(level + 2, val_type, options)
578
+
579
+ when :value
580
+ val = create_simple_value([:value_simple, :value_string, :value_method, :value_complex_string].sample, options)
581
+ expected = val
582
+ end
583
+
584
+ case hash_type
585
+ when :hash_key_reversed_symbol
586
+ value_val << "#{append_value}#{name}#{" " * rand(0..10)}#{val}"
587
+ if val_type == :value
588
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} #{expected}"
589
+ else
590
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name}\n#{expected}"
591
+ end
592
+
593
+ else
594
+ value_val << "#{append_value}#{name}#{" " * rand(0..10)}=>#{" " * rand(0..10)}#{val}"
595
+ if val_type == :value
596
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} => #{expected}"
597
+ else
598
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} =>\n#{expected}"
599
+ end
600
+ end
601
+
602
+ append_value = ",#{create_simple_value(:whitespace, options)}"
603
+ append_expect = ",\n"
604
+ end
605
+
606
+ value_val << "#{create_simple_value(:whitespace, options)}>"
607
+ value_expect << "\n#{" " * level}>"
608
+
609
+ when :hash
610
+ value_val = "{#{create_simple_value(:whitespace, options)}"
611
+ value_expect = "#{" " * level}{\n"
612
+ append_value = ""
613
+ append_expect = ""
614
+
615
+ rand(1..5).times do
616
+ hash_type = [:hash_key_string, :hash_key_complex_string, :hash_key_symbol, :hash_key_reversed_symbol].sample
617
+ name = create_simple_value(hash_type, options)
618
+ val_type = [:class, :value, :hash, :array].sample
619
+ val_type = :value if level > 4 || rand(0.1) == 0
620
+
621
+ case val_type
622
+ when :class, :hash, :array
623
+ val, expected = create_value(level + 2, val_type, options)
624
+
625
+ when :value
626
+ val = create_simple_value([:value_simple, :value_string, :value_method, :value_complex_string].sample, options)
627
+ expected = val
628
+ end
629
+
630
+ case hash_type
631
+ when :hash_key_reversed_symbol
632
+ value_val << "#{append_value}#{name}#{create_simple_value(:whitespace, options)}#{val}"
633
+ if val_type == :value
634
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} #{expected}"
635
+ else
636
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name}\n#{expected}"
637
+ end
638
+
639
+ else
640
+ value_val << "#{append_value}#{name}#{create_simple_value(:whitespace, options)}=>#{create_simple_value(:whitespace, options)}#{val}"
641
+ if val_type == :value
642
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} => #{expected}"
643
+ else
644
+ value_expect << "#{append_expect}#{" " * (level + 1)}#{name} =>\n#{expected}"
645
+ end
646
+ end
647
+
648
+ append_value = ",#{create_simple_value(:whitespace, options)}"
649
+ append_expect = ",\n"
650
+ end
651
+
652
+ value_val << "#{create_simple_value(:whitespace, options)}}"
653
+ value_expect << "\n#{" " * level}}"
654
+
655
+ when :array
656
+ value_val = "[#{create_simple_value(:whitespace, options)}"
657
+ value_expect = "#{" " * level}[\n"
658
+ append_value = ""
659
+ append_expect = ""
660
+
661
+ rand(1..5).times do
662
+ val_type = [:class, :value, :hash, :array].sample
663
+ val_type = :value if level > 4 || rand(0.1) == 0
664
+
665
+ case val_type
666
+ when :class, :hash, :array
667
+ val, expected = create_value(level + 1, val_type, options)
668
+
669
+ when :value
670
+ val = create_simple_value([:value_simple, :value_string, :value_method, :value_complex_string].sample, options)
671
+ expected = "#{" " * (level + 1)}#{val}"
672
+ end
673
+
674
+ value_val << "#{append_value}#{val}"
675
+ value_expect << "#{append_expect}#{expected}"
676
+
677
+ append_value = ",#{create_simple_value(:whitespace, options)}"
678
+ append_expect = ",\n"
679
+ end
680
+
681
+ value_val << "#{create_simple_value(:whitespace, options)}]"
682
+ value_expect << "\n#{" " * level}]"
683
+ end
684
+
685
+ [value_val, value_expect]
686
+ end
687
+
688
+ def expectation_in_text(expected_text, pre_text, post_text)
689
+ expected = "#{pre_text}#{expected_text}#{post_text}"
690
+ expected = expected.gsub("\n", "\n ") unless pre_text.empty?
691
+ expected = expected.gsub(post_text.gsub("\n", "\n "), post_text)
692
+
693
+ expected
694
+ end