Skip to content

Commit 0ded26b

Browse files
committed
Add tests for IRewriteSession implementations
Contains extraction of a partial interface from the RubberduckParserState (IParseManager) in order to allow mocking the corresponding functionality.
1 parent 2c5bd70 commit 0ded26b

File tree

9 files changed

+414
-14
lines changed

9 files changed

+414
-14
lines changed

Rubberduck.Core/UI/Command/ReparseCommand.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Runtime.InteropServices;
5-
using System.Windows.Forms;
65
using NLog;
76
using Rubberduck.Interaction;
87
using Rubberduck.Parsing.VBA;
98
using Rubberduck.Settings;
109
using Rubberduck.SettingsProvider;
1110
using Rubberduck.Resources;
12-
using Rubberduck.UI.CodeExplorer.Commands;
1311
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
1412
using Rubberduck.VBEditor.SafeComWrappers;
1513
using Rubberduck.VBEditor.SafeComWrappers.Abstract;

Rubberduck.Main/Root/RubberduckIoCInstaller.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void Install(IWindsorContainer container, IConfigurationStore store)
9393
container.Register(Component.For<IProjectsProvider, IProjectsRepository>()
9494
.ImplementedBy<ProjectsRepository>()
9595
.LifestyleSingleton());
96-
container.Register(Component.For<RubberduckParserState, IParseTreeProvider, IDeclarationFinderProvider>()
96+
container.Register(Component.For<RubberduckParserState, IParseTreeProvider, IDeclarationFinderProvider, IParseManager>()
9797
.ImplementedBy<RubberduckParserState>()
9898
.LifestyleSingleton());
9999
container.Register(Component.For<ISelectionChangeService>()

Rubberduck.Parsing/Rewriter/AttributesRewriteSession.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,24 @@ namespace Rubberduck.Parsing.Rewriter
66
{
77
public class AttributesRewriteSession : RewriteSessionBase
88
{
9-
private readonly RubberduckParserState _state;
9+
private readonly IParseManager _parseManager;
1010

11-
public AttributesRewriteSession(RubberduckParserState state, IRewriterProvider rewriterProvider,
11+
public AttributesRewriteSession(IParseManager parseManager, IRewriterProvider rewriterProvider,
1212
Func<IRewriteSession, bool> rewritingAllowed)
1313
: base(rewriterProvider, rewritingAllowed)
1414
{
15-
_state = state;
15+
_parseManager = parseManager;
1616
}
1717

1818
protected override IExecutableModuleRewriter ModuleRewriter(QualifiedModuleName module)
1919
{
20-
return RewriterProvider.CodePaneModuleRewriter(module);
20+
return RewriterProvider.AttributesModuleRewriter(module);
2121
}
2222

2323
protected override void RewriteInternal()
2424
{
2525
//The suspension ensures that only one parse gets executed instead of two for each rewritten module.
26-
var result = _state.OnSuspendParser(this, new[] {ParserState.Ready}, ExecuteAllRewriters);
26+
var result = _parseManager.OnSuspendParser(this, new[] {ParserState.Ready}, ExecuteAllRewriters);
2727
if(result != SuspensionResult.Completed)
2828
{
2929
Logger.Warn($"Rewriting attribute modules did not succeed. suspension result = {result}");

Rubberduck.Parsing/Rewriter/CodePaneRewriteSession.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ namespace Rubberduck.Parsing.Rewriter
66
{
77
public class CodePaneRewriteSession : RewriteSessionBase
88
{
9-
private readonly RubberduckParserState _state;
9+
private readonly IParseManager _parseManager;
1010

11-
public CodePaneRewriteSession(RubberduckParserState state, IRewriterProvider rewriterProvider,
11+
public CodePaneRewriteSession(IParseManager parseManager, IRewriterProvider rewriterProvider,
1212
Func<IRewriteSession, bool> rewritingAllowed)
1313
: base(rewriterProvider, rewritingAllowed)
1414
{
15-
_state = state;
15+
_parseManager = parseManager;
1616
}
1717

1818

@@ -27,7 +27,7 @@ protected override void RewriteInternal()
2727
{
2828
rewriter.Rewrite();
2929
}
30-
_state.OnParseRequested(this);
30+
_parseManager.OnParseRequested(this);
3131
}
3232
}
3333
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Rubberduck.Parsing.VBA
5+
{
6+
public interface IParseManager
7+
{
8+
event EventHandler<ParserStateEventArgs> StateChanged;
9+
event EventHandler<ParseProgressEventArgs> ModuleStateChanged;
10+
11+
void OnParseRequested(object requestor);
12+
SuspensionResult OnSuspendParser(object requestor, IEnumerable<ParserState> allowedRunStates, Action busyAction, int millisecondsTimeout = -1);
13+
}
14+
}

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
using Rubberduck.VBEditor;
1313
using Rubberduck.Parsing.Annotations;
1414
using NLog;
15-
using Rubberduck.Parsing.Rewriter;
1615
using Rubberduck.Parsing.VBA.Parsing;
1716
using Rubberduck.VBEditor.ComManagement;
1817
using Rubberduck.VBEditor.Events;
@@ -120,7 +119,7 @@ public RubberduckStatusMessageEventArgs(string message)
120119
public string Message { get; }
121120
}
122121

123-
public sealed class RubberduckParserState : IDisposable, IDeclarationFinderProvider, IParseTreeProvider
122+
public sealed class RubberduckParserState : IDisposable, IDeclarationFinderProvider, IParseTreeProvider, IParseManager
124123
{
125124
public const int NoTimeout = -1;
126125

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Moq;
5+
using NUnit.Framework;
6+
using Rubberduck.Parsing.Rewriter;
7+
using Rubberduck.Parsing.VBA;
8+
using Rubberduck.Parsing.VBA.Parsing;
9+
using Rubberduck.VBEditor;
10+
11+
namespace RubberduckTests.Rewriter
12+
{
13+
[TestFixture]
14+
public class AttributesRewriteSessionTests : RewriteSessionTestBase
15+
{
16+
[Test]
17+
[Category("Rewriter")]
18+
public void UsesASuspendActionToRewrite()
19+
{
20+
var mockParseManager = new Mock<IParseManager>();
21+
mockParseManager.Setup(m => m.OnSuspendParser(It.IsAny<object>(), It.IsAny<IEnumerable<ParserState>>(), It.IsAny<Action>(), It.IsAny<int>()))
22+
.Callback((object requestor, IEnumerable<ParserState> allowedStates, Action suspendAction, int timeout) => suspendAction())
23+
.Returns((object requestor, IEnumerable<ParserState> allowedStates, Action suspendAction, int timeout) => SuspensionResult.Completed);
24+
25+
var rewriteSession = RewriteSession(mockParseManager.Object, session => true, out _);
26+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
27+
rewriteSession.CheckOutModuleRewriter(module);
28+
29+
rewriteSession.Rewrite();
30+
31+
mockParseManager.Verify(m => m.OnSuspendParser(It.IsAny<object>(), It.IsAny<IEnumerable<ParserState>>(), It.IsAny<Action>(), It.IsAny<int>()), Times.Once);
32+
}
33+
34+
[Test]
35+
[Category("Rewriter")]
36+
public void DoesNotCallRewriteOutsideTheSuspendAction()
37+
{
38+
var mockParseManager = new Mock<IParseManager>();
39+
mockParseManager.Setup(m => m.OnSuspendParser(It.IsAny<object>(), It.IsAny<IEnumerable<ParserState>>(), It.IsAny<Action>(), It.IsAny<int>()))
40+
.Returns((object requestor, IEnumerable<ParserState> allowedStates, Action suspendAction, int timeout) => SuspensionResult.Completed);
41+
42+
var rewriteSession = RewriteSession(mockParseManager.Object, session => true, out var mockRewriterProvider);
43+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
44+
rewriteSession.CheckOutModuleRewriter(module);
45+
var (qmn, codeKind, mockRewriter) = mockRewriterProvider.RequestedRewriters().Single();
46+
47+
rewriteSession.Rewrite();
48+
49+
mockRewriter.Verify(m => m.Rewrite(), Times.Never);
50+
}
51+
52+
[Test]
53+
[Category("Rewriter")]
54+
public void ChecksOutAttributesRewriters()
55+
{
56+
var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider);
57+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
58+
59+
rewriteSession.CheckOutModuleRewriter(module);
60+
61+
var (qmn, codeKind, mockRewriter) = mockRewriterProvider.RequestedRewriters().Single();
62+
Assert.AreEqual(CodeKind.AttributesCode, codeKind);
63+
}
64+
65+
protected override IRewriteSession RewriteSession(IParseManager parseManager, Func<IRewriteSession, bool> rewritingAllowed, out MockRewriterProvider mockProvider)
66+
{
67+
mockProvider = new MockRewriterProvider();
68+
return new AttributesRewriteSession(parseManager, mockProvider, rewritingAllowed);
69+
}
70+
}
71+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
using System;
2+
using System.Linq;
3+
using Moq;
4+
using NUnit.Framework;
5+
using Rubberduck.Parsing.Rewriter;
6+
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.Parsing;
8+
using Rubberduck.VBEditor;
9+
10+
namespace RubberduckTests.Rewriter
11+
{
12+
[TestFixture]
13+
public class CodePaneRewriteSessionTests : RewriteSessionTestBase
14+
{
15+
[Test]
16+
[Category("Rewriter")]
17+
public void RequestsParseAfterRewriteIfNotInvalidatedAndParsingAllowed()
18+
{
19+
var mockParseManager = new Mock<IParseManager>();
20+
mockParseManager.Setup(m => m.OnParseRequested(It.IsAny<object>()));
21+
22+
var rewriteSession = RewriteSession(mockParseManager.Object, session => true, out _);
23+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
24+
var otherModule = new QualifiedModuleName("TestProject", string.Empty, "OtherTestModule");
25+
rewriteSession.CheckOutModuleRewriter(module);
26+
rewriteSession.CheckOutModuleRewriter(otherModule);
27+
28+
rewriteSession.Rewrite();
29+
30+
mockParseManager.Verify(m => m.OnParseRequested(It.IsAny<object>()), Times.Once);
31+
}
32+
33+
[Test]
34+
[Category("Rewriter")]
35+
public void DoesNotCallRequestsParseAfterRewriteIfInvalidated()
36+
{
37+
var mockParseManager = new Mock<IParseManager>();
38+
mockParseManager.Setup(m => m.OnParseRequested(It.IsAny<object>()));
39+
40+
var rewriteSession = RewriteSession(mockParseManager.Object, session => true, out _);
41+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
42+
var otherModule = new QualifiedModuleName("TestProject", string.Empty, "OtherTestModule");
43+
rewriteSession.CheckOutModuleRewriter(module);
44+
rewriteSession.Invalidate();
45+
rewriteSession.CheckOutModuleRewriter(otherModule);
46+
47+
rewriteSession.Rewrite();
48+
49+
mockParseManager.Verify(m => m.OnParseRequested(It.IsAny<object>()), Times.Never);
50+
}
51+
52+
[Test]
53+
[Category("Rewriter")]
54+
public void DoesNotRequestsParseAfterRewriteIfNotParsingAllowed()
55+
{
56+
var mockParseManager = new Mock<IParseManager>();
57+
mockParseManager.Setup(m => m.OnParseRequested(It.IsAny<object>()));
58+
59+
var rewriteSession = RewriteSession(mockParseManager.Object, session => false, out _);
60+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
61+
var otherModule = new QualifiedModuleName("TestProject", string.Empty, "OtherTestModule");
62+
rewriteSession.CheckOutModuleRewriter(module);
63+
rewriteSession.CheckOutModuleRewriter(otherModule);
64+
65+
rewriteSession.Rewrite();
66+
67+
mockParseManager.Verify(m => m.OnParseRequested(It.IsAny<object>()), Times.Never);
68+
}
69+
70+
[Test]
71+
[Category("Rewriter")]
72+
public void DoesNotRequestParseIfNoRewritersAreCheckedOut()
73+
{
74+
var mockParseManager = new Mock<IParseManager>();
75+
mockParseManager.Setup(m => m.OnParseRequested(It.IsAny<object>()));
76+
var rewriteSession = RewriteSession(mockParseManager.Object, session => true, out _);
77+
78+
rewriteSession.Rewrite();
79+
80+
mockParseManager.Verify(m => m.OnParseRequested(It.IsAny<object>()), Times.Never);
81+
}
82+
83+
[Test]
84+
[Category("Rewriter")]
85+
public void ChecksOutCodePaneRewriters()
86+
{
87+
var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider);
88+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
89+
90+
rewriteSession.CheckOutModuleRewriter(module);
91+
92+
var (qmn, codeKind, mockRewriter) = mockRewriterProvider.RequestedRewriters().Single();
93+
Assert.AreEqual(CodeKind.CodePaneCode, codeKind);
94+
}
95+
96+
protected override IRewriteSession RewriteSession(IParseManager parseManager, Func<IRewriteSession, bool> rewritingAllowed, out MockRewriterProvider mockProvider)
97+
{
98+
mockProvider = new MockRewriterProvider();
99+
return new CodePaneRewriteSession(parseManager, mockProvider, rewritingAllowed);
100+
}
101+
}
102+
}

0 commit comments

Comments
 (0)