<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Spec Explorer Team Blog</title><subtitle type="html">A Model-Based Testing tool from Microsoft  
</subtitle><id>http://blogs.msdn.com/b/specexplorer/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/specexplorer/atom.aspx" /><generator uri="http://telligent.com" version="5.6.583.20496">Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><updated>2009-10-27T05:20:00Z</updated><entry><title>How to initialize the initial state from an external source</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2011/08/02/how-to-initialize-the-initial-state-from-an-external-source.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2011/08/02/how-to-initialize-the-initial-state-from-an-external-source.aspx</id><published>2011-08-02T07:10:59Z</published><updated>2011-08-02T07:10:59Z</updated><content type="html">&lt;p&gt;We received several emails to ask how to initialize the initial state from an external source recently, this post introduces a good pattern to do it.&lt;/p&gt;  &lt;p&gt;We can implement our own data loader to load data from external source, and use this loader to initialize the state. Note that since data loading method might involve native invocation, we’d better set our loader to native (more details can be found at &lt;a title="http://msdn.microsoft.com/en-us/library/ee620483.aspx" href="http://msdn.microsoft.com/en-us/library/ee620483.aspx"&gt;http://msdn.microsoft.com/en-us/library/ee620483.aspx&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Here is an example:&lt;/p&gt;  &lt;p&gt;Model.cs&lt;/p&gt;  &lt;p&gt;using System;    &lt;br /&gt;using System.Collections.Generic;     &lt;br /&gt;using System.Text;     &lt;br /&gt;using System.Linq;     &lt;br /&gt;using Microsoft.Modeling;     &lt;br /&gt;using Microsoft.Xrt.Runtime;     &lt;br /&gt;using System.IO;&lt;/p&gt;  &lt;p&gt;[assembly: NativeType(typeof(Sample.MyLoader))]    &lt;br /&gt;namespace Sample     &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; static class MyLoader     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; internal static Sequence&amp;lt;UserData&amp;gt; Load()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int i;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UserData data;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sequence&amp;lt;UserData&amp;gt; dataSequence = new Sequence&amp;lt;UserData&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string[] contents = File.ReadAllLines(&amp;quot;c:\\temp\\data.txt&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; contents.Length; i=i+2)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data.Name = contents[i];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data.Address = contents[i + 1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataSequence = dataSequence.Add(data);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return dataSequence;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public struct UserData    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Name;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Address;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; static class ModelProgram    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static Sequence&amp;lt;UserData&amp;gt; Data = MyLoader.Load();&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Rule]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static Sequence&amp;lt;UserData&amp;gt; ShowData()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Data;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Rule]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static void Clear()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Data = new Sequence&amp;lt;UserData&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Config.cord&lt;/p&gt;  &lt;p&gt;using Sample;    &lt;br /&gt;using Microsoft.Modeling;&lt;/p&gt;  &lt;p&gt;config Main    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; action abstract static Sequence&amp;lt;UserData&amp;gt; Adapter.ShowData();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; action abstract static void Adapter.Clear();&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; switch StepBound = 128;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; switch PathDepthBound = 128;     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;machine ModelProgram() : Main    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; construct model program from Main     &lt;br /&gt;}     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;And the data under c:\temp&lt;/p&gt;  &lt;p&gt;Lisa    &lt;br /&gt;#5, Danling Street     &lt;br /&gt;Bob     &lt;br /&gt;Queen Square&lt;/p&gt;  &lt;p&gt;Then we explore the ModelProgram machine, and get the exploration graph like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-30-04-metablogapi/8802.image_5F00_49FC4170.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-30-04-metablogapi/8836.image_5F00_thumb_5F00_7AAF491B.png" width="631" height="111" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Of course the data source is not limited to text files, you can design your own loader to make your model more powerful.&lt;/p&gt;  &lt;p&gt;Please feel free to share your thoughts or other good approaches to initialize initial state.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10191938" width="1" height="1"&gt;</content><author><name>Xiang Li</name><uri>http://blogs.msdn.com/Xiang-Li/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Spec Explorer 2010 Release 3.5 now available!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2011/04/18/spec-explorer-2010-release-3-5-now-available.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2011/04/18/spec-explorer-2010-release-3-5-now-available.aspx</id><published>2011-04-18T15:03:00Z</published><updated>2011-04-18T15:03:00Z</updated><content type="html">&lt;p&gt;&lt;b&gt;Spec Explorer 2010, Release 3.5 Now Available!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Spec Explorer 2010 Release 3.5&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Hello!&amp;nbsp; We are delighted to announce the newest version of Spec Explorer 2010, Release 3.5.&lt;/p&gt;
&lt;p&gt;Spec Explorer 2010 Release 3.5 contains new features, improved documentation, plus over 60 bug fixes. It runs on the Visual Studio 2010 Professional level product and above.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What&amp;rsquo;s New in Spec Explorer?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;This release contains new / enhanced features including:&lt;/p&gt;
&lt;p&gt;&amp;middot; &lt;b&gt;Model change detecting&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;The model change detecting feature detects all model changes and decides if Spec Explorer needs to re-explore the model. For specific machines, if Spec Explorer detects any change in the model code, cord script files, or other inputs, or detects a tool version change, Spec Explorer will start a new exploration; otherwise, Spec Explorer will use existing exploration result files for current exploration viewing, test code generation, and user customized post processing. The UI has been updated to allow you to force Spec Explorer to re-explore the machines.&lt;/p&gt;
&lt;p&gt;&amp;middot; &lt;b&gt;Multiple machine processing&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;Now you can select multiple machines in Exploration Manager and explore, generate test code, or perform post processing tasks on them. For multiple machine processing, Spec Explorer generates a summary including all information of the batch-processing.&lt;/p&gt;
&lt;p&gt;&amp;middot; &lt;b&gt;Cord context menu&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;Spec Explorer adds a new context menu item &amp;ldquo;Go To Definition&amp;rdquo; in the Cord editor, which enables users to navigate to specific configurations and machines. This is part of an ongoing effort to improve the Cord editing user experience and the general integration of the tool with Visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Where can you get it?&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Spec Explorer download can be found on the Spec Explorer &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166911"&gt;home page&lt;/a&gt; on Visual Studio Gallery.&lt;/li&gt;
&lt;li&gt;See the on-line &lt;a href="http://msdn.microsoft.com/en-us/library/hh781546.aspx"&gt;Release Notes&lt;/a&gt; for the latest, more detailed description of installation requirements, major features, bug fixes and known issues. Further information can also be found on &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads"&gt;The Spec Explorer Forum&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/SpecExplorer"&gt;The Spec Explorer Team Blog&lt;/a&gt;, and the latest Spec Explorer &lt;a href="http://msdn.microsoft.com/en-us/library/ee620411.aspx"&gt;Help Documentation&lt;/a&gt; is always available in the MSDN library.&lt;/li&gt;
&lt;li&gt;Please note that Spec Explorer 2010 Release 3.5 runs only on Visual Studio 2010. The 90 day trial version of Visual Studio 2010 can be found at &lt;a href="http://www.microsoft.com/visualstudio/en-us/download"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope you enjoy this release and look forward to hearing feedback from the Spec Explorer community.&lt;/p&gt;
&lt;p&gt;The Spec Explorer Team&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10155213" width="1" height="1"&gt;</content><author><name>Xiang Li</name><uri>http://blogs.msdn.com/Xiang-Li/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Spec Explorer 2010 Release 3.4 now available!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2011/01/07/spec-explorer-2010-release-3-4-now-available.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2011/01/07/spec-explorer-2010-release-3-4-now-available.aspx</id><published>2011-01-07T07:38:04Z</published><updated>2011-01-07T07:38:04Z</updated><content type="html">&lt;p&gt;&lt;b&gt;Spec Explorer 2010, Release 3.4 Now Available!&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Spec Explorer 2010 Release 3.4&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Hello!&amp;#160; We are delighted to announce the newest version of Spec Explorer 2010, Release 3.4.&lt;/p&gt;  &lt;p&gt;Spec Explorer 2010 Release 3.4 contains new features, improved documentation, plus over 50 bug fixes. It runs on the Visual Studio 2010 Professional level product and above.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;What’s New in Spec Explorer?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This release contains new / enhanced features including:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Dynamic traversal&lt;/b&gt;: Dynamic traversal provides a new test case generation mechanism. It works by traversing the exploration result (with a user-customizable strategy) while invoking the corresponding actions on the system under test at test runtime. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Validation performance improvement&lt;/b&gt;: The performance of Cord validation has been greatly improved. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Exploration cleanup&lt;/b&gt;: This enhanced feature provides a post-exploration process to remove redundant states/steps.&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Getting partial exploration result:&lt;/b&gt; If exploration time exceeds the value of switch ExplorationTimeout or you click the “Stop” button during exploration, a partially explored / cleaned-up result will be displayed.&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Model program construct from multiple namespaces / types:&lt;/b&gt;&lt;b&gt; &lt;/b&gt;This feature allows a model program to be constructed from a list of comma-separated model namespaces / types.&lt;b&gt;&lt;/b&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Fully-qualified-name support for static action invocations:&lt;/b&gt;&lt;b&gt; &lt;/b&gt;Fully qualified names are used to distinguish different static action invocations with the same method name.&lt;b&gt;&lt;/b&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;Validation task in SpecExplorer.exe:&lt;/b&gt;&lt;b&gt; &lt;/b&gt;New task “Validate” has been added as a task in SpecExplorer.exe&lt;b&gt;&lt;/b&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Where can you get it?&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The Spec Explorer download can be found on the Spec Explorer &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166911" target="_blank"&gt;home page&lt;/a&gt; on Visual Studio Gallery. &lt;/li&gt;    &lt;li&gt;See the on-line &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166135" target="_blank"&gt;Release Notes&lt;/a&gt; for the latest, more detailed description of installation requirements, major features, bug fixes and known issues. Further information can also be found on &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads" target="_blank"&gt;The Spec Explorer Forum&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/SpecExplorer" target="_blank"&gt;The Spec Explorer Team Blog&lt;/a&gt;, and the latest Spec Explorer &lt;a href="http://msdn.microsoft.com/en-us/library/ee620411.aspx" target="_blank"&gt;Help Documentation&lt;/a&gt; is always available in the MSDN library. &lt;/li&gt;    &lt;li&gt;Please note that Spec Explorer 2010 Release 3.4 runs only on Visual Studio 2010. The 90 day trial version of Visual Studio 2010 can be found at &lt;a href="http://www.microsoft.com/visualstudio/en-us/download" target="_blank"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We hope you enjoy this release and look forward to hearing feedback from the Spec Explorer community.&lt;/p&gt;  &lt;p&gt;The Spec Explorer Team&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10112832" width="1" height="1"&gt;</content><author><name>Xiang Li</name><uri>http://blogs.msdn.com/Xiang-Li/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Spec Explorer 2010 Release 3.3 now available as a Visual Studio Power Tool!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/09/30/spec-explorer-2010-release-3-3-now-available-as-a-visual-studio-power-tool.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/09/30/spec-explorer-2010-release-3-3-now-available-as-a-visual-studio-power-tool.aspx</id><published>2010-09-30T20:22:00Z</published><updated>2010-09-30T20:22:00Z</updated><content type="html">&lt;p&gt;&lt;i&gt;Spec Explorer 2010 Release 3.3&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Hello again!&amp;nbsp; We are proudly announcing the newest version of Spec Explorer 2010, Release 3.3. The next step has been taken from being resident on DevLabs to being a Power Tool on Visual Studio gallery where you can find the new &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkID=166911" title="Spec Explorer home page in VS Gallery"&gt;home page&lt;/a&gt; for Spec Explorer.&lt;/p&gt;
&lt;p&gt;Spec Explorer 2010 Release 3.3 contains new features, continued improvement in documentation, plus over 100 bug fixes.&lt;/p&gt;
&lt;h3&gt;What&amp;rsquo;s New in Spec Explorer?&lt;/h3&gt;
&lt;p&gt;New features added in Release 3.3 include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;On-The-Fly (OTF) testing&lt;/strong&gt;: On-The-Fly testing provides a new means to use Spec Explorer to create and run tests directly from models (machines). In On-The-Fly testing, the selection and evaluation of model actions (including events) is alternated with execution by the System Under Test/adapter. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visual state search&lt;/strong&gt;: This new feature in the Spec Explorer view enables the search for and highlighting of specific states. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Probe logging:&lt;/strong&gt; Newly provided recording of probe values in states enhances analysis of test logs. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test method customization:&lt;/strong&gt; New control of test attributes in generated test code offers expanded support for other test frameworks in addition to the default one provided by Visual Studio.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, a Spec Explorer extension for UML is also being released at this time that is &lt;strong&gt;not&lt;/strong&gt; included in the main Spec Explorer MSI and must be downloaded separately. Documentation for the UML extension can be found &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkID=202596" title="Separately installable extension to Spec Explorer for UML model testing"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Where can you get it?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Spec Explorer downloads can be found on the Spec Explorer &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkID=166911" title="Spec Explorer 2010 home page"&gt;home page&lt;/a&gt; on Visual Studio Gallery. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See the on-line &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkID=166135" title="Spec Explorer 3.3 Release Notes"&gt;Release Notes&lt;/a&gt; for the latest, more detailed description of installation requirements, major features, bug fixes and known issues. Further information can also be found on &lt;a target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads" title="Spec Explorer's MSDN forum"&gt;The Spec Explorer Forum&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/SpecExplorer" title="Spec Explorer's MSDN Blog"&gt;The Spec Explorer Team Blog&lt;/a&gt;, and the latest Spec Explorer &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ee620411.aspx" title="Spec Explorer's on-line MSDN documentation"&gt;Help Documentation&lt;/a&gt; is always available in the MSDN library. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Please note that Spec Explorer 2010 Release 3.3 runs only on Visual Studio 2010 Professional Edition or higher. The 90 day trial version of Visual Studio 2010 can be found at &lt;a target="_blank" href="http://www.microsoft.com/visualstudio/en-us/download" title="Try driving VS 2010 before you buy it!"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope you enjoy this release and look forward to your help by feedback and community involvement to continue making Spec Explorer better and better.&lt;/p&gt;
&lt;p&gt;The Spec Explorer Team&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10070008" width="1" height="1"&gt;</content><author><name>Rob DuWors</name><uri>http://blogs.msdn.com/rduwors/ProfileUrlRedirect.ashx</uri></author><category term="testing" scheme="http://blogs.msdn.com/b/specexplorer/archive/tags/testing/" /><category term="MBT" scheme="http://blogs.msdn.com/b/specexplorer/archive/tags/MBT/" /><category term="Model-Based Testing" scheme="http://blogs.msdn.com/b/specexplorer/archive/tags/Model_2D00_Based+Testing/" /><category term="Spec Explorer" scheme="http://blogs.msdn.com/b/specexplorer/archive/tags/Spec+Explorer/" /></entry><entry><title>The Controlled Calculator: An example of combining models while showing other features of Spec Explorer</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/07/06/the-controlled-calculator-an-example-of-combining-models-while-showing-other-features-of-spec-explorer.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/07/06/the-controlled-calculator-an-example-of-combining-models-while-showing-other-features-of-spec-explorer.aspx</id><published>2010-07-06T21:16:06Z</published><updated>2010-07-06T21:16:06Z</updated><content type="html">&lt;p style="text-align: center; margin-bottom: 2pt" class="MsoNormal" align="center"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color: #0070c0"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;The Calculator    &lt;p&gt;&lt;/p&gt; &lt;/h2&gt;  &lt;p class="MsoNormal"&gt;The core calculator model is a simple four function calculator. But infix calculators aren't entirely simple, because calculators demonstrate rich variations in outputs depending upon the exact order of input sequences of numbers, operations, and pressing the Equals keys. This implementation (and model) emulates the Windows Calculator. It is similar to but is slightly different from most store-bought calculators, especially in how the Equals key first repeats upon multiple key pushes and how an operation is done when only one operand has been provided. The model and implementation provided, however, should match up with the Windows calculator found under Accessories in the Windows Start menu. The Visual Studio 2010 solution for this example can be found &lt;a title="Controller Calculator Solution" href="http://cid-d75b985f44923001.office.live.com/self.aspx/MyBlogFiles/TheControlledCalculator.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;The Scenario    &lt;p&gt;&lt;/p&gt; &lt;/h2&gt;  &lt;p class="MsoNormal"&gt;For the purposes of this sample, first the calculator functionality was created as a standalone product. This was then integrated with connection access that allowed the calculator to be used as a service. These were then modeled together as single integrated service. The calculator service model can be explored by itself and its implementation can optionally be tested standalone. The security authorization model controls access to the calculator via a simple minded Access Control List (ACL) consisting of a list of authorized users.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;(Note that the full ACL target resources and operations were not of interest for testing purposes so were not modeled). This simplified ACL was modeled on its own and can be explored on its own. Testing the ACL implementation requires the calculator service only for its connection capabilities. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;How the Two Model Program Rule Sets Work Together    &lt;p&gt;&lt;/p&gt; &lt;/h2&gt;  &lt;p class="MsoNormal"&gt;The ACL (authorization) model and the calculator service model actually synchronize on only a few actions, specifically connection and disconnection. They interleave the rest. The two model programs use the |?| operator to achieve this.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;Thus the authorization model can manage its ACL,&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;allow and release user authorization on its own, as shown by exploring machine AuthorizationSlice, while the calculator model independently can do all of its calculator functionality (actions and events) .&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;The vast majority of the all-important security related sequencing is done by transition modes in the authorization model. By carefully controlling when the synchronized actions (connect and disconnect) can occur the authorization model imposes the majority of inter-model sequencing constraints expressed by the joint model. &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;Internally within the calculator service, however, the rules are generally aware that they must be connected to be enabled but have no knowledge at all of the authorization rules. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The end-to end-control is shown, not surprisingly, by machine EndToEndControl (Slice and Test) in the Cord file. It specifies that between ACL creations and disposals, users can be authorized multiple times, and between multiple authorizations the current user can connect multiple times, and within a connection multiple operations can be performed.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;This models the functionality of the core authorization sequences. Multiple simultaneous users and connections were not modeled. Had this been a test objective, likely instance based modeling would have been used and the implementation would be have been multithreaded. The current model (and the current implementation) adequately tests basic end-to-end functionality. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;How the Implementation Does This    &lt;p&gt;&lt;/p&gt; &lt;/h2&gt;  &lt;p class="MsoNormal"&gt;The implementation is written as four layers. The top level static class acts as the interface that implements the controllable and event actions declared in Cord. Thus it can be considered to be an adapter layer. The rest of the implementation is written as three layers, each of which is represented by a single object. There is an object that implements all of the calculator functionality, one that manages the connection to the calculator object, and finally one that represents the ACL control logic. In principle, the calculator object could be replaced by the real Windows calculator, but that has not been attempted. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Things to look for    &lt;p&gt;&lt;/p&gt; &lt;/h2&gt;  &lt;p class="MsoNormal"&gt;In addition to modeling the active (behavioral) joining of two rule sets, this sample illustrates several important features of using Spec Explorer. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Cord    &lt;p&gt;&lt;/p&gt; &lt;/h3&gt;  &lt;p class="MsoNormal"&gt;The Cord file is structured around logical groups of configurations, which of course is what configs are supposed to do for a living. The use of parameters in machines is shown by the DoubleOperand machine. The machines related to test purposes are built up from scenarios to model slices to test cases. For example, &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;BigLongScenario to BigLongSlice to BigLongTest. There are a number of helper machines such as FullStart, CloseDown, SingleOperation. Fairly rigorous testing of calculator key sequences is shown by all the scenarios that &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;are included in AllOperationsTogetherSlice (and Test). &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;But in many ways the most interesting machines deal with constructing and joining the two rule sets. The machine called AuthorizationSlice builds the (sliced) &lt;stockticker w:st="on"&gt;ACL&lt;/stockticker&gt; model program and CalculatorService constructs the model program of the calculator service. These two model programs are actually independent of each other and use their own rule sets kept for convenience in separate name spaces and files. They make no assumptions about each other. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Machine JointModel is the one that joins the two by means of the partially synchronizing |?| operator, aka the “&lt;a href="http://msdn.microsoft.com/en-us/library/ee620450.aspx"&gt;synchronized-interleaved parallel composition operator&lt;/a&gt;”.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;This synchronizes when both machines try to produce the same action just like the parallel synchronization operator ||-- in this case the connection and disconnection related actions--but interleaves otherwise when either machine produces an action unique to itself, just like the ||| operator. It may be that |?| is one of the more underappreciated operators in Cord.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;There are subtleties in its definition, but it is behaviorally powerful as shown. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Machine SimpleDirectSlice (and Test) deserves quick mention. If uncommented in CalculatorService.Connect (file Calculator.cs), the implementation will allow the calculator service to be tested on its own by automatically creating an ACL and authorizing a fictitious user. (The users defined for model slicing in configuration Authorize are neither fictitious nor necessarily innocent but that's another story.) This implementation short circuit would ordinarily be a security hole, since the ACL logic is being neutered, but is useful for testing and illustrates one way to get around the layering of the implementation code. Note that no changes were necessary in the CalculatorServiceModel rules to make this test generation work correctly because those rules by themselves do not depend on the ACL logic to which they are later composed only by the |?| operator &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Model and Implementation Code    &lt;p&gt;&lt;/p&gt; &lt;/h3&gt;  &lt;p class="MsoNormal"&gt;The model and implementation code is heavily commented and largely self-explanatory.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;The model code uses helper functions extensively. In both the model code and the implementation, state data is initialized actively in a constructor or other method. This promotes consistency and successful re-running of the same code in a test sequence or between test case executions. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Note that a rule may be blocked from producing a step in a helper function such as in CalculatorServiceModel.RequiresConnected (in file ArithmeticRules.cs). &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;A rule method must reach all the way to an exit point without violating any Condition class constraints in order for any step(s) to be produced. Otherwise that rule execution is completely discarded during exploration and no step is produced outgoing from the current state by that rule. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;In the same model rule set, the rule for the Divide action shows how a special condition, often an exception, can be converted into the expectation of a following event. Spec Explorer actions are indivisible which means they cannot suddenly be stopped and switched to another one. But at model evaluation time, the new state can reflect that a condition has occurred in the prior step (from a prior rule firing). In this case, the rule for OperationError will pick up on that fact that previously Divide had found and marked that the denominator was zero. A quick look at the configuration called Operation in Cord shows that the OperationError action is to be treated as an event. This is the only place to find out that the OperationError rule described an event, as it does not matter to the rule itself whether it is an input or output action to the SUT. Rather, the rule just knows under what conditions that the step can be seen externally to the SUT.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;It does matter, of course, to exploration and test code generation both of which will treat the event appropriately (which is why the Cord code tells them). &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The actual implementation of the OperationError event can be found in CalculatorService (in file Calculator.cs). Notice it requires an instance of the correct name (OperationError) of a correct kind of delegate type. In this case it happens to be called OperationErrorHandler, but the type name may be chosen at will. The event is actually raised in this sample by helper method CalculatorService.RaiseError which is a callback used by the calculator object if it encounters a problem with divide by zero. The event will be placed on Spec Explorer's run time event queue for future consideration and the Divide action will run to completion, returning a zero value if a problem occurred as tested by scenario DividebyZero in Cord. When the model indicated the event would be eligible for consideration the queue will be examined and in the two cases of the ZeroDivide scenario it will be found. The third case does not look for the event and shows that a test may conclude successfully in an accepting state even if there are events left on the event queue. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Part of the moral of this story is that controllable actions (that is, inputs to the SUT) in the implementation are simple methods, but observable actions &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;(that is, events) are implemented quite differently (as described above). &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;Whereas in the rules, such actions are indistinguishable. &lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;And only in Cord, as the bridge in between, does Spec Explorer learn which is supposed to be which. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10035090" width="1" height="1"&gt;</content><author><name>Rob DuWors</name><uri>http://blogs.msdn.com/rduwors/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Actions, Step and Rules</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/04/21/actions-step-and-rules.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/04/21/actions-step-and-rules.aspx</id><published>2010-04-22T01:33:27Z</published><updated>2010-04-22T01:33:27Z</updated><content type="html">&lt;p&gt;These are key concepts in Spec Explorer. Unfortunately sometimes they are used almost interchangeably. For now, let's clear up what they are and how they differ. To be fair, our documentation does a good job of using the correct terms but even so it pays to keep in mind their particular meaning. &lt;/p&gt;  &lt;h2&gt;Actions &lt;/h2&gt;  &lt;p&gt;In the most general notion, an action describes an interaction with the System Under Test (SUT) as seen from the tester's (or test system's) perspective. Spec Explorer recognizes three kinds of atomic actions that are discrete and indivisible: events, call actions, and return actions. Events represent autonomous messages coming from the SUT. A call action represents a stimulus from the test system to the SUT (as originally decided in the model). A return action must always follow after a call action without any intervening actions. The return actions capture the response (if any) from the SUT. &lt;/p&gt;  &lt;p&gt;For further reference see &lt;a href="http://msdn.microsoft.com/en-us/library/ee620493(v=SpecExplorer.10).aspx"&gt;Actions&lt;/a&gt; in the on-line documentation. &lt;/p&gt;  &lt;h2&gt;Action Declarations &lt;/h2&gt;  &lt;p&gt;Actions are declared in Cord configs using definitions that are like C# signatures preceded by the keyword &amp;quot;action&amp;quot;. Cord expects the target SUT assemblies, or the adapter assemblies that wrap access to the SUT, to provide the .Net code that corresponds to each action. Put another way, the code to implement actions ultimately belongs not to the model but rather to the implementation to be invoked at test run time only. &lt;/p&gt;  &lt;p&gt;An action declaration in Cord is always one of two kinds: a synchronous action declaration, which is the default, or an explicitly stated event action declaration. A synchronous action declaration actually forms the indivisible pair of an atomic call action followed by the corresponding atomic return action. The target of a call/return pair is implemented by a single method in the SUT, or the adapter to the SUT. Tests generated from Spec Explorer models invoke these methods on the SUT, and block waiting for them to return. &lt;/p&gt;  &lt;p&gt;Event action declarations describe a single atomic action that indicates the SUT has sent a message on its own in keeping with the .Net event model. Events are implemented as standard C# events in the SUT (or adapter). Tests generated from Spec Explorer models subscribe to these events and add them to a queue as they arrive. Events from this queue are consumed when the test reaches a point where one or more events are expected. &lt;/p&gt;  &lt;h2&gt;Action Invocations &lt;/h2&gt;  &lt;p&gt;In Cord the use of an action in a behavioral (regular) expression is called an invocation, e.g. Add(1,2)/3.&amp;#160; The arguments of an invocation can be variables or literals. Action invocation arguments, if specified, must always match in type and position with the signature provided by the action declaration in the applicable Cord config. Cord allows for polymorphic overloading of action declarations and Spec Explorer will chose the correct action declaration accordingly. &lt;/p&gt;  &lt;p&gt;Note: action invocations do not directly call the implementation because they belong to the modeling. The implementation only becomes available at test execution time. Action invocations are also used to annotate rules, which are the other major part of modeling. &lt;/p&gt;  &lt;p&gt;For further reference see &lt;a href="http://msdn.microsoft.com/en-us/library/ee620463(v=SpecExplorer.10).aspx"&gt;Invocation&lt;/a&gt; in the on-line documentation. &lt;/p&gt;  &lt;h2&gt;Steps &lt;/h2&gt;  &lt;p&gt;Steps are the transitions in the graph. Step labels are action invocations that appear as transition (edge) labels in the exploration result graph. &lt;/p&gt;  &lt;p&gt;At test run time, these step labels are translated into either method calls to the SUT (or adapter) that implement the call/return pair, or expected events. For call/return pairs, the generated test code will call the implementation (or adapter) method (call action step). The test code then will note the response with the actual out and result values given by the SUT (return action step). For events coming from the SUT (or adapter), all parameters will be considered as outputs. The actual values found at run time (for out parameters, results and event parameters) will be compared to the expected values from the model (&amp;quot;the oracle&amp;quot;). Only if these values meet all corresponding conditions will the test case succeed. &lt;/p&gt;  &lt;p&gt;Like all behavioral modeling, Spec Explorer is ultimately interested in what can actually be seen in terms of inputs and outputs to the System Under Test (SUT), i.e. the actions. Everything else in Spec Explorer exists just to determine the legal sequence of steps (behavior) that a compliant SUT will be expected to follow in a test case. Even Spec Explorer's advanced notion of &amp;quot;state&amp;quot; is used only at modeling (exploration) time by a rule (see below) to determine if a particular step label would be permitted at that point in the sequence, but state does not partake in the actual test execution. Only step labels interpreted as invocations to the SUT (or adapter) and events are relevant to testing, as just described above. &lt;/p&gt;  &lt;h2&gt;Rules &lt;/h2&gt;  &lt;p&gt;Rules determine what steps can be produced leading from the current state in the model program. All rules are tried out by exploration from each state. &lt;/p&gt;  &lt;p&gt;In Spec Explorer, rules are represented by model program methods that have been marked with the Rule attribute. The Rule attribute has an optional Action argument that specifies the action invocation. &lt;/p&gt;  &lt;p&gt;Since rules exist to specify what steps the model program allows from a given state, the true output of a rule is zero or more step labels representing possible next actions from that state. Because of advanced features in Spec Explorer such as domains and parameter generation, it quite possible for a single rule to yield multiple instances of step labels for a given state. Of course a particular rule method always produces the same kind of step label in keeping with the Cord action declaration that matches the action invocation of its Rule attribute, but each step label will have a different combination of parameter values. &lt;/p&gt;  &lt;p&gt;When a rule method is explored in order to generate step&lt;span style="text-decoration: line-through"&gt; &lt;/span&gt;labels, the action invocation contained in its Rule attribute is used to map the exploration supplied input values to the rule method and to map back out/result values after the rule method has executed (as discussed below). A step label that cannot be produced by a rule due to violating a constraint in a Condition class method (e.g., Condition.Istrue) is simply discarded and will not appear in the exploration graph. &lt;/p&gt;  &lt;p&gt;The action invocation in the Rule attribute is used to establish the correspondence between the Cord action declaration signature and the potentially different rule method signature in a way that is quite unique to Spec Explorer: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The name of the action invocation annotating a rule does not need to match the name of the rule method. It must however match the name of an action declaration in the Cord config that the model program is constructed from (e.g. &amp;quot;construct model from MyConfig&amp;quot;).&lt;/li&gt;    &lt;li&gt;Remember that action invocation arguments must always match in position and type compatibility with the corresponding action declaration signature in Cord. &lt;/li&gt;    &lt;li&gt;If an action invocation argument is a literal value (for example, a number) it is not mapped at all to the rule method parameters! The rule method may simply assume what it wants when the action invocation parameter has that value without having to explicitly test for it. &lt;/li&gt;    &lt;li&gt;If an action invocation argument is a variable rather than a literal value, it is mapped by name only, not by position, to the corresponding rule method parameter. If no such mapping is possible a validation error occurs. The type of the rule method parameter must agree with the corresponding type in the Cord definition. This includes the special names that can be used as action invocation arguments: &amp;quot;this&amp;quot; (represents the receiver of an instance-based rule method) and &amp;quot;result&amp;quot; (represents the return value of a non-void rule method). Note that the apparent return value of a C# rule method simply maps to the &amp;quot;result&amp;quot; output parameter. &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;All parameters of a rule method must appear in the action invocation annotating it. If one or more of the rule parameters do not appear in the corresponding action invocation, a validation error will result. This includes the special parameters &amp;quot;this&amp;quot; (for instance-based rules) and &amp;quot;result&amp;quot; (for non-void rules). For Example, &lt;/div&gt;      &lt;p style="margin-left: 18pt"&gt;In Cord: &lt;/p&gt;      &lt;p style="margin-left: 58pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;action&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; Sum(&lt;span style="color: blue"&gt;int&lt;/span&gt; x); &lt;/span&gt;&lt;/p&gt;      &lt;p style="margin-left: 58pt"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin-left: 18pt"&gt;In Model Program: &lt;/p&gt;      &lt;p style="margin-left: 58pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; stateTotal; &lt;/span&gt;&lt;/p&gt;      &lt;p style="margin-left: 27pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-family: consolas; font-size: 9pt"&gt;[&lt;span style="color: #2b91af"&gt;Rule&lt;/span&gt;(Action = &lt;span style="color: #a31515"&gt;&amp;quot;this.Sum(op) / result&amp;quot;&lt;/span&gt;)] &lt;/span&gt;&lt;/p&gt;      &lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; int&lt;/span&gt; AddtoTotal(&lt;span style="color: blue"&gt;int&lt;/span&gt; op) { &lt;/span&gt;&lt;/p&gt;      &lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; return&lt;/span&gt; stateTotal += op;} &lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;If the Action keyword is not specified in the rule annotation (e.g. &amp;quot;[Rule]&amp;quot;), Spec Explorer will automatically construct an invocation based on the rule method signature. The method name of the rule will be used as the action name (which must then match an action declaration in the corresponding Cord config), and the method's parameter names will be used as the action invocation parameters. For example, if the method signature is &amp;quot;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; MyMethod(&lt;span style="color: blue"&gt;string&lt;/span&gt; name, &lt;span style="color: blue"&gt;float&lt;/span&gt; age)&lt;/span&gt;&amp;quot;, the constructed action invocation will be &amp;quot;&lt;span style="font-family: consolas; font-size: 9pt"&gt;Action = &lt;span style="color: #a31515"&gt;&amp;quot;this.MyMethod(name,age)/result&amp;quot;&lt;/span&gt;&lt;/span&gt;. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Summary: The action invocation in the Rule attribute must match in type and position (but not necessarily in name) the signature of the Cord action declaration. Rule method parameters must match the action invocation in the Rule attribute in name and type, but not necessarily position. &lt;/p&gt;  &lt;h2&gt;An Example &lt;/h2&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160; &lt;span style="color: #4f81bd"&gt;&lt;strong&gt;Action Declaration in Cord: &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9pt"&gt;action&lt;/span&gt;&lt;span style="font-family: courier new"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9pt"&gt;abstract&lt;/span&gt;&lt;span style="font-family: courier new"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9pt"&gt;static&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&amp;#160;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9pt"&gt;bool&lt;/span&gt;&lt;span style="font-family: courier new"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;Login(&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;user,&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt; &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;securityLevel);&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&amp;#160;&lt;/span&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin-left: 36pt"&gt;&lt;span style="color: #4f81bd"&gt;&lt;strong&gt;Rules in the Model Program &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ol style="margin-left: 72pt"&gt;   &lt;li&gt;The rule for a power user at security level 1 to login successfully (if unknown user, the rule itself fails, i.e. the action label will not be produced). &lt;/li&gt;    &lt;li&gt;The rule for a power user at security level 1 to login unsuccessfully (if unknown user, the rule fails). &lt;/li&gt;    &lt;li&gt;The rule for a normal user at any other security level allows login only if the user is already known and legal security levels also must be a positive integer value. &lt;/li&gt; &lt;/ol&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyModel&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;{ &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; loggedIn; &lt;span style="color: green"&gt;// State variable for Login status&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; userName; &lt;span style="color: green"&gt;// current user id with prefix&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; static&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; securityRing; &lt;span style="color: green"&gt;// current security level&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Set&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; PowerUsers; &lt;span style="color: green"&gt;// Level 1 people (initialized elsewhere)&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Set&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; NormalUsers;&lt;span style="color: green"&gt;// Normal users (initialized elsewhere)&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: green"&gt;// Rule for successful login at security level 1&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;[&lt;span style="color: #2b91af"&gt;Rule&lt;/span&gt;(Action=&lt;span style="color: #a31515"&gt;&amp;quot;Login(userId, 1) / true&amp;quot;&lt;/span&gt;)]&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LoginLevel1Worked(&lt;span style="color: blue"&gt;string&lt;/span&gt; userId) &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;{ &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160; Condition&lt;/span&gt;.IsTrue(PowerUsers.Contains(userId)); &lt;span style="color: green"&gt;//Unknown-step fails&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; userName=&lt;span style="color: #a31515"&gt;&amp;quot;P.&amp;quot;&lt;/span&gt;+userId; &lt;span style="color: green"&gt;// Step possible; add Power User Prefix&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; securityRing=1;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Assumed due to Action label&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; loggedIn=&lt;span style="color: blue"&gt;true&lt;/span&gt;;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Already know this login is good&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // result==true assumed due to Action label&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: green"&gt;// Rule for failed login at security Level 1&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;[&lt;span style="color: #2b91af"&gt;Rule&lt;/span&gt;(Action=&lt;span style="color: #a31515"&gt;&amp;quot;Login(string userId, 1)/ false&amp;quot;&lt;/span&gt;)] &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LoginLevel2Failed(&lt;span style="color: blue"&gt;string&lt;/span&gt; userId) &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;{ &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160; Condition&lt;/span&gt;.IsFalse(PowerUsers.Contains(userId)); &lt;span style="color: green"&gt;//Unknown-step fails&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; loggedIn=&lt;span style="color: blue"&gt;false&lt;/span&gt;; &lt;span style="color: green"&gt;// Still in rule; so assumed due to Action label&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; securityRing=0; &lt;span style="color: green"&gt;// Logged out default state values&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; userName=&lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// result==false assumed due to Action label &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: green"&gt;// Rule for login attempt at any level except security level 1&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;[&lt;span style="color: #2b91af"&gt;Rule&lt;/span&gt;(Action=&lt;span style="color: #a31515"&gt;&amp;quot;Login(userId, securityCode) / result&amp;quot;&lt;/span&gt;)] &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; LoginNotLevel1(&lt;span style="color: blue"&gt;string&lt;/span&gt; userId, &lt;span style="color: blue"&gt;int&lt;/span&gt; securityCode) &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;{ &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160; Condition&lt;/span&gt;.IsTrue(securityCode &amp;gt; 1); &lt;span style="color: green"&gt;// Rule only for legal non-level 1&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; if&lt;/span&gt; (NormalUsers.Contains(userId)) &lt;span style="color: green"&gt;// Step OK; check if user known&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; { &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; userName=&lt;span style="color: #a31515"&gt;&amp;quot;U.&amp;quot;&lt;/span&gt;+userId; &lt;span style="color: green"&gt;// User known, so login succeeds&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; securityRing=securityCode; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; loggedIn=&lt;span style="color: blue"&gt;true&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; } &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; else&lt;/span&gt; &lt;span style="color: green"&gt;// User unknown, so login fails&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;{&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; loggedIn=&lt;span style="color: blue"&gt;false&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; securityRing=0; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; userName=&lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&amp;#160; } &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;span style="color: blue"&gt;&amp;#160; return&lt;/span&gt; loggedIn; &lt;span style="color: green"&gt;// result == returned value&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left: 54pt"&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9pt"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Rob DuWors &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10000438" width="1" height="1"&gt;</content><author><name>Rob DuWors</name><uri>http://blogs.msdn.com/rduwors/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Spec Explorer 2010, Release 3.2 Now Available!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/04/19/spec-explorer-2010-release-3-2-now-available.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/04/19/spec-explorer-2010-release-3-2-now-available.aspx</id><published>2010-04-20T00:08:27Z</published><updated>2010-04-20T00:08:27Z</updated><content type="html">&lt;p&gt;&lt;i&gt;Spec Explorer 2010 Release 3.2&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Hello!&amp;#160; We are delighted to announce the newest version of Spec Explorer 2010, Release 3.2.&lt;/p&gt;  &lt;p&gt;Spec Explorer 2010 Release 3.2 contains new and enhanced features, improved documentation, plus over 110 bug fixes. It runs on the Visual Studio 2010 Professional level product and above.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;What’s New in Spec Explorer?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This release also contains new features including:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;New Model Wizard:&lt;/b&gt; The new Model Wizard conveniently consolidates solution and project creation by unifying the previously separate Spec Explorer Model Project and Spec Explorer Base Solution templates.       &lt;p&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Choice API:&lt;/b&gt; The new Choice feature has been added to assist support where the System Under Test may provide one of several compliant responses to a single action. While Spec Explorer previously supported such non-determinism the new feature makes it simpler to model.       &lt;p&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;b&gt;SpecExplorer.exe:&lt;/b&gt; The automation version of Spec Explorer has been updated to support the newest standard format for exploration results and to provide better automation support for custom-written post processor extensions.       &lt;p&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Improved Documentation:&lt;/b&gt; While continuing to improve the overall quality of the Spec Explorer documentation the description of the Cord Scripting Language has been extensively revised in particular, and every page of the documentation now has a version header to clearly indicate the version of Spec Explorer that the documentation describes. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Where can you get it?&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The Spec Explorer downloads can be found on the Spec Explorer &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee692301.aspx"&gt;home page&lt;/a&gt; on DevLabs.       &lt;p&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;See the on-line &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166135"&gt;Release Notes&lt;/a&gt; for the latest, more detailed description of installation requirements, major features, bug fixes and known issues. Further information can also be found on &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads"&gt;The Spec Explorer Forum&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/SpecExplorer"&gt;The Spec Explorer Team Blog&lt;/a&gt;, and the latest Spec Explorer &lt;a href="http://msdn.microsoft.com/en-us/library/ee620411.aspx"&gt;Help Documentation&lt;/a&gt; is always available in the MSDN library.       &lt;p&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;Please note that Spec Explorer 2010 Release 3.2 now runs only on the released version of Visual Studio 2010. It does not work with Beta 1 or 2 or the Release Candidate versions of Visual Studio 2010, nor with Visual Studio 2008. The 90 day trial version of Visual Studio 2010 can be found at &lt;a href="http://www.microsoft.com/visualstudio/en-us/download" target="_blank"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;We hope you enjoy this release and look forward to hearing feedback from the Spec Explorer community.&lt;/p&gt;  &lt;p&gt;The Spec Explorer Team&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9998809" width="1" height="1"&gt;</content><author><name>Rob DuWors</name><uri>http://blogs.msdn.com/rduwors/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Effective Model-Based Testing with Spec Explorer Full Class</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/03/31/effective-model-based-testing-with-spec-explorer-full-class.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/03/31/effective-model-based-testing-with-spec-explorer-full-class.aspx</id><published>2010-03-31T18:51:50Z</published><updated>2010-03-31T18:51:50Z</updated><content type="html">&lt;p&gt;The &lt;a href="http://channel9.msdn.com/tags/SpecExplorerClass" target="_blank"&gt;full video series&lt;/a&gt; for the modeling class is available on Channel 9! It’s the recording of a two-half-day course Wolfgang and I gave on the Microsoft Redmond campus.&lt;/p&gt;  &lt;p&gt;The training is long (about 8 hours), but we have split it for your viewing convenience into 4 lectures (sessions). Each session has in turn 4 parts. &lt;/p&gt;  &lt;div align="center"&gt;   &lt;table border="0" cellspacing="0" cellpadding="2" width="424" align="center"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="247"&gt;           &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/SpecExplorerClassSession1/" target="_blank"&gt;Session 1&lt;/a&gt;&lt;/p&gt;            &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/SpecExplorerClassSession2/" target="_blank"&gt;Session 2&lt;/a&gt;&lt;/p&gt;            &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/SpecExplorerClassSession3/" target="_blank"&gt;Session 3&lt;/a&gt;&lt;/p&gt;            &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/SpecExplorerClassSession4/" target="_blank"&gt;Session 4&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="175"&gt;&lt;object id="ctl00_mainContentContainer_ctl02_SVP_Player_cea3f88b_35ce_45ef_896e_a5f0c92de5bb" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="340px;" height="340px;"&gt;&lt;param name="source" value="http://i3.msdn.microsoft.com/platform/controls/silverlightsupport/Microsoft.Mtps.Silverlight.App.VideoPlayer-bn20100217.xap"&gt;&lt;/param&gt;&lt;param name="initParams" value="ApplicationName=SingleVideoPlayerControl_bafb0c80_10a9_4e31_84d7_9d22874ae908,VideoUri=http://ecn.channel9.msdn.com/o9/ch9/6/7/1/0/4/5/SpecExplorerClassSession1Part1_ch9.wmv,ThumbUri=http://ecn.channel9.msdn.com/o9/ch9/6/7/1/0/4/5/SpecExplorerClassSession1Part1_320_ch9.png,EmbedEnabled=false,EmbedXapUri=http://msdn.microsoft.com/objectforward/default.aspx,EmbedCssWidth=400,EmbedCssHeight=320,StartMode=AutoLoad,Persistence=None,Title=,Texts=NormalSize=Default Size;FullBrowser=Full Browser Size;FullScreen=Full Screen Size,HideFullBrowser=True,Bn=20100217,FontMappings=Segoe UI:Segoe UI;1,FontsToLoad=http://i3.msdn.microsoft.com/platform/controls/silverlightsupport/Microsoft.Mtps.Silverlight.Fonts.SegoeUI-bn20100217.xap;Segoe UI#Segoe UI,OmnitureParameters=,HighlightColor=#FF27aee4,LoadingColor=#FF27aee4,GetUri=http://msdn.microsoft.com/platform/controls/SilverlightSupport/VideoCaptionService.asmx,MSNVideoUUID=,PTID="&gt;&lt;/param&gt;&lt;param name="windowless" value="false"&gt;&lt;/param&gt;&lt;param name="background" value="#00FFFFFF"&gt;&lt;/param&gt;&lt;param name="minRuntimeVersion" value="3.0.40624.0"&gt;&lt;/param&gt;&lt;param name="autoUpgrade" value="false"&gt;&lt;/param&gt;&lt;param name="enableHtmlAccess" value="true"&gt;&lt;/param&gt;&lt;div id="ctl00_mainContentContainer_ctl02_ctl08" class="Mtps_SVP_NoSilverLight"&gt; 			&lt;a id="ctl00_mainContentContainer_ctl02_ctl09" title="Get Microsoft Silverlight!" href="http://go.microsoft.com/fwlink/?LinkID=124807" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl08|ctl00_mainContentContainer_ctl02_ctl09',this);"&gt; &lt;img border="0" src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight!" /&gt; &lt;/a&gt; 		&lt;/div&gt;&lt;/object&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/SpecExplorerClassSession4/" target="_blank"&gt;&lt;/a&gt;&lt;/p&gt; Enjoy!   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Caveat&lt;/strong&gt;: The quality of the screen captures makes them hard to read. These videos will be replaced with new ones recorded with a better quality in the future. Please, forgive any inconvenience this might cause you.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9988312" width="1" height="1"&gt;</content><author><name>Nico Kicillof - Microsoft</name><uri>http://blogs.msdn.com/nicok/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Announcing Spec Explorer 2010, Release 3.1!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/02/15/announcing-spec-explorer-2010-release-3-1.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/02/15/announcing-spec-explorer-2010-release-3-1.aspx</id><published>2010-02-16T05:38:00Z</published><updated>2010-02-16T05:38:00Z</updated><content type="html">&lt;span style="font-family: &amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;"&gt;&lt;font size="3"&gt;     &lt;p&gt;       &lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;         &lt;p&gt;&amp;#160;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="color: #1f497d; mso-themecolor: dark2; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ascii-font-family: calibri; mso-hansi-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi"&gt;           &lt;p&gt;&amp;#160;&lt;/p&gt;         &lt;/span&gt;&lt;/p&gt;        &lt;p style="text-align: center; margin: 0in 0in 16pt" class="MsoNormal" align="center"&gt;&lt;i&gt;&lt;span style="font-size: 26pt"&gt;Spec Explorer 2010 Release 3.1&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;        &lt;p style="text-align: center; margin: 0in 0in 16pt" class="MsoNormal" align="center"&gt;&lt;i&gt;&lt;span style="font-size: 26pt"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Note: Now obsolete. Please use&lt;/strong&gt;&lt;/font&gt; &lt;a href="http://blogs.msdn.com/specexplorer/archive/2010/04/19/spec-explorer-2010-release-3-2-now-available.aspx" target="_blank"&gt;Release 3.2&lt;/a&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;Greetings!&amp;#160; Today we are proud to announce of the newest version of Spec Explorer 2010, Release 3.1.         &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;         &lt;p&gt;&amp;#160;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;Running only on Visual Studio 2010 Release Candidate (RC), Spec Explorer 2010 Release 3.1 contains major enhancements, new features, and over 220 bug fixes.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 16pt 0in 6pt" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;What’s New in Spec Explorer?             &lt;p&gt;&lt;/p&gt;           &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;Please note that core modeling attributes and classes have been renamed and revised to make them more consistent and clear. Spec Explorer users should be aware that the continued use of these deprecated items in this release will generate warning messages. Usage of the new attributes and classes is highly encouraged, as is migration of prior models and scripts from the older usage.         &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal"&gt;This release also contains significant new features including:         &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Flexible test naming and attributes:&lt;/b&gt; New and revised switches allow finer control over test case naming and attributes including the ability to construct switch values using system environment variables and newly provided Spec Explorer built-in variables.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Bounded repetition machine:&lt;/b&gt; Cord now supports additional ways to specify a repeating behavior for a specific number of times or a range of repetitions.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;New project creation:&lt;/b&gt; The Spec Explorer model project template can now be used to create a new project within an existing or a new solution whereas only solutions could be created before.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Construct tag and switch completion:&lt;/b&gt; Cord now supports automatic completion of tags in the Construct statement and for switch names.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;F1 help:&lt;/b&gt; the built-in Help Viewer of Visual Studio 2010 will display top level information for each type of window in Spec Explorer using the F1 key.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Help integration:&lt;/b&gt; Spec Explorer documentation is now fully integrated with the Help Manager to support both online MSDN Library viewing of help information and locally stored help content. The Help Manager can also be used to update the local copy of help documentation.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Exploration progress:&lt;/b&gt; Spec Explorer provides updated status to give a better indication of the progress being made during lengthy explorations and related algorithms.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="line-height: 115%; text-indent: -0.25in; margin: 0in 0in 4pt 0.5in; mso-list: l0 level1 lfo2" class="MsoListParagraph"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;User-customized post processing:&lt;/b&gt; User-defined post-exploration processing task can now be launched from within Visual Studio to generate additional artifacts.          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 16pt 0in 0pt" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;Where can you get it?             &lt;p&gt;&lt;/p&gt;           &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo1" class="MsoListBulletCxSpFirst"&gt;&lt;span style="font-family: symbol; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;The Spec Explorer downloads can be found on the Spec Explorer &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee692301.aspx" mce_href="http://msdn.microsoft.com/en-us/devlabs/ee692301.aspx"&gt;&lt;span style="color: windowtext"&gt;home page&lt;/span&gt;&lt;/a&gt; on DevLabs          &lt;p&gt;&lt;/p&gt;       &lt;/p&gt;        &lt;p style="margin: 0in 0in 0pt 0.5in; mso-list: l1 level1 lfo1" class="MsoListBulletCxSpMiddle"&gt;&lt;span style="font-family: symbol; font-size: 12pt; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;See the on-line &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166135" mce_href="http://go.microsoft.com/fwlink/?LinkID=166135"&gt;&lt;span style="color: windowtext"&gt;Release Notes&lt;/span&gt;&lt;/a&gt; for the latest, more detailed description of installation requirements, major features, bug fixes and known issues&lt;span style="font-family: wingdings; font-size: 12pt"&gt;           &lt;p&gt;&lt;/p&gt;         &lt;/span&gt;&lt;/p&gt;        &lt;p style="margin: 0in 0in 2pt 0.5in; mso-list: l1 level1 lfo1" class="MsoListBulletCxSpLast"&gt;&lt;span style="font-family: symbol; font-size: 12pt; mso-bidi-font-family: symbol; mso-fareast-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;·&lt;span style="font: 7pt &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Further information can also be found on &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads" mce_href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads"&gt;&lt;span style="color: windowtext"&gt;The Spec Explorer Forum&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/SpecExplorer" mce_href="http://blogs.msdn.com/SpecExplorer"&gt;&lt;span style="color: windowtext"&gt;The Spec Explorer Team Blog&lt;/span&gt;&lt;/a&gt;, and the latest Spec Explorer &lt;a href="http://msdn.microsoft.com/en-us/library/ee620411.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ee620411.aspx"&gt;&lt;span style="color: windowtext"&gt;Help Documentation&lt;/span&gt;&lt;/a&gt; is always available for the MSDN library.&lt;span style="font-family: wingdings; font-size: 12pt"&gt;           &lt;p&gt;&lt;/p&gt;         &lt;/span&gt;&lt;/p&gt;        &lt;p&gt;&lt;span style="font-family: &amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;"&gt;We hope you enjoy this release,           &lt;br /&gt;The Spec Explorer Team             &lt;p&gt;&lt;/p&gt;         &lt;/span&gt;&lt;/p&gt;        &lt;p style="text-align: center; margin: 0in 0in 16pt" class="MsoNormal" align="center"&gt;&lt;/p&gt;     &lt;/p&gt;   &lt;/font&gt;&lt;/span&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9964065" width="1" height="1"&gt;</content><author><name>Rob DuWors</name><uri>http://blogs.msdn.com/rduwors/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Spec Explorer Webcast in German Online</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/02/02/spec-explorer-webcast-in-german-online.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/02/02/spec-explorer-webcast-in-german-online.aspx</id><published>2010-02-02T18:27:35Z</published><updated>2010-02-02T18:27:35Z</updated><content type="html">&lt;p&gt;In case you are capable of the German language, &lt;a href="http://blogs.msdn.com/cbinder/default.aspx"&gt;Christian Binder&lt;/a&gt; has posted an interview with me taken during TechED 2009 in Berlin, and we augmented it with an extended Webcast of using Spec Explorer, including its application by Microsoft for the Protocol Documentation Program. Check it out &lt;a href="http://blogs.msdn.com/cbinder/archive/2010/01/25/webcasts-zum-thema-model-based-testing-mbt.aspx"&gt;here&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9957097" width="1" height="1"&gt;</content><author><name>wrwg</name><uri>http://blogs.msdn.com/wrwg/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>How to customize test initialization and logging</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2010/01/31/how-to-customize-test-initialization-and-logging.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2010/01/31/how-to-customize-test-initialization-and-logging.aspx</id><published>2010-01-31T15:22:49Z</published><updated>2010-01-31T15:22:49Z</updated><content type="html">&lt;p&gt;Junfeng Dai has written an &lt;a href="http://blogs.msdn.com/junfengdai/archive/2009/10/30/how-to-generate-nunit-test-codes-with-spec-explorer.aspx" target="_blank"&gt;article&lt;/a&gt; about customizing &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee692301.aspx" target="_blank"&gt;Spec Explorer&lt;/a&gt; for using &lt;a href="http://www.nunit.org" target="_blank"&gt;NUnit&lt;/a&gt; as the test execution engine instead of VSTT a few month ago. The same general approach can be used for simpler scenarios, for example to add custom test initialization code or test logging, which I would like to explain here.&lt;/p&gt;  &lt;p&gt;When Spec Explorer generates test code, this code is placed in a class which derives from a base class found in the Spec Explorer runtime. You can simply insert a ‘middle man’ between this class and the generated test code class, overriding some methods.&lt;/p&gt;  &lt;p&gt;Suppose you have created a Spec Explorer project based on the ‘static modeling solution’ (the same applies for any other Spec Explorer project), and you have generated test code.&amp;#160; You will see that the test code looks as below:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SpecExplorer1.TestSuite {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Reflection;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.SpecExplorer.Runtime.Testing;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    [System.CodeDom.Compiler.GeneratedCodeAttribute(&lt;span class="str"&gt;&amp;quot;Spec Explorer&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;3.0.2168.0&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AccumulatorTestSuite : &lt;font color="#ff0000"&gt;VsTestClassBase&lt;/font&gt; {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; AccumulatorTestSuite() { &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;           ...&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The class VsTestClassBase in line 11 is what we would like to substitute. However, in contrast to the full replacement scenario, we want to still use most of its functionality, and continue to run our tests under VSTT.&lt;/p&gt;

