1+ using System ;
2+ using System . Collections ;
3+ using System . Collections . Generic ;
4+ using System . Linq ;
5+ using Microsoft . Vbe . Interop ;
6+ using Moq ;
7+
8+ namespace RubberduckTests . Mocks
9+ {
10+ public class MockProjectBuilder
11+ {
12+ private readonly Func < VBE > _getVbe ;
13+ private readonly Mock < VBProject > _project ;
14+ private readonly Mock < VBComponents > _vbComponents ;
15+ private readonly Mock < References > _vbReferences ;
16+
17+ private readonly List < Mock < VBComponent > > _components = new List < Mock < VBComponent > > ( ) ;
18+ private readonly List < Mock < Reference > > _references = new List < Mock < Reference > > ( ) ;
19+
20+ public MockProjectBuilder ( string name , vbext_ProjectProtection protection , Func < VBE > getVbe )
21+ {
22+ _getVbe = getVbe ;
23+
24+ _project = CreateProjectMock ( name , protection ) ;
25+
26+ _vbComponents = CreateComponentsMock ( ) ;
27+ _project . SetupGet ( m => m . VBComponents ) . Returns ( _vbComponents . Object ) ;
28+
29+ _vbReferences = CreateReferencesMock ( ) ;
30+ _project . SetupGet ( m => m . References ) . Returns ( _vbReferences . Object ) ;
31+ }
32+
33+ public MockProjectBuilder AddComponent ( string name , vbext_ComponentType type , string content )
34+ {
35+ var component = CreateComponentMock ( name , type , content ) ;
36+ _components . Add ( component ) ;
37+
38+ return this ;
39+ }
40+
41+ public MockProjectBuilder AddReference ( string name , string filePath )
42+ {
43+ _references . Add ( CreateReferenceMock ( name , filePath ) ) ;
44+ return this ;
45+ }
46+
47+ public Mock < VBProject > Build ( )
48+ {
49+ return _project ;
50+ }
51+
52+ private Mock < VBProject > CreateProjectMock ( string name , vbext_ProjectProtection protection )
53+ {
54+ var result = new Mock < VBProject > ( ) ;
55+
56+ result . SetupProperty ( m => m . Name , name ) ;
57+ result . SetupGet ( m => m . Protection ) . Returns ( ( ) => protection ) ;
58+ result . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
59+
60+ return result ;
61+ }
62+
63+ private Mock < VBComponents > CreateComponentsMock ( )
64+ {
65+ var result = new Mock < VBComponents > ( ) ;
66+
67+ result . SetupGet ( m => m . Parent ) . Returns ( ( ) => _project . Object ) ;
68+ result . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
69+
70+ result . Setup ( c => c . GetEnumerator ( ) ) . Returns ( ( ) => _components . GetEnumerator ( ) ) ;
71+ result . As < IEnumerable > ( ) . Setup ( c => c . GetEnumerator ( ) ) . Returns ( ( ) => _components . GetEnumerator ( ) ) ;
72+
73+ result . Setup ( m => m . Item ( It . IsAny < int > ( ) ) ) . Returns < int > ( index => _components [ index ] . Object ) ;
74+ result . Setup ( m => m . Item ( It . IsAny < string > ( ) ) ) . Returns < string > ( name => _components . Single ( item => item . Object . Name == name ) . Object ) ;
75+
76+ return result ;
77+ }
78+
79+ private Mock < References > CreateReferencesMock ( )
80+ {
81+ var result = new Mock < References > ( ) ;
82+
83+ result . SetupGet ( m => m . Parent ) . Returns ( ( ) => _project . Object ) ;
84+ result . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
85+
86+ result . Setup ( m => m . GetEnumerator ( ) ) . Returns ( ( ) => _references . GetEnumerator ( ) ) ;
87+ result . As < IEnumerable > ( ) . Setup ( m => m . GetEnumerator ( ) ) . Returns ( ( ) => _references . GetEnumerator ( ) ) ;
88+
89+ result . Setup ( m => m . Item ( It . IsAny < int > ( ) ) ) . Returns < int > ( index => _references [ index ] . Object ) ;
90+
91+ return result ;
92+ }
93+
94+ private Mock < Reference > CreateReferenceMock ( string name , string filePath )
95+ {
96+ var result = new Mock < Reference > ( ) ;
97+
98+ result . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
99+ result . SetupGet ( m => m . Collection ) . Returns ( ( ) => _vbReferences . Object ) ;
100+
101+ result . SetupGet ( m => m . Name ) . Returns ( ( ) => name ) ;
102+ result . SetupGet ( m => m . FullPath ) . Returns ( ( ) => filePath ) ;
103+
104+ return result ;
105+ }
106+
107+ private Mock < VBComponent > CreateComponentMock ( string name , vbext_ComponentType type , string content )
108+ {
109+ var result = new Mock < VBComponent > ( ) ;
110+
111+ result . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
112+ result . SetupGet ( m => m . Collection ) . Returns ( ( ) => _vbComponents . Object ) ;
113+ result . SetupGet ( m => m . Type ) . Returns ( ( ) => type ) ;
114+ result . SetupProperty ( m => m . Name , name ) ;
115+
116+ var module = CreateCodeModuleMock ( name , content ) ;
117+ result . SetupGet ( m => m . CodeModule ) . Returns ( ( ) => module . Object ) ;
118+
119+ result . Setup ( m => m . Activate ( ) ) ;
120+
121+ return result ;
122+ }
123+
124+ private Mock < CodeModule > CreateCodeModuleMock ( string name , string content )
125+ {
126+ var codePane = CreateCodePaneMock ( name ) ;
127+ codePane . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
128+
129+ var result = CreateCodeModuleMock ( content ) ;
130+ result . SetupGet ( m => m . VBE ) . Returns ( _getVbe ) ;
131+ result . SetupGet ( m => m . CodePane ) . Returns ( ( ) => codePane . Object ) ;
132+
133+ codePane . SetupGet ( m => m . CodeModule ) . Returns ( ( ) => result . Object ) ;
134+ return result ;
135+ }
136+
137+ private Mock < CodeModule > CreateCodeModuleMock ( string content )
138+ {
139+ var lines = content . Split ( new [ ] { Environment . NewLine } , StringSplitOptions . None ) . ToList ( ) ;
140+
141+ var codeModule = new Mock < CodeModule > ( ) ;
142+ codeModule . SetupGet ( c => c . CountOfLines ) . Returns ( ( ) => lines . Count ) ;
143+
144+ // ReSharper disable once UseIndexedProperty
145+ codeModule . Setup ( m => m . get_Lines ( It . IsAny < int > ( ) , It . IsAny < int > ( ) ) )
146+ . Returns < int , int > ( ( start , count ) => String . Join ( Environment . NewLine , lines . Skip ( start - 1 ) . Take ( count ) ) ) ;
147+
148+ codeModule . Setup ( m => m . ReplaceLine ( It . IsAny < int > ( ) , It . IsAny < string > ( ) ) )
149+ . Callback < int , string > ( ( index , str ) => lines [ index - 1 ] = str ) ;
150+
151+ codeModule . Setup ( m => m . DeleteLines ( It . IsAny < int > ( ) , It . IsAny < int > ( ) ) )
152+ . Callback < int , int > ( ( index , count ) => lines . RemoveRange ( index - 1 , count ) ) ;
153+
154+ codeModule . Setup ( m => m . InsertLines ( It . IsAny < int > ( ) , It . IsAny < string > ( ) ) )
155+ . Callback < int , string > ( ( index , newLine ) => lines . Insert ( index - 1 , newLine ) ) ;
156+
157+ return codeModule ;
158+ }
159+
160+ private Mock < CodePane > CreateCodePaneMock ( string name )
161+ {
162+ var windows = _getVbe ( ) . Windows as MockWindowsCollection ;
163+ if ( windows == null )
164+ {
165+ throw new InvalidOperationException ( "VBE.Windows collection must be a MockWindowsCollection object." ) ;
166+ }
167+
168+ var codePane = new Mock < CodePane > ( ) ;
169+ var window = windows . CreateWindow ( name ) ;
170+ windows . Add ( window ) ;
171+
172+ codePane . Setup ( p => p . SetSelection ( It . IsAny < int > ( ) , It . IsAny < int > ( ) , It . IsAny < int > ( ) , It . IsAny < int > ( ) ) ) ;
173+ codePane . Setup ( p => p . Show ( ) ) ;
174+
175+ codePane . SetupGet ( p => p . VBE ) . Returns ( _getVbe ) ;
176+ codePane . SetupGet ( p => p . Window ) . Returns ( ( ) => window ) ;
177+
178+ return codePane ;
179+ }
180+ }
181+ }
0 commit comments