rr 1.1.1 → 3.0.0
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.
- checksums.yaml +5 -5
- data/Appraisals +6 -0
- data/CHANGES.md +102 -1
- data/CREDITS.md +5 -0
- data/Gemfile +3 -0
- data/README.md +91 -110
- data/Rakefile +43 -0
- data/doc/02_syntax_comparison.md +1 -0
- data/gemfiles/ruby_19_rspec_2.gemfile +14 -0
- data/gemfiles/ruby_19_rspec_2.gemfile.lock +49 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile +15 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile.lock +119 -0
- data/lib/rr/class_instance_method_defined.rb +1 -1
- data/lib/rr/core_ext/array.rb +2 -0
- data/lib/rr/core_ext/hash.rb +2 -0
- data/lib/rr/deprecations.rb +97 -0
- data/lib/rr/double.rb +28 -10
- data/lib/rr/double_definitions/double_definition.rb +39 -16
- data/lib/rr/double_definitions/double_definition_create.rb +5 -5
- data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
- data/lib/rr/double_definitions/double_injections/any_instance_of.rb +1 -1
- data/lib/rr/double_definitions/double_injections/instance.rb +2 -2
- data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
- data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
- data/lib/rr/double_matches.rb +4 -3
- data/lib/rr/dsl.rb +152 -0
- data/lib/rr/expectations/any_argument_expectation.rb +4 -4
- data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
- data/lib/rr/injections/double_injection.rb +67 -19
- data/lib/rr/injections/method_missing_injection.rb +37 -6
- data/lib/rr/integrations.rb +13 -12
- data/lib/rr/integrations/decorator.rb +4 -1
- data/lib/rr/integrations/minitest_4.rb +1 -1
- data/lib/rr/integrations/minitest_4_active_support.rb +1 -1
- data/lib/rr/integrations/rspec/invocation_matcher.rb +0 -8
- data/lib/rr/integrations/rspec_2.rb +28 -3
- data/lib/rr/keyword_arguments.rb +15 -0
- data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
- data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
- data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
- data/lib/rr/recorded_call.rb +35 -0
- data/lib/rr/recorded_calls.rb +23 -9
- data/lib/rr/space.rb +15 -5
- data/lib/rr/spy_verification.rb +13 -5
- data/lib/rr/version.rb +1 -2
- data/lib/rr/wildcard_matchers.rb +10 -10
- data/lib/rr/without_autohook.rb +7 -14
- data/rr.gemspec +14 -5
- data/spec/custom_formatter_for_rspec.rb +18 -0
- data/spec/custom_formatter_for_rspec_2.rb +40 -0
- data/spec/defines_spec_suite_tasks.rb +57 -0
- data/spec/fixtures/rubygems_patch_for_187.rb +598 -0
- data/spec/global_helper.rb +38 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_suite_configuration.rb +126 -0
- data/spec/spec_suite_runner.rb +47 -0
- data/spec/suites.yml +10 -0
- data/spec/suites/rspec_2/functional/any_instance_of_spec.rb +147 -0
- data/spec/suites/rspec_2/functional/dont_allow_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_strong_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/received_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/spy_spec.rb +102 -0
- data/spec/suites/rspec_2/functional/stub_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_proxy_instance_of_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/stub_proxy_spec.rb +45 -0
- data/spec/suites/rspec_2/functional/stub_spec.rb +71 -0
- data/spec/suites/rspec_2/functional/stub_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/wildcard_matchers_spec.rb +128 -0
- data/spec/suites/rspec_2/helper.rb +28 -0
- data/spec/suites/rspec_2/integration/minitest_4_spec.rb +109 -0
- data/spec/suites/rspec_2/integration/minitest_spec.rb +109 -0
- data/spec/suites/rspec_2/spec_helper.rb +3 -0
- data/spec/suites/rspec_2/support/matchers/wildcard_matcher_matchers.rb +32 -0
- data/spec/suites/rspec_2/support/mixins/double_definition_creator_helpers.rb +173 -0
- data/spec/suites/rspec_2/support/mixins/mock_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/mixins/proxy_definition_creator_helpers.rb +33 -0
- data/spec/suites/rspec_2/support/mixins/stub_creator_helpers.rb +43 -0
- data/spec/suites/rspec_2/support/mixins/stub_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_never_called_qualifier.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_times_called_qualifier.rb +50 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_without_qualifiers.rb +131 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/dont_allow.rb +148 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb +26 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of_strong.rb +28 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mocking.rb +107 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb +32 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of_strong.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stubbing.rb +57 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb +35 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/block_form.rb +31 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb +63 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb +43 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/sequential_invocations.rb +26 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/setting_implementation.rb +51 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/yields.rb +81 -0
- data/spec/suites/rspec_2/support/shared_examples/space.rb +13 -0
- data/spec/suites/rspec_2/support/shared_examples/times_called_expectation.rb +9 -0
- data/spec/suites/rspec_2/unit/core_ext/array_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/core_ext/enumerable_spec.rb +53 -0
- data/spec/suites/rspec_2/unit/core_ext/hash_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/core_ext/range_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/core_ext/regexp_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/deprecations_spec.rb +27 -0
- data/spec/suites/rspec_2/unit/double_definitions/child_double_definition_create_spec.rb +114 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_blank_slate_spec.rb +93 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +446 -0
- data/spec/suites/rspec_2/unit/dsl/double_creators_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/dsl/space_spec.rb +99 -0
- data/spec/suites/rspec_2/unit/dsl/wildcard_matchers_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/errors/rr_error_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +48 -0
- data/spec/suites/rspec_2/unit/expectations/anything_argument_equality_expectation_spec.rb +14 -0
- data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +135 -0
- data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +30 -0
- data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +92 -0
- data/spec/suites/rspec_2/unit/expectations/satisfy_argument_equality_expectation_spec.rb +61 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/any_times_matcher_spec.rb +22 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_least_matcher_spec.rb +37 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_most_matcher_spec.rb +43 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/integer_matcher_spec.rb +58 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/proc_matcher_spec.rb +35 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/range_matcher_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/hash_with_object_id_key_spec.rb +88 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_spec.rb +533 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb +32 -0
- data/spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb +297 -0
- data/spec/suites/rspec_2/unit/integrations/rspec_spec.rb +70 -0
- data/spec/suites/rspec_2/unit/rr_spec.rb +28 -0
- data/spec/suites/rspec_2/unit/space_spec.rb +598 -0
- data/spec/suites/rspec_2/unit/spy_verification_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/any_times_matcher_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_least_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_most_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/integer_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/proc_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/range_matcher_spec.rb +75 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/times_called_matcher_spec.rb +117 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/anything_spec.rb +33 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/boolean_spec.rb +45 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/duck_type_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/hash_including_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb +57 -0
- data/spec/support/adapter.rb +22 -0
- data/spec/support/adapter_tests/base.rb +45 -0
- data/spec/support/adapter_tests/minitest.rb +7 -0
- data/spec/support/adapter_tests/rspec.rb +70 -0
- data/spec/support/adapter_tests/test_unit.rb +47 -0
- data/spec/support/command_runner.rb +105 -0
- data/spec/support/generator.rb +56 -0
- data/spec/support/integration_tests/base.rb +64 -0
- data/spec/support/integration_tests/rails.rb +60 -0
- data/spec/support/integration_tests/rails_minitest.rb +13 -0
- data/spec/support/integration_tests/rails_rspec.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit_like.rb +13 -0
- data/spec/support/integration_tests/ruby.rb +7 -0
- data/spec/support/integration_tests/ruby_minitest.rb +13 -0
- data/spec/support/integration_tests/ruby_rspec.rb +13 -0
- data/spec/support/integration_tests/ruby_test_unit.rb +13 -0
- data/spec/support/matchers/be_a_subset_of_matcher.rb +24 -0
- data/spec/support/project/cucumber.rb +50 -0
- data/spec/support/project/generator.rb +348 -0
- data/spec/support/project/minitest.rb +39 -0
- data/spec/support/project/rails.rb +199 -0
- data/spec/support/project/rails_minitest.rb +17 -0
- data/spec/support/project/rails_rspec.rb +50 -0
- data/spec/support/project/rails_test_unit.rb +17 -0
- data/spec/support/project/rails_test_unit_like.rb +17 -0
- data/spec/support/project/rspec.rb +69 -0
- data/spec/support/project/ruby.rb +34 -0
- data/spec/support/project/ruby_minitest.rb +11 -0
- data/spec/support/project/ruby_rspec.rb +29 -0
- data/spec/support/project/ruby_test_unit.rb +11 -0
- data/spec/support/project/ruby_test_unit_like.rb +21 -0
- data/spec/support/project/test_unit.rb +29 -0
- data/spec/support/project/test_unit_like.rb +7 -0
- data/spec/support/project/tests_runner.rb +22 -0
- data/spec/support/test.sqlite3 +0 -0
- data/spec/support/test_case/generator.rb +53 -0
- data/spec/support/test_case/minitest.rb +13 -0
- data/spec/support/test_case/rspec.rb +19 -0
- data/spec/support/test_case/test_unit.rb +21 -0
- data/spec/support/test_file/generator.rb +120 -0
- data/spec/support/test_file/minitest.rb +19 -0
- data/spec/support/test_file/rails_minitest.rb +7 -0
- data/spec/support/test_file/rails_rspec.rb +12 -0
- data/spec/support/test_file/rails_test_unit.rb +25 -0
- data/spec/support/test_file/rspec.rb +33 -0
- data/spec/support/test_file/test_unit.rb +36 -0
- data/spec/support/test_helper/generator.rb +27 -0
- data/spec/support/test_helper/minitest.rb +7 -0
- data/spec/support/test_helper/rails.rb +31 -0
- data/spec/support/test_helper/rails_minitest.rb +7 -0
- data/spec/support/test_helper/rails_rspec.rb +25 -0
- data/spec/support/test_helper/rails_test_unit.rb +23 -0
- data/spec/support/test_helper/rspec.rb +7 -0
- data/spec/support/test_helper/ruby.rb +31 -0
- data/spec/support/test_helper/test_unit.rb +7 -0
- metadata +240 -19
- data/VERSION +0 -1
- data/lib/rr/adapters.rb +0 -44
- data/lib/rr/adapters/rr_methods.rb +0 -142
- data/lib/rr/integrations/rspec_1.rb +0 -46
- data/lib/rr/integrations/test_unit_1.rb +0 -63
- data/lib/rr/integrations/test_unit_2.rb +0 -15
- data/lib/rr/integrations/test_unit_200.rb +0 -27
- data/lib/rr/integrations/test_unit_200_active_support.rb +0 -25
- data/lib/rr/integrations/test_unit_2_active_support.rb +0 -38
- data/lib/rr/proc_from_block.rb +0 -11
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'appraisal/file'
|
|
2
|
+
|
|
3
|
+
class Adapter
|
|
4
|
+
attr_reader :name
|
|
5
|
+
|
|
6
|
+
def initialize(name)
|
|
7
|
+
@name = name
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def appraisal_name
|
|
11
|
+
parts = []
|
|
12
|
+
parts << 'ruby_19'
|
|
13
|
+
parts << name
|
|
14
|
+
parts.join('_')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def appraisal
|
|
18
|
+
@appraisal ||= Appraisal::File.new.appraisals.find do |appraisal|
|
|
19
|
+
appraisal.name == appraisal_name
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
module AdapterTests
|
|
4
|
+
module Base
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def assert_stubs_work
|
|
8
|
+
subject = Object.new
|
|
9
|
+
stub(subject).foobar { :baz }
|
|
10
|
+
assert_equal :baz, subject.foobar("any", "thing")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def assert_mocks_work
|
|
14
|
+
subject = Object.new
|
|
15
|
+
mock(subject).foobar(1, 2) { :baz }
|
|
16
|
+
assert_equal :baz, subject.foobar(1, 2)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def assert_stub_proxies_work
|
|
20
|
+
subject = Object.new
|
|
21
|
+
def subject.foobar; :baz; end
|
|
22
|
+
stub.proxy(subject).foobar
|
|
23
|
+
assert_equal :baz, subject.foobar
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def assert_mock_proxies_work
|
|
27
|
+
subject = Object.new
|
|
28
|
+
def subject.foobar; :baz; end
|
|
29
|
+
mock.proxy(subject).foobar
|
|
30
|
+
assert_equal :baz, subject.foobar
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def assert_times_called_verifications_work
|
|
34
|
+
subject = Object.new
|
|
35
|
+
mock(subject).foobar(1, 2) { :baz }
|
|
36
|
+
assert_raises RR::Errors.error_class(:TimesCalledError) do
|
|
37
|
+
RR.verify
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def assert_adapters_loaded(matching_adapters)
|
|
42
|
+
assert_subset Set.new(matching_adapters), Set.new(RR.loaded_adapter_names)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require File.expand_path('../base', __FILE__)
|
|
2
|
+
require File.expand_path('../../matchers/be_a_subset_of_matcher', __FILE__)
|
|
3
|
+
|
|
4
|
+
module AdapterTests
|
|
5
|
+
module RSpec
|
|
6
|
+
include Base
|
|
7
|
+
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.class_eval do
|
|
10
|
+
specify 'stubs work' do
|
|
11
|
+
assert_stubs_work
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
specify 'mocks work' do
|
|
15
|
+
assert_mocks_work
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
specify 'stub proxies work' do
|
|
19
|
+
assert_stub_proxies_work
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
specify 'mock proxies work' do
|
|
23
|
+
assert_mock_proxies_work
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
specify 'times-called verifications work' do
|
|
27
|
+
assert_times_called_verifications_work
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
specify 'have_received works' do
|
|
31
|
+
subject = Object.new
|
|
32
|
+
stub(subject).foobar(1, 2)
|
|
33
|
+
subject.foobar(1, 2)
|
|
34
|
+
subject.should have_received.foobar(1, 2)
|
|
35
|
+
|
|
36
|
+
expect {
|
|
37
|
+
subject.should have_received.foobar(1, 2, 3)
|
|
38
|
+
}.to raise_error(
|
|
39
|
+
expectation_not_met_error,
|
|
40
|
+
/Expected foobar\(1, 2, 3\).+to be called 1 time/m
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def expectation_not_met_error
|
|
47
|
+
if defined?(::RSpec)
|
|
48
|
+
::RSpec::Expectations::ExpectationNotMetError
|
|
49
|
+
else
|
|
50
|
+
Spec::Expectations::ExpectationNotMetError
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def assert_equal(expected, actual)
|
|
55
|
+
expected.should be == actual
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def assert_subset(subset, set)
|
|
59
|
+
subset.should be_a_subset_of(set)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def assert_raises(error, &block)
|
|
63
|
+
expect(&block).to raise_error(error)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def be_a_subset_of(set)
|
|
67
|
+
BeASubsetOfMatcher.new(set)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require File.expand_path('../base', __FILE__)
|
|
2
|
+
|
|
3
|
+
module AdapterTests
|
|
4
|
+
module TestUnit
|
|
5
|
+
include Base
|
|
6
|
+
|
|
7
|
+
def test_that_stubs_work
|
|
8
|
+
assert_stubs_work
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_that_mocks_work
|
|
12
|
+
assert_mocks_work
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_that_stub_proxies_work
|
|
16
|
+
assert_stub_proxies_work
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_that_mock_proxies_work
|
|
20
|
+
assert_mock_proxies_work
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_that_times_called_verifications_work
|
|
24
|
+
assert_times_called_verifications_work
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_using_assert_received
|
|
28
|
+
subject = Object.new
|
|
29
|
+
stub(subject).foobar(1, 2)
|
|
30
|
+
subject.foobar(1, 2)
|
|
31
|
+
assert_received(subject) {|s| s.foobar(1, 2) }
|
|
32
|
+
|
|
33
|
+
error_class = RR::Errors.error_class(
|
|
34
|
+
RR::Errors::SpyVerificationErrors::InvocationCountError
|
|
35
|
+
)
|
|
36
|
+
assert_raises(error_class) do
|
|
37
|
+
assert_received(subject) {|s| s.foobar(1, 2, 3) }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def assert_subset(subset, set)
|
|
42
|
+
value = (subset - set).empty?
|
|
43
|
+
message = "Set 1 was not a subset of set 2.\nSet 1: #{subset.inspect}\nSet 2: #{set.inspect}"
|
|
44
|
+
assert value, message
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
require 'open3'
|
|
2
|
+
|
|
3
|
+
class CommandRunner
|
|
4
|
+
# http://stackoverflow.com/questions/6407141/how-can-i-have-ruby-logger-log-output-to-stdout-as-well-as-file
|
|
5
|
+
class MultiIO
|
|
6
|
+
def initialize(*targets)
|
|
7
|
+
@targets = targets
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def write(*args)
|
|
11
|
+
@targets.each {|t| t.write(*args) }
|
|
12
|
+
end
|
|
13
|
+
alias_method :<<, :write
|
|
14
|
+
|
|
15
|
+
def close
|
|
16
|
+
@targets.each(&:close)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.call(command, options={})
|
|
21
|
+
new(command, options).call
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
attr_reader :command, :output, :exit_status
|
|
25
|
+
|
|
26
|
+
def initialize(command, options)
|
|
27
|
+
@command = command
|
|
28
|
+
#@command << " 2>&1" unless @command =~ / 2>&1$/
|
|
29
|
+
@output = ""
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def call
|
|
33
|
+
@stdout_buffer = StringIO.new
|
|
34
|
+
|
|
35
|
+
puts "Running: #{@command}"
|
|
36
|
+
|
|
37
|
+
if defined?(JRUBY_VERSION)
|
|
38
|
+
call_using_popen4
|
|
39
|
+
else
|
|
40
|
+
call_using_spawn
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if RR.debug?
|
|
44
|
+
puts "~ Output from `#{@command}` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
45
|
+
puts @output
|
|
46
|
+
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
self
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def success?
|
|
53
|
+
@exit_status == 0
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def call_using_session
|
|
59
|
+
reader, writer = IO.pipe
|
|
60
|
+
require 'session'
|
|
61
|
+
session = Session::Bash.new
|
|
62
|
+
session.execute(@command, :stdout => writer, :stderr => writer)
|
|
63
|
+
writer.close
|
|
64
|
+
@exit_status = session.exit_status
|
|
65
|
+
@output = reader.read
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def call_using_popen4
|
|
69
|
+
reader, writer = IO.pipe
|
|
70
|
+
|
|
71
|
+
# Using popen4 here without a block will always result in an Errno::ECHILD
|
|
72
|
+
# error under JRuby: <http://jira.codehaus.org/browse/JRUBY-5684>
|
|
73
|
+
block = lambda { |pid, _, stdout, _| writer.write(stdout.read) }
|
|
74
|
+
|
|
75
|
+
if defined?(JRUBY_VERSION)
|
|
76
|
+
IO.popen4("#{@command} 2>&1", &block)
|
|
77
|
+
else
|
|
78
|
+
require 'open4'
|
|
79
|
+
Open4.popen4("#{@command} 2>&1", &block)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
writer.close
|
|
83
|
+
@exit_status = $?.exitstatus
|
|
84
|
+
@output = reader.read
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def call_using_spawn
|
|
88
|
+
reader, writer = IO.pipe
|
|
89
|
+
args = [@command, {[:out, :err] => writer}]
|
|
90
|
+
require 'posix-spawn'
|
|
91
|
+
pid = POSIX::Spawn.spawn(*args)
|
|
92
|
+
Process.waitpid(pid)
|
|
93
|
+
writer.close
|
|
94
|
+
@exit_status = $?.exitstatus
|
|
95
|
+
@output = reader.read
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def build_stdout
|
|
99
|
+
ios = [@stdout_buffer]
|
|
100
|
+
#if RR.debug?
|
|
101
|
+
# ios << $stdout
|
|
102
|
+
#end
|
|
103
|
+
MultiIO.new(*ios)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Generator
|
|
2
|
+
module ClassMethods
|
|
3
|
+
attr_reader :configurators
|
|
4
|
+
|
|
5
|
+
def factory
|
|
6
|
+
klass = Class.new(self)
|
|
7
|
+
yield klass if block_given?
|
|
8
|
+
klass
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def call(*args, &block)
|
|
12
|
+
new(*args, &block).tap { |object| object.call }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def generate(&block)
|
|
16
|
+
factory.call(&block)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def mixin(mod)
|
|
20
|
+
include mod
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def configure(&block)
|
|
24
|
+
configurators << block
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def configurators
|
|
28
|
+
@configurators ||= []
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.included(base)
|
|
33
|
+
base.extend(ClassMethods)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def initialize(*args)
|
|
37
|
+
setup(*args)
|
|
38
|
+
run_configurators
|
|
39
|
+
configure(*args)
|
|
40
|
+
yield self if block_given?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def setup(*args)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def configure(*args)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def run_configurators
|
|
52
|
+
self.class.configurators.each do |configurator|
|
|
53
|
+
configurator.call(self)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require File.expand_path('../../project/generator', __FILE__)
|
|
2
|
+
|
|
3
|
+
module IntegrationTests
|
|
4
|
+
module Base
|
|
5
|
+
class FailWithOutputMatcher < Struct.new(:pattern)
|
|
6
|
+
def matches?(result)
|
|
7
|
+
result.output =~ pattern
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def description
|
|
11
|
+
"fail with output #{pattern.inspect}"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def failure_message_for_should
|
|
15
|
+
"Expected running the test to produce output #{pattern.inspect} but it didn't"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def failure_message_for_should_not
|
|
19
|
+
"Expected running the test to not produce output #{pattern.inspect} but it did"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class HaveErrorsOrFailuresMatcher
|
|
24
|
+
def matches?(result)
|
|
25
|
+
match = result.output.match(/(\d+) error|(\d+) failure/)
|
|
26
|
+
match && match.captures.any? {|value| value && value.to_i > 0 }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def description
|
|
30
|
+
"have errors or failures"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def failure_message_for_should
|
|
34
|
+
"Expected running the test to result in errors or failures but it did not"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def failure_message_for_should_not
|
|
38
|
+
"Expected running the test to not result in errors or failures, but it did "
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def build_project_generator
|
|
43
|
+
Project::Generator.factory do |project_generator|
|
|
44
|
+
configure_project_generator(project_generator)
|
|
45
|
+
yield project_generator if block_given?
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def generate_project(&block)
|
|
50
|
+
build_project_generator.call(&block)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def configure_project_generator(generator)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def fail_with_output(pattern)
|
|
57
|
+
FailWithOutputMatcher.new(pattern)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def have_errors_or_failures
|
|
61
|
+
HaveErrorsOrFailuresMatcher.new
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require File.expand_path('../base', __FILE__)
|
|
2
|
+
require File.expand_path('../../project/rails', __FILE__)
|
|
3
|
+
|
|
4
|
+
module IntegrationTests
|
|
5
|
+
module Rails
|
|
6
|
+
class LeaveDatabaseTableClearMatcher < Struct.new(:project, :table_name)
|
|
7
|
+
def matches?(block)
|
|
8
|
+
@old_number_of_rows = number_of_rows
|
|
9
|
+
block.call
|
|
10
|
+
@new_number_of_rows = number_of_rows
|
|
11
|
+
@old_number_of_rows == 0 && @new_number_of_rows == 0
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def description
|
|
15
|
+
"leave the database table #{table_name} unchanged"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def failure_message_for_should
|
|
19
|
+
"Expected for database table #{table_name} to have been left clear, but it was changed (there are now #{@new_number_of_rows} rows)"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def failure_message_for_should_not
|
|
23
|
+
"Expected for database table #{table_name} to not have been left clear, but it was"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def number_of_rows
|
|
29
|
+
result = project.exec!("echo 'select count(*) from #{table_name};' | sqlite3 #{project.database_file_path}")
|
|
30
|
+
result.output.chomp.to_i
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
include Base
|
|
35
|
+
|
|
36
|
+
def configure_project_generator(project_generator)
|
|
37
|
+
super
|
|
38
|
+
configure_rails_project_generator(project_generator)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def build_rails_project_generator
|
|
42
|
+
Project::Generator.factory do |project_generator|
|
|
43
|
+
configure_rails_project_generator(project_generator)
|
|
44
|
+
yield project_generator if block_given?
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def generate_rails_project(&block)
|
|
49
|
+
build_rails_project_generator.call(&block)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def configure_rails_project_generator(project_generator)
|
|
53
|
+
project_generator.mixin Project::Rails
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def leave_database_table_clear(project, table_name)
|
|
57
|
+
LeaveDatabaseTableClearMatcher.new(project, table_name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|