public void ConditionalInclusionsIfTests()
        {
            #region setup
            
            var definesHandler = new Defines();

            definesHandler.Define("DEBUG", "");
            definesHandler.Define("NDEBUG", "");
            definesHandler.Define("DEBUGGER", "");

            var expectedPreprocessorDefines = new HashSet<string>()
            {
                "DEBUG",
                "NDEBUG",
                "DEBUGGER",
                "DLEVEL"
            };

            var filter = new ConditionalInclusionsFilter( new ExpressionEvaluation() );

            const string nameSpace = "BoostTestAdapterNunit.Resources.SourceFiltering.";
            const string unfilteredSourceCodeResourceName = "ConditionalInclusionsIfTests_UnFilteredSourceCode.cpp";
            const string filteredSourceCodeResourceName = "ConditionalInclusionsIfTests_FilteredSourceCode.cpp";

            string sourceCodeOriginal = TestHelper.ReadEmbeddedResource(nameSpace + unfilteredSourceCodeResourceName);
            string sourceCodeExpected = TestHelper.ReadEmbeddedResource(nameSpace + filteredSourceCodeResourceName);

            var cppSourceFile = new CppSourceFile()
            {
                FileName = nameSpace + unfilteredSourceCodeResourceName,
                SourceCode = sourceCodeOriginal
            };

            #endregion

            #region excercise

            filter.Filter(cppSourceFile, definesHandler);

            #endregion

            #region verify

            Assert.AreEqual(sourceCodeExpected, cppSourceFile.SourceCode);
            Assert.AreEqual(expectedPreprocessorDefines, definesHandler.NonSubstitutionTokens);
            Assert.AreEqual(0, definesHandler.SubstitutionTokens.Count);

            #endregion

        }
        /// <summary>
        /// Given a parameter list of strings, generates a Defines structure
        /// where pairs of strings are treated as a definition and its value.
        /// </summary>
        /// <param name="definitions">The string pair definitions array from which to generate the Defines structue</param>
        /// <returns>A Defines structure built out of string pairs available in the definitions array</returns>
        private Defines GenerateDefines(string[] definitions)
        {
            Assert.That(definitions.Length % 2, Is.EqualTo(0));

            Defines definesHandler = new Defines();

            for (int i = 1; i < definitions.Length; i += 2)
            {
                definesHandler.Define(definitions[i - 1], definitions[i]);
            }

            return definesHandler;
        }
        /// <summary>
        /// Acquires the pre-processor definitions used by the project
        /// </summary>
        /// <param name="projectInfo">The Visual Studio project</param>
        /// <returns>The pre-processor definitions specified within the project</returns>
        private static Defines GetDefines(ProjectInfo projectInfo)
        {
            /*
             * it is important that the pre-processor defines at project level are not modified
             * because every source file in the project has to have the same starting point.
             */

            //call to cpy ctor
            Defines defines = new Defines(projectInfo.DefinesHandler);

            // Additional Boost definitions

            // NOTE These definitions are generally assumed to be available since
            //      we are operating in a BOOST Test context
            if (!defines.IsDefined("BOOST_VERSION"))
            {
                defines.Define("BOOST_VERSION", "0");
            }

            return defines;
        }