File: VisualBasicParserUtilitites_Tests.cs
Web Access
Project: ..\..\..\src\Tasks.UnitTests\Microsoft.Build.Tasks.UnitTests.csproj (Microsoft.Build.Tasks.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Build.Tasks;
using Xunit;
 
#nullable disable
 
namespace Microsoft.Build.UnitTests
{
    public sealed class VisualBasicParserUtilititesTests
    {
        // Try just and empty file
        [Fact]
        public void EmptyFile()
        {
            AssertParse("", null);
        }
 
        // A simple form
        [Fact]
        public void SimpleForm()
        {
            AssertParse(
                @"
        rem This is my class
        <DefaultInstanceProperty(&qtGetInstance&qt)> Public ClAsS Form1
        End Class
                ",
                "Form1");
        }
 
        // A simple form with a namespace
        [Fact]
        public void Namespace()
        {
            AssertParse(
                @"
    ' This is my Namespace
    NamEspacE Goofy.Mickey
        rem This is my class
        <DefaultInstanceProperty(&qtGetInstance&qt)> Public ClAsS Form1
        End Class
    End Namespace
                ",
                "Goofy.Mickey.Form1");
        }
 
        // A simple form with a namespace
        [Fact]
        public void NestedNamespace()
        {
            AssertParse(
                @"
    Namespace Goofy
        Namespace Mickey
            <DefaultInstanceProperty(&qtGetInstance&qt)> Public Class Form1
                ",
                "Goofy.Mickey.Form1");
        }
 
        // A namespace the is ended before the class
        [Fact]
        public void NestedAndEndedNamespace()
        {
            AssertParse(
                @"
    Namespace Goofy
        Namespace Mickey
        End Namespace ' Just finished with the namespace, about to make a class
        <DefaultInstanceProperty(&qtthis propert is a class name&qt)> PuBlic Class Form1
                ",
                "Goofy.Form1");
        }
 
        /// <summary>
        /// Our Visual Basic parser would sink any string that begins with "rem" as
        /// the beginning of a comment, even if the "rem" wasn't immediately followed
        /// by whitespace.  This resulted in broken resource names when the namespace
        /// name was something like "BugResources.RemoveStuff.XYZ", because we would
        /// only match the "BugResources" bit.
        /// </summary>
        [Fact]
        public void NamespaceElementBeginsWithRem()
        {
            AssertParse(
    @"
    ' This is my Namespace
    NamEspacE Artist.Painter.Rembrandt
        rem This is my class
        <DefaultInstanceProperty(&qtGetInstance&qt)> Public ClAsS SelfPortrait
        End Class
    End Namespace
                ",
    "Artist.Painter.Rembrandt.SelfPortrait");
        }
 
        /*
        * Method:  AssertParse
        *
        * Parse 'source' as VB source code and get the first class name fully-qualified
        * with namespace information. That class name must match the expected class name.
        */
        private static void AssertParse(string source, string expectedClassName)
        {
            source = source.Replace("&qt", "\"");
 
            ExtractedClassName className = VisualBasicParserUtilities.GetFirstClassNameFullyQualified(
                StreamHelpers.StringToStream(source));
 
            Assert.Equal(expectedClassName, className.Name);
        }
    }
}