#!/usr/bin/env ruby require 'test/unit' require 'flexmock' class TestFlexMock < Test::Unit::TestCase def test_defaults FlexMock.use do |m| m.should_receive(:hi) assert_nil m.hi assert_nil m.hi(1) assert_nil m.hi("hello", 2) end end def test_returns_with_value FlexMock.use do |m| m.should_receive(:hi).returns(1) assert_equal 1, m.hi assert_equal 1, m.hi(123) end end def test_returns_with_block FlexMock.use do |m| result = nil m.should_receive(:hi).with(Object).returns { |obj| result = obj } m.hi(3) assert_equal 3, result end end def test_and_returns_alias FlexMock.use do |m| m.should_receive(:hi).and_return(4) assert_equal 4, m.hi end end def test_multiple_expectations FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10) m.should_receive(:hi).with(2).returns(20) assert_equal 10, m.hi(1) assert_equal 20, m.hi(2) end end def test_with_no_args_with_no_args FlexMock.use do |m| m.should_receive(:hi).with_no_args m.hi end end def test__with_no_args_but_with_args ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with_no_args m.hi(1) end end end def test__with_any_args FlexMock.use do |m| m.should_receive(:hi).with_any_args m.hi m.hi(1) m.hi(1,2,3) m.hi("this is a test") end end def test_args_matching_with_regex FlexMock.use do |m| m.should_receive(:hi).with(/one/).returns(10) m.should_receive(:hi).with(/t/).returns(20) assert_equal 10, m.hi("one") assert_equal 10, m.hi("done") assert_equal 20, m.hi("two") assert_equal 20, m.hi("three") end end def test_arg_matching_with_regex_matching_non_string FlexMock.use do |m| m.should_receive(:hi).with(/1/).returns(10) assert_equal 10, m.hi(319) end end def test_arg_matching_with_class FlexMock.use do |m| m.should_receive(:hi).with(Fixnum).returns(10) m.should_receive(:hi).with(Object).returns(20) assert_equal 10, m.hi(319) assert_equal 10, m.hi(Fixnum) assert_equal 20, m.hi("hi") end end def test_arg_matching_with_no_match FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10) assert_failure { assert_equal 20, m.hi(2) } end end def test_never_and_never_called FlexMock.use do |m| m.should_receive(:hi).with(1).never end end def test_never_and_called_once ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).never m.hi(1) end end end def test_once_called_once FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).once m.hi(1) end end def test_once_but_never_called ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).once end end end def test_once_but_called_twice ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).once m.hi(1) m.hi(1) end end end def test_twice_and_called_twice FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).twice m.hi(1) m.hi(1) end end def test_zero_or_more_called_zero FlexMock.use do |m| m.should_receive(:hi).zero_or_more_times end end def test_zero_or_more_called_once FlexMock.use do |m| m.should_receive(:hi).zero_or_more_times m.hi end end def test_zero_or_more_called_100 FlexMock.use do |m| m.should_receive(:hi).zero_or_more_times 100.times { m.hi } end end def test_times FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).times(10) 10.times { m.hi(1) } end end def test_at_least_called_once FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once m.hi(1) end end def test_at_least_but_never_called ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once end end end def test_at_least_once_but_called_twice FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once m.hi(1) m.hi(1) end end def test_at_least_and_exact ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once.once m.hi(1) m.hi(1) end end end def test_at_most_but_never_called FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_most.once end end def test_at_most_called_once FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_most.once m.hi(1) end end def test_at_most_called_twice ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_most.once m.hi(1) m.hi(1) end end end def test_at_most_and_at_least_called_never ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once.at_most.twice end end end def test_at_most_and_at_least_called_once FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once.at_most.twice m.hi(1) end end def test_at_most_and_at_least_called_twice FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once.at_most.twice m.hi(1) m.hi(1) end end def test_at_most_and_at_least_called_three_times ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).returns(10).at_least.once.at_most.twice m.hi(1) m.hi(1) m.hi(1) end end end def test_call_counts_only_apply_to_matching_args FlexMock.use do |m| m.should_receive(:hi).with(1).once m.should_receive(:hi).with(2).twice m.should_receive(:hi).with(3) m.hi(1) m.hi(2) m.hi(2) 20.times { m.hi(3) } end end def test_call_counts_only_apply_to_matching_args_with_mismatch ex = assert_failure do FlexMock.use do |m| m.should_receive(:hi).with(1).once m.should_receive(:hi).with(2).twice m.should_receive(:hi).with(3) m.should_receive(:lo) m.hi(1) m.hi(2) m.lo 20.times { m.hi(3) } end end end def test_ordered_calls_in_order FlexMock.use 'm' do |m| m.should_receive(:hi).ordered m.should_receive(:lo).ordered m.hi m.lo end end def test_ordered_calls_out_of_order ex = assert_failure do FlexMock.use 'm' do |m| m.should_receive(:hi).ordered m.should_receive(:lo).ordered m.lo m.hi end end end def test_order_calls_with_different_arg_lists_and_in_order FlexMock.use 'm' do |m| m.should_receive(:hi).with("one").ordered m.should_receive(:hi).with("two").ordered m.hi("one") m.hi("two") end end def test_order_calls_with_different_arg_lists_and_out_of_order ex = assert_failure do FlexMock.use 'm' do |m| m.should_receive(:hi).with("one").ordered m.should_receive(:hi).with("two").ordered m.hi("two") m.hi("one") end end end def test_unordered_calls_do_not_effect_ordered_testing FlexMock.use 'm' do |m| m.should_receive(:blah) m.should_receive(:hi).ordered m.should_receive(:lo).ordered m.blah m.hi m.blah m.lo m.blah end end def test_ordered_with_multiple_calls_is_ok FlexMock.use 'm' do |m| m.should_receive(:hi).ordered m.should_receive(:lo).ordered m.hi m.hi m.lo m.lo end end def test_grouped_ordering FlexMock.use 'm' do |m| m.should_receive(:start).ordered(:start_group) m.should_receive(:flip).ordered(:flip_flop_group) m.should_receive(:flop).ordered(:flip_flop_group) m.should_receive(:final).ordered m.start m.flop m.flip m.flop m.final end end def test_grouped_ordering_with_symbols FlexMock.use 'm' do |m| m.should_receive(:start).ordered(:group_one) m.should_receive(:flip).ordered(:group_two) m.should_receive(:flop).ordered(:group_two) m.should_receive(:final).ordered m.start m.flop m.flip m.flop m.final end end def test_explicit_ordering_mixed_with_implicit_ordering_should_not_overlap FlexMock.use 'm' do |m| xstart = m.should_receive(:start).ordered xmid = m.should_receive(:mid).ordered(:group_name) xend = m.should_receive(:end).ordered assert xstart.order_number < xmid.order_number assert xmid.order_number < xend.order_number end end def test_explicit_ordering_with_explicit_misorders assert_failure do FlexMock.use 'm' do |m| m.should_receive(:hi).ordered(:first_group) m.should_receive(:lo).ordered(:second_group) m.lo m.hi end end end def test_expectation_formating m = FlexMock.new("m") exp = m.should_receive(:f).with(1,"two", /^3$/).and_return(0).at_least.once assert_equal 'f(1, "two", /^3$/)', exp.to_s end def assert_failure assert_raises(Test::Unit::AssertionFailedError) do yield end end end