public void BuildPropertyBlock_Set(string asTypeName)
        {
            var attrSet = new PropertyAttributeSet()
            {
                PropertyName           = "NewProperty",
                BackingField           = "backingField",
                RHSParameterIdentifier = "RHS",
                GeneratePropertySet    = true,
                AsTypeName             = asTypeName,
            };

            var results     = GeneratePropertyBlocks($"Public xxx As {asTypeName}", "xxx", attrSet);
            var actualLines = results.Set.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList();

            Assert.AreEqual(3, actualLines.Count);
            Assert.AreEqual(actualLines[0].Trim(), $"Public Property Set {attrSet.PropertyName}(ByVal {attrSet.RHSParameterIdentifier} As {asTypeName})");
            Assert.AreEqual(actualLines[1].Trim(), $"Set {attrSet.BackingField} = {attrSet.RHSParameterIdentifier}");
            Assert.AreEqual(actualLines[2].Trim(), "End Property");
        }
        public void BuildPropertyBlock_VariantGet()
        {
            var attrSet = new PropertyAttributeSet()
            {
                PropertyName = "NewProperty",
                BackingField = "backingField",
                AsTypeName   = "Variant",
            };

            var results     = GeneratePropertyBlocks("Public xxx As Variant", "xxx", attrSet);
            var actualLines = results.Get.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList();

            Assert.AreEqual(7, actualLines.Count);
            Assert.AreEqual(actualLines[0].Trim(), $"Public Property Get {attrSet.PropertyName}() As {attrSet.AsTypeName}");
            Assert.AreEqual(actualLines[1].Trim(), $"If IsObject({attrSet.BackingField}) Then");
            Assert.AreEqual(actualLines[2].Trim(), $"Set {attrSet.PropertyName} = {attrSet.BackingField}");
            Assert.AreEqual(actualLines[3].Trim(), "Else");
            Assert.AreEqual(actualLines[4].Trim(), $"{attrSet.PropertyName} = {attrSet.BackingField}");
            Assert.AreEqual(actualLines[5].Trim(), "End If");
            Assert.AreEqual(actualLines[6].Trim(), "End Property");
        }
        private (string Get, string Let, string Set) GeneratePropertyBlocks(string code, string prototypeIdentifier, PropertyAttributeSet attrSet)
        {
            var vbe = MockVbeBuilder.BuildFromSingleStandardModule(code, out _).Object;

            using (var state = MockParser.CreateAndParse(vbe))
            {
                var encapsulateTarget = state.AllUserDeclarations.Single(d => d.IdentifierName.Equals(prototypeIdentifier));

                attrSet.Declaration = encapsulateTarget;
                var resolver = EncapsulateFieldTestSupport.GetResolver(state);

                return(resolver.Resolve <IEncapsulateFieldCodeBuilder>()
                       .BuildPropertyBlocks(attrSet));
            }
        }