<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Software Musings</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/raulperez/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/raulperez/feed.xml</link>
    <description>Random thoughts while writing code (and mostly about code)</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:26:37 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Technical Interview Tips</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/technical-interview-tips</link>
      <pubDate>Mon, 11 Jun 2012 14:04:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2012/06/11/technical-interview-tips/</guid>
      <description><![CDATA[So you know you have the right skillset for a job but you don&rsquo;t do that great on interviews....]]></description>
      <content:encoded><![CDATA[<p>So you know you have the right skillset for a job but you don&rsquo;t do that great on interviews. The good news is that most jobs on the computer science fields put more value on technical interview than classic interviews. In this post I&rsquo;ll go through a mock interview and cover some simple tips in how to bring those skills to the forefront and shine based on your technical skills.<br /><br /> A lot of these things most likely we all do at a subconscious level already, it&rsquo;s a matter of doing them out loud and sharing your thoughts (a theme that will keep coming up). Some of these will be fairly obvious and it&rsquo;s advice than anyone will tell you when taking about technical interviews so the purpose of this isn&rsquo;t to give you some unique tip on how to succeed but rather take a pragmatic approach and show you how everything comes together.<br /><br /> Technical interviews aren&rsquo;t a race to the finish, sure the faster you complete the problems the more time you&rsquo;ll have to show your skills with more problems. However the most important thing about these interviews is to get the interviewer to know you and how you think. So you should take any chance you get to do that while answering those coding questions.<br /><br /> So with all that out of the way let&rsquo;s go through the theoretical interview and explore things you can do along the way. And if you&rsquo;re wondering, no, this is not a question I ask or would ask on an interview but it serves as a good example.<br /><br /><em>Implement a function that given 2 integer values returns the multiplication of those two characters without using a multiplication operator.</em><br /><br /><br /><strong>1)&nbsp;Understand the question and if you have any doubts ask. If you&rsquo;re not given a signature that should be the first thing you write down and again ask to make sure you&rsquo;re on the same page with your interviewer.</strong><br /><br /><em>Why?</em><br /><br /> It ensures that you&rsquo;re solving the problem that the interviewer really wants you to solve<br /><br /><em>Example:</em><br /><br />int Multiply(int a, int b)<br /><br /><br /><strong>2)&nbsp;Make sure you understand all the constraints of the problem, and again, if you have doubts ask about that.</strong><br /><br /><em>Why?</em><br /><br /> It lets them know more about what you&rsquo;re thinking and an early insight about your problem solving skills.<br /><br /><em>Example:</em><br /><br /> Should the function handle negative numbers?<br /><br /><br /><strong>3)&nbsp;Write down what your test input would be. It doesn&rsquo;t have to be a comprehensive list at this point; although the more interesting cases you have the better.</strong><br /><br /><em>Why?</em><br /><br /> You&rsquo;ll outline most if not all of the situations your implementation has to deal with which will give you a better idea of what your implementation needs to be and probably some code paths that didn&rsquo;t originally came to mind at first when you heard the problem.<br /><br /><em>Example:</em><br /><br /> Personally I like doing this as a table with inputs and outputs but the format is up to you. I like this one because it&rsquo;s pretty clear and you&rsquo;ll have a list of both the expected and the actual results (think unit tests). I wouldn&rsquo;t actually write the last column but it&rsquo;s something that you could be talking about while you&rsquo;re writing it and definitely worth mentioning why you&rsquo;re choosing those inputs</p>
