/// <summary> /// Creates a message sink that populates the test model as test and annotation /// discovered messages are published. /// </summary> /// <param name="testModel">The test model to populate.</param> /// <returns>The message sink.</returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="testModel"/> is null.</exception> public static IMessageSink CreateMessageSinkToPopulateTestModel(TestModel testModel) { if (testModel == null) throw new ArgumentNullException("testModel"); return new MessageConsumer() .Handle<TestDiscoveredMessage>(message => { Test test = message.Test.ToTest(); if (message.ParentTestId != null) { Test parentTest = testModel.FindTest(message.ParentTestId); if (parentTest == null) throw new InvalidOperationException("The parent test is missing."); parentTest.AddChild(test); } else { testModel.RootTest = test; } }) .Handle<AnnotationDiscoveredMessage>(message => { testModel.AddAnnotation(message.Annotation.ToAnnotation()); }); }
private TestModel PublishTestModelFromCodeElements(IEnumerable<ICodeElementInfo> codeElements, IMessageSink messageSink, IProgressMonitor progressMonitor) { TestModel testModel = new TestModel(); var tests = new Dictionary<ICodeElementInfo, Test>(); foreach (ICodeElementInfo codeElement in codeElements) { if (progressMonitor.IsCanceled) return null; testModel.AddAnnotation(new Annotation(AnnotationType.Warning, codeElement, FallbackExplanation)); IAssemblyInfo assembly = ReflectionUtils.GetAssembly(codeElement); if (assembly != null) { Test assemblyTest; if (!tests.TryGetValue(assembly, out assemblyTest)) { assemblyTest = CreateTest(Path.GetFileName(assembly.Path), assembly); testModel.RootTest.AddChild(assemblyTest); tests.Add(assembly, assemblyTest); ITypeInfo type = ReflectionUtils.GetType(codeElement); if (type != null) { Test typeTest; if (!tests.TryGetValue(type, out typeTest)) { typeTest = CreateTest(type.Name, type); assemblyTest.AddChild(typeTest); tests.Add(type, typeTest); } } } } progressMonitor.Worked(1); } TestModelSerializer.PublishTestModel(testModel, messageSink); return testModel; }