1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using ICSharpCode.SharpDevelop.Dom;
7
using ICSharpCode.SharpDevelop.Project;
8
using ICSharpCode.UnitTesting;
10
using UnitTesting.Tests.Utils;
12
namespace UnitTesting.Tests.Project
15
/// Creates a TestProject that has one test class.
18
public class TestProjectWithOneClassTestFixture
20
TestProject testProject;
22
MSBuildBasedProject project;
23
bool resultChangedCalled;
24
MockProjectContent projectContent;
25
List<TestClass> classesAdded;
26
List<TestClass> classesRemoved;
27
MockTestFrameworksWithNUnitFrameworkSupport testFrameworks;
32
resultChangedCalled = false;
33
classesAdded = new List<TestClass>();
34
classesRemoved = new List<TestClass>();
37
project = new MockCSharpProject();
38
project.Name = "TestProject";
39
ReferenceProjectItem nunitFrameworkReferenceItem = new ReferenceProjectItem(project);
40
nunitFrameworkReferenceItem.Include = "NUnit.Framework";
41
ProjectService.AddProjectItem(project, nunitFrameworkReferenceItem);
43
// Add a test class with a TestFixture attributes.
44
projectContent = new MockProjectContent();
45
projectContent.Language = LanguageProperties.None;
46
MockClass c = new MockClass(projectContent, "RootNamespace.MyTestFixture");
47
c.SetCompoundClass(c);
48
c.Attributes.Add(new MockAttribute("TestFixture"));
49
projectContent.Classes.Add(c);
51
// Add a second class that has no test fixture attribute.
52
MockClass nonTestClass = new MockClass(projectContent);
53
projectContent.Classes.Add(nonTestClass);
55
testFrameworks = new MockTestFrameworksWithNUnitFrameworkSupport();
56
testProject = new TestProject(project, projectContent, testFrameworks);
57
testProject.TestClasses.TestClassAdded += TestClassAdded;
58
testProject.TestClasses.TestClassRemoved += TestClassRemoved;
60
testClass = testProject.TestClasses[0];
64
public void OneTestClass()
66
Assert.AreEqual(1, testProject.TestClasses.Count);
70
public void TestProjectName()
72
Assert.AreEqual("TestProject", testProject.Name);
76
public void TestClassName()
78
Assert.AreEqual("MyTestFixture", testClass.Name);
82
public void TestClassQualifiedName()
84
Assert.AreEqual("RootNamespace.MyTestFixture", testClass.QualifiedName);
88
public void OneRootNamespace()
90
Assert.AreEqual(1, testProject.RootNamespaces.Count);
94
public void ProjectProperty()
96
Assert.AreSame(project, testProject.Project);
100
public void FindTestClass()
102
Assert.AreSame(testClass, testProject.TestClasses["RootNamespace.MyTestFixture"]);
106
public void NoMatchingTestClass()
108
Assert.IsFalse(testProject.TestClasses.Contains("NoSuchClass.MyTestFixture"));
112
public void TestClassResultChanged()
115
testClass.ResultChanged += ResultChanged;
116
testClass.Result = TestResultType.Success;
118
testClass.ResultChanged -= ResultChanged;
121
Assert.IsTrue(resultChangedCalled);
125
/// Tests that a new class is added to the TestProject
126
/// from the parse info.
129
public void NewClassInParserInfo()
131
// Create old compilation unit.
132
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent);
133
MockClass mockClass = (MockClass)testClass.Class;
134
mockClass.SetCompoundClass(mockClass);
135
oldUnit.Classes.Add(testClass.Class);
137
// Create new compilation unit with extra class.
138
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent);
139
newUnit.Classes.Add(testClass.Class);
140
MockClass newClass = new MockClass(projectContent, "RootNamespace.MyNewTestFixture");
141
newClass.Attributes.Add(new MockAttribute("TestFixture"));
142
newClass.SetCompoundClass(newClass);
143
newUnit.Classes.Add(newClass);
145
// Update TestProject's parse info.
146
testProject.UpdateParseInfo(oldUnit, newUnit);
148
Assert.IsTrue(testProject.TestClasses.Contains("RootNamespace.MyNewTestFixture"));
149
Assert.AreEqual(1, classesAdded.Count);
150
Assert.AreSame(newClass, classesAdded[0].Class);
154
/// Tests that the TestProject.UpdateParseInfo handles the
155
/// case when the old compilation unit does not have a
156
/// test class, the new compilation unit does have the
157
/// test class, but the test class has already been
158
/// added to our TestProject.
161
public void TestClassInNewCompilationUnitOnly()
163
// Create old compilation unit.
164
projectContent.Classes.Clear();
165
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent);
167
// Create new compilation unit with class that
168
// already exists in the project.
169
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent);
170
newUnit.Classes.Add(testClass.Class);
171
MockClass c = new MockClass(projectContent, "RootNamespace.MyTestFixture");
172
c.Attributes.Add(new MockAttribute("TestFixture"));
173
c.SetCompoundClass(c);
174
newUnit.Classes.Add(c);
176
// Update TestProject's parse info.
177
testProject.UpdateParseInfo(oldUnit, newUnit);
179
Assert.IsTrue(testProject.TestClasses.Contains("RootNamespace.MyTestFixture"));
180
Assert.AreEqual(0, classesAdded.Count);
184
/// New class without a test fixture attribute should not
185
/// be added to the list of test classes.
188
public void NewClassInParserInfoWithoutTestFixtureAttribute()
190
// Create old compilation unit.
191
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent);
192
MockClass mockClass = (MockClass)testClass.Class;
193
mockClass.SetCompoundClass(mockClass);
194
oldUnit.Classes.Add(testClass.Class);
196
// Create new compilation unit with extra class.
197
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent);
198
newUnit.Classes.Add(testClass.Class);
199
MockClass newClass = new MockClass(projectContent, "RootNamespace.MyNewTestFixture");
200
newClass.SetCompoundClass(newClass);
201
newUnit.Classes.Add(newClass);
203
// Update TestProject's parse info.
204
testProject.UpdateParseInfo(oldUnit, newUnit);
206
Assert.IsFalse(testProject.TestClasses.Contains("RootNamespace.MyNewTestFixture"));
210
public void TestClassRemovedInParserInfo()
212
// Create old compilation unit.
213
projectContent.Classes.Clear();
214
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent);
215
MockClass mockClass = (MockClass)testClass.Class;
216
mockClass.SetCompoundClass(mockClass);
217
oldUnit.Classes.Add(testClass.Class);
219
// Create new compilation unit with the original test class
221
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent);
223
// Update TestProject's parse info.
224
testProject.UpdateParseInfo(oldUnit, newUnit);
226
Assert.AreEqual(0, testProject.TestClasses.Count);
227
Assert.AreEqual(1, classesRemoved.Count);
228
Assert.AreSame(testClass, classesRemoved[0]);
232
public void NewCompilationUnitNull()
234
// Create old compilation unit.
235
projectContent.Classes.Clear();
236
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent);
237
MockClass mockClass = (MockClass)testClass.Class;
238
mockClass.SetCompoundClass(mockClass);
239
oldUnit.Classes.Add(testClass.Class);
241
// Update TestProject's parse info.
242
testProject.UpdateParseInfo(oldUnit, null);
244
Assert.AreEqual(0, testProject.TestClasses.Count);
245
Assert.AreEqual(1, classesRemoved.Count);
246
Assert.AreSame(testClass, classesRemoved[0]);
250
/// Tests that a new method is added to the TestClass
251
/// from the parse info. Also checks that the test method is
252
/// taken from the CompoundClass via IClass.GetCompoundClass.
253
/// A CompoundClass combines partial classes into one class so
254
/// we do not get any duplicate classes with the same name.
257
public void NewMethodInParserInfo()
259
// Create old compilation unit.
260
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent);
261
oldUnit.Classes.Add(testClass.Class);
263
// Create new compilation unit.
264
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent);
265
newUnit.Classes.Add(testClass.Class);
267
// Add a new method to a new compound class.
268
MockClass compoundClass = new MockClass(projectContent, "RootNamespace.MyTestFixture");
269
compoundClass.Attributes.Add(new MockAttribute("TestFixture"));
270
MockMethod method = new MockMethod(testClass.Class, "NewMethod");
271
method.Attributes.Add(new MockAttribute("Test"));
272
compoundClass.Methods.Add(method);
273
MockClass mockClass = (MockClass)testClass.Class;
274
mockClass.SetCompoundClass(compoundClass);
276
// Monitor test methods added.
277
List<TestMethod> methodsAdded = new List<TestMethod>();
278
testClass.TestMethods.TestMethodAdded += delegate(Object source, TestMethodEventArgs e)
279
{ methodsAdded.Add(e.TestMethod); };
281
// Update TestProject's parse info.
282
testProject.UpdateParseInfo(oldUnit, newUnit);
284
Assert.IsTrue(testClass.TestMethods.Contains("NewMethod"));
285
Assert.AreEqual(1, methodsAdded.Count);
286
Assert.AreSame(method, methodsAdded[0].Method);
290
public void ParserInfoForDifferentProject()
292
// Create old compilation unit.
293
MockProjectContent differentProjectContent = new MockProjectContent();
294
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(differentProjectContent);
295
MockClass mockClass = (MockClass)testClass.Class;
296
mockClass.SetCompoundClass(mockClass);
297
oldUnit.Classes.Add(testClass.Class);
299
// Create new compilation unit with the original test class
301
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(differentProjectContent);
303
// Update TestProject's parse info.
304
testProject.UpdateParseInfo(oldUnit, newUnit);
306
Assert.AreEqual(1, testProject.TestClasses.Count);
307
Assert.AreEqual(0, classesRemoved.Count);
308
Assert.AreEqual(0, classesAdded.Count);
312
public void ParserInfoForThisProjectOldCompilationUnitNull()
314
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent);
315
Assert.IsTrue(testProject.IsParseInfoForThisProject(null, newUnit));
319
public void ParserInfoForDifferentProjectOldCompilationUnitNull()
321
MockProjectContent differentProjectContent = new MockProjectContent();
322
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(differentProjectContent);
324
Assert.IsFalse(testProject.IsParseInfoForThisProject(null, newUnit));
328
public void ParseInfoForThisProjectWhenBothCompilationUnitsNull()
330
Assert.IsFalse(testProject.IsParseInfoForThisProject(null, null));
333
void ResultChanged(object source, EventArgs e)
335
resultChangedCalled = true;
338
void TestClassAdded(object source, TestClassEventArgs e)
340
classesAdded.Add(e.TestClass);
343
void TestClassRemoved(object source, TestClassEventArgs e)
345
classesRemoved.Add(e.TestClass);