<table border="1">
<tbody>
<tr>
<td>a</td>
<td>b</td>
<td>Result</td>
<td>Scenario</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
<td>Multiplication by 1</td>
</tr>
<tr>
<td>2</td>
<td>5</td>
<td>10</td>
<td>a greater than b</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
<td>10</td>
<td>b greater than a</td>
</tr>
<tr>
<td>MaxSize</td>
<td>2</td>
<td>Error</td>
<td>Overflow case when a is Max int</td>
</tr>
<tr>
<td>2</td>
<td>MaxSize</td>
<td>Error</td>
<td>Overflow case when b is Max int</td>
</tr>
<tr>
<td>MaxSize - 1</td>
<td>MaxSize - 1</td>
<td>Error</td>
<td>Overflow when the result overflows</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>0</td>
<td>Multiplication by 0 when a is 0 and b is something else</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>0</td>
<td>Multiplication by 0 when b is 0 and a is something else</td>
</tr>
<tr>
<td>-1</td>
<td>1</td>
<td>-1</td>
<td>Negative a, positive b</td>
</tr>
<tr>
<td>1</td>
<td>-1</td>
<td>-1</td>
<td>Negative b, positive a</td>
</tr>
<tr>
<td>-1</td>
<td>-1</td>
<td>1</td>
<td>Both negatives</td>
</tr>
</tbody>
</table>
<p><br /><br /><strong>4)&nbsp;Always write down (or at least mention) the first implementation that comes to mind, even if you get the feeling there might be a more efficient way. This includes handling all your special cases which you can add once you have basic implementation.</strong><br /><br /><em>Why?</em><br /><br /> You&rsquo;ll show that you know how to solve the problem. A lot of times there&rsquo;s more efficient and elegant solutions than the first one that comes to mind. After implementing the simple one you can mention that there might be another and keep thinking about it (remember brainstorm out loud!) or you might get asked if there&rsquo;s a better solution anyway.<br /><br /><em>Example:</em><br /><br /> int total = 0;<br />for (int i =0; i &lt; a; i++)<br />{<br />&nbsp;&nbsp;&nbsp; total += b;<br />}<br />return total;<br /><br /><br /><strong>5)&nbsp;Run through your test cases and see if your algorithm holds, specially run through the most interesting ones. This is where they become useful!</strong><br /><br /><em>Why?</em><br /><br /> You want to validate your algorithm; that was the whole point of having a list of scenarios earlier. If your test cases are good enough you might also pick up bugs on your algorithm and it&rsquo;s always a plus if you find your own bug instead of having your interviewer point it out and having you figure out where it is.<br /><br /><em>Example:</em><br /><br /> Depending on the complexity of the algorithm I like to use tables here as well when running through loops (for this example this would be overkill and a waste but just to illustrate the point here)<br /><br /> For the scenario where a =2, b =5 and expected result = 10</p>
<table border="1">
<tbody>
<tr>
<td><strong>i</strong></td>
<td><strong>total</strong></td>
</tr>
<tr>
<td>0</td>
<td>5</td>
</tr>
<tr>
<td>1</td>
<td>10</td>
</tr>
</tbody>
</table>
<p><br />&nbsp;If we tried with the negative test case, a = -1, b = 1, expected result = -1</p>
<table border="1">
<tbody>
<tr>
<td><strong>i</strong></td>
<td><strong>total</strong></td>
</tr>
<tr>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>...</td>
</tr>
</tbody>
</table>
<p><br />&nbsp;At this point you can see that it doesn&rsquo;t handles negative very well.<br /><br /><br /><strong>6)&nbsp;Fix any bugs you might have found or make any optimizations (which might involve rewriting the whole thing so if that&rsquo;s the case repeat the last step after you&rsquo;re done).</strong><br /><br /><em>Why?</em><br /><br /> If this one isn&rsquo;t obvious as to why you&rsquo;re probably looking for work in the wrong field.<br /> Having bugs in your algorithm is not necessarily a bad thing so don&rsquo;t get discouraged if you find one or if your interviewer points it out for you. Finding and fixing bugs if part of the software cycle so only panic if you still can&rsquo;t see the bug after you get several hints of where it&rsquo;s at.<br /><br /><em>Example:</em><br /><br /> The original code didn&rsquo;t handle negatives so we&rsquo;ll modify the code to handle that:</p>
<p style="padding-left: 30px;">int v1 = Abs(a);<br />int v2 = Abs(b);<br />int negativeCount = 0;<br />int total = 0;<br /><br /> if (a &lt; 0)<br />{<br />&nbsp;&nbsp;&nbsp; negativeCount++;<br />}<br /><br /> if (b &lt; 0)<br />{<br />&nbsp;&nbsp;&nbsp;negativeCount++;<br />}<br /><br /> for (int i =0; i &lt; v1; i++)<br />{<br />&nbsp;&nbsp;&nbsp; total += v2;<br />}<br /><br /> return negativeCount == 1 ? 0 &ndash; total : total;</p>
<p><br /> Finally, be ready to explain any choices you made in your implementation if your interviewer has any question. The clich&eacute; there&rsquo;s no right or wrong doesn&rsquo;t completely apply here (as obviously code full of bugs is wrong) but other than that you should feel confident on your code and be able to explain why you went with that implementation. If you get a question like that don&rsquo;t immediately think that there&rsquo;s something wrong as this isn&rsquo;t necessarily a trick question. It might just mean that you have a different implementation than what your interviewed expected and he&rsquo;s curious as to your design choices and he wants to get more insight as to how you think (which is a good thing!).</p>]]></content:encoded>
    </item>
    <item>
      <title>Hey look I'm on TV! (well sort of)</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/hey-look-im-on-tv-well-sort-of</link>
      <pubDate>Thu, 12 Jan 2012 11:38:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2012/01/12/hey-look-im-on-tv-well-sort-of/</guid>
      <description><![CDATA[I did a channel 9 interview right before the holidays where I talk about the front end and the...]]></description>
      <content:encoded><![CDATA[<p><span style="font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">I did a channel 9 interview right before the holidays where I talk about the front end and the IntelliSense architecture in general. I was going to write an intro but I'll be lazy and reuse the one from the interview</span></p>
<p><iframe style="height: 288px; width: 512px;" src="https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-5-Inside-the-Visual-C-ID-Meet-Raul-Prez/player?w=512&amp;h=288" frameborder="0" scrolling="no"></iframe></p>
<hr style="width: 100%;" width="100%" />
<p><span style="font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"><a href="https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-5-Inside-the-Visual-C-ID-Meet-Raul-Prez">https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-5-Inside-the-Visual-C-ID-Meet-Raul-Prez</a></span></p>
<p><span style="font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Happy Holidays to all of you out there who are in some sort of holiday state. If not, then happy holidays anyway from Diego, Charles, C9, and VC <img alt="Smiley" src="http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif?v=c9" /><br /><br />We don't cover software testing&mdash;the job discipline&mdash;often enough on C9. We aim to change that starting now.<br /><br />A friend of Diego's on the VC++ team, <strong>Raul P&eacute;rez</strong>, is a software developer from Puerto Rico who works in QA for the Visual C++ IDE team. He writes tests to make sure the <em>very-front-end </em>of the VC toolchain&mdash;the IDE and its design-time compiler infrastructure<em>&mdash;</em>works as expected. <br /><br />There's a lot going on when you type characters into the VC++ editor. What happens, exactly? Why? What types of things can make Intellisense fast? What types of things can hinder the performance of the IDE? How does all of this magic happen? There's a compiler involved in all of this. It's not the front-end compiler (cl), but it is a front-end compiler and it compiles your source into data that's stored in a local DB for design-time use by Intellisense, Go-To-Definition, Syntax Coloring, Reference Highlighting, Auto-Completion, etc... All of these things are part of the set of IDE features that make Visual C++ <em>visual</em>... So, meet Raul and learn a thing or two about how the IDE works under the covers and how the system has evolved over time.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>No Repro, No Way! - Handling Bugs Before They Come Back To Haunt You</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/no-repro-no-way-handling-bugs-before-they-come-back-to-haunt-you</link>
      <pubDate>Fri, 23 Dec 2011 16:31:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2011/12/23/no-repro-no-way-handling-bugs-before-they-come-back-to-haunt-you/</guid>
      <description><![CDATA[I haven't actually written in a long time which its an indication of how busy things have been...]]></description>
      <content:encoded><![CDATA[<p>I haven't actually written in a long time which its an indication of how busy things have been around here. I put together a presentation about how to handle itermitent test failures earlier this year and I've been meaning to turn it into a document and I figured this was a good chance to do just that (you're warned that this is the first draft). The presentation is way more entertaining than the document since you're missing the jokes and the pretty picture but it's still interesting enough if you're into software testing.</p>
<hr style="width: 100%;" width="100%" />
<p></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><em><strong>Abstract:</strong></em></span></p>
<p>Ever had a situation where you saw a test failing but since it didn&rsquo;t immediately repro the failure got dismissed and then later the issue resurfaced and it ended up being a serious issue? We&rsquo;ll explore as to why even though most of us agree we shouldn&rsquo;t not ignore failures people still do along with some real case studies of occurrences of this that I&rsquo;ve come across as a tester in Visual Studio. Finally we&rsquo;ll talk about when it&rsquo;s &ldquo;ok&rdquo; to dismiss a failure and ways to influence the culture around this.</p>
<p><strong><em><span style="font-size: small;"></span></em></strong>&nbsp;</p>
<p><strong><em><span style="font-size: small;">Section 1: Introduction</span></em></strong></p>
<p>Does this scenario sound familiar?</p>
<ul>
<li>Test fails</li>
<li>First thing whomever looking at it does is to run it again</li>
<li>Test passes</li>
<li>If there was a bug it&rsquo;s closed at not repro</li>
<li>If it was on a test run it gets ignored as pass on rerun</li>
<li>Real bug keeps lurking and resurfaces later</li>
</ul>
<p>If it does it also probably frustrates you to no end. After all, tests are written for a reason and when they fail it usually means something is wrong. In theory all this sounds right but in practice it might not be the case. So why is it that we&rsquo;re so far apart between what is should happen and what actually happens? From experience I can summarize the top reason for that in one of these 4 buckets:</p>
<ul>
<li>Everyone is on a tight schedule &ndash; This means that when there&rsquo;s a business decision to be made you have to take some calculated risks and if a test is only failing sometimes that&rsquo;s something you might justify living with.</li>
<li>Investigations are unattractive work &ndash; Some people love digging into problems and figuring them out. Others view it as something that isn&rsquo;t fun or something that they rather not do. I&rsquo;d even go as far as say that some people think that doing test investigations is beneath them. Bottom line is that it isn&rsquo;t glamorous work and some investigations can be very tedious.</li>
<li>Lack of manual repro must mean that the user scenario isn&rsquo;t broken &ndash; This falls under the blame the test category (which we&rsquo;ll cover in more detail later). It&rsquo;s very easy to blame test automation (which effectively translates to its someone else&rsquo;s bug) when you&rsquo;re dealing with a hard to repro bug.</li>
<li>It&rsquo;s easier to add a workaround in the test than to find the root cause &ndash; Sometimes people will agree that there&rsquo;s a bug (albeit begrudgingly) but they&rsquo;ll argue that working around the issue is easy and cheap so the test should be doing that instead.</li>
</ul>
<p><span style="font-size: small;"><em><strong></strong></em></span>&nbsp;</p>
<p><span style="font-size: small;"><em><strong>Section 2: Culture around test failures</strong></em></span></p>
<p>One big problem as to why even though people agree with the statements in the previous section is how tests (and by association) the testers are viewed and valued in an organization and more importantly how much does that organization value testing.</p>
<p>There are two very distinct lines of thought when talking about tests and as a tester you should always be pushing for the later:</p>
<ul>
<li>Tests are just things that need to run and pass before I check in my code changes.</li>
<li>Tests results paint me an accurate picture of what the quality of my product is.</li>
</ul>
<p>If you&rsquo;re stuck around people that have the mindset of the former you&rsquo;ve probably seen both of these:</p>
<ul>
<li>When a test fails the first thing a good number of developers ask is, &ldquo;Is this a flaky test?&rdquo;</li>
</ul>
<p style="padding-left: 30px;">The first thing you should ask yourself when a test fails is what new bug got introduced in the product and how do we fix it? Not if the test itself is full of bugs.</p>
<ul>
<li>The Guilty until proven innocent&nbsp;mentality</li>
</ul>
<p style="padding-left: 30px;">This is a variation on the last statement. For a lot of developers until you can prove and explain a product bug it&rsquo;s considered a test bug.</p>
<p>Both of these paint a bleak picture where the overall mentality ends up being &ldquo;It&rsquo;s never my fault, it&rsquo;s always yours&rdquo; and its sibling &ldquo;It&rsquo;s someone else&rsquo;s bug&rdquo;. This has the unfortunate side effect of affecting how testers are valued and these are statements I&rsquo;ve heard that make me roll my eyes because they&rsquo;re wrong and most of the time unfair and untrue:</p>
<ul>
<li>&ldquo;This is a crappy test so I just keep running it until it passes.&rdquo;</li>
<li>&ldquo;My code is fine, your test never really finds issues it just fails randomly.&rdquo;</li>
<li>&ldquo;Can we fix the test so that it&rsquo;s more resilient to bugs?&rdquo;</li>
</ul>
<p><span style="font-size: small;"><strong><em></em></strong></span>&nbsp;</p>
<p><span style="font-size: small;"><strong><em>Section 3: Common issues on the product and on the test side</em></strong></span></p>
<p>So how do we fix all this? First thing we need to understand is why there are failures that feel random and that there&rsquo;s a multitude of issues on both the test and the product side that can contribute to this. Here&rsquo;s what I&rsquo;ve seen cause the most instability with test results and it&rsquo;s worth noting that as everything around software there&rsquo;s enough blame to go around and both sides (development and testing) have their own share.</p>
<p>On the product side of things:</p>
<ul>
<li>Issues that only manifest themselves on the application first load</li>
</ul>
<p style="padding-left: 30px;">This one is self-explanatory, these are issues that only happen on cold boots or the first time ever the application runs on a machine.</p>
<ul>
<li>Race conditions</li>
</ul>
<p style="padding-left: 30px;">One of the &ldquo;fun&rdquo; parts of dealing with threading. When there&rsquo;s multiple threads sharing resources assumptions are usually made and a lot of times they can be wrong and cause race conditions when the bugs only manifest itself when one thread gets there before another and one of them assumed there was going to be some sort of order.</p>
<ul>
<li>Reentrancy issues</li>
</ul>
<p style="padding-left: 30px;">Another threading issue, one of the common causes of these is when reentrant functions presume resources are thread safe while they&rsquo;re not necessarily completely thread safe.</p>
<p>On the test side of things:</p>
<ul>
<li>Dirty test assets</li>
</ul>
<p style="padding-left: 30px;">Depending on what your application consumes your assets might not always be clean. One good example here is testing a test editor where you&rsquo;re opening an existing file and doing some edits. The first time the test runs it might be pristine but if you don&rsquo;t do things right or cleanup correctly subsequent runs might run against a different file.</p>
<ul>
<li>Dirty application settings/environment</li>
</ul>
<p style="padding-left: 30px;">When the test depends on the state of the machine and/or the application and it doesn&rsquo;t ensure that everything is on the expected state you&rsquo;ll see different results depending on where tests are run.</p>
<ul>
<li>Lack of synchronization</li>
</ul>
<p style="padding-left: 30px;">Not every action finishes instantaneously so a lot of times you have to wait until that action is finished to validate your result or to perform other actions that depend on the previous one. A lot of times the synchronization is happening as part of your test API&rsquo;s but you shouldn&rsquo;t take anything for granted and always confirm that the correct synchronization is happening.</p>
<p><span style="font-size: small;"><strong><em></em></strong></span>&nbsp;</p>
<p><span style="font-size: small;"><strong><em>Section 4: Case studies</em></strong></span></p>
<p>Let&rsquo;s talk about actual examples of issues I&rsquo;ve seen while working on Visual Studio over the last few years that illustrate some of the issues I previously mentioned. I&rsquo;ll go over one common test bug and two interesting product bugs I&rsquo;ve had to deal with.</p>
<p><strong></strong>&nbsp;</p>
<p><strong>Section 4.1 &ndash; Blame Your Tester</strong></p>
<p>This is something I&rsquo;ve seen way more times than I&rsquo;d like to admit on multiple incarnations. Can you spot the bug in this algorithm?</p>
<p style="padding-left: 30px;">OpenVisualStudio()<br />CreateNewProject()<br />RequestIntelliSense()</p>
<p><br />The problem here is that after you create a new project IntelliSense is not immediately ready (is this reminding you yet of the synchronization issues we talked about before?). It&rsquo;s a very easy issue to fix as long as you have the right tools and you actually spot the issue. Now this is how it&rsquo;s usually solved, does it sound right?</p>
<p style="padding-left: 30px;">OpenVisualStudio()<br />CreateNewProject()<br />Sleep()<br />RequestIntelliSense()</p>
<p>So now we wait and then we perform the action. Issue solved right? No, and I can&rsquo;t express this enough. If you see a sleep there better be a good explanation as to why it was the last resort or sooner or later you&rsquo;ll hit the same issue. Sleeps are non deterministic, for all you know it might exit way earlier than the time you actually needed or even worse it will work most of the time and fail other times.</p>
<p>What should happen instead is something like this:</p>
<p style="padding-left: 30px;">OpenVisualStudio()<br />CreateNewProject()<br />WaitForIntelliSenseReady()<br />RequestIntelliSense()</p>
<p>In which you have some good deterministic synchronization that waits just the exact amount of time and won&rsquo;t introduce random failures.</p>
<p><em>Conclusion</em>: Synchronizing the right way makes a world of a difference yet it&rsquo;s one thing that&rsquo;s easy to overlook. When you end up with cases like this in which you hit the worst possible scenario of working most of the time but still failing in some occasions the statements we talked about on section two made by developers are more than justified.</p>
<p><strong></strong>&nbsp;</p>
<p><strong>Section 4.2 &ndash; Death by a Thousand Cuts</strong></p>
<p>This is an example that perfectly illustrates the &ldquo;it&rsquo;s someone else&rsquo;s bug&rdquo; attitude that we mentioned previously. It also caused me a lot of grief which you&rsquo;ll see soon enough why. So to start off here&rsquo;s the failure:</p>
<p>Before running tests our team does a couple of pre setup steps which ensure that we&rsquo;re running on a clean environment. Remember that pesky issue about dirty environment we mentioned earlier? This is one of the ways we deal with it. As part of this one of the steps is to load Visual Studio and reset the settings. Now, we don&rsquo;t want things to be hung so we set the timeout for this step to 5 minutes which is more than enough. All of the sudden this starts failing and everyone says it has nothing to do with them.</p>
<p>Now here&rsquo;s where the grief part starts, these are actual parts of an email conversation I had with one of the developers investigating a failure:</p>
<p style="padding-left: 30px;"><strong>Me</strong>: I&rsquo;m concerned about is that I&rsquo;m not seeing that issue in main (or elsewhere) and you mentioned that you hit it multiple times so if it is an issue it&rsquo;s coming from the branch and it should be investigated there.</p>
<p style="padding-left: 30px;"><strong>Developer</strong>: I am only looking at the debugger issue. If it fails on official runs the owner will need to take a look. I doubt that it is a product issue</p>
<p style="padding-left: 30px;"><strong>Me</strong>: If you had to rerun it multiple times that would be something you should investigate as that might mean we&rsquo;ll see the same failure on official runs. The timeout of that is 5 minutes, if a call to reset settings is taking that long there might be some perf regressions or other badness here.</p>
<p>So this already isn&rsquo;t going to well, over the next several weeks I start getting emails from a lot of different people about the test failing with the same common cause that timeout. At this point I think I was close to testing how sturdy my office door was by ramming my head into it quite a few times.</p>
<p>As usual though, I had keep fighting the good fight as I knew that the root cause here was a product issue and something that should get addressed. So fast forward 3 weeks later and after enough investigation was done there was a broad email from a developer manager high along the food chain acknowledging that we indeed had an issue and that we had multiple people working on it. Score one for testers standing up for the tests!</p>
<p><em>Conclusion</em>: The root cause for this failure ended up being multiple bugs on different packages that caused significant slowdowns that would only manifest themselves the first time the application was loaded. Interestingly enough the two tests that were hitting this, which of course came under fire and I had to fight off a lot of requests change in order to add workarounds, were not actually even going through the scenarios that were broken. It just so happened that their setup routines was uncovering issues that would have been otherwise ignored.</p>
<p><strong></strong>&nbsp;</p>
<p><strong>Section 4.3 &ndash; I Called Dibs!</strong></p>
<p>This was an extremely interesting case which yielded some big changes which I&rsquo;ll talk about later. Is there anything wrong with this test code?</p>
<p style="padding-left: 30px;">OpenVisualStudio()<br />CreateNewProject()<br />Build()</p>
<p>It turns out everything on the test side was correct, however under the wraps there were a lot of things going. After a project is created there&rsquo;s a bunch of background operations that happen in order to be able to deliver the full user experience including the work IntelliSense needs to do. In this case particularly both the IntelliSense engine and the build system have different builds going on (both using their own components).</p>
<p>So far so good, however both of them need to ask the build manager for some project specific data. So what happens when the build manager is busy? It turns out the way it works is that when there&rsquo;s a build in progress and someone asks the build manager for information it tells them sorry I&rsquo;m occupied right now, could you please ask me later? Now if any of the components is greedy and presumes that they&rsquo;ll get everything when they ask for it they&rsquo;ll eventually run into issues which is what ultimately happened here.</p>
<p><em>Conclusion</em>: The root cause of this ended up being that both of the consumers needed to handle the retry calls graciously and neither of them was so depending on who started first we&rsquo;d have a failure coming from the other component. As I mentioned earlier, this turned out to be an architectural issue that needed to be changed with both components understanding that they might not always have priority and that getting told to wait is a completely valid response.</p>
<p><span style="font-size: small;"><strong><em></em></strong></span>&nbsp;</p>
<p><span style="font-size: small;"><strong><em>Section 5: Promoting change</em></strong></span></p>
<p>So all of this is great information but you&rsquo;re still not sure as to how you can make a difference and change the culture around you? For starters you should always be thorough and be able to explain with confidence what&rsquo;s happening (even if all you have is a working theory). Here&rsquo;s three things you can do that will help your argument on failures being product bugs:</p>
<ul>
<li>Run the test on multiple iterations</li>
</ul>
<p style="padding-left: 30px;">Don&rsquo;t give up when it doesn&rsquo;t repros immediately, as we have mentioned multiple times just because it passes on rerun doesn&rsquo;t means everything is good. Most drivers have options to run a test multiple times so abuse it.</p>
<ul>
<li>Restore the machine to a clean state</li>
</ul>
<p style="padding-left: 30px;">This can be tedious and annoying as its very time consuming but sometimes it&rsquo;s the only way. If possible (and virtualization helps with this in a big way) you can restore the machine to the same state it was before the test was originally run. You don&rsquo;t always have to go that far though, every application has specific things that they do the first time they run (add registry entries, save setting files, etc). If you know your product well you should be able to manually get the machine back to that state.</p>
<ul>
<li>Cleanup the test assets and environments before and after the test</li>
</ul>
<p style="padding-left: 30px;">This probably should go without saying but if you eliminate as many variables from the equation as possible it makes it hard to argue that there are issues with the way the tests are doing something.</p>
<p>Now, there are cases when you have to just cut your losses and accept that the test failed without having a good explanation for it. Even when that is the case my previous statement still holds - always be through and explain things with confidence. Two very important tips in this area:</p>
<ul>
<li>Above all perform due diligence before dismissing it outright</li>
</ul>
<p style="padding-left: 30px;">If you&rsquo;re dismissing your test failures without exploring all possible options then you can&rsquo;t expect others to respect your tests which correlate to how much respect they have for you as a tester.</p>
<ul>
<li>Use your judgment and prioritize</li>
</ul>
<p style="padding-left: 30px;">Some tests are more important than others and as much as it pains us to admit it most bugs will get fixed but some bugs will not. If it&rsquo;s something that you consider extremely important go the extra mile but if it&rsquo;s something that you can probably live with due to the rarity and the severity of the bug your time might be better spent elsewhere. You know your product and your features so trust your judgement.</p>
<p><span style="font-size: small;"><strong><em>Section 6: Conclusion</em></strong></span></p>
<p>If nothing else there&rsquo;s one thing that I hope was ingrained in your brain from this:</p>
<p><strong>Pass on rerun and not repro resolutions are unacceptable.</strong></p>
<p>If that&rsquo;s all you got away from this then all this time was already more than worth it yet if you also got all these then you&rsquo;ll fully appreciate testing (and your testers) even more.</p>
<ul>
<li>Failures are bad, if they were acceptable then what&rsquo;s the point of having a test for it?</li>
<li>A lot of times flaky tests are just reflecting a flaky product, don&rsquo;t be quick to blame the tests.</li>
<li>Until you can prove that there&rsquo;s a test issue presume that it is a product issue.</li>
<li>Workarounds are a sign of a buggy product, if you have to work around something it probably means your customers will have to as well.</li>
<li>Even when it is a test issue, get to the root cause of it.</li>
</ul>
<p>&nbsp;</p>
<p></p>]]></content:encoded>
    </item>
    <item>
      <title>The Pitfalls of Code Coverage</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/the-pitfalls-of-code-coverage</link>
      <pubDate>Wed, 20 Apr 2011 18:34:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2011/04/20/the-pitfalls-of-code-coverage/</guid>
      <description><![CDATA[&nbsp;

When used correctly code coverage can be a great data point to assess your test quality...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal" align="center"><b style="mso-bidi-font-weight: normal"><o:p><span style="font-family: Calibri; font-size: small;"></span></o:p></b></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">When used correctly code coverage can be a great data point to assess your test quality and test holes. What a lot of people don&rsquo;t realize though is that code coverage doesn&rsquo;t actually means good tests or even that all the areas that are covered are actually tested correctly. There are several things you should keep in mind when looking at code coverage numbers which we&rsquo;ll look at here.<o:p></o:p></span></span></p>
<p>&nbsp;
<div><o:p><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p><span style="font-size: medium;"><span style="color: #4f81bd;"><span style="font-family: Cambria;">What is code coverage?<o:p></o:p></span></span></span></o:p></div>
</p>
<p><o:p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>If you&rsquo;re already familiar with code coverage just browse over the code samples (as I&rsquo;ll reference them later) and skip to the next section. I&rsquo;m not going to go into details here but rather define the basic things one needs to know and show a small example using the MsTest code coverage tool in Visual Studio. The first concept with code coverage is <i style="mso-bidi-font-style: normal">blocks</i> which represent sections of your code. Take the following application as an example:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">01<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">class</span> <span style="COLOR: #2b91af">Program<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">02<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">03<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">static</span> <span style="COLOR: blue">int</span> Main(<span style="COLOR: blue">string</span>[] args)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">04<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">05<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">int</span> value;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">06<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">if</span> (<span style="COLOR: #2b91af">Int32</span>.TryParse(args[0], <span style="COLOR: blue">out</span> value))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">07<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">08<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">if</span> (value &gt;= 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">09<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">10<span style="mso-tab-count: 5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">return</span> FuncA(value);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">11<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">12<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">else<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">13<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">14<span style="mso-tab-count: 5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">return</span> FuncB(value);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">15<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">16<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">17<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">else<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">18<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">19<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">return</span> 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">20<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">21<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">22<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">23<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">static</span> <span style="COLOR: blue">int</span> FuncA(<span style="COLOR: blue">int</span> value)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">24<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">25<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">return</span> value + 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">26<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">27<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">28<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">static</span> <span style="COLOR: blue">int</span> FuncB(<span style="COLOR: blue">int</span> value)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">29<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">30<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">return</span> value - 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">31<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">32<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">That application contains thirteen blocks but for simplicity I&rsquo;m going to name the major ones<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpFirst"><span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><span style="mso-list: Ignore"><span style="font-size: small;">&middot;</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Line 6<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><span style="mso-list: Ignore"><span style="font-size: small;">&middot;</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Line 7-8<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><span style="mso-list: Ignore"><span style="font-size: small;">&middot;</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Lines 9-10<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><span style="mso-list: Ignore"><span style="font-size: small;">&middot;</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Lines 13-14<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><span style="mso-list: Ignore"><span style="font-size: small;">&middot;</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Lines 24-26<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpLast"><span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><span style="mso-list: Ignore"><span style="font-size: small;">&middot;</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Lines 29-31<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">The simplest way of visualizing a block is a continuous block of code that executes some code. Notice for example how the declaration of value at line 5 doesn&rsquo;t counts as a block. In general you&rsquo;ll never really worry about where blocks are since code coverage applications do that for you. When a test executes some blocks will be hit and the percentage of blocks hit will be your code coverage numbers.<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">I added this simple test to my project:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>[<span style="COLOR: #2b91af">TestMethod</span>()]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>[<span style="COLOR: #2b91af">DeploymentItem</span>(<span style="COLOR: #a31515">"ConsoleApplication3.exe"</span>)]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">public</span> <span style="COLOR: blue">void</span> MainTest1()<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">string</span>[] args = <span style="COLOR: blue">new</span> <span style="COLOR: blue">string</span> [] {<span style="COLOR: #a31515">"0"</span>};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">int</span> expected = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">int</span> actual = <span style="COLOR: #2b91af">Program_Accessor</span>.Main(args);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #2b91af">Assert</span>.AreEqual(expected, actual);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">After running the test I get the following numbers:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="mso-no-proof: yes"><v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" id="_x0000_t75"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span><o:p></o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;"><span style="font-family: Calibri; font-size: small;"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/29/8863.CodeCoverageNumbers.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-29/8863.CodeCoverageNumbers.jpg" border="0" /></span></span></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">And Visual Studio colors the blocks to show me what&rsquo;s covered (blue) and what&rsquo;s not covered (orange):<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="mso-no-proof: yes"></span><o:p></o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;"></span></o:p></p>
<p class="MsoNormal"><o:p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/29/1884.CodeCoverageBlocks.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-29/1884.CodeCoverageBlocks.jpg" border="0" />&nbsp;</o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<h2 style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt"><span style="font-size: medium;"><span style="color: #4f81bd;"><span style="font-family: Cambria;">A good test and a bad test that have the exact same coverage<o:p></o:p></span></span></span></h2>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Code coverage will only show you which portions of your code were executed when running a test but it will not tell you if those portions of the code actually behaved correctly. That means that code coverage is somewhat reliable in order to say things like my application runs with the following input set. It doesn&rsquo;t tell you however how resilient or buggy your application might be. On the test side it doesn&rsquo;t means that your tests aren&rsquo;t a pile of garbage, just that they touch certain spots.<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Take the same simple test we used above (and keep in mind this is a simple application and this is an extreme case). If I removed the last line of the test (the one that does the verification) the code coverage numbers will come back exactly the same. Let&rsquo;s take that a step further and run this test:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>[<span style="COLOR: #2b91af">TestMethod</span>()]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>[<span style="COLOR: #2b91af">DeploymentItem</span>(<span style="COLOR: #a31515">"ConsoleApplication3.exe"</span>)]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">public</span> <span style="COLOR: blue">void</span> MainTest2()<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: blue">string</span>[] args = <span style="COLOR: blue">new</span> <span style="COLOR: blue">string</span>[] { <span style="COLOR: #a31515">"0"</span> };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #2b91af">Program_Accessor</span>.Main(args);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>args = <span style="COLOR: blue">new</span> <span style="COLOR: blue">string</span>[] { <span style="COLOR: #a31515">"-1"</span> };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #2b91af">Program_Accessor</span>.Main(args);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>args = <span style="COLOR: blue">new</span> <span style="COLOR: blue">string</span>[] { <span style="COLOR: #a31515">"a"</span> };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #2b91af">Program_Accessor</span>.Main(args);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">There are no verifications whatsoever on that test but if you&rsquo;re just going on code coverage you just wrote the perfect test:</span></span><o:p><span style="font-family: Calibri; font-size: small;"><span style="font-family: Calibri; font-size: small;"></span></span></o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;"><span style="font-family: Calibri; font-size: small;"></span></span></o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;"><span style="font-family: Calibri; font-size: small;"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/29/7343.CodeCoverageNumbers100.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-29/7343.CodeCoverageNumbers100.jpg" border="0" /></span>&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="mso-no-proof: yes"></span><o:p></o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">I have to add a disclaimer here, while that&rsquo;s the worst test you can write when doing functional and correctness testing it has its value if you&rsquo;re running stress testing as it&rsquo;s touching all of the code.<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<h2 style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt"><span style="font-size: medium;"><span style="color: #4f81bd;"><span style="font-family: Cambria;">Background work items<o:p></o:p></span></span></span></h2>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Here&rsquo;s one of those cases where things get tricky. If you&rsquo;re testing a more complex app chances are it&rsquo;s a multithreaded app and there&rsquo;s some work going on in the background most of the time. Here&rsquo;s an actual example I ran into a few weeks ago. I was running some tests for one of our language services and here&rsquo;s how the test looked like:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">1)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Open a file<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">2)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Wait for the file to be colorized in the editor window<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">3)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Verify that it&rsquo;s colorized correctly<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpLast"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Keep in mind that code coverage is per assembly and the assembly contains the whole language service which includes way more than just colorization. I had run these tests before and the code coverage was around the 30% range but this time it gave me around 80%. You can imagine my surprise when the exact same of tests gave me 50% more coverage when there had been no changes to the code base. How did that happen? <o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Let me briefly explain here how a language service work (which will give you a hint of where the extra coverage comes from). When you open a file Visual Studio loads the language service associated with that extension. Most language services start by parsing the file in order to find the classifications, and then run other components for more complex information (outlining, intellisense, etc). All of these, including the colorization, are done in separate threads in the background after the document is loaded. <o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">The difference here between previous runs and this one is that I had a bunch of other things opened in my machine that were consuming resources and thus slowing down the test. Usually the tests are pretty fast so as soon as colorization was finished the test exited. In this case that extra time that the test was running allowed some of these other background operations to complete. Easy way of proving this theory, add a fourth step to the test that sleeps for 10 seconds. Every single time I ran the test with that it hit the 80% mark.<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">The one take away here, if your code coverage is hitting more blocks than the scenario you&rsquo;re actually testing its most likely that it&rsquo;s due to background operations and your total coverage is bloated. <o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<h2 style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt"><span style="font-size: medium;"><span style="color: #4f81bd;"><span style="font-family: Cambria;">So what does code coverage data actually tells me?<o:p></o:p></span></span></span></h2>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">The one thing that&rsquo;s absolute about code coverage is that if you&rsquo;re not getting code coverage in one area it&rsquo;s simply not tested at all. You can take this information to:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">a)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Add more tests for that area.<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">b)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Figure out which edge cases you haven&rsquo;t tested yet.<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">c)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">What portions of the code you&rsquo;re purposely not testing.<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpLast"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">One additional note to that last point, while having 100% code coverage looks nice it shouldn&rsquo;t (and usually isn&rsquo;t) a realistic goal. A well coded application will probably have some redundant fault tolerance that it&rsquo;s expensive to test on a regular basis. For example let&rsquo;s say the application queries some services which can rarely crash. A good application will be resilient to this but testing that could be expensive (say for example you would have to go and corrupt some memory in order for this to happen). There is a point of diminishing returns here.<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Conversely you can use the data from the things you are covering to:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">a)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Reduce code bloat by eliminating duplicated tests - Yes there can be such thing as too many tests.<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">b)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Ensure that your mainstream scenarios are covered &ndash; This is particularly useful when you&rsquo;re evaluating the coverage on a subset of tests that you want to prioritize versus running your full set of tests.<o:p></o:p></span></span></p>
<p class="MsoListParagraphCxSpLast"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><span style="mso-list: Ignore"><span style="font-family: Calibri; font-size: small;">c)</span><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Optimize your test bed &ndash; If running your tests is expensive you can use code coverage as a supplementary data point as to add the minimum number of tests that give you the maximum amount of coverage.<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">The key point here is that code coverage is a very important part of testing in the software cycle however it should be used as a tool rather than a primary data point to make decisions. The numbers should always be analyzed and the conclusions should come out of that analysis not out of the numbers themselves.</span></span></p>
</o:p></p>]]></content:encoded>
    </item>
    <item>
      <title>Regular expressions for float values and coordinates</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/regular-expressions-for-float-values-and-coordinates</link>
      <pubDate>Tue, 01 Mar 2011 14:02:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2011/03/01/regular-expressions-for-float-values-and-coordinates/</guid>
      <description><![CDATA[I was working with some pixel values the other day and I had this problem; I&rsquo;m getting an...]]></description>
      <content:encoded><![CDATA[<h1 align="center" style="text-align: center; line-height: normal; margin: 0in 0in 0pt;"><span style="color: #365f91;"><span style="font-family: Cambria;"><o:p></o:p></span></span></h1>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">I was working with some pixel values the other day and I had this problem; I&rsquo;m getting an RGBA value from my object model but it returns it on a string format (ie: <b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;">0, 1, 1, .5</i></b>). For this specific task I only cared about the alpha value so I figured writing a regular expression for it should be the easiest way to do this and I was in for a fun surprise.<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">So I started out with this:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">\d,\s\d,\s\d,\s\d<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Wrong!!</strong> &ndash; I forgot one cardinal rule about regular expressions, they work against string content so a decimal will not be considered part of a number. So long story short what I thought should be a simple regular expression turned into a scary one (at some point I should have given up on it and used String.Split but where would the fun in that be?). So here&rsquo;s the final version of it:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">\d+(\.\d*)?,\s\d+(\.\d*)?,\s\d+(\.\d*)?,\s(?&lt;alpha&gt;\d+(\.\d*)?)<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">A breakdown of that expression<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">\d+(\.\d*)? &ndash; This will pick up my values, it will pick up both 1 and 1.0<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">,\s &ndash; This is the separator which in my case is always a comma followed by a space<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">(?&lt;alpha&gt;\d+(\.\d*)?) &ndash; This is the same as the first part except that I defined this group as alpha so that I could pull the value. I<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">And a snippet of the code where it would be used (I defined groups for all 4 values here:<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<table cellpadding="0" cellspacing="0" border="1" class="MsoTableGrid" style="border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt;">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes;">
<td width="638" valign="top" style="padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 6.65in; padding-right: 5.4pt; padding-top: 0in; mso-border-alt: solid windowtext .5pt; border: windowtext 1pt solid;">
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 8pt;">Regex</span><span style="font-family: Consolas; font-size: 8pt;"> exp = <span style="color: blue;">new</span> <span style="color: #2b91af;">Regex</span>(<span style="color: #a31515;">@"(?&lt;red&gt;\d(\.\d*)?),\s(?&lt;green&gt;\d(\.\d*)?),\s(?&lt;blue&gt;\d(\.\d*)?),\s(?&lt;alpha&gt;\d(\.\d*)?)"</span>);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: green; font-size: 8pt;">// Get this value from somewhere</span><span style="font-family: Consolas; font-size: 8pt;"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: blue; font-size: 8pt;">string</span><span style="font-family: Consolas; font-size: 8pt;"> value = ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 8pt;">Match</span><span style="font-family: Consolas; font-size: 8pt;"> match = exp.Match(value);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: blue; font-size: 8pt;">string</span><span style="font-family: Consolas; font-size: 8pt;"> alpha = match.Result(<span style="color: #a31515;">"${alpha}"</span>);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: green; font-size: 8pt;">// Do some comparison with your alpha value &hellip;</span><span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #2b91af; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Similar expressions can be used for coordinates (both 2D and 3D)<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">2D : <b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;">(3.1,23,5)</i></b> = <span style="mso-spacerun: yes;">&nbsp;</span>\((?&lt;X&gt;\d(\.\d*)?),(?&lt;Y&gt;\d(\.\d*)?)\)<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">3D : <b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;">(3.1,23,5,90)</i></b> = <span style="mso-spacerun: yes;">&nbsp;</span>\((?&lt;X&gt;\d(\.\d*)?),(?&lt;Y&gt;\d(\.\d*)?),(?&lt;Z&gt;\d(\.\d*)?)\)<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>]]></content:encoded>
    </item>
    <item>
      <title>Manual Testing and Babysitting Your Tests</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/manual-testing-and-babysitting-your-tests</link>
      <pubDate>Fri, 03 Dec 2010 18:17:19 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2010/12/03/manual-testing-and-babysitting-your-tests/</guid>
      <description><![CDATA[No matter how much test automation
you have nothing will ever substitute the value added by manual...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;">No matter how much test automation
you have nothing will ever substitute the value added by manual testing. I
could go on as to why but nothing beats a real story so here's what happened to
me a couple of weeks ago:</p>
<p style="text-align: justify;">I had just finished implementing some
formatting tests for a new language service so I ran them to see if they were
doing what I wanted them to do (on a side note is testing the tests considered
recursion?). While one of the newer tests is running I hear some odd beeps from
my computer. I'm always listening to music while I work so at first I was
wondering if that was just part of whatever song was playing. Kill the music and
run the test again this time with my speakers way up and there were the beeps
again. I manually did what the test was doing to make sure it wasn't something weird
from the test library and confirmed that it was indeed a bug in VS.</p>
<p style="text-align: justify;">At that point I freaked out a lil
bit since it was a Friday night and most everyone had left already plus we were
locking down on code changes but I did find someone still around to debug the
issue with and fix it. So what was the problem? The test was simply opening an
empty file and typing this:</p>
<pre class="scroll"><code class="cplusplus">int foo()<br />{<br />     int a = 0;</code></pre>
<p style="text-align: justify;">And on the first letter of each "word"
IntelliSense was trying to kick in and failed (the failure was expected) so it
beeped. The bug was that on scenarios like the one I was testing it shouldn't
have even tried to kick in. Now you can imagine how annoying this would be on a
real production environment if your computer was beeping for the first letter
of each thing you typed...</p>
<p style="text-align: justify;">Even though I noticed it while running a test there
would have been absolutely no way we could have caught this through our
automated tests since we don't test for sound. Lesson here never forgo doing
manual testing because you have good coverage on your automated tests. At the
very least sit down every once in a while and watch your tests run and make
sure no "bad" behavior that's irrelevant to the test purpose (but important to
your user) is going on. &nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Changing the value of a property from a toolstrip control across threads</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/changing-the-value-of-a-property-from-a-toolstrip-control-across-threads</link>
      <pubDate>Fri, 16 Jul 2010 17:05:08 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2010/07/16/changing-the-value-of-a-property-from-a-toolstrip-control-across-threads/</guid>
      <description><![CDATA[I ran across this issue while working on the UI for one of our tools and I found a bunch of code...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal" style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-family: Calibri;">I ran across this issue while working on the UI for one of our tools and I found a bunch of code samples to solve the issue for regular controls and vague references (but no samples) as to how to work with this on toolstrip controls (in my case I needed to enable/disable menu items). I won&rsquo;t go into the details of what it does since there&rsquo;s a million topics on the subject already but the basics is that you&rsquo;re declaring a delegate and then changing the property you want through reflection. This is the code for regular controls:<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; color: blue; font-size: 9.5pt;">delegate</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">void</span> SetControlValueCallback(Control control, <span style="color: blue;">string</span> property, <span style="color: blue;">object</span> value);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; color: blue; font-size: 9.5pt;">void</span><span style="font-family: Consolas; font-size: 9.5pt;"> SetControlPropertyValue(Control control, <span style="color: blue;">string</span> property, <span style="color: blue;">object</span> value)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">if</span> (control.InvokeRequired)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SetControlValueCallback callback = <span style="color: blue;">new</span> SetControlValueCallback(SetControlPropertyValue);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>control.Invoke(callback, <span style="color: blue;">new</span> <span style="color: blue;">object</span>[] { control, property, value });<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">else</span><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #2b91af;">Type</span> t = control.GetType();<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #2b91af;">PropertyInfo</span> p = t.GetProperty(property);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>p.SetValue(control, value, <span style="color: blue;">null</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: justify; line-height: normal; text-indent: 0.5in; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-size: small;"><span style="font-family: Calibri;">The problem with toolstrip controls is that they don&rsquo;t really inherit from the control class so you can&rsquo;t call Invoke on them. The trick is to call invoke on the Owner control while still passing the toolstrip control to the callback (if you pass the owner control to the callback you&rsquo;ll get some funny results like your whole menu bar being disabled&hellip;). Here&rsquo;s the code snippet for that:<span style="font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; color: blue; font-size: 9.5pt;">delegate</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">void</span> SetToolstripValueCallback(ToolStripItem toolstripItem, <span style="color: blue;">string</span> property, <span style="color: blue;">object</span> value);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; color: blue; font-size: 9.5pt;">void</span><span style="font-family: Consolas; font-size: 9.5pt;"> SetToolstripPropertyValue(ToolStripItem toolstripItem, <span style="color: blue;">string</span> property, <span style="color: blue;">object</span> value)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;">{<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">if</span> (toolstripItem.Owner.InvokeRequired)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SetToolstripValueCallback callback = <span style="color: blue;">new</span> SetToolstripValueCallback(SetToolstripPropertyValue);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>toolstripItem.Owner.Invoke(callback, <span style="color: blue;">new</span> <span style="color: blue;">object</span>[] { toolstripItem, property, value });<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">else</span><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #2b91af;">Type</span> t = toolstripItem.GetType();<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #2b91af;">PropertyInfo</span> p = t.GetProperty(property);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>p.SetValue(toolstripItem, value, <span style="color: blue;">null</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0in 0in 0pt; mso-layout-grid-align: none;"><span style="font-family: Consolas; font-size: 9.5pt;">}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></o:p></p>]]></content:encoded>
    </item>
    <item>
      <title>Unit testing, component level testing and UI testing, what to use and when</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/unit-testing-component-level-testing-and-ui-testing-what-to-use-and-when</link>
      <pubDate>Thu, 29 Apr 2010 19:03:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2010/04/29/unit-testing-component-level-testing-and-ui-testing-what-to-use-and-when/</guid>
      <description><![CDATA[This is a topic that anyone doing software testing faces every time they are writing new tests. What...]]></description>
      <content:encoded><![CDATA[<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>This is a topic that anyone doing software testing faces every time they are writing new tests. What are the advantages and disadvantages of each? When should I use them? What’s a healthy mix?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Let’s start with the basic definition of each of these scenarios:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">Unit Testing</B> – Unit testing is testing directly at the most granular level. If given a method that takes two values and return a positive result. Does the method fails (crashes, throws an exeption, etc) if either of the values is null or invalid? Does it return valid results given a specific set of values? Does it fails if given an incorrect set of values?<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">Component Level Testing</B> – Similar to unit testing but with a higher level of integration. The big difference here is that the testing is done in the context of the application instead of just directly testing the method in question. Take the same example as the method above, say that the method is invoked through a keyboard shortcut after your application opened a document and after it executes something is displayed on the application. While testing at the component level you would have the application open and the document displayed but you would be testing the method and evaluating it’s result (without taking into account the shortcut or what gets displayed on the application afterwards). For the most part this is the kind of testing we do when there are test hooks inside your product code.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">UI Testing</B> – This tests the whole end to end scenario (which simulates exactly what the user would be doing). This (for the most part) goes through all the mouse clicks and keyboard presses the user goes through to get an action done. If we extend the previous example this would be invoking the same action except that this time instead of using any test hooks it would be using the keyboard shortcut and instead verify the actual displayed results on the application.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="MARGIN: 10pt 0in 0pt" class=CustomHeading><STRONG><FONT size=4><FONT color=#4f81bd><FONT face=Cambria>What method to use?<o:p></o:p></FONT></FONT></FONT></STRONG></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><I style="mso-bidi-font-style: normal"><o:p><STRONG><FONT size=3 face=Calibri>&nbsp;</FONT></STRONG></o:p></I></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>The question that first comes to mind for everyone, since UI testing is the most complete and closest to the user why not simple do UI testing exclusively and be done with it? Going through the UI will execute the action at every layer and that in turn will call the individual methods so why not simplify things? The issue here is that for extensive scenarios you have to pay the cost of loading the application and going through all the actions every single time (which depending on your application it can take several minutes per test).<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>After hearing the opposite comes to mind, so if doing UI testing is so expensive why not simply do Unit Testing which is pretty cheap since it only needs to invoke the functions for the multiple scenarios? With this approach you’ll know that all your methods are working properly but you’re not testing the integrations of the features and the product as a whole.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>That leaves us with the third option; component testing seems to be a pretty good happy medium? Why not just do component level testing then? While this would cover most of the scenarios we’re still missing one layer of testing that still needs to be tested<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>The table below summarizes the integration level versus the speed/cost of each method:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<DIV align=center>
<TABLE style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-COLLAPSE: collapse; BORDER-TOP: medium none; BORDER-RIGHT: medium none; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" class=MsoTableGrid border=1 cellSpacing=0 cellPadding=0 class="MsoTableGrid">
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 72.9pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt" vAlign=top width=97>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 0.75in; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=72>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Speed<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 67.5pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=90>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Integration<o:p></o:p></FONT></FONT></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 72.9pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=97>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Unit<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 0.75in; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=72>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Fast<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 67.5pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=90>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>None<o:p></o:p></FONT></FONT></P></TD></TR>
<TR style="mso-yfti-irow: 2">
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 72.9pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=97>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Component<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 0.75in; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=72>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Fast<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 67.5pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=90>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Partial<o:p></o:p></FONT></FONT></P></TD></TR>
<TR style="mso-yfti-irow: 3; mso-yfti-lastrow: yes">
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 72.9pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=97>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>UI<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 0.75in; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=72>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Slow<o:p></o:p></FONT></FONT></P></TD>
<TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #f0f0f0; PADDING-BOTTOM: 0in; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; WIDTH: 67.5pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0in; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=90>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Full<o:p></o:p></FONT></FONT></P></TD></TR></TBODY></TABLE></DIV>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>There’s no reason to be completely constrained by any of the methods so the answer to the question is you want to use all of them. The question then becomes what do I test with each method and what amount of testing, per method, is enough. The answer here is going to be different for everyone and it’s going to be constrained by the product and features you’re testing.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>These are the general rules I follow:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">Unit Testing</B> – Sanity tests at the lowest level. Make sure the methods can handle valid and invalid data and that the basic functionality works. No real test case scenario testing here. (Note: depending on how your organization is defined this might fall solely on the feature owner rather than the testers).<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">Component Level Testing</B> – The bulk the work is here; test all the define test case scenarios here since it’s fast and gives a good amount of coverage.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">UI Testing</B> –This covers the things you can’t test through component level testing such as verifying that actual UI elements are displayed correctly. In addition to that end to end scenarios, this means running a very small subset of the scenarios testing through the component level to verify that the feature as a whole, as the user will be experiencing it, will work.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>With that mix you can have full coverage of the whole feature with a major emphasis on correctness with an extra layer of testing for the UI integration. The huge advantage here is that since your correctness testing is relatively fast you can run and investigate a full test run in a fraction of the time that it would take to do a full UI test pass but without actually neglecting the UI scenarios.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>One thing here that I want to make some emphasis on is that people have a preference for one type of testing over the other (which is natural) however some people end up with tunnel vision and dismiss the other methods which as we’ll see from the next example can either hurt efficiency or coverage (or both).<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="MARGIN: 10pt 0in 0pt" class=CustomHeading><STRONG><FONT size=4><FONT color=#4f81bd><FONT face=Cambria>Case Study<o:p></o:p></FONT></FONT></FONT></STRONG></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT face=Calibri><FONT size=3>Let’s take those 3 concepts on more concrete example, a simplified IntelliSense scenario.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>When a call is invoked the compiler calculates the raw result data and passes it to the IDE which does some formatting and then that result is passed to the Editor to be displayed. Our three components here are the compiler, the IDE and the editor.</FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT face=Calibri><FONT size=3></FONT></FONT>&nbsp;</P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT face=Calibri><FONT size=3><o:p><IMG style="WIDTH: 466px; HEIGHT: 106px" title="IntelliSense Action" alt="IntelliSense Action" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/00/49/64/IntelliSense%20Action.jpg" original-url="http://blogs.msdn.com/photos/raulperez/images/10004964/original.aspx" width=466 height=106 mce_src="http://blogs.msdn.com/photos/raulperez/images/10004964/original.aspx">&nbsp;</o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:group style="Z-INDEX: 251660288; POSITION: absolute; TEXT-ALIGN: left; MARGIN-TOP: 12.75pt; WIDTH: 342pt; HEIGHT: 1in; MARGIN-LEFT: 82.5pt; LEFT: 0px" id=Group_x0020_10 coordsize="43434,9144" o:spid="_x0000_s1026" o:gfxdata="UEsDBBQABgAIAAAAIQC75UiUBQEAAB4CAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKSRvU7DMBSF&#13;&#10;dyTewfKKEqcMCKEmHfgZgaE8wMW+SSwc27JvS/v23KTJgkoXFsu+P+c7Ol5vDoMTe0zZBl/LVVlJ&#13;&#10;gV4HY31Xy4/tS3EvRSbwBlzwWMsjZrlprq/W22PELHjb51r2RPFBqax7HCCXIaLnThvSAMTP1KkI&#13;&#10;+gs6VLdVdad08ISeCho1ZLN+whZ2jsTzgcsnJwldluLxNDiyagkxOquB2Knae/OLUsyEkjenmdzb&#13;&#10;mG/YhlRnCWPnb8C898bRJGtQvEOiVxjYhtLOxs8AySiT4JuDystlVV4WPeM6tK3VaILeDZxIOSsu&#13;&#10;ti/jidNGNZ3/J08yC1dNv9v8AAAA//8DAFBLAwQUAAYACAAAACEArTA/8cEAAAAyAQAACwAAAF9y&#13;&#10;ZWxzLy5yZWxzhI/NCsIwEITvgu8Q9m7TehCRpr2I4FX0AdZk2wbbJGTj39ubi6AgeJtl2G9m6vYx&#13;&#10;jeJGka13CqqiBEFOe2Ndr+B03C3WIDihMzh6RwqexNA281l9oBFTfuLBBhaZ4ljBkFLYSMl6oAm5&#13;&#10;8IFcdjofJ0z5jL0MqC/Yk1yW5UrGTwY0X0yxNwri3lQgjs+Qk/+zfddZTVuvrxO59CNCmoj3vCwj&#13;&#10;MfaUFOjRhrPHaN4Wv0VV5OYgm1p+LW1eAAAA//8DAFBLAwQUAAYACAAAACEAJAtIA3oGAACeJgAA&#13;&#10;HwAAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWzsWttu2zgQfV9g/4HQe2tL8iUx6hSp&#13;&#10;m2QDBG0Qp+gzLVG2EIrUUnTi9Gv2W/bLdoYXWXFsJ/G2KIIYBmxKHA6Hw+HhXPzh46Lg5JapKpdi&#13;&#10;GITv2wFhIpFpLqbD4Nv16buDgFSaipRyKdgwuGdV8PHozz8+0MFU0XKWJwQ4iGpAh8FM63LQalXJ&#13;&#10;jBW0ei9LJqAvk6qgGh7VtJUqegecC96K2u1eq6C5CI6WrD5TTclc5Tuw4jK5YemIiltaAUueDJpv&#13;&#10;nIw8+f+c6UDcnqlyXF4qlDz5cnupSJ4OA9CcoAWoKGi5DkcGj62VUdMlg0WmCqSXWUYWsAOHvSjs&#13;&#10;Aq/7YXAQht243bb82EKTBAg6MXzgJUmA4jDsYNtOOPv6BItkdrKdCYhpxYFGQ0TTRBk3rDysl36m&#13;&#10;5Lwk8PybVWD158XYcdlVadf8eKvjrt/rKzkXKUvJFUvgkEw5I9DnF48D/eZ7JpWzm5VtfyDwE1td&#13;&#10;7xIdlKrSZ0wWBBvDALQvUhTFHCp6e1FpO7+nM5boRdCLsVmhXnyS6T2udQK/YM1KAi+QqCqT0xwY&#13;&#10;X9BKX1IFJxxeAlbor/CVcXk3DKRrBWQm1Y9175EeTh30BuQOEGMYVH/PqWIB4eeiciYcEG0eOt1+&#13;&#10;BHOoZs+k2SPmxUhyOCZGOtNEes19M1Oy+C5VeoyzQhcVCcw9DBKt/MNIwzN0ATAl7PjYtBNZlFRf&#13;&#10;iHEJEBEa9aHOrhffqSqddjXsyxc5ntGSrdOvpTUmI4/nWma5U77VKnbwSo/1PWfGQIzuwRpIQdWF&#13;&#10;EQIaV9gwpCgKNmATLhNNbimuGpDBHnewAd6g+MQyT6srS2uMH8hg/LL3ONOrdOGSI5AaAhjlrFQh&#13;&#10;tQIZORj3MGDi3bcxaP4HigKCYC/LMjA4a2kgFNW5IPq+ZBlNAAtHlOcTldsjweimnqRq9FznBavI&#13;&#10;F3ZHrmRBBY4FiUAKnE4f/fsPPsI68KX5Bk3im9qM5xUbl3gM7Ehv5xWqHnlwccUywGxA08iswdxY&#13;&#10;bMSVVR1NEiZ0x3bNaMrsa9R9rVW843CEmdowRM5ZznnN25rRBt5WNEe/1GM92Cp362CreRhhZpZC&#13;&#10;14OLXEi1bmVch06dmaU34jvFgA4t5G0Bvr4HvmsEqU9yQeK+3Vy4CBHjCG4D3mNuHmHeooQedlaQ&#13;&#10;D664uBsBoMJ11uv1+g4+PQaGUa93gN143UXdfmgJQFbPx2Obx8Ct8AdiSJ6np7BPRia/jXaHl+p5&#13;&#10;QMUFAajrxXAtm0FNDjh7bTgTTpMbt/AGBxCWCxzZPCtG286m3xIQ6z0MW5Q10Hzp4frVwfC50Izz&#13;&#10;fMxExchxoiF++Im4vAX+PLKsB91nDNwJdP2sO4BueuMHbwPdp5zsQ4+81sc+rFH3zMYS9kJ54KEb&#13;&#10;lhZiPFi6KCOO4gMXZHTiA4w3YDjgkwsP4l6/18N+BN24H3Y8Kic+xoA+6HrkYG8YWKM1NBpCbb5n&#13;&#10;wL2zsdTSrzY6NPEWXjN+tdg2mOx+V9b5QEy/Ohc0rSyulvGxV731RnmrOP6aHGpC+RSyGygyGkvT&#13;&#10;c/6lvnXtLb4Kx3oEMVDOmfqJML7FvXbe8S9xr2u8te740vWqPeRnXBM7IP3Sf9yG9JthL3oMe1GN&#13;&#10;8y+AvRAwuwexSgOj9+CHqbKAvL1swh78TCbiiazC+eeTPe6ZbMBvwL34Me7Fu+Be1O9FkfNrV1za&#13;&#10;vdOHyVaXX30TWdQ97j0H907SXMu9y2fjyV8GfckCkvXohorbETZt0LqsHXY8AI61ovl0psmxUvKO&#13;&#10;jKQQEH1KRTo1HjoGPgJu8KvWB8GHcdxxoAj4aFPYy1i/Ex5iKt9Ewz5e8VH0Smq1csLVUlkffm2d&#13;&#10;yac8G2lQSHip6aROlp6emny6K80WzyrNQoXkZl6+s9WafJLzXN+bUnJAimRwPoW0N51wrMH6qnTY&#13;&#10;eVTyLfJEyUpm+j3waUFGJE+Yr0wDs7Bt69JWwQ/k1zTnJyI1tYphQHGLcFsgBYD53UYmYF2pYUs5&#13;&#10;wMcrryalpRde5PWBTm3vdWOD4deF1I2Gvyynvtjwo7jdhY8Jg8JuVFfKfSy0N/296WPx8kUltJ9m&#13;&#10;+vDHGpvj3Gj6By/EfJLxvPzL169dqreB/lBK66+B//Yh5JYx07uH/98D/ybHYy4Rb4nNMvKWVJUf&#13;&#10;uFNFww/ewel55hmAJbmqRqO18s8sc226f5Lh37+az0f/AQAA//8DAFBLAwQUAAYACAAAACEANTdd&#13;&#10;VEoHAAD/IwAAGgAAAGNsaXBib2FyZC90aGVtZS90aGVtZTEueG1s7FpPb9s2FL8P2HcgdG/9P42D&#13;&#10;OkXs2M3Wpg1it0OPtERLrClRoOikvg3tccCAYd2wwwrstsOwrUAL7NJ9mmwdtg7oV9gjKdliLC9J&#13;&#10;G2xO0Rwc6enx/eV7/InU1WsPQoYOiEgoj1pO5XLZQSRyuUcjv+XcGfQurTsokTjyMOMRaTlTkjjX&#13;&#10;Nj/84CrecBmNhxwLbxCQkCAQFCUbuOUEUsYbpVLiAhknl3lMIng24iLEEm6FX/IEPgQFIStVy+W1&#13;&#10;Uohp5GyCRKkEdRn8RDJRBJeJvhJDUIRD0H57NKIu0bzeuKI4kmnSYQIdYNZyQKbHDwfkgXQQw4mE&#13;&#10;By2nrP+c0ubVEt5IBzG5ZGxuXE//pePSAd64qnUKfzhTWunVm1e2ndT90D2N/yEW40l8yeVhjCUd&#13;&#10;UkblVIfCQaG78ZEfcYGHDPzNxOJKfUFuSF3BEz6Sl0FOievIZJEFYZWyiWvmuLacyUUHut1up1vJ&#13;&#10;NK2qA6nl2HVhbpjs5bNQ761X2iufhZz15nIxG51yo1y/II5o640jtYW6aLbb7UZz1adVznpzWV9w&#13;&#10;ZL28Vt+qXgxHtPXGkcaCI/X2VqezdjEc0dYbR9YWHOldaa7VL4gj2vqA0Wi84IZamHq9Vc/HzPYR&#13;&#10;ZzuFfqyDH+uAGwwAWNUFZG4+4IAZrlBJGfFILkMZIb7PRQ8YFCODxTpCchqTEXZhde7gcCgoVhgB&#13;&#10;bxCce2JIbrJAUrpQ4goay5bzcYwjJ8fy+sWPr188Q0cPnx89/OXo0aOjhz8bQdaoHRz5+VGvvv/i&#13;&#10;7yefor+efffq8VfF/Eme//efPvvt1y+LGQE4zd17+fXTP54/ffnN53/+8LiAfQswSp59QEOSoFvk&#13;&#10;EO3zEBzTUbEtJ0NxthGDANP8iK3IT3CElZYC+V0ZWNy3ppil2bHsaBM7gncFAMcixuuT+5bB/UBM&#13;&#10;JC3QfCMILcZdzlkbQFxRFG4oXbkwDyaRX6xcTPJ8+xgfFOnu4MjKb3cSA2LOpqXleCcglpl7DEcS&#13;&#10;+yQiEqlnfExIgXf3KLXiupshT3SPojamhSEZ0KE1m+aDdmgIeZkW+Qz5tmKzexe1OSvyepsc2JxQ&#13;&#10;FZgVGD8gzArjdTyROCwSOcAhywf8JpZBkZH9qXDzfN1EQqZ9wjjqeiRJisbcFuBvLuk3MLTSwrTv&#13;&#10;smlocwpJx0Uyb2LO85zbfNwJMLxSFEShT6Mgz/tRMoYpitEel0Xsu9yuEHUPecDR0nTfpcRK98nd&#13;&#10;4A71LZPmE0Q9mYgCL64Tbs3f/pSNMNFFBk3d6tUhhZeo3tLGzSh0bqPh/Bo3tMqX3z4psHtVW/YW&#13;&#10;rF5FNbNzrFEv4zvenjtceHT1u/M2nkR7BApicYl635zfN2fnnW/Oy+r5/FvyvAtDg1ZYxABtDbvD&#13;&#10;pah7RBnryykjNxMNvBNYe7weENU4va9IZvtvcQCXqpJBgcXnC6zHIMHlJ1QG/QDHANorjhLiJ6lo&#13;&#10;P0ExT2CbUJMLZSt+AP7SbDI21Gub6RwJlrvcM+SaImu6skPvWYJd2ipfb2VmimpKwGmV1a6kQkHm&#13;&#10;myirKKNOra2iTdNN0dI2c7nQNSDOogmgBgEUgiivwc6uUg0vO5gRT8Xd5ChLi87CeaYoCbBH0hwp&#13;&#10;vxdzVNFJyubKv+RIvdGeELWctqYS+xbaTpOkvLr6EnVZ9t4mS9kMnmcJpB0vRxbli5NF6LDlNBvV&#13;&#10;hoNcHLecEbwnw2UYQ9YThSMx8+FswZXCTPsTi1lX+TybzcwxuwgqsFNq4r7gsNUHYpHIbZwEZmro&#13;&#10;R+kUYJHSZOyvNiCs5+VAQTc6nRW1dZgM/5sVEEc7tWQ0Iq7MJztHUbEzt2kr5RNJRD/wDtGQTcQ+&#13;&#10;hvSrqQr+eDSB7Q7dEdQNnMqoaOtHdnNOiy6/s6/5QMaq7i6pMGAWBzhdB1TvyFqM8UMvArPg6Ltc&#13;&#10;3CDohUHVUT97jHUvetdjnC/89zE+n3PC4/P4rDFWqAc2kmqeEuTCaa3ASDW9lsOFDDgsKHFA3Z4A&#13;&#10;DKiXASh8OKSFx1DbcLSs/wtyoP6b9mlkKGkM9gPkPvWRoAAtZCAI2YMVRjeSE4RVUhhiRGaCDFic&#13;&#10;m5vExuwhOSBsoJazNQXTHBRA19ILQ9rRNd/xirXv02Y49BVezbdOa1GaIUTTNf5rEGv6MjhlL6ka&#13;&#10;m2bxn5lYAGLNeD08g1F5R9SDOWKuZ1MJlOVW9WbaKN/QhDOiJrP4LHhcbWTGQRYXPQbiDNvCUX2A&#13;&#10;1A9AGSpcZj5DUNhowPdhmUTwBYISBtMGZvUlgyGRWusMcQgY2BDNZFKiTGhTFKyiluGuc35pmek9&#13;&#10;Fmxl2WnyfcZgz3C2rc6qxfMMdhphK9aGtjTUkNnjJQqkUfZOqhNT9DnKLo7R0K+0HPgkBBL9AK7g&#13;&#10;oxIHaFVFqyoaXMGXIoB7zccKLSe9yCjw3FBmPLWMUst46hmlnlEaGQVwdnoymlHgLFQf08E3IuqE&#13;&#10;zkHZYReA8fTULmuq1jc7m/8AAAD//wMAUEsDBBQABgAIAAAAIQCcZkZBuwAAACQBAAAqAAAAY2xp&#13;&#10;cGJvYXJkL2RyYXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzhI/NCsIwEITvgu8Q9m7SehCR&#13;&#10;Jr2I0KvUBwjJNi02PyRR7Nsb6EVB8LIws+w3s037sjN5YkyTdxxqWgFBp7yenOFw6y+7I5CUpdNy&#13;&#10;9g45LJigFdtNc8VZ5nKUxikkUigucRhzDifGkhrRykR9QFc2g49W5iKjYUGquzTI9lV1YPGTAeKL&#13;&#10;STrNIXa6BtIvoST/Z/thmBSevXpYdPlHBMulFxagjAYzB0pXZ501LV2BiYZ9/SbeAAAA//8DAFBL&#13;&#10;AQItABQABgAIAAAAIQC75UiUBQEAAB4CAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBl&#13;&#10;c10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAAAAAAAAAANgEAAF9yZWxz&#13;&#10;Ly5yZWxzUEsBAi0AFAAGAAgAAAAhACQLSAN6BgAAniYAAB8AAAAAAAAAAAAAAAAAIAIAAGNsaXBi&#13;&#10;b2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEANTddVEoHAAD/IwAAGgAA&#13;&#10;AAAAAAAAAAAAAADXCAAAY2xpcGJvYXJkL3RoZW1lL3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEA&#13;&#10;nGZGQbsAAAAkAQAAKgAAAAAAAAAAAAAAAABZEAAAY2xpcGJvYXJkL2RyYXdpbmdzL19yZWxzL2Ry&#13;&#10;YXdpbmcxLnhtbC5yZWxzUEsFBgAAAAAFAAUAZwEAAFwRAAAAAA==&#13;&#10;"><v:roundrect style="POSITION: absolute; WIDTH: 43434px; HEIGHT: 9144px; VISIBILITY: visible; mso-wrap-style: square; v-text-anchor: middle" id=Rounded_x0020_Rectangle_x0020_35 o:spid="_x0000_s1027" o:gfxdata="UEsDBBQABgAIAAAAIQDw94q7/QAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzUrEMBDH&#13;&#10;74LvEOYqbaoHEWm6B6tHFV0fYEimbdg2CZlYd9/edD8u4goeZ+b/8SOpV9tpFDNFtt4puC4rEOS0&#13;&#10;N9b1Cj7WT8UdCE7oDI7ekYIdMayay4t6vQvEIrsdKxhSCvdSsh5oQi59IJcvnY8TpjzGXgbUG+xJ&#13;&#10;3lTVrdTeJXKpSEsGNHVLHX6OSTxu8/pAEmlkEA8H4dKlAEMYrcaUSeXszI+W4thQZudew4MNfJUx&#13;&#10;QP7asFzOFxx9L/lpojUkXjGmZ5wyhjSRJQ8YKGvKv1MWzIkL33VWU9lGfl98J6hz4cZ/uUjzf7Pb&#13;&#10;bHuj+ZQu9z/UfAMAAP//AwBQSwMEFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAABfcmVscy8ucmVs&#13;&#10;c6SQwWrDMAyG74O9g9G9cdpDGaNOb4VeSwe7CltJTGPLWCZt376mMFhGbzvqF/o+8e/2tzCpmbJ4&#13;&#10;jgbWTQuKomXn42Dg63xYfYCSgtHhxJEM3Elg372/7U40YalHMvokqlKiGBhLSZ9aix0poDScKNZN&#13;&#10;zzlgqWMedEJ7wYH0pm23Ov9mQLdgqqMzkI9uA+p8T9X8hx28zSzcl8Zy0Nz33r6iasfXeKK5UjAP&#13;&#10;VAy4LM8w09zU50C/9q7/6ZURE31X/kL8TKv1x6wXNXYPAAAA//8DAFBLAwQUAAYACAAAACEAMy8F&#13;&#10;nkEAAAA5AAAAEAAAAGRycy9zaGFwZXhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQUkjNS85PycxL&#13;&#10;t1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAAACEAf2Oj/MYA&#13;&#10;AADbAAAADwAAAGRycy9kb3ducmV2LnhtbESPQWvCQBSE74X+h+UVvBTdGKmU6CqlICrNRVPR4yP7&#13;&#10;moRm34bsmqT++m6h4HGYmW+Y5XowteiodZVlBdNJBII4t7riQsFnthm/gnAeWWNtmRT8kIP16vFh&#13;&#10;iYm2PR+oO/pCBAi7BBWU3jeJlC4vyaCb2IY4eF+2NeiDbAupW+wD3NQyjqK5NFhxWCixofeS8u/j&#13;&#10;1SjIbuk2/bjIk9ufznH83KW9uaVKjZ6GtwUIT4O/h//bO61g9gJ/X8IPkKtfAAAA//8DAFBLAQIt&#13;&#10;ABQABgAIAAAAIQDw94q7/QAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10u&#13;&#10;eG1sUEsBAi0AFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAAAAAAAAAAAAAAAALgEAAF9yZWxzLy5y&#13;&#10;ZWxzUEsBAi0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKQIAAGRycy9zaGFw&#13;&#10;ZXhtbC54bWxQSwECLQAUAAYACAAAACEAf2Oj/MYAAADbAAAADwAAAAAAAAAAAAAAAACYAgAAZHJz&#13;&#10;L2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA9QAAAIsDAAAAAA==&#13;&#10;" arcsize="10923f" fillcolor="#8064a2" strokecolor="#5c4776" strokeweight="2pt"><v:textbox>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: #f0f0f0; BORDER-LEFT: #f0f0f0; BACKGROUND-COLOR: transparent; BORDER-TOP: #f0f0f0; BORDER-RIGHT: #f0f0f0">
<DIV>
<P style="MARGIN: 0in 0in 10pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P></DIV></TD></TR></TBODY></TABLE></v:textbox></v:roundrect><v:shapetype id=_x0000_t202 path="m,l,21600r21600,l21600,xe" o:spt="202" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:path gradientshapeok="t" o:connecttype="rect"></v:path></v:shapetype><v:shape style="POSITION: absolute; WIDTH: 12668px; HEIGHT: 2572px; VISIBILITY: visible; TOP: 666px; LEFT: 15335px; mso-wrap-style: square; v-text-anchor: top" id=Text_x0020_Box_x0020_37 type="#_x0000_t202" o:spid="_x0000_s1028" o:gfxdata="UEsDBBQABgAIAAAAIQDw94q7/QAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzUrEMBDH&#13;&#10;74LvEOYqbaoHEWm6B6tHFV0fYEimbdg2CZlYd9/edD8u4goeZ+b/8SOpV9tpFDNFtt4puC4rEOS0&#13;&#10;N9b1Cj7WT8UdCE7oDI7ekYIdMayay4t6vQvEIrsdKxhSCvdSsh5oQi59IJcvnY8TpjzGXgbUG+xJ&#13;&#10;3lTVrdTeJXKpSEsGNHVLHX6OSTxu8/pAEmlkEA8H4dKlAEMYrcaUSeXszI+W4thQZudew4MNfJUx&#13;&#10;QP7asFzOFxx9L/lpojUkXjGmZ5wyhjSRJQ8YKGvKv1MWzIkL33VWU9lGfl98J6hz4cZ/uUjzf7Pb&#13;&#10;bHuj+ZQu9z/UfAMAAP//AwBQSwMEFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAABfcmVscy8ucmVs&#13;&#10;c6SQwWrDMAyG74O9g9G9cdpDGaNOb4VeSwe7CltJTGPLWCZt376mMFhGbzvqF/o+8e/2tzCpmbJ4&#13;&#10;jgbWTQuKomXn42Dg63xYfYCSgtHhxJEM3Elg372/7U40YalHMvokqlKiGBhLSZ9aix0poDScKNZN&#13;&#10;zzlgqWMedEJ7wYH0pm23Ov9mQLdgqqMzkI9uA+p8T9X8hx28zSzcl8Zy0Nz33r6iasfXeKK5UjAP&#13;&#10;VAy4LM8w09zU50C/9q7/6ZURE31X/kL8TKv1x6wXNXYPAAAA//8DAFBLAwQUAAYACAAAACEAMy8F&#13;&#10;nkEAAAA5AAAAEAAAAGRycy9zaGFwZXhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQUkjNS85PycxL&#13;&#10;t1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAAACEAJ5sVPcIA&#13;&#10;AADbAAAADwAAAGRycy9kb3ducmV2LnhtbESPQWvCQBSE74L/YXlCb7qpgShpNtIWCtKbMRdvj+wz&#13;&#10;Cc2+Dbtbk/77riB4HGbmG6Y4zGYQN3K+t6zgdZOAIG6s7rlVUJ+/1nsQPiBrHCyTgj/ycCiXiwJz&#13;&#10;bSc+0a0KrYgQ9jkq6EIYcyl905FBv7EjcfSu1hkMUbpWaodThJtBbpMkkwZ7jgsdjvTZUfNT/RoF&#13;&#10;x+wjXKjW3zrdpnaqZeOug1fqZTW/v4EINIdn+NE+agXpDu5f4g+Q5T8AAAD//wMAUEsBAi0AFAAG&#13;&#10;AAgAAAAhAPD3irv9AAAA4gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQ&#13;&#10;SwECLQAUAAYACAAAACEAMd1fYdIAAACPAQAACwAAAAAAAAAAAAAAAAAuAQAAX3JlbHMvLnJlbHNQ&#13;&#10;SwECLQAUAAYACAAAACEAMy8FnkEAAAA5AAAAEAAAAAAAAAAAAAAAAAApAgAAZHJzL3NoYXBleG1s&#13;&#10;LnhtbFBLAQItABQABgAIAAAAIQAnmxU9wgAAANsAAAAPAAAAAAAAAAAAAAAAAJgCAABkcnMvZG93&#13;&#10;bnJldi54bWxQSwUGAAAAAAQABAD1AAAAhwMAAAAA&#13;&#10;" strokeweight=".5pt"><v:textbox>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: #f0f0f0; BORDER-LEFT: #f0f0f0; BACKGROUND-COLOR: transparent; BORDER-TOP: #f0f0f0; BORDER-RIGHT: #f0f0f0">
<DIV>
<P style="MARGIN: 0in 0in 10pt" class=MsoNormal><FONT face=Calibri><FONT size=3>IntelliSense Action<o:p></o:p></FONT></FONT></P></DIV></TD></TR></TBODY></TABLE></v:textbox></v:shape><v:group style="POSITION: absolute; WIDTH: 36767px; HEIGHT: 3715px; TOP: 4381px; LEFT: 3238px" id=Group_x0020_9 coordsize="36766,3714" o:spid="_x0000_s1029" o:gfxdata="UEsDBBQABgAIAAAAIQCi+E9TBAEAAOwBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRy07DMBBF&#13;&#10;90j8g+UtShxYIISadEGAHSAoHzCyJ4lFYlseN7R/z7iPDaJIXdpzz5wre7HcTKOYMZL1rpbXZSUF&#13;&#10;Ou2NdX0tP1dPxZ0UlMAZGL3DWm6R5LK5vFistgFJMO2olkNK4V4p0gNOQKUP6HjS+ThB4mPsVQD9&#13;&#10;BT2qm6q6Vdq7hC4VKe+QzaLFDtZjEo8bvt43iTiSFA/7YHbVEkIYrYbETdXszC9LcTCUTO4yNNhA&#13;&#10;V1xDqj8NeXJacOBe+WmiNSjeIKYXmLiGMpFUH/060AABOVj+vyp3najwXWc1lm2k5wx/ZPhY75TG&#13;&#10;+G8XcT5X0DL2jvNxu9r9VfMDAAD//wMAUEsDBBQABgAIAAAAIQBsBtX+2AAAAJkBAAALAAAAX3Jl&#13;&#10;bHMvLnJlbHOkkMFKAzEQhu+C7xDm7mbbg4g025vQa63gNSSz2eAmE2biat/eWBBc6c3jzM9838/s&#13;&#10;9p9pVguyRMoGNl0PCrMjH3Mw8HJ6unsAJdVmb2fKaOCMAvvh9mZ3xNnWdiRTLKIaJYuBqdbyqLW4&#13;&#10;CZOVjgrmlozEydY2ctDFujcbUG/7/l7zbwYMK6Y6eAN88FtQp3Np5j/sFB2T0Fg7R0nTOEZ3jao9&#13;&#10;feQjLo1iOWA14FkuS8ala+VAX/du/ukNTO/lebIFX5tkZb9E8h01/08HvXro8AUAAP//AwBQSwME&#13;&#10;FAAGAAgAAAAhADMvBZ5BAAAAOQAAABUAAABkcnMvZ3JvdXBzaGFwZXhtbC54bWyysa/IzVEoSy0q&#13;&#10;zszPs1Uy1DNQUkjNS85PycxLt1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBL&#13;&#10;AwQUAAYACAAAACEAvJSJLcUAAADaAAAADwAAAGRycy9kb3ducmV2LnhtbESPT2vCQBTE7wW/w/KE&#13;&#10;3uomSkuNrhJCLT2EQlUQb4/sMwlm34bsNn++fbdQ6HGYmd8w2/1oGtFT52rLCuJFBIK4sLrmUsH5&#13;&#10;dHh6BeE8ssbGMimYyMF+N3vYYqLtwF/UH30pAoRdggoq79tESldUZNAtbEscvJvtDPogu1LqDocA&#13;&#10;N41cRtGLNFhzWKiwpayi4n78NgreBxzSVfzW5/dbNl1Pz5+XPCalHudjugHhafT/4b/2h1awht8r&#13;&#10;4QbI3Q8AAAD//wMAUEsBAi0AFAAGAAgAAAAhAKL4T1MEAQAA7AEAABMAAAAAAAAAAAAAAAAAAAAA&#13;&#10;AFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAbAbV/tgAAACZAQAACwAAAAAAAAAA&#13;&#10;AAAAAAA1AQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAMy8FnkEAAAA5AAAAFQAAAAAAAAAA&#13;&#10;AAAAAAA2AgAAZHJzL2dyb3Vwc2hhcGV4bWwueG1sUEsBAi0AFAAGAAgAAAAhALyUiS3FAAAA2gAA&#13;&#10;AA8AAAAAAAAAAAAAAAAAqgIAAGRycy9kb3ducmV2LnhtbFBLBQYAAAAABAAEAPoAAACcAwAAAAA=&#13;&#10;"><v:rect style="POSITION: absolute; WIDTH: 9144px; HEIGHT: 3714px; VISIBILITY: visible; mso-wrap-style: square; v-text-anchor: middle" id=Rectangle_x0020_1 o:spid="_x0000_s1030" o:gfxdata="UEsDBBQABgAIAAAAIQDw94q7/QAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzUrEMBDH&#13;&#10;74LvEOYqbaoHEWm6B6tHFV0fYEimbdg2CZlYd9/edD8u4goeZ+b/8SOpV9tpFDNFtt4puC4rEOS0&#13;&#10;N9b1Cj7WT8UdCE7oDI7ekYIdMayay4t6vQvEIrsdKxhSCvdSsh5oQi59IJcvnY8TpjzGXgbUG+xJ&#13;&#10;3lTVrdTeJXKpSEsGNHVLHX6OSTxu8/pAEmlkEA8H4dKlAEMYrcaUSeXszI+W4thQZudew4MNfJUx&#13;&#10;QP7asFzOFxx9L/lpojUkXjGmZ5wyhjSRJQ8YKGvKv1MWzIkL33VWU9lGfl98J6hz4cZ/uUjzf7Pb&#13;&#10;bHuj+ZQu9z/UfAMAAP//AwBQSwMEFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAABfcmVscy8ucmVs&#13;&#10;c6SQwWrDMAyG74O9g9G9cdpDGaNOb4VeSwe7CltJTGPLWCZt376mMFhGbzvqF/o+8e/2tzCpmbJ4&#13;&#10;jgbWTQuKomXn42Dg63xYfYCSgtHhxJEM3Elg372/7U40YalHMvokqlKiGBhLSZ9aix0poDScKNZN&#13;&#10;zzlgqWMedEJ7wYH0pm23Ov9mQLdgqqMzkI9uA+p8T9X8hx28zSzcl8Zy0Nz33r6iasfXeKK5UjAP&#13;&#10;VAy4LM8w09zU50C/9q7/6ZURE31X/kL8TKv1x6wXNXYPAAAA//8DAFBLAwQUAAYACAAAACEAMy8F&#13;&#10;nkEAAAA5AAAAEAAAAGRycy9zaGFwZXhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQUkjNS85PycxL&#13;&#10;t1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAAACEATAIV6MEA&#13;&#10;AADaAAAADwAAAGRycy9kb3ducmV2LnhtbERPTWsCMRC9C/6HMEJvmtVDrdvNiojSghTp1ktv0810&#13;&#10;s7iZLEmq23/fCAVPw+N9TrEebCcu5EPrWMF8loEgrp1uuVFw+thPn0CEiKyxc0wKfinAuhyPCsy1&#13;&#10;u/I7XarYiBTCIUcFJsY+lzLUhiyGmeuJE/ftvMWYoG+k9nhN4baTiyx7lBZbTg0Ge9oaqs/Vj1Vw&#13;&#10;/twd346r02Jv9ctX1sblyviDUg+TYfMMItIQ7+J/96tO8+H2yu3K8g8AAP//AwBQSwECLQAUAAYA&#13;&#10;CAAAACEA8PeKu/0AAADiAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBL&#13;&#10;AQItABQABgAIAAAAIQAx3V9h0gAAAI8BAAALAAAAAAAAAAAAAAAAAC4BAABfcmVscy8ucmVsc1BL&#13;&#10;AQItABQABgAIAAAAIQAzLwWeQQAAADkAAAAQAAAAAAAAAAAAAAAAACkCAABkcnMvc2hhcGV4bWwu&#13;&#10;eG1sUEsBAi0AFAAGAAgAAAAhAEwCFejBAAAA2gAAAA8AAAAAAAAAAAAAAAAAmAIAAGRycy9kb3du&#13;&#10;cmV2LnhtbFBLBQYAAAAABAAEAPUAAACGAwAAAAA=&#13;&#10;" fillcolor="#4f81bd" strokecolor="#385d8a" strokeweight="2pt"><v:textbox>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: #f0f0f0; BORDER-LEFT: #f0f0f0; BACKGROUND-COLOR: transparent; BORDER-TOP: #f0f0f0; BORDER-RIGHT: #f0f0f0">
<DIV>
<P style="TEXT-ALIGN: center; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal align=center><FONT face=Calibri><FONT size=3>Compiler<o:p></o:p></FONT></FONT></P></DIV></TD></TR></TBODY></TABLE></v:textbox></v:rect><v:rect style="POSITION: absolute; WIDTH: 9144px; HEIGHT: 3714px; VISIBILITY: visible; LEFT: 13716px; mso-wrap-style: square; v-text-anchor: middle" id=Rectangle_x0020_2 o:spid="_x0000_s1031" o:gfxdata="UEsDBBQABgAIAAAAIQDw94q7/QAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzUrEMBDH&#13;&#10;74LvEOYqbaoHEWm6B6tHFV0fYEimbdg2CZlYd9/edD8u4goeZ+b/8SOpV9tpFDNFtt4puC4rEOS0&#13;&#10;N9b1Cj7WT8UdCE7oDI7ekYIdMayay4t6vQvEIrsdKxhSCvdSsh5oQi59IJcvnY8TpjzGXgbUG+xJ&#13;&#10;3lTVrdTeJXKpSEsGNHVLHX6OSTxu8/pAEmlkEA8H4dKlAEMYrcaUSeXszI+W4thQZudew4MNfJUx&#13;&#10;QP7asFzOFxx9L/lpojUkXjGmZ5wyhjSRJQ8YKGvKv1MWzIkL33VWU9lGfl98J6hz4cZ/uUjzf7Pb&#13;&#10;bHuj+ZQu9z/UfAMAAP//AwBQSwMEFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAABfcmVscy8ucmVs&#13;&#10;c6SQwWrDMAyG74O9g9G9cdpDGaNOb4VeSwe7CltJTGPLWCZt376mMFhGbzvqF/o+8e/2tzCpmbJ4&#13;&#10;jgbWTQuKomXn42Dg63xYfYCSgtHhxJEM3Elg372/7U40YalHMvokqlKiGBhLSZ9aix0poDScKNZN&#13;&#10;zzlgqWMedEJ7wYH0pm23Ov9mQLdgqqMzkI9uA+p8T9X8hx28zSzcl8Zy0Nz33r6iasfXeKK5UjAP&#13;&#10;VAy4LM8w09zU50C/9q7/6ZURE31X/kL8TKv1x6wXNXYPAAAA//8DAFBLAwQUAAYACAAAACEAMy8F&#13;&#10;nkEAAAA5AAAAEAAAAGRycy9zaGFwZXhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQUkjNS85PycxL&#13;&#10;t1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAAACEAvNCLn8MA&#13;&#10;AADaAAAADwAAAGRycy9kb3ducmV2LnhtbESPT2sCMRTE7wW/Q3iCt5p1D1q3RilSUZAi/rl4e928&#13;&#10;bhY3L0uS6vrtTaHgcZiZ3zCzRWcbcSUfascKRsMMBHHpdM2VgtNx9foGIkRkjY1jUnCnAIt572WG&#13;&#10;hXY33tP1ECuRIBwKVGBibAspQ2nIYhi6ljh5P85bjEn6SmqPtwS3jcyzbCwt1pwWDLa0NFReDr9W&#13;&#10;weX8ufvaTU/5yur1d1bHydT4rVKDfvfxDiJSF5/h//ZGK8jh70q6AXL+AAAA//8DAFBLAQItABQA&#13;&#10;BgAIAAAAIQDw94q7/QAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1s&#13;&#10;UEsBAi0AFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAAAAAAAAAAAAAAAALgEAAF9yZWxzLy5yZWxz&#13;&#10;UEsBAi0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKQIAAGRycy9zaGFwZXht&#13;&#10;bC54bWxQSwECLQAUAAYACAAAACEAvNCLn8MAAADaAAAADwAAAAAAAAAAAAAAAACYAgAAZHJzL2Rv&#13;&#10;d25yZXYueG1sUEsFBgAAAAAEAAQA9QAAAIgDAAAAAA==&#13;&#10;" fillcolor="#4f81bd" strokecolor="#385d8a" strokeweight="2pt"><v:textbox>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: #f0f0f0; BORDER-LEFT: #f0f0f0; BACKGROUND-COLOR: transparent; BORDER-TOP: #f0f0f0; BORDER-RIGHT: #f0f0f0">
<DIV>
<P style="TEXT-ALIGN: center; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal align=center><FONT face=Calibri><FONT size=3>IDE<o:p></o:p></FONT></FONT></P></DIV></TD></TR></TBODY></TABLE></v:textbox></v:rect><v:rect style="POSITION: absolute; WIDTH: 9144px; HEIGHT: 3714px; VISIBILITY: visible; LEFT: 27622px; mso-wrap-style: square; v-text-anchor: middle" id=Rectangle_x0020_3 o:spid="_x0000_s1032" o:gfxdata="UEsDBBQABgAIAAAAIQDw94q7/QAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzUrEMBDH&#13;&#10;74LvEOYqbaoHEWm6B6tHFV0fYEimbdg2CZlYd9/edD8u4goeZ+b/8SOpV9tpFDNFtt4puC4rEOS0&#13;&#10;N9b1Cj7WT8UdCE7oDI7ekYIdMayay4t6vQvEIrsdKxhSCvdSsh5oQi59IJcvnY8TpjzGXgbUG+xJ&#13;&#10;3lTVrdTeJXKpSEsGNHVLHX6OSTxu8/pAEmlkEA8H4dKlAEMYrcaUSeXszI+W4thQZudew4MNfJUx&#13;&#10;QP7asFzOFxx9L/lpojUkXjGmZ5wyhjSRJQ8YKGvKv1MWzIkL33VWU9lGfl98J6hz4cZ/uUjzf7Pb&#13;&#10;bHuj+ZQu9z/UfAMAAP//AwBQSwMEFAAGAAgAAAAhADHdX2HSAAAAjwEAAAsAAABfcmVscy8ucmVs&#13;&#10;c6SQwWrDMAyG74O9g9G9cdpDGaNOb4VeSwe7CltJTGPLWCZt376mMFhGbzvqF/o+8e/2tzCpmbJ4&#13;&#10;jgbWTQuKomXn42Dg63xYfYCSgtHhxJEM3Elg372/7U40YalHMvokqlKiGBhLSZ9aix0poDScKNZN&#13;&#10;zzlgqWMedEJ7wYH0pm23Ov9mQLdgqqMzkI9uA+p8T9X8hx28zSzcl8Zy0Nz33r6iasfXeKK5UjAP&#13;&#10;VAy4LM8w09zU50C/9q7/6ZURE31X/kL8TKv1x6wXNXYPAAAA//8DAFBLAwQUAAYACAAAACEAMy8F&#13;&#10;nkEAAAA5AAAAEAAAAGRycy9zaGFwZXhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQUkjNS85PycxL&#13;&#10;t1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAAACEA05wuBMQA&#13;&#10;AADaAAAADwAAAGRycy9kb3ducmV2LnhtbESPQWsCMRSE70L/Q3iF3jSrgtXtZqUUpQUpovXS2+vm&#13;&#10;uVncvCxJquu/N4WCx2FmvmGKZW9bcSYfGscKxqMMBHHldMO1gsPXejgHESKyxtYxKbhSgGX5MCgw&#13;&#10;1+7COzrvYy0ShEOOCkyMXS5lqAxZDCPXESfv6LzFmKSvpfZ4SXDbykmWzaTFhtOCwY7eDFWn/a9V&#13;&#10;cPpebT+3i8NkbfX7T9bE54XxG6WeHvvXFxCR+ngP/7c/tIIp/F1JN0CWNwAAAP//AwBQSwECLQAU&#13;&#10;AAYACAAAACEA8PeKu/0AAADiAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnht&#13;&#10;bFBLAQItABQABgAIAAAAIQAx3V9h0gAAAI8BAAALAAAAAAAAAAAAAAAAAC4BAABfcmVscy8ucmVs&#13;&#10;c1BLAQItABQABgAIAAAAIQAzLwWeQQAAADkAAAAQAAAAAAAAAAAAAAAAACkCAABkcnMvc2hhcGV4&#13;&#10;bWwueG1sUEsBAi0AFAAGAAgAAAAhANOcLgTEAAAA2gAAAA8AAAAAAAAAAAAAAAAAmAIAAGRycy9k&#13;&#10;b3ducmV2LnhtbFBLBQYAAAAABAAEAPUAAACJAwAAAAA=&#13;&#10;" fillcolor="#4f81bd" strokecolor="#385d8a" strokeweight="2pt"><v:textbox>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD style="BORDER-BOTTOM: #f0f0f0; BORDER-LEFT: #f0f0f0; BACKGROUND-COLOR: transparent; BORDER-TOP: #f0f0f0; BORDER-RIGHT: #f0f0f0">
<DIV>
<P style="TEXT-ALIGN: center; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal align=center><FONT face=Calibri><FONT size=3>Editor<o:p></o:p></FONT></FONT></P></DIV></TD></TR></TBODY></TABLE></v:textbox></v:rect><v:shapetype id=_x0000_t32 filled="f" path="m,l21600,21600e" o:spt="32" coordsize="21600,21600" o:oned="t"><v:path o:connecttype="none" arrowok="t" fillok="f"></v:path><o:lock v:ext="edit" shapetype="t"></o:lock></v:shapetype><v:shape style="POSITION: absolute; WIDTH: 4191px; HEIGHT: 0px; VISIBILITY: visible; TOP: 762px; LEFT: 9334px; mso-wrap-style: square" id=Straight_x0020_Arrow_x0020_Connector_x0020_4 type="#_x0000_t32" o:spid="_x0000_s1033" o:gfxdata="UEsDBBQABgAIAAAAIQD+JeulAAEAAOoBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzU7EIBDH&#13;&#10;7ya+A+FqWqoHY0zpHqwe1Zj1AQhMW2I7EAbr7ts73e5ejGviEeb/8RuoN7tpFDMk8gG1vC4rKQBt&#13;&#10;cB57Ld+3T8WdFJQNOjMGBC33QHLTXF7U230EEuxG0nLIOd4rRXaAyVAZIiBPupAmk/mYehWN/TA9&#13;&#10;qJuqulU2YAbMRV4yZFO30JnPMYvHHV+vJAlGkuJhFS5dWpoYR29NZlI1o/vRUhwbSnYeNDT4SFeM&#13;&#10;IdWvDcvkfMHR98JPk7wD8WpSfjYTYyiXaNkAweaQWFf+nbSgTlSErvMWyjYRL7V6T3DnSlz4wgTz&#13;&#10;f/Nbtr3BfEpXh59qvgEAAP//AwBQSwMEFAAGAAgAAAAhAJYFM1jUAAAAlwEAAAsAAABfcmVscy8u&#13;&#10;cmVsc6SQPWsDMQyG90L/g9He8yVDKSW+bIWsIYWuxtZ9kLNkJHNN/n1MoaVXsnWUXvQ8L9rtL2k2&#13;&#10;C4pOTA42TQsGKXCcaHDwfnp7egGjxVP0MxM6uKLCvnt82B1x9qUe6ThlNZVC6mAsJb9aq2HE5LXh&#13;&#10;jFSTniX5UkcZbPbh7Ae027Z9tvKbAd2KaQ7RgRziFszpmqv5DztNQVi5L03gZLnvp3CPaiN/0hGX&#13;&#10;SvEyYHEQRb+WgktTy4G979380xuYCENh+aiOlfwnqfbvBnb1zu4GAAD//wMAUEsDBBQABgAIAAAA&#13;&#10;IQAzLwWeQQAAADkAAAAUAAAAZHJzL2Nvbm5lY3RvcnhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQ&#13;&#10;UkjNS85PycxLt1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAA&#13;&#10;ACEAwBrBpsIAAADaAAAADwAAAGRycy9kb3ducmV2LnhtbESPUWvCMBSF3wf7D+EOfBkz6RCRzihO&#13;&#10;KAxERN0PuGuubWdzU5Jou3+/CIKPh3POdzjz5WBbcSUfGscasrECQVw603Cl4ftYvM1AhIhssHVM&#13;&#10;Gv4owHLx/DTH3Lie93Q9xEokCIccNdQxdrmUoazJYhi7jjh5J+ctxiR9JY3HPsFtK9+VmkqLDaeF&#13;&#10;Gjta11SeDxerodj+9rg6vc52foOZ/FFnkp9K69HLsPoAEWmIj/C9/WU0TOB2Jd0AufgHAAD//wMA&#13;&#10;UEsBAi0AFAAGAAgAAAAhAP4l66UAAQAA6gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5&#13;&#10;cGVzXS54bWxQSwECLQAUAAYACAAAACEAlgUzWNQAAACXAQAACwAAAAAAAAAAAAAAAAAxAQAAX3Jl&#13;&#10;bHMvLnJlbHNQSwECLQAUAAYACAAAACEAMy8FnkEAAAA5AAAAFAAAAAAAAAAAAAAAAAAuAgAAZHJz&#13;&#10;L2Nvbm5lY3RvcnhtbC54bWxQSwECLQAUAAYACAAAACEAwBrBpsIAAADaAAAADwAAAAAAAAAAAAAA&#13;&#10;AAChAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA+QAAAJADAAAAAA==&#13;&#10;" strokecolor="red" o:connectortype="straight"><v:stroke endarrow="open"><FONT size=3 face=Calibri></FONT></v:stroke></v:shape><v:shape style="POSITION: absolute; WIDTH: 4191px; HEIGHT: 0px; VISIBILITY: visible; TOP: 1524px; LEFT: 23050px; mso-wrap-style: square" id=Straight_x0020_Arrow_x0020_Connector_x0020_5 type="#_x0000_t32" o:spid="_x0000_s1034" o:gfxdata="UEsDBBQABgAIAAAAIQD+JeulAAEAAOoBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzU7EIBDH&#13;&#10;7ya+A+FqWqoHY0zpHqwe1Zj1AQhMW2I7EAbr7ts73e5ejGviEeb/8RuoN7tpFDMk8gG1vC4rKQBt&#13;&#10;cB57Ld+3T8WdFJQNOjMGBC33QHLTXF7U230EEuxG0nLIOd4rRXaAyVAZIiBPupAmk/mYehWN/TA9&#13;&#10;qJuqulU2YAbMRV4yZFO30JnPMYvHHV+vJAlGkuJhFS5dWpoYR29NZlI1o/vRUhwbSnYeNDT4SFeM&#13;&#10;IdWvDcvkfMHR98JPk7wD8WpSfjYTYyiXaNkAweaQWFf+nbSgTlSErvMWyjYRL7V6T3DnSlz4wgTz&#13;&#10;f/Nbtr3BfEpXh59qvgEAAP//AwBQSwMEFAAGAAgAAAAhAJYFM1jUAAAAlwEAAAsAAABfcmVscy8u&#13;&#10;cmVsc6SQPWsDMQyG90L/g9He8yVDKSW+bIWsIYWuxtZ9kLNkJHNN/n1MoaVXsnWUXvQ8L9rtL2k2&#13;&#10;C4pOTA42TQsGKXCcaHDwfnp7egGjxVP0MxM6uKLCvnt82B1x9qUe6ThlNZVC6mAsJb9aq2HE5LXh&#13;&#10;jFSTniX5UkcZbPbh7Ae027Z9tvKbAd2KaQ7RgRziFszpmqv5DztNQVi5L03gZLnvp3CPaiN/0hGX&#13;&#10;SvEyYHEQRb+WgktTy4G979380xuYCENh+aiOlfwnqfbvBnb1zu4GAAD//wMAUEsDBBQABgAIAAAA&#13;&#10;IQAzLwWeQQAAADkAAAAUAAAAZHJzL2Nvbm5lY3RvcnhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQ&#13;&#10;UkjNS85PycxLt1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAA&#13;&#10;ACEAr1ZkPcIAAADaAAAADwAAAGRycy9kb3ducmV2LnhtbESPUWvCMBSF3wf7D+EOfBkz6UCRzihO&#13;&#10;KAxERN0PuGuubWdzU5Jou3+/CIKPh3POdzjz5WBbcSUfGscasrECQVw603Cl4ftYvM1AhIhssHVM&#13;&#10;Gv4owHLx/DTH3Lie93Q9xEokCIccNdQxdrmUoazJYhi7jjh5J+ctxiR9JY3HPsFtK9+VmkqLDaeF&#13;&#10;Gjta11SeDxerodj+9rg6vc52foOZ/FFnkp9K69HLsPoAEWmIj/C9/WU0TOB2Jd0AufgHAAD//wMA&#13;&#10;UEsBAi0AFAAGAAgAAAAhAP4l66UAAQAA6gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5&#13;&#10;cGVzXS54bWxQSwECLQAUAAYACAAAACEAlgUzWNQAAACXAQAACwAAAAAAAAAAAAAAAAAxAQAAX3Jl&#13;&#10;bHMvLnJlbHNQSwECLQAUAAYACAAAACEAMy8FnkEAAAA5AAAAFAAAAAAAAAAAAAAAAAAuAgAAZHJz&#13;&#10;L2Nvbm5lY3RvcnhtbC54bWxQSwECLQAUAAYACAAAACEAr1ZkPcIAAADaAAAADwAAAAAAAAAAAAAA&#13;&#10;AAChAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA+QAAAJADAAAAAA==&#13;&#10;" strokecolor="red" o:connectortype="straight"><v:stroke endarrow="open"><FONT size=3 face=Calibri></FONT></v:stroke></v:shape><v:shape style="POSITION: absolute; WIDTH: 4191px; HEIGHT: 0px; VISIBILITY: visible; TOP: 2667px; LEFT: 9334px; mso-wrap-style: square; flip: x" id=Straight_x0020_Arrow_x0020_Connector_x0020_8 type="#_x0000_t32" o:spid="_x0000_s1035" o:gfxdata="UEsDBBQABgAIAAAAIQD+JeulAAEAAOoBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRzU7EIBDH&#13;&#10;7ya+A+FqWqoHY0zpHqwe1Zj1AQhMW2I7EAbr7ts73e5ejGviEeb/8RuoN7tpFDMk8gG1vC4rKQBt&#13;&#10;cB57Ld+3T8WdFJQNOjMGBC33QHLTXF7U230EEuxG0nLIOd4rRXaAyVAZIiBPupAmk/mYehWN/TA9&#13;&#10;qJuqulU2YAbMRV4yZFO30JnPMYvHHV+vJAlGkuJhFS5dWpoYR29NZlI1o/vRUhwbSnYeNDT4SFeM&#13;&#10;IdWvDcvkfMHR98JPk7wD8WpSfjYTYyiXaNkAweaQWFf+nbSgTlSErvMWyjYRL7V6T3DnSlz4wgTz&#13;&#10;f/Nbtr3BfEpXh59qvgEAAP//AwBQSwMEFAAGAAgAAAAhAJYFM1jUAAAAlwEAAAsAAABfcmVscy8u&#13;&#10;cmVsc6SQPWsDMQyG90L/g9He8yVDKSW+bIWsIYWuxtZ9kLNkJHNN/n1MoaVXsnWUXvQ8L9rtL2k2&#13;&#10;C4pOTA42TQsGKXCcaHDwfnp7egGjxVP0MxM6uKLCvnt82B1x9qUe6ThlNZVC6mAsJb9aq2HE5LXh&#13;&#10;jFSTniX5UkcZbPbh7Ae027Z9tvKbAd2KaQ7RgRziFszpmqv5DztNQVi5L03gZLnvp3CPaiN/0hGX&#13;&#10;SvEyYHEQRb+WgktTy4G979380xuYCENh+aiOlfwnqfbvBnb1zu4GAAD//wMAUEsDBBQABgAIAAAA&#13;&#10;IQAzLwWeQQAAADkAAAAUAAAAZHJzL2Nvbm5lY3RvcnhtbC54bWyysa/IzVEoSy0qzszPs1Uy1DNQ&#13;&#10;UkjNS85PycxLt1UKDXHTtVBSKC5JzEtJzMnPS7VVqkwtVrK34+UCAAAA//8DAFBLAwQUAAYACAAA&#13;&#10;ACEAQ2LjTb8AAADaAAAADwAAAGRycy9kb3ducmV2LnhtbERPy4rCMBTdC/5DuIIbGVNnIdIxlUFU&#13;&#10;ZldfC91dmtsH09yUJrb1781CcHk47/VmMLXoqHWVZQWLeQSCOLO64kLB9bL/WoFwHlljbZkUPMnB&#13;&#10;JhmP1hhr2/OJurMvRAhhF6OC0vsmltJlJRl0c9sQBy63rUEfYFtI3WIfwk0tv6NoKQ1WHBpKbGhb&#13;&#10;UvZ/fhgF3SF92MV9duuPtMv7wyq9+12q1HQy/P6A8DT4j/jt/tMKwtZwJdwAmbwAAAD//wMAUEsB&#13;&#10;Ai0AFAAGAAgAAAAhAP4l66UAAQAA6gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVz&#13;&#10;XS54bWxQSwECLQAUAAYACAAAACEAlgUzWNQAAACXAQAACwAAAAAAAAAAAAAAAAAxAQAAX3JlbHMv&#13;&#10;LnJlbHNQSwECLQAUAAYACAAAACEAMy8FnkEAAAA5AAAAFAAAAAAAAAAAAAAAAAAuAgAAZHJzL2Nv&#13;&#10;bm5lY3RvcnhtbC54bWxQSwECLQAUAAYACAAAACEAQ2LjTb8AAADaAAAADwAAAAAAAAAAAAAAAACh&#13;&#10;AgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA+QAAAI0DAAAAAA==&#13;&#10;" strokecolor="red" o:connectortype="straight"><v:stroke endarrow="open"><FONT size=3 face=Calibri></FONT></v:stroke></v:shape></v:group></v:group><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT face=Calibri><FONT size=3>Now let’s go in a deeper layer and define an AutoComplete scenario with these methods defined on the components mentioned above:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo2" class=MsoListParagraphCxSpFirst><SPAN style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><SPAN style="mso-list: Ignore"><FONT size=3>·</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>string[] Compiler.CompleteStatement(string file, int position)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo2" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><SPAN style="mso-list: Ignore"><FONT size=3>·</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>bool IDE.CompleteStatement(int position)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo2" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><SPAN style="mso-list: Ignore"><FONT size=3>·</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>bool Editor.DisplayCompletions(string[] completionList)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo2" class=MsoListParagraphCxSpLast><SPAN style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol"><SPAN style="mso-list: Ignore"><FONT size=3>·</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>bool Editor.InsertText(string text)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>The action workflow would be this:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l1 level1 lfo1" class=MsoListParagraphCxSpFirst><SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>1)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>IDE.CompleteStatement is called<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l1 level1 lfo1" class=MsoListParagraphCxSpMiddle><SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>2)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Compiler.CompleteStatement is called<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l1 level1 lfo1" class=MsoListParagraphCxSpMiddle><SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>3)</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>If there’s any results<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l1 level2 lfo1" class=MsoListParagraphCxSpMiddle><SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>a.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>If there’s just one result call Editor.InsertText<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1in; mso-add-space: auto; mso-list: l1 level2 lfo1" class=MsoListParagraphCxSpLast><SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>b.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>If there’s multiple results call Editor.DisplayCompletions<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>Finally let’s define a simple test case in which we’re invoking autocomplete on line 3, column 5 of a.cpp and I'm expecting have a list displayed with 3 results. With the specs for our action and our test case defined here’s testing divided on those 3 areas:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">Unit Testing</B> (verify that the methods can work independently, this also doesn’t take into account our scenario):<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraphCxSpFirst><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>Verify that each of the 4 methods return the expected results given specific input<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1.25in; mso-add-space: auto; mso-list: l2 level2 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'"><SPAN style="mso-list: Ignore"><FONT size=3>o</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>Compiler.CompleteStatement return results with the raw data <o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1.25in; mso-add-space: auto; mso-list: l2 level2 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'"><SPAN style="mso-list: Ignore"><FONT size=3>o</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>IDE.CompleteStatement invoke InsertText when there’s just one result and DisplayCompletions when there’s more than one<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1.25in; mso-add-space: auto; mso-list: l2 level2 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'"><SPAN style="mso-list: Ignore"><FONT size=3>o</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>IDE.CompleteStatement formats the raw data<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1.25in; mso-add-space: auto; mso-list: l2 level2 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'"><SPAN style="mso-list: Ignore"><FONT size=3>o</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT face=Calibri><FONT size=3>Editor.InsertText inserts the given text <o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 1.25in; mso-add-space: auto; mso-list: l2 level2 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'"><SPAN style="mso-list: Ignore"><FONT size=3>o</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Editor.DisplayCompletions invokes the event to display the list and passes it the relevant data? (ie which data to display, tooltip data, etc)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Verify that the methods don’t fail for valid inputs<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraphCxSpMiddle><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Verify that the methods can handle invalid data gracefully<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraphCxSpLast><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Verify negative cases (ie: the results should be empty)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">Component Testing</B> (at the main layer through test hooks verify the correctness of the results):<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraph><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>The IDE gets the 3 results from the compiler and formats that data correctly before passing it to the editor<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri><B style="mso-bidi-font-weight: normal">UI Testing</B> (verify that the action as a whole is successful)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraphCxSpFirst><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>After invoking the action in the same way the user would does the list displays with the 3 expected items.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.75in; mso-add-space: auto; mso-list: l2 level1 lfo3" class=MsoListParagraphCxSpLast><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Verify that it works for every way to invoke the action when there’s multiple ways defined (menus, context menu, mouse, keyboard shortcuts).<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>One thing you might be wondering here is wherever you would want to add component tests at the other two layers (the compiler and the editor). In this example it doesn’t makes much sense since the IDE is calling the Compiler at the component level anyway (not to mention that most likely there’s a full test suite dedicated to those scenarios at the compiler level already anyway). As for the editor it just consumes whatever the IDE feeds it so the UI tests would cover that integration.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><o:p><FONT size=3 face=Calibri>&nbsp;</FONT></o:p></P>
<P style="TEXT-ALIGN: justify; LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt" class=MsoNormal><FONT size=3><FONT face=Calibri>The final result of all this is that for a more realistic test plan in which you had more than just one scenario you would only have to add tests at the component level as testing those scenarios either with unit tests or UI tests wouldn’t give you any extra coverage. <o:p></o:p></FONT></FONT></P>]]></content:encoded>
    </item>
    <item>
      <title>Visual C++ IntelliSense Options on Visual Studio 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/visual-c-intellisense-options-on-visual-studio-2010</link>
      <pubDate>Fri, 19 Mar 2010 16:45:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2010/03/19/visual-c-intellisense-options-on-visual-studio-2010/</guid>
      <description><![CDATA[&nbsp;One of the requests we that we often heard from our customers was the ability to disable...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></span><span style="mso-no-proof: yes;"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">One of the requests we that we often heard from our customers was the ability to disable IntelliSense at will. There are ways of disabling it on previous versions via macros and other tricks (more details about that from <a href="http://blogs.msdn.com/b/vcblog/archive/2007/11/19/controlling-intellisense-through-macros.aspx">this blog post</a></span></span><span style="mso-no-proof: yes;"><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">) but we all agree that if you want to turn off a feature it should be simple enough.<o:p></o:p></span></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">On Visual Studio 2010 we completely changed the IntelliSense architecture (more details on that from </span></span><a href="http://blogs.msdn.com/vcblog/archive/2009/05/27/rebuilding-intellisense.aspx"><span style="mso-no-proof: yes;"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">this blog post</span></span></a><span style="mso-no-proof: yes;"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">) and the problems that made people want to turn IntelliSense off are a thing of the past. Without going into much detail here, the big part of the change was in the way we did the parsing (more info on that from </span></span><a href="http://blogs.msdn.com/vcblog/archive/2009/08/12/tag-parsing-c.aspx"><span style="mso-no-proof: yes;"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">this blog post</span></span></a><span style="mso-no-proof: yes;"><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">) and that as a result of that we&rsquo;re not using NCB files anymore to store the IntelliSense information and we&rsquo;re using SQLCE SDF databases to do so (and in turn retrieve the information using SQL queries). And just as a side note here, this means that if you&rsquo;re developing addins for Visual Studio you pretty much have access to the same information that Visual Studio itself does regarding IntelliSense (but I&rsquo;ll leave that conversation, and all the fun stuff you can do with that for another day).<o:p></o:p></span></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3"><span style="mso-spacerun: yes;">&nbsp;</span>Even after those changes, we decided to provide our customers with a rich set of options to control how much of IntelliSense they want (if they want it at all). On this post I&rsquo;ll go over the available option as well as some background as to what&rsquo;s going on behind the scenes.<o:p></o:p></span></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="mso-no-proof: yes;"><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">Lets start with the basics, the options are available under the Tools Menu under the Options items. This will bring up the Visual Studio options dialog. On the right side panel select Text Editor, C/C++, Advanced.<o:p></o:p></span></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"></p>
<blockquote>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">&nbsp;<img style="width: 624px; height: 359px;" title="IntelliSense Options Window" alt="IntelliSense Options Window" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/98/21/88/IntelliSenseOptions.jpg" original-url="http://blogs.msdn.com/photos/raulperez/images/9982188/original.aspx" width="624" height="359" mce_src="http://blogs.msdn.com/photos/raulperez/images/9982188/original.aspx" /></span></span></p>
</blockquote>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">The window is fairly simple, the left pane is the shared Tools -&gt; Options tree menu. On the right are the specific items we&rsquo;re interested in, the options are divided in categories which are collapsible. Under each category (which we&rsquo;ll discuss below) you can select the individual options.<o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3">There are five main categories:<o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1;" class="MsoListParagraphCxSpFirst"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;" size="3">&middot;</span><span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3"><b style="mso-bidi-font-weight: normal;">Browsing/Navigation</b> &ndash; These all affect the behavior of the IntelliSense database.<o:p></o:p></span></span></p>
<p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1;" class="MsoListParagraphCxSpMiddle"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;" size="3">&middot;</span><span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3"><b style="mso-bidi-font-weight: normal;">Diagnostic Logging</b> &ndash; Enables debug logging for some of the IntelliSense features. This one is more of a troubleshooting option so I&rsquo;ll skip these options.<o:p></o:p></span></span></p>
<p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1;" class="MsoListParagraphCxSpMiddle"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;" size="3">&middot;</span><span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3"><b style="mso-bidi-font-weight: normal;">Fallback Location</b> &ndash; This controls the default behavior when there are issues with creating the IntelliSense database (for example if you&rsquo;re opening a project from a network share for which you don&rsquo;t have write access to).<o:p></o:p></span></span></p>
<p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1;" class="MsoListParagraphCxSpMiddle"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;" size="3">&middot;</span><span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: Calibri;" face="Calibri"><span style="font-size: small;" size="3"><b style="mso-bidi-font-weight: normal;">IntelliSense</b> &ndash; IntelliSense specific options<o:p></o:p></span></span></p>
<p style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-add-space: auto; mso-list: l0 level1 lfo1;" class="MsoListParagraphCxSpLast"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;" size="3">&middot;</span><span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">References</b> &ndash; Find All References options<o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Now for the specifics, some of the Dialogs are self-explanatory so I won&rsquo;t go into details about those.<o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Browsing/Navigation<o:p></o:p></span></span></i></b></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Database</b> &ndash; <i style="mso-bidi-font-style: normal;">Disable all use of the code browsing database. The database will not be opened or created.</i><o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Basically this is the main switch to turn IntelliSense off. Since no database file will be touched no IntelliSense parsing will go on. There&rsquo;s another IntelliSense option (which will get to in the IntelliSense section) to just turn IntelliSense on, that still populates the database. Turning this setting on also disables everything under Browsing/Navigation and IntelliSense (except Disable #include Auto Complete).<o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Database Updates</b> &ndash; <i style="mso-bidi-font-style: normal;">The code browsing database will be opened read-only and no updates will be performed.</i><o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">This means, run IntelliSense with whatever was previously on my database (created from previous sessions).<o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Database Auto Updates</b> &ndash; <i style="mso-bidi-font-style: normal;">The code browsing database will not be automatically updated when source files are modified.</i><o:p></o:p></span></span></p>
<p style="margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">IntelliSense information is gathered in real time, however if you got into a state in which vcpkgsvr.exe becomes unstable or where you rather not have background parsing going on you can change the setting here. On a side note, if you do get into such a state with vcpkgsvr.exe by all means open a bug on it (details on how to do so are available on </span><a href="http://blogs.msdn.com/vcblog/archive/2009/11/10/steps-to-open-actionable-bugs.aspx"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">this blog post</span></a><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">). <o:p></o:p></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Implicit Files</b> &ndash; <i style="mso-bidi-font-style: normal;">The code browsing database will not collect data for files not specified in a project.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Information files that are not explicitly included in the project file (ie: external dependencies) won&rsquo;t be parsed into the database so you won&rsquo;t get any IntelliSense on those.<o:p></o:p></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Implicit Cleanup</b> &ndash; <i style="mso-bidi-font-style: normal;">The code browsing database will not clean up no longer referenced implicit files.<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>When implicit references are removed entries related to these are removed from the database. With this option turned on that information will remain on the database.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable External Dependencies Folder</b> &ndash; <i style="mso-bidi-font-style: normal;">The &lsquo;External Dependencies&rsquo; folder for each project will not be created/updated.<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">This one doesn&rsquo;t affects IntelliSense related but worth talking about. All the implicit files will show up on the solution explorer as a separate node (External Dependencies). This doesn&rsquo;t means that they are actually part of your project but since the IntelliSense database knows where they are and their information you get them visually represented on the Solution Explorer as if it were. Enabling this option removes that node from the tool window.<o:p></o:p></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Recreate Database</b> &ndash; <i style="mso-bidi-font-style: normal;">Recreate the code browsing database from scratch upon the next solution load.<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">This is for cases where you think your database is getting corrupted and you rather start it from scratch every time you load the solution. This does means that you&rsquo;ll have to wait until the solution is completely parsed until you can start getting accurate IntelliSense.<o:p></o:p></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Rescan Solution Interval</b> &ndash; <i style="mso-bidi-font-style: normal;">A &lsquo;Rescan Solution Now&rsquo; job will be scheduled every &lsquo;value&rsquo; minutes. The value must be between 0 and 5000.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Changes you make are parsed in real time (ie: as you make them), however every set amount of time a complete parse is triggered to ensure that the whole database is up to date. This extra parse won&rsquo;t actually clean up your database and recreate it from scratch but rather scan for changes made on files that are not active (take for example opening one of the header files your project is referencing on a different instance of Visual Studio). By default this is every 60 minutes, by changing this you can control that interval.<o:p></o:p></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Fallback Location<o:p></o:p></span></span></b></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Always Use Fallback Location</b> &ndash; <i style="mso-bidi-font-style: normal;">Indicates that the browsing database and IntelliSense files should always be stored in your &lsquo;Fallback Location&rsquo;, not next to the .sln file.<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">As the description mentions, the default behavior has always been to save the IntelliSense files on the same folder as the solution file. If you rather have them somewhere else (more specifically on the fallback location) you can change this flag.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Do Not Warn If Fallback Location Used</b> &ndash; <i style="mso-bidi-font-style: normal;">Do not inform or prompt you if a &lsquo;Fallback Location&rsquo; is used.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">As we mentioned before if there&rsquo;s any issues with creating the SDF file a fallback location will be used. By default you get a prompt when this happens and Visual Studio will try to determine a location for you (if you actually want one). Turning on this setting will prevent that initial dialog from showing up (this is the same as selecting the &ldquo;Do not prompt me again&rdquo; checkbox on the dialog).<o:p></o:p></span></span></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><img style="width: 479px; height: 335px;" title="Fallback location window" alt="Fallback location window" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/98/21/90/FallBackLocationWindow.jpg" original-url="http://blogs.msdn.com/photos/raulperez/images/9982190/original.aspx" width="479" height="335" mce_src="http://blogs.msdn.com/photos/raulperez/images/9982190/original.aspx" /></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Fallback Location</b> &ndash; <i style="mso-bidi-font-style: normal;">This value is used as a secondary location to store the browsing database or IntelliSense files. If empty this will default to your temporary directory.<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><i style="mso-bidi-font-style: normal;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></i></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">IntelliSense<o:p></o:p></span></span></i></b></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></i></b></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Before going on with the IntelliSense settings, I&rsquo;ll briefly go over the features these settings affect since most of them are new in Visual Studio 2010.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">QuickInfo &ndash; This is the tooltip you get when hovering over a symbol (or using the keyboard shortcut Ctrl +K, Ctrl + I). <o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Squiggles &ndash; These are the red curvy lines you get on the editor window when there are errors.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Error Reporting &ndash; The errors that cause the IntelliSense squiggles to appear are also displayed on the Error Window (which you can find under the View menu or through its keyboard shortcut Ctrl + \, Ctrl + E)<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">More information about Squiggles and error reporting is available on </span><a href="http://blogs.msdn.com/vcblog/archive/2009/06/01/c-gets-squiggles.aspxhttp:/blogs.msdn.com/vcblog/archive/2009/06/01/c-gets-squiggles.aspx"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">this blog post</span></a><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">#include Auto Complete &ndash; When including files on code you&rsquo;ll get the same behavior as previous versions of Member List and AutoComplete on these statements.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">More information about this new feature is available on </span><a href="http://blogs.msdn.com/raulperez/archive/2009/11/17/include-auto-complete.aspx"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">this blog post</span></a><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Auto Quick Info</b> &ndash; <i style="mso-bidi-font-style: normal;">Automatically display Quick Info tooltips when hovering over text in the editor.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Turning this feature off removes the hovering (you can still get Quick Info via the keyboard shortcut).<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable IntelliSense</b> &ndash; <i style="mso-bidi-font-style: normal;">Disable all IntelliSense features<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">As mentioned previously this will also change the values of all the rest of the options (excluding Disable #include Auto Complete)<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Auto Updating</b> &ndash; <i style="mso-bidi-font-style: normal;">IntelliSense updating will be delayed until an actual request for IntelliSense</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Instead of database updates happening on real time they will happen upon request.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Error Reporting</b> &ndash; <i style="mso-bidi-font-style: normal;">Disables reporting of IntelliSense errors through squiggles and the Error List window. Also disables the background parsing associated with error reporting.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">Changing this to true completely disables both squiggles and error reporting.<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></b></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Squiggles</b> &ndash; <i style="mso-bidi-font-style: normal;">Disable IntelliSense error Squiggles.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">This disables only the visible squiggles (errors still get reported through the error reporting window).<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable #include Auto Complete</b> &ndash; <i style="mso-bidi-font-style: normal;">Disable automatic completion of #include statements.</i><o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Max Cached Translation Units</b> &ndash; <i style="mso-bidi-font-style: normal;">The maximum number of translation units that will be kept active at a time for IntelliSense requests. The value must be between 2 and 15.<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; text-indent: 0.5in; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">A translation unit (TU) is the term for a source file plus all of its included headers. For each translation unit there&rsquo;s an instance of vcpkgsvr.exe running. The tradeoff here as usual is memory versus performance, if you like working with multiple source files open in the editor (and you actually swap to them constantly) you will see some performance increase by raising this number. The default value for this is two (which is more than enough for most projects).<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><i style="mso-bidi-font-style: normal;"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">References<o:p></o:p></span></span></i></b></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">The &ldquo;Find All References&rdquo; was also improved for this release. Both are basically allowing you to turn the new behavior on or off (more information on the new functionality and the two options on </span><a href="http://blogs.msdn.com/vcblog/archive/2009/11/17/improvements-to-find-all-references-in-visual-studio-2010.aspx" mce_href="http://blogs.msdn.com/vcblog/archive/2009/11/17/improvements-to-find-all-references-in-visual-studio-2010.aspx"><span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff">this blog post</span></a><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri">)<o:p></o:p></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Disable Resolving</b> &ndash; <i style="mso-bidi-font-style: normal;">&lsquo;Find All References&rsquo; will display raw textual results instead of using IntelliSense to verify each candidate (faster).<o:p></o:p></i></span></span></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;" face="Calibri" size="3">&nbsp;</span></o:p></p>
<p style="text-align: justify; margin: 0in 0in 0pt;" class="MsoNormal"><span style="font-size: small;" size="3"><span style="font-family: Calibri;" face="Calibri"><b style="mso-bidi-font-weight: normal;">Hide Unconfirmed</b> &ndash; <i style="mso-bidi-font-style: normal;">Hide unconfirmed items in the &lsquo;Find All References&rsquo; results.</i></span></span><o:p></o:p></p>]]></content:encoded>
    </item>
    <item>
      <title>.Net Reflection and Unloading Assemblies</title>
      <link>https://docs.microsoft.com/archive/blogs/raulperez/net-reflection-and-unloading-assemblies</link>
      <pubDate>Thu, 04 Mar 2010 11:34:00 GMT</pubDate>
      <dc:creator><![CDATA[Raul Perez]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/raulperez/2010/03/04/net-reflection-and-unloading-assemblies/</guid>
      <description><![CDATA[I was working with one of our tools and ran into the following problem. The tool is on the PATH...]]></description>
      <content:encoded><![CDATA[<P style="TEXT-ALIGN: justify; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 10pt" class=MsoNormal><FONT size=3><FONT face=Calibri>I was working with one of our tools and ran into the following problem. The tool is on the PATH environment variable and we run it from different folders (through the console). On those folders the tool builds an assembly, loads it through reflection and then does some operations against it. Now the issue is that if I’m doing the build and load thing multiple times the assembly is locked and I can’t rebuild it (failures due to a sharing violation).<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; MARGIN: 0in 0in 10pt" class=MsoNormal><FONT size=3><FONT face=Calibri><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>I though ok, this should be easy enough, just call Assembly.Unload right? Well to my surprise there’s no such method. After doing some research I found there’s an unload method if you’re using AppDomain and I got all excited. Unfortunately that didn’t last long as I had to use AppDomain.Load and due to the path issue I mentioned above Load would just fail. The loading of the assembly was being done though Assembly.LoadFrom to get around the path issue.<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 10pt" class=MsoNormal><FONT size=3><FONT face=Calibri>The whole process of trial an error lasted a few hours and I probably lost a few hairs but experimenting with the Assembly.Load overloads I saw one that took a byte array and some light bulbs started flashing above my head. Using that overload solved two issues:<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.25in; mso-add-space: auto; mso-list: l0 level1 lfo1" class=MsoListParagraphCxSpFirst><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>I could load the assembly no matter the path because I was getting it in memory first (inside the byte array)<o:p></o:p></FONT></FONT></P>
<P style="TEXT-ALIGN: justify; TEXT-INDENT: -0.25in; MARGIN: 0in 0in 10pt 0.25in; mso-add-space: auto; mso-list: l0 level1 lfo1" class=MsoListParagraphCxSpLast><SPAN style="mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"><SPAN style="mso-list: Ignore"><FONT size=3 face=Calibri>-</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><FONT face=Calibri>Since I was loading it in memory and loading that memory buffer the file wasn’t getting locked so that fixed my original issue.<o:p></o:p></FONT></FONT></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; COLOR: #2b91af; FONT-SIZE: 9.5pt">String </SPAN><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">filename = …; <SPAN style="COLOR: green">// Full path of the assembly I want to load<o:p></o:p></SPAN></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt">byte</SPAN><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">[] file = <SPAN style="COLOR: blue">null</SPAN>;<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt">int</SPAN><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"> bufferSize = 1024;<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt">using</SPAN><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"> (<SPAN style="COLOR: #2b91af">FileStream</SPAN> fileStream = <SPAN style="COLOR: #2b91af">File</SPAN>.Open(filename, <SPAN style="COLOR: #2b91af">FileMode</SPAN>.Open))<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">{<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; TEXT-INDENT: 0.5in; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt">using</SPAN><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"> (<SPAN style="COLOR: #2b91af">MemoryStream</SPAN> memoryStream = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: #2b91af">MemoryStream</SPAN>())<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">byte</SPAN>[] buffer = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: blue">byte</SPAN>[bufferSize];<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">int</SPAN> readBytesCount = 0;<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">while</SPAN> ((readBytesCount = fileStream.Read(buffer, 0, bufferSize)) &gt; 0)<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>memoryStream.Write(buffer, 0, readBytesCount);<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>file = memoryStream.ToArray();<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">}<o:p></o:p></SPAN></P>
<P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal><SPAN style="FONT-FAMILY: Consolas; COLOR: #2b91af; FONT-SIZE: 9.5pt">Assembly </SPAN><SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt">assembly = <SPAN style="COLOR: #2b91af">Assembly</SPAN>.Load(file);<o:p></o:p></SPAN></P>]]></content:encoded>
    </item>
  </channel>
</rss>