1: #region Copyright (c) 2009, Andre Loker <mail@andreloker.de>
2: // Permission to use, copy, modify, and/or distribute this software for any
3: // purpose with or without fee is hereby granted, provided that the above
4: // copyright notice and this permission notice appear in all copies.
5: //
6: // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7: // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
8: // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
9: // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
10: // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
11: // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
12: // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
13: #endregion
14:
15: using System;
16: using MbUnit.Framework;
17: using Rhino.Mocks;
18:
19: [TestFixture]
20: public class ObjectSendExtensionTests {
21: [Test]
22: public void FailsIfTargetIsNull() {
23: const string x = null;
24: Assert.Throws<ArgumentNullException>(() => x.Send("ToString"));
25: }
26:
27: [Test]
28: public void FailsIfMethodNameIsNull() {
29: Assert.Throws<ArgumentNullException>(() => 123.Send(null));
30: }
31:
32: [Test]
33: public void CanInvokeUniqueMethodWithoutArgs() {
34: var mock = MockRepository.GenerateMock<IUniqueMethodWithoutArgs>();
35: mock.Send("Foo");
36: mock.AssertWasCalled(x => x.Foo());
37: }
38:
39: [Test]
40: public void CanDistinguishMethodsByParameterCount_FirstMethod() {
41: var mock = MockRepository.GenerateMock<ISimpleOverload>();
42: mock.Send("Foo");
43: mock.AssertWasCalled(x => x.Foo());
44: mock.AssertWasNotCalled(x => x.Foo(Arg<int>.Is.Anything));
45: }
46:
47: [Test]
48: public void CanDistinguishMethodsByParameterCount_SecondMethod() {
49: var mock = MockRepository.GenerateMock<ISimpleOverload>();
50: mock.Send("Foo", 42);
51: mock.AssertWasCalled(x => x.Foo(Arg.Is(42)));
52: mock.AssertWasNotCalled(x => x.Foo());
53: }
54:
55: [Test]
56: public void CanPassArgumentsToMethod() {
57: var mock = MockRepository.GenerateMock<ISimpleArguments>();
58: mock.Send("Foo", 4, "bar");
59: mock.AssertWasCalled(x => x.Foo(Arg.Is(4), Arg.Is("bar")));
60: }
61:
62: [Test]
63: public void CanDoSimpleParameterResolution_StringOverload() {
64: var mock = MockRepository.GenerateMock<IParameterResolution>();
65: var arg = "bar";
66: mock.Send("Foo", arg);
67: mock.AssertWasCalled(x => x.Foo(Arg.Is(arg)));
68: mock.AssertWasNotCalled(x => x.Foo(Arg<Version>.Is.Anything));
69: mock.AssertWasNotCalled(x => x.Foo(Arg<int>.Is.Anything));
70: }
71:
72: [Test]
73: public void CanDoSimpleParameterResolution_VersionOverload() {
74: var mock = MockRepository.GenerateMock<IParameterResolution>();
75: var arg = new Version(1, 2, 3);
76: mock.Send("Foo", arg);
77: mock.AssertWasCalled(x => x.Foo(Arg.Is(arg)));
78: mock.AssertWasNotCalled(x => x.Foo(Arg<string>.Is.Anything));
79: mock.AssertWasNotCalled(x => x.Foo(Arg<int>.Is.Anything));
80: }
81:
82: [Test]
83: public void CanDoSimpleParameterResolution_IntOverload() {
84: var mock = MockRepository.GenerateMock<IParameterResolution>();
85: var arg = 42;
86: mock.Send("Foo", arg);
87: mock.AssertWasCalled(x => x.Foo(Arg.Is(arg)));
88: mock.AssertWasNotCalled(x => x.Foo(Arg<string>.Is.Anything));
89: mock.AssertWasNotCalled(x => x.Foo(Arg<Version>.Is.Anything));
90: }
91:
92: [Test]
93: public void CanHandleNullableArguments() {
94: var mock = MockRepository.GenerateMock<INullableParameters>();
95: int? arg = 42;
96: mock.Send("Foo", arg);
97: mock.AssertWasCalled(x => x.Foo(Arg.Is(arg)));
98: mock.AssertWasNotCalled(x => x.Foo(Arg<float>.Is.Anything));
99: }
100:
101: [Test]
102: public void CanHandleNullableArgumentsWithNullValue() {
103: var mock = MockRepository.GenerateMock<INullableParameters>();
104: int? arg = null;
105: mock.Send("Foo", arg);
106: mock.AssertWasCalled(x => x.Foo(Arg.Is(arg)));
107: mock.AssertWasNotCalled(x => x.Foo(Arg<float>.Is.Anything));
108: }
109:
110: [Test, Description("Although not desired this behaviour is expected")]
111: public void SuffersFromNullableBoxingBehaviour() {
112: var mock = MockRepository.GenerateMock<INullableParametersBoxingIssue>();
113: int? arg = 42;
114: mock.Send("Foo", arg);
115: mock.AssertWasCalled(x => x.Foo(Arg<int>.Is.Equal(42)));
116: mock.AssertWasNotCalled(x => x.Foo(Arg<int?>.Is.Anything));
117: }
118:
119: [Test]
120: public void TriesToMatchTypesAsGoodAsPossible() {
121: var mock = MockRepository.GenerateMock<ISelectPolymorphic>();
122: var item = new DerivedClass();
123: mock.Send("Foo", item);
124: mock.AssertWasCalled(x => x.Foo(Arg<DerivedClass>.Is.Same(item)));
125: mock.AssertWasNotCalled(x => x.Foo(Arg<BaseClass>.Is.Anything));
126: }
127:
128: [Test]
129: public void TriesToMatchTypesAsGoodAsPossible2() {
130: var mock = MockRepository.GenerateMock<ISelectPolymorphic2>();
131: var item = new DerivedClass();
132: mock.Send("Foo", null, item);
133: mock.AssertWasCalled(x => x.Foo(Arg<BaseClass>.Is.Null, Arg<DerivedClass>.Is.Same(item)));
134: mock.AssertWasNotCalled(x => x.Foo(Arg<BaseClass>.Is.Anything, Arg<BaseClass>.Is.Anything));
135: }
136:
137: [Test]
138: public void CanCauseAmbiguousInvocation() {
139: var mock = MockRepository.GenerateMock<ISelectPolymorphic>();
140:
141: var exception = Assert.Throws<ArgumentException>(() => mock.Send("Foo", new object[] { null }));
142: Assert.AreEqual("Ambiguous method invocation", exception.Message);
143: }
144:
145: [Test]
146: public void CanHandleNullArrayAsArguments() {
147: var mock = MockRepository.GenerateMock<IUniqueMethodWithoutArgs>();
148: mock.Send("Foo", default(object[]));
149: mock.AssertWasCalled(x => x.Foo());
150: }
151:
152: [Test]
153: public void ReturnsReturnValue() {
154: var stub = MockRepository.GenerateStub<IReturnValue>();
155: stub.Stub(x => x.IntFoo()).Return(123);
156: stub.Stub(x => x.StringFoo()).Return("bar");
157:
158: var intResult = stub.Send("IntFoo");
159: var stringResult = stub.Send("StringFoo");
160:
161: Assert.AreEqual(123, intResult);
162: Assert.AreEqual("bar", stringResult);
163: }
164:
165: [Test]
166: public void ReturnsCastReturnValue() {
167: var stub = MockRepository.GenerateStub<IReturnValue>();
168: stub.Stub(x => x.IntFoo()).Return(123);
169: stub.Stub(x => x.StringFoo()).Return("bar");
170:
171: int intResult = stub.Send<int>("IntFoo");
172: string stringResult = stub.Send<string>("StringFoo");
173:
174: Assert.AreEqual(123, intResult);
175: Assert.AreEqual("bar", stringResult);
176: }
177:
178: public interface IUniqueMethodWithoutArgs {
179: void Foo();
180: }
181:
182: public interface ISimpleOverload {
183: void Foo();
184: void Foo(int x);
185: }
186:
187: public interface ISimpleArguments {
188: void Foo(int x, string y);
189: }
190:
191: public interface IParameterResolution {
192: void Foo(string x);
193: void Foo(Version x);
194: void Foo(int x);
195: }
196:
197: public interface INullableParameters {
198: void Foo(float a);
199: void Foo(int? a);
200: }
201:
202: public interface INullableParametersBoxingIssue {
203: void Foo(int a);
204: void Foo(int? a);
205: }
206:
207: public interface ISelectPolymorphic {
208: void Foo(BaseClass arg);
209: void Foo(DerivedClass arg);
210: }
211:
212: public interface ISelectPolymorphic2 {
213: void Foo(BaseClass arg, BaseClass arg2);
214: void Foo(BaseClass arg, DerivedClass arg2);
215: }
216:
217: public interface IReturnValue {
218: int IntFoo();
219: string StringFoo();
220: }
221:
222: public class BaseClass {
223: }
224:
225: public class DerivedClass : BaseClass {
226: }
227: }