1- using Moq ;
2-
31namespace UsingStaticInCSharp . Tests ;
2+
43public class UsingStaticUnitTest
54{
5+ private static string CaptureOutput ( Action invoke )
6+ {
7+ var original = Console . Out ;
8+ using var writer = new StringWriter ( ) ;
9+ Console . SetOut ( writer ) ;
10+ try
11+ {
12+ invoke ( ) ;
13+ }
14+ finally
15+ {
16+ Console . SetOut ( original ) ;
17+ }
18+
19+ return writer . ToString ( ) ;
20+ }
21+
22+ [ Fact ]
23+ public void GivenAStaticMethodFromClassA_WhenCalledByUsingStaticFeature_ThenItRuns ( )
24+ {
25+ var output = CaptureOutput ( ( ) => new MethodsAndProperties . Caller ( ) . Invoke ( ) ) ;
26+
27+ Assert . Contains ( "MethodsAndProperties.ClassA.MethodA() called" , output ) ;
28+ Assert . Contains ( "MethodsAndProperties.ClassA.MethodB() called" , output ) ;
29+ }
30+
31+ [ Fact ]
32+ public void GivenAnEnum_WhenItemsAreUsedByUsingStaticFeature_ThenTheyResolve ( )
33+ {
34+ var output = CaptureOutput ( ( ) => new Enums . Caller ( ) . Invoke ( ) ) ;
35+
36+ Assert . Contains ( "The enum items are User, Admin" , output ) ;
37+ }
38+
39+ [ Fact ]
40+ public void GivenStaticConstants_WhenUsedByUsingStaticFeature_ThenTheyResolve ( )
41+ {
42+ var output = CaptureOutput ( ( ) => new Constants . Caller ( ) . Invoke ( ) ) ;
43+
44+ Assert . Contains ( "Pending, InProgress, Completed" , output ) ;
45+ }
46+
47+ [ Fact ]
48+ public void GivenANestedClass_WhenCalledByUsingStaticFeature_ThenItRuns ( )
49+ {
50+ var output = CaptureOutput ( ( ) => new NestedTypeMembers . Caller ( ) . Invoke ( ) ) ;
51+
52+ Assert . Contains ( "NestedTypeMembers.ClassA.ClassB.MethodA() called" , output ) ;
53+ Assert . Contains ( "NestedTypeMembers.ClassA.ClassB.MethodB() called" , output ) ;
54+ }
55+
656 [ Fact ]
7- public void GivenAStaticConstant_WhenCalledByUsingStaticFeature_ShouldBeInvoked ( )
57+ public void GivenTheOuterClass_WhenImportedByUsingStatic_ThenTheNestedClassNeedsNoPrefix ( )
858 {
9- var mock = new Mock < Constants . Caller > ( ) ;
10- mock . Object . Invoke ( ) ;
59+ var output = CaptureOutput ( ( ) => new NestedTypeMembers . OuterTypeCaller ( ) . Invoke ( ) ) ;
1160
12- mock . Verify ( x => x . Invoke ( ) ) ;
61+ Assert . Contains ( "NestedTypeMembers.ClassA.ClassB.MethodA() called" , output ) ;
62+ Assert . Contains ( "NestedTypeMembers.ClassA.ClassB.MethodB() called" , output ) ;
1363 }
1464
1565 [ Fact ]
16- public void GivenANestedClassFromSampleClassOne_WhenCalledByUsingStaticFeature_ShouldBeInvoked ( )
66+ public void GivenAnExtensionMethodInDifferentNamespace_WhenImportedByUsingStatic_ThenItIsFound ( )
1767 {
18- var mock = new Mock < NestedTypeMembers . Caller > ( ) ;
19- mock . Object . Invoke ( ) ;
68+ var output = CaptureOutput ( ( ) => new ExtensionMethods . Caller ( ) . Invoke ( ) ) ;
2069
21- mock . Verify ( x => x . Invoke ( ) ) ;
70+ Assert . Contains ( "The sum is 3" , output ) ;
2271 }
2372
2473 [ Fact ]
25- public void GivenAStaticMethodFromClassA_WhenCalledByUsingStaticFeature_ShouldBeInvoked ( )
74+ public void GivenADerivedClass_WhenItsOwnStaticMethodIsCalledByUsingStatic_ThenItRuns ( )
2675 {
27- var mock = new Mock < MethodsAndProperties . Caller > ( ) ;
28- mock . Object . Invoke ( ) ;
76+ var output = CaptureOutput ( ( ) => new BaseClassMembers . Caller ( ) . Invoke ( ) ) ;
2977
30- mock . Verify ( x => x . Invoke ( ) ) ;
78+ Assert . Contains ( "BaseClassMembers.ClassB.MethodB() called" , output ) ;
3179 }
3280
3381 [ Fact ]
34- public void GivenAAmbiguityMethodFromClassAAndClassB_WhenCalledByItsClassName_ShouldBeInvoked ( )
82+ public void GivenTwoClassesWithTheSameMethod_WhenCalledByClassName_ThenBothRun ( )
3583 {
36- var mock = new Mock < Ambiguity . Caller > ( ) ;
37- mock . Object . Invoke ( ) ;
84+ var output = CaptureOutput ( ( ) => new Ambiguity . Caller ( ) . Invoke ( ) ) ;
3885
39- mock . Verify ( x => x . Invoke ( ) ) ;
86+ Assert . Contains ( "Ambiguity.ClassA.Method() called" , output ) ;
87+ Assert . Contains ( "Ambiguity.ClassB.Method() called" , output ) ;
4088 }
4189
4290 [ Fact ]
43- public void GivenAEnum_WhenCalledByUsingStaticFeature_ShouldBeInvoked ( )
91+ public void GivenAGlobalUsingStatic_WhenMathMembersAreCalledWithoutTypeName_ThenTheyResolve ( )
4492 {
45- var mock = new Mock < Enums . Caller > ( ) ;
46- mock . Object . Invoke ( ) ;
93+ var output = CaptureOutput ( ( ) => new GlobalUsingStatic . Caller ( ) . Invoke ( ) ) ;
4794
48- mock . Verify ( x => x . Invoke ( ) ) ;
95+ Assert . Contains ( "The hypotenuse is 5" , output ) ;
96+ Assert . Contains ( "The best score is 9" , output ) ;
4997 }
5098
5199 [ Fact ]
52- public void GivenAnExtensionMethodInDifferentNamespace_WhenCalledByUsingStaticFeature_ShouldBeInvoked ( )
100+ public void GivenAMemberWithTheSameName_WhenCalledUnqualified_ThenTheEnclosingTypeWins ( )
53101 {
54- var mock = new Mock < ExtensionMethods . Caller > ( ) ;
55- mock . Object . Invoke ( ) ;
102+ var output = CaptureOutput ( ( ) => new MemberPrecedence . Caller ( ) . Invoke ( ) ) ;
56103
57- mock . Verify ( x => x . Invoke ( ) ) ;
104+ Assert . Contains ( "Describe() returned Caller.Describe()" , output ) ;
58105 }
59- }
106+ }
0 commit comments