&lt;p&gt;So we add a class to the test suite project as below, where we override a couple of methods from VsTestClassBase:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SpecExplorer1.TestSuite
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyTestClassBase : VsTestClassBase
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeTestManager()
        {
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.InitializeTestManager();
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;My test initialization executes now&amp;quot;&lt;/span&gt;);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CleanupTestManager()
        {
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;My test cleanup executes now&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;base&lt;/span&gt;.CleanupTestManager();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Comment(&lt;span class="kwrd"&gt;string&lt;/span&gt; description)
        {
            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;My test logging executes now: {0}&amp;quot;&lt;/span&gt;, description);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Checkpoint(&lt;span class="kwrd"&gt;string&lt;/span&gt; description)
        {
             Console.WriteLine(&lt;span class="str"&gt;&amp;quot;My requirement logging executes now: {0}&amp;quot;&lt;/span&gt;, description);
        }

    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;In the methods InitializeTestManager and CleanupTestManager, we add custom test preparation and cleanup code. Note that it is imperative to call the base class here (unless you want to install your own test manager, which is usually not required).&lt;/p&gt;

&lt;p&gt;Finally, we just need to tell Spec Explorer to use our new test class base when it generates test code, instead of the standard one. This is achieved by setting the switch TestClassBase in the Cord configuration:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;/// Contains actions of the model, bounds, and switches.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;font color="#0080c0"&gt;&lt;font color="#0000ff"&gt;config&lt;/font&gt; &lt;/font&gt;Main &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// The two implementation actions that will be modeled and tested&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;font color="#0000ff"&gt;action&lt;/font&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Accumulator.Add(&lt;span class="kwrd"&gt;int&lt;/span&gt; x);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;font color="#0000ff"&gt;action&lt;/font&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Accumulator.ReadAndReset();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; StepBound = 128;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; PathDepthBound = 128;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; &lt;font color="#ff0000"&gt;TestClassBase = &lt;span class="str"&gt;&amp;quot;MyTestClassBase&amp;quot;&lt;/span&gt;;&lt;/font&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; GeneratedTestPath = &lt;span class="str"&gt;&amp;quot;..\\TestSuite&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; GeneratedTestNamespace = &lt;span class="str"&gt;&amp;quot;SpecExplorer1.TestSuite&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; TestEnabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; ForExploration = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Regenerating test code and executing it finally yields in the following test log:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;My test initialization executes now
My test logging executes now: reaching state &lt;span class="str"&gt;'S0'&lt;/span&gt;
My test logging executes now: executing step &lt;span class="str"&gt;'call Add(2)'&lt;/span&gt;
My requirement logging executes now: Add rule captured
My test logging executes now: reaching state &lt;span class="str"&gt;'S1'&lt;/span&gt;
My test logging executes now: checking step &lt;span class="str"&gt;'return Add'&lt;/span&gt;
My test logging executes now: reaching state &lt;span class="str"&gt;'S8'&lt;/span&gt;
My test logging executes now: executing step &lt;span class="str"&gt;'call Add(2)'&lt;/span&gt;
My requirement logging executes now: Add rule captured
My test logging executes now: reaching state &lt;span class="str"&gt;'S12'&lt;/span&gt;
My test logging executes now: checking step &lt;span class="str"&gt;'return Add'&lt;/span&gt;
My test logging executes now: reaching state &lt;span class="str"&gt;'S16'&lt;/span&gt;
My test logging executes now: executing step &lt;span class="str"&gt;'call ReadAndReset()'&lt;/span&gt;
My test logging executes now: reaching state &lt;span class="str"&gt;'S20'&lt;/span&gt;
My test logging executes now: checking step &lt;span class="str"&gt;'return ReadAndReset/4'&lt;/span&gt;
My test logging executes now: reaching state &lt;span class="str"&gt;'S24'&lt;/span&gt;
My test cleanup executes now&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9955935" width="1" height="1"&gt;</content><author><name>wrwg</name><uri>http://blogs.msdn.com/wrwg/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Using the exploration result object model: Basics</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2009/11/24/using-the-exploration-result-object-model-basics.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2009/11/24/using-the-exploration-result-object-model-basics.aspx</id><published>2009-11-24T22:08:48Z</published><updated>2009-11-24T22:08:48Z</updated><content type="html">&lt;p&gt;Several advanced users have expressed interest to process the test suite generated by Spec Explorer in a different way from the built-in test code generation. The Spec Explorer &lt;em&gt;object model &lt;/em&gt;allows to do that. This article provides an introduction to its basic usage.&lt;/p&gt;  &lt;p&gt;Whenever Spec Explorer performs an exploration – including a machine which generates test cases – the result is stored in a file ending in ‘.seexpl’. This file is in fact a zipped archive of several XML files representing the result of exploration. The content of this file is displayed under Visual Studio in the well-known graphical form, as shown below – from the far -- for the &lt;strong&gt;TestSuite&lt;/strong&gt; machine of the SMB2 project which comes as a sample with Spec Explorer:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_thumb_5.png" width="630" height="645" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In addition to displaying this file in Visual Studio, it can be also processed with a user program – which we are going to demonstrate in this article.&lt;/p&gt;  &lt;p&gt;To this end, the assembly &lt;strong&gt;Microsoft.SpecExplorer.ObjectModel&lt;/strong&gt; contains all you need. Let’s use this to develop a little program which prints some statistics about exploration, the captured requirements, and the action sequences. To replay what we do, create a console application under Visual Studio and add the reference to the above assembly:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_thumb.png" width="488" height="395" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The object model is contained in the namespace &lt;strong&gt;Microsoft.SpecExplorer.ObjectModel&lt;/strong&gt;:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.SpecExplorer.ObjectModel;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; TransitionSystemDemo&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;      ...&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;The top-level object representing an exploration result is called a &lt;em&gt;transition system&lt;/em&gt;. This stems from the fact that it actually represents the exploration as a set of states, and transitions between those states labeled with actions. The transition system is loaded by a class called &lt;strong&gt;TransitionSystemLoader&lt;/strong&gt;. Our main method can therefore look as below:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (args.Length != 1)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;usage: transitionsystemdemo &amp;lt;pathtoseexpl&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        Environment.Exit(1);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        var loader = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ExplorationResultLoader(args[0]);&lt;br /&gt;        TransitionSystem tsys = loader.LoadTransitionSystem();&lt;br /&gt;        Process(tsys);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;failed: &amp;quot;&lt;/span&gt; + e.Message);&lt;br /&gt;        Environment.Exit(2);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;The method &lt;strong&gt;Process&lt;/strong&gt; will be defined later. Let us first examine how to print statistics about the transition system, a method which is called from within &lt;strong&gt;Process&lt;/strong&gt;. We use a bit of LINQish magic to compute the ordered list of all requirements captured or assumed to be captured by the transition system: &lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PrintStatistics(TransitionSystem tsys)&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;{0} states ({1} initial), {2} steps&amp;quot;&lt;/span&gt;,&lt;br /&gt;        tsys.States.Length, tsys.InitialStates.Length, tsys.Transitions.Length);&lt;br /&gt;    var captured =&lt;br /&gt;        tsys.Transitions.Aggregate(&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[0] &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;,&lt;br /&gt;                (cs, tr) =&amp;gt; cs.Concat(tr.CapturedRequirements).Concat(tr.AssumeCapturedRequirements))&lt;br /&gt;                .Distinct()&lt;br /&gt;                .OrderBy(x =&amp;gt; x);&lt;br /&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;captured: &amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var req &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; captured)&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;  &amp;quot;&lt;/span&gt; + req);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;The transition system contains three central properties which build the hooks for traversing it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The property &lt;strong&gt;tsys.States&lt;/strong&gt; (of type &lt;strong&gt;State[]&lt;/strong&gt;) is the array of all states in the transition system. Every entry in this array is an object containing information such as the state label, state kind, etc. &lt;/li&gt;

  &lt;li&gt;The property &lt;strong&gt;tsys.InitialStates&lt;/strong&gt; (of type &lt;strong&gt;string[]&lt;/strong&gt;) contains the array of state labels constituting the initial states of the transition system. If the transition system represents a test suite, these are typically the start states of each test case. &lt;/li&gt;

  &lt;li&gt;The property &lt;strong&gt;tsys.Transitions&lt;/strong&gt; (of type &lt;strong&gt;Transition[]&lt;/strong&gt;) is the array of all transitions. Every entry in this array is an object containing information such as the source and target state labels, the captured requirements, and the requirements which are assumed to be captured by the adapter &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running this part of the program on the exploration result file of the &lt;strong&gt;TestSuite&lt;/strong&gt; machine in the SMB2 project results in output as below:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_thumb_1.png" width="570" height="317" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This part was easy. The more tricky part is to compute sequences (which would correspond to test cases) from the transition system. The challenges are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We want to be able to run our program on arbitrary transition systems, and those may contain cycles. We will deal with this by just stopping once we have walked through a cycle. &lt;/li&gt;

  &lt;li&gt;The transition system – even in the case of a test suite – may contain branches (more than one outgoing transition from a given state). We will deal with this by actually generating our sequences similar to patterns in a Cord machine. So if we have an action &lt;strong&gt;A&lt;/strong&gt; which leads to a state where both &lt;strong&gt;B&lt;/strong&gt; and &lt;strong&gt;C&lt;/strong&gt; are possible, we will generate &lt;strong&gt;A;(B|C)&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The code resulting from this design is below:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PrintPatterns(TransitionSystem tsys)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var stateLabel &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; tsys.InitialStates)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Starting in state {0}:&amp;quot;&lt;/span&gt;, stateLabel);&lt;br /&gt;        Console.WriteLine(ToPattern(tsys, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HashSet&amp;lt;State&amp;gt;(), GetState(tsys, stateLabel)));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ToPattern(TransitionSystem tsys, HashSet&amp;lt;State&amp;gt; visiting, State state)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (state.RepresentativeState != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #008000"&gt;// skip intermediate state&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ToPattern(tsys, visiting, GetState(tsys, state.RepresentativeState));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (visiting.Contains(state))&lt;br /&gt;        &lt;span style="color: #008000"&gt;// Stop at cycle&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;    visiting.Add(state);&lt;br /&gt;    &lt;span style="color: #008000"&gt;// compute successor&lt;/span&gt;&lt;br /&gt;    var successors = GetSuccessors(tsys, state).Select(tr =&amp;gt; ToPattern(tsys, visiting, tr)).ToArray();&lt;br /&gt;    visiting.Remove(state);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (successors.Length == 0)&lt;br /&gt;        &lt;span style="color: #008000"&gt;// end state&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (successors.Length == 1)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; successors[0];&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;(&amp;quot;&lt;/span&gt; + &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Join(&lt;span style="color: #006080"&gt;&amp;quot;|\r\n&amp;quot;&lt;/span&gt;, successors) + &lt;span style="color: #006080"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ToPattern(TransitionSystem tsys, HashSet&amp;lt;State&amp;gt; visiting, Transition tr)&lt;br /&gt;{&lt;br /&gt;    var continuation = ToPattern(tsys, visiting, GetState(tsys, tr.Target));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (continuation != &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tr.Action.Text + &lt;span style="color: #006080"&gt;&amp;quot;;\r\n&amp;quot;&lt;/span&gt; + continuation;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tr.Action.Text;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; State GetState(TransitionSystem tsys, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; stateLabel)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tsys.States.First(state =&amp;gt; state.Label == stateLabel);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Transition&amp;gt; GetSuccessors(TransitionSystem tsys, State state)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tsys.Transitions.Where(tr =&amp;gt; tr.Source == state.Label);&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;br /&gt;&lt;/div&gt;
Notes on this code:

&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Every state has a property &lt;strong&gt;RepresentativeState&lt;/strong&gt;. The reason for that is related to the representation of symbolic transition systems, which goes beyond the scope of this article. In this context, whenever we visit a state which has a representative, we should just skip this state and continue with the representative instead. &lt;/li&gt;

  &lt;li&gt;We pass a set of the states which we are currently visiting through the algorithm. This allows us to detect cycles. &lt;/li&gt;

  &lt;li&gt;In order to print the action, we use &lt;strong&gt;tr.Action.Text. &lt;/strong&gt;This is the same as shown in the labels of the graphical representation in Visual Studio. However, we should note that the action object has much more detailed information than just the action label text, which we don’t use here. &lt;/li&gt;

  &lt;li&gt;In order to compute the State object associated with a state label, and the successor transitions of a state, we search the arrays in the transition system again and again. This is indeed way too inefficient, and in a real application, we would like to cache this information. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will illustrate the result again using the example of the &lt;strong&gt;TestSuite&lt;/strong&gt; exploration result from the SMB2 project. The result for one of the proper sequence cases looks as below:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/UsingtheexplorationresultobjectmodelBasi_8C44/image_thumb_4.png" width="619" height="305" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This concludes this little demo. There are a number of features of the transition system which you can exploit which we haven’t shown. Among the coolest is probably is that all information about actions and action parameters can be converted on-the-fly into reflection information and LINQ expressions, allowing one to write a test executor directly based on the transition system. I may come back with an example for this in a later post.&lt;/p&gt;

&lt;p&gt;You can find the full text of the demo program in the window below:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 80.33%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 121px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.SpecExplorer.ObjectModel;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; TransitionSystemDemo&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (args.Length != 1)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;usage: transitionsystemdemo &amp;lt;pathtoseexpl&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                Environment.Exit(1);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                var loader = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ExplorationResultLoader(args[0]);&lt;br /&gt;                TransitionSystem tsys = loader.LoadTransitionSystem();&lt;br /&gt;                Process(tsys);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;failed: &amp;quot;&lt;/span&gt; + e.Message);&lt;br /&gt;                Environment.Exit(2);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Process(TransitionSystem tsys)&lt;br /&gt;        {&lt;br /&gt;            PrintStatistics(tsys);&lt;br /&gt;            PrintPatterns(tsys);          &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PrintStatistics(TransitionSystem tsys)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;{0} states ({1} initial), {2} steps&amp;quot;&lt;/span&gt;,&lt;br /&gt;                tsys.States.Length, tsys.InitialStates.Length, tsys.Transitions.Length);&lt;br /&gt;            var captured =&lt;br /&gt;                tsys.Transitions.Aggregate(&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[0] &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;,&lt;br /&gt;                        (cs, tr) =&amp;gt; cs.Concat(tr.CapturedRequirements).Concat(tr.AssumeCapturedRequirements))&lt;br /&gt;                        .Distinct()&lt;br /&gt;                        .OrderBy(x =&amp;gt; x);&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;captured: &amp;quot;&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var req &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; captured)&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;  &amp;quot;&lt;/span&gt; + req);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PrintPatterns(TransitionSystem tsys)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var stateLabel &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; tsys.InitialStates)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Starting in state {0}:&amp;quot;&lt;/span&gt;, stateLabel);&lt;br /&gt;                Console.WriteLine(ToPattern(tsys, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HashSet&amp;lt;State&amp;gt;(), GetState(tsys, stateLabel)));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ToPattern(TransitionSystem tsys, HashSet&amp;lt;State&amp;gt; visiting, State state)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (state.RepresentativeState != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                &lt;span style="color: #008000"&gt;// skip intermediate state&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ToPattern(tsys, visiting, GetState(tsys, state.RepresentativeState));&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (visiting.Contains(state))&lt;br /&gt;                &lt;span style="color: #008000"&gt;// Stop at cycle&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;            visiting.Add(state);&lt;br /&gt;            &lt;span style="color: #008000"&gt;// compute successor&lt;/span&gt;&lt;br /&gt;            var successors = GetSuccessors(tsys, state).Select(tr =&amp;gt; ToPattern(tsys, visiting, tr)).ToArray();&lt;br /&gt;            visiting.Remove(state);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (successors.Length == 0)&lt;br /&gt;                &lt;span style="color: #008000"&gt;// end state&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (successors.Length == 1)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; successors[0];&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;(&amp;quot;&lt;/span&gt; + &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Join(&lt;span style="color: #006080"&gt;&amp;quot;|\r\n&amp;quot;&lt;/span&gt;, successors) + &lt;span style="color: #006080"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ToPattern(TransitionSystem tsys, HashSet&amp;lt;State&amp;gt; visiting, Transition tr)&lt;br /&gt;        {&lt;br /&gt;            var continuation = ToPattern(tsys, visiting, GetState(tsys, tr.Target));&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (continuation != &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tr.Action.Text + &lt;span style="color: #006080"&gt;&amp;quot;;\r\n&amp;quot;&lt;/span&gt; + continuation;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tr.Action.Text;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; State GetState(TransitionSystem tsys, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; stateLabel)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tsys.States.First(state =&amp;gt; state.Label == stateLabel);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Transition&amp;gt; GetSuccessors(TransitionSystem tsys, State state)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; tsys.Transitions.Where(tr =&amp;gt; tr.Source == state.Label);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9928259" width="1" height="1"&gt;</content><author><name>wrwg</name><uri>http://blogs.msdn.com/wrwg/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Static vs. Instance-Based Models</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2009/11/23/static-vs-instance-based-models.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2009/11/23/static-vs-instance-based-models.aspx</id><published>2009-11-24T00:39:36Z</published><updated>2009-11-24T00:39:36Z</updated><content type="html">&lt;p&gt;Many Spec Explorer users have asked the question of how and when to choose between static or instance-based at the time of creating a model. &lt;/p&gt;  &lt;p&gt;The Base Solution Wizard (Visual Studio File menu -&amp;gt; New -&amp;gt; Project… -&amp;gt; Visual C# -&amp;gt; Spec Explorer Base Solution) shortly explains in its second step the difference between these two kinds of models, while leaving the choice to the user:&lt;/p&gt;  &lt;p align="center"&gt;&lt;b&gt;Spec Explorer Base Solution Wizard&lt;/b&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/Staticvs.InstanceBasedModels_EA44/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/Staticvs.InstanceBasedModels_EA44/image_thumb.png" width="441" height="348" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So I figured it would be worth explaining the reasons to pick one or the other in this blog post. I’ve explained in a &lt;a href="http://blogs.msdn.com/specexplorer/archive/2009/11/23/connecting-your-tests-to-an-implementation.aspx" target="_blank"&gt;previous one&lt;/a&gt; two different ways to connect your test cases: directly or through a test adapter.&lt;/p&gt;  &lt;p&gt;If you decide to go with the latter, the design of the test adapter itself is one place where the static-vs.-instance-based decision can be made. A static adapter can be used to control an instance-based SUT and vice-versa. The test adapter is just another component in your (testing) system. The rationale and constraints involved in this decision are the same one would take into consideration for designing any component in an object-oriented design. Moreover, this is not an all-or-nothing choice. Static and instance-based members can be combined in the same adapter as needed.&lt;/p&gt;  &lt;p&gt;Action declarations in Cord configurations are used to connect the test cases to an external entity (either the SUT or an adapter). Generally, if your test cases will call static methods in the adapter or SUT, your actions will be static, whereas you will have instance-based actions if the methods to be called are instance-based. So the actual choice between static vs. instance-based actions is not really made by the modeler, but rather by whoever designs that external entity. Of course, they could be the same person, but would mean wearing two hats anyway. &lt;/p&gt;  &lt;p&gt;The implication of having instance-based actions is that model steps will need to invoke the actions on objects that are not only known at model-exploration time, but also at test execution time. This means that the receiver of an instance-based action (“this” in C#) must have been the output of an action in a previous step. If a rule creates an object but doesn’t return it in its associated action, future steps will not be able to use it as a receiver. &lt;/p&gt;  &lt;p&gt;Now a second choice point is reached when creating a model program. Spec Explorer allows mapping instance-based actions to static rule methods (and in some cases, the other way round). The usual recommendation is not to make this switch, as modeling static actions with static rules (and instance-based actions with instance-based rules) is usually more natural. But we’ve seen cases where a modeler doesn’t agree with the design choice made at SUT or adapter design time and believes better model clarity can be achieved by using a different approach for the rules. &lt;/p&gt;  &lt;p&gt;The goal, as with any design, is to keep your model simple to understand and to maintain, while achieving the desired behavior.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927648" width="1" height="1"&gt;</content><author><name>Nico Kicillof - Microsoft</name><uri>http://blogs.msdn.com/nicok/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Connecting Your Tests to an Implementation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2009/11/23/connecting-your-tests-to-an-implementation.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2009/11/23/connecting-your-tests-to-an-implementation.aspx</id><published>2009-11-24T00:36:59Z</published><updated>2009-11-24T00:36:59Z</updated><content type="html">&lt;p&gt;Spec Explorer supports two topologies for connecting generated test cases to the implementation of your System Under Test (SUT). They can be either connected directly or through a test adapter. &lt;/p&gt;  &lt;p&gt;Connecting them directly means to declare the actual methods and events of your implementation as actions in a Cord configuration (either one by one or using the “action all” option to extract them for the SUT). Consequently, the generated test code will call directly into your SUT and expect the events it raises. This option can only be applied to managed code implementations that expose an API rich enough to allow testability.&lt;/p&gt;  &lt;p align="center"&gt;&lt;b&gt;Direct Connection&lt;/b&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/ConnectingYourTeststoanImplementation_E9A5/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/ConnectingYourTeststoanImplementation_E9A5/image_thumb.png" width="288" height="260" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A test adapter is a (fairly thin) software layer that sits between your test cases and your SUT. When you create a test adapter, you declare the adapter methods and events as actions in a Cord configuration instead referring directly to the SUT. As a result, the generated test code will call methods (and expect events) in the adapter. The adapter has the task of turning these calls into SUT calls, usually performing some translation or marshaling. This architecture must be used when the implementation is not managed, when the communication is remote, when there is a test infrastructure in the middle (for example, to control the SUT’s UI), to raise the level of abstraction of modeling and testing, etc. Adapters are a way to get around testing environments that otherwise would be hard to tackle by managed test code derived solely from modeling. Thus they greatly extend the power of Spec Explorer.&lt;/p&gt;  &lt;p align="center"&gt;&lt;b&gt;Connection through a Test Adapter&lt;/b&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/ConnectingYourTeststoanImplementation_E9A5/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/ConnectingYourTeststoanImplementation_E9A5/image_thumb_1.png" width="393" height="283" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It is possible in both approaches that the modeler and the adapter or SUT implementer collaborate by agreeing on the action interface as a contract and then proceed in parallel: the modeler ultimately being a consumer of the agreed interface and the implementer being the provider of the functionality behind the interface. Only at generated test case run time must the adapter or SUT interface be ready for execution. The modeler would declare the actions in Cord as abstract and use rules in the model program and Cord scenarios to model expected system behavior.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927647" width="1" height="1"&gt;</content><author><name>Nico Kicillof - Microsoft</name><uri>http://blogs.msdn.com/nicok/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>The Spec Explorer Story on WG’s Logbook</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2009/10/28/the-spec-explorer-story-on-wg-s-logbook.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2009/10/28/the-spec-explorer-story-on-wg-s-logbook.aspx</id><published>2009-10-28T16:56:03Z</published><updated>2009-10-28T16:56:03Z</updated><content type="html">&lt;p&gt;I posted a personal account of the history of Spec Explorer on my blog: how it is related to AsmL, Spec#, NModel, etc. Take a &lt;a href="http://blogs.msdn.com/wrwg/archive/2009/10/28/the-spec-explorer-story.aspx"&gt;look&lt;/a&gt; if you are interested.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9914184" width="1" height="1"&gt;</content><author><name>wrwg</name><uri>http://blogs.msdn.com/wrwg/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>What is Model-Based Testing?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2009/10/27/what-is-model-based-testing.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2009/10/27/what-is-model-based-testing.aspx</id><published>2009-10-27T20:35:56Z</published><updated>2009-10-27T20:35:56Z</updated><content type="html">&lt;p&gt;I know there are people out there who found out about Spec Explorer 2010 as a great testing tool, but are wondering what all that &amp;quot;Model-Based Testing&amp;quot; buzz is about. If you are in this group, this post should be a good place to start. &lt;/p&gt;  &lt;p&gt;Of course, you can also &lt;a href="http://www.bing.com/search?q=model-based+testing"&gt;search&lt;/a&gt; the Web for Model-Based Testing (&lt;strong&gt;MBT&lt;/strong&gt;, for short) and you'll find plenty of information, since MBT is not new or restricted to Spec Explorer. It's in fact the subject of ongoing academic research and an industrial practice that has been around for a while and is here to stay. Tools like Spec Explorer just make it easier to learn and to use, and generally more accessible to a larger audience. &lt;/p&gt;  &lt;p&gt;So I'll cut to the chase and explain what MBT is and what it's used for. Model-Based testing is considered to be a &lt;strong&gt;lightweight formal method&lt;/strong&gt; to validate software systems. &lt;/p&gt;  &lt;p&gt;It's &lt;strong&gt;formal&lt;/strong&gt; because it works out of a formal (that is, machine-readable) specification (or &lt;strong&gt;model&lt;/strong&gt;) of the software system one intends to test (usually called the implementation or System Under Test, &lt;strong&gt;SUT&lt;/strong&gt;). &lt;/p&gt;  &lt;p&gt;It's &lt;strong&gt;lightweight &lt;/strong&gt;because, contrary to other formal methods, MBT doesn't aim at mathematically proving that the implementation matches the spec under all possible circumstances. What MBT does is systematically generate from the model a collection of tests (a &amp;quot;test suite&amp;quot;) that, when run against the SUT, will provide sufficient confidence that it behaves as the model predicted it would. &lt;/p&gt;  &lt;p&gt;So the difference between lightweight and heavyweight formal methods is basically about sufficient confidence vs. complete certainty. Now, the price to pay for absolute certainty is not low, which results in heavyweight formal methods being very hard (sometimes prohibitively hard) to apply to real-life projects. MBT on the other hand scales much better and has been used to test life-size systems in huge projects, some of them inside Microsoft. &lt;/p&gt;  &lt;p&gt;Here's a simplified diagram showing how MBT works. &lt;/p&gt;  &lt;h4 align="center"&gt;Model-Based Testing in a Nutshell &lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WhatisModelBasedTesting_C012/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WhatisModelBasedTesting_C012/image_thumb.png" width="461" height="262" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="text-align: center"&gt;&lt;/p&gt;  &lt;p&gt;The method starts from a set of requirements usually written in prose, sketches or just shared by the development team as tribal knowledge. &lt;/p&gt;  &lt;p&gt;The first task in the process (#1) is to create a machine-readable model that expresses all the possible behaviors of a system meeting the requirements. This has to be done by humans and is arguably the most work-intensive step. A key ingredient to keep it manageable is to work at the right level of abstraction. That is, as a modeler you should focus on certain aspects of the system that will be tested (such as UI elements or API calls) and forget about the rest. Other models can be created for other system aspects, as long as each of them is kept at a clear abstraction level. &lt;/p&gt;  &lt;p&gt;In the case of Spec Explorer, models are written as sets of rules in a mainstream programming language (&lt;a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx"&gt;C#&lt;/a&gt;), which makes the learning curve much less steep than tools that require learning an ad-hoc formal language. Spec Explorer runs as an add-on to the Microsoft &lt;a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual Studio&lt;/a&gt; integrated development environment, which provides extensive support for .Net languages such as syntax coloring, auto-completion and refactoring. A small but powerful configuration language called Cord (short for &amp;quot;Coordination Language&amp;quot;) complements the C# code by providing features to combine models, generate test data and select certain scenarios that are especially relevant for testing. &lt;/p&gt;  &lt;p&gt;I said authoring a model is the most work-intensive step in an MBT process, but it also has a big payoff! Just by trying to turn informal requirements into a machine-readable model you are very likely to discover inconsistencies and missing pieces in the requirements (&amp;quot;What on Earth is the system expected to do when I press the Esc key twice?&amp;quot;) This is illustrated by flow #2, where feedback about the requirements is obtained from the model. &lt;/p&gt;  &lt;p&gt;Once the model is in place, a Model-Based Testing tool such as Spec Explorer can do its magic. It can automatically take a model and generate standalone test cases from it (#3). Spec Explorer is among the MBT tools that generate complete test suites from a model, including both the inputs to be provided to the SUT and the expected outputs, also called a test oracle. &lt;/p&gt;  &lt;p&gt;So the test cases automatically generated by Spec Explorer will run independently from the model, in a standard unit test framework, such as the one included in &lt;a href="http://msdn.microsoft.com/en-us/library/bb385902.aspx"&gt;Visual Studio&lt;/a&gt; or &lt;a href="http://www.nunit.org/index.php"&gt;NUnit&lt;/a&gt;. The tests will provide the test sequences (and data) to control (#4) the implementation. But they will also observe (#5) the results coming back from the system to compare them with the outputs expected by the model and issue a verdict (#6) of Pass or Fail, together with log information for diagnostics. Moreover, this execution of the test cases in lockstep with the SUT can be reiterated to reproduce bugs and debugged to understand what went wrong. &lt;/p&gt;  &lt;p&gt;Of course such a verdict will provide feedback about the implementation (#7). After all, finding bugs or gaining confidence on the implementation is the goal of the whole thing, right? Well, yes and no. A failing test case might also mean that the implementation is behaving correctly, but an error was made while creating the model! Or perhaps the model faithfully reflects the documented requirements, but it was the requirements that were wrong to begin with! If this happens, you shouldn't freak out. One of the big advantages of MBT is it makes test suite maintenance much easier, when compared with manually written test cases. Just take the result as normal feedback about the model or requirements (#8), fix the model to convey the behavior actually expected from the running system, re-generate your test cases, and voilà! You are back on track. The previously failing test cases should now pass. Keith, Wolfgang and I have shown an example of this workflow in our Channel 9 &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166160"&gt;video&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I hope this both satisfies your curiosity about Model-Based Testing and feeds your curiosity about Spec Explorer, at least enough to &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166911"&gt;install it&lt;/a&gt; and start using it! &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9913689" width="1" height="1"&gt;</content><author><name>Nico Kicillof - Microsoft</name><uri>http://blogs.msdn.com/nicok/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Welcome to the Spec Explorer Team Blog!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/specexplorer/archive/2009/10/27/welcome-to-the-spec-explorer-team-blog.aspx" /><id>http://blogs.msdn.com/b/specexplorer/archive/2009/10/27/welcome-to-the-spec-explorer-team-blog.aspx</id><published>2009-10-27T12:20:00Z</published><updated>2009-10-27T12:20:00Z</updated><content type="html">&lt;P&gt;Spec Explorer is a Model-Based Testing tool from Microsoft. It extends the Visual Studio integrated environment with the ability to define a model describing the expected behavior of a software system. Using this model you can generate tests automatically for execution within Visual Studio's own testing framework, or many other unit test frameworks. &lt;/P&gt;
&lt;P&gt;You write models in a mainstream programming language (C#), accompanied by configuration files in a scripting language called Cord (short for "Coordination Language"). &lt;/P&gt;
&lt;P&gt;The name &lt;STRONG&gt;Spec Explorer&lt;/STRONG&gt; comes from its power to &lt;STRONG&gt;explore&lt;/STRONG&gt; these models (aka &lt;STRONG&gt;specifications&lt;/STRONG&gt;) in order to discover all the potential behaviors they define, and present a graphical view of the result. Although the outcome of an exploration can be huge, the Cord language provides a very intuitive way to reduce it by selecting scenarios relevant for testing. If you have encountered purely state oriented tools, you will find Spec Explorer has very effective ways to deal with the notorious "state explosion" problem. &lt;/P&gt;
&lt;P&gt;Spec Explorer is the latest and greatest in a family of tools for Model-Based Testing, originating from Microsoft Research and backed up by many research articles and collaborations. Our full-fledged product engineering team in the Windows Server Division, distributed between Redmond and Beijing, carries on enhancing and supporting Spec Explorer in its current form. &lt;/P&gt;
&lt;DIV style="TEXT-ALIGN: center"&gt;
&lt;TABLE style="BORDER-COLLAPSE: collapse" border=0&gt;
&lt;COLGROUP&gt;
&lt;COL style="WIDTH: 319px"&gt;
&lt;COL style="WIDTH: 319px"&gt;&lt;/COLGROUP&gt;
&lt;TBODY vAlign=top&gt;
&lt;TR&gt;
&lt;TD style="PADDING-LEFT: 7px; PADDING-RIGHT: 7px"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;STRONG&gt;Beijing Spec Explorer Team &lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="PADDING-LEFT: 7px; PADDING-RIGHT: 7px"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;STRONG&gt;Redmond Spec Explorer Team &lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="PADDING-LEFT: 7px; PADDING-RIGHT: 7px"&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_4.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_thumb_1.png" width=244 height=164 mce_src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;
&lt;TD style="PADDING-LEFT: 7px; PADDING-RIGHT: 7px"&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_thumb.png" width=244 height=163 mce_src="http://blogs.msdn.com/blogfiles/specexplorer/WindowsLiveWriter/WelcometotheSpecExplorerTeamBlog_12DEC/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;Spec Explorer is being extensively used to test several Microsoft technologies and has been successfully applied to testing thousands of pages of &lt;A href="http://msdn.microsoft.com/en-us/library/cc216517(PROT.10).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/cc216517(PROT.10).aspx"&gt;Windows open protocol specifications&lt;/A&gt;, a huge project that took more than 250 person years. &lt;/P&gt;
&lt;P&gt;Today we are super proud to ship Spec Explorer 2010 for the first time outside Microsoft through &lt;A href="http://msdn.microsoft.com/en-us/devlabs/ee692301.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/devlabs/ee692301.aspx"&gt;MSDN DevLabs&lt;/A&gt;! &lt;/P&gt;
&lt;P&gt;We'll use this blog to post technical articles and share samples with our user community. We hope you download Spec Explorer, try it out, and let us know what you think on the project &lt;A href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads" mce_href="http://social.msdn.microsoft.com/Forums/en-US/specexplorer/threads"&gt;forum&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Thanks in advance on behalf of the Spec Explorer team. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9913324" width="1" height="1"&gt;</content><author><name>Nico Kicillof - Microsoft</name><uri>http://blogs.msdn.com/nicok/ProfileUrlRedirect.ashx</uri></author></entry></feed>