Beispiel #1
0
        public void GetWholeChain_ReturnAllCrumbs_RelatedTo_Selected_One()
        {
            var crumbRoot = new Crumb();
            //B
            var crumbB     = new Crumb();
            var crumbB_A   = new Crumb();
            var crumbB_B   = new Crumb();
            var crumbB_C   = new Crumb();
            var crumbB_C_A = new Crumb();
            //C
            var crumbC = new Crumb();

            crumbRoot.RegisterObserver(crumbB);
            crumbRoot.RegisterObserver(crumbC);

            crumbB.RegisterObserver(crumbB_A);
            crumbB.RegisterObserver(crumbB_B);

            crumbB_C.RegisterObserver(crumbB_C_A);
            crumbB.RegisterObserver(crumbB_C);

            //act
            var crumbChain = crumbB.GetWholeChain().ToArray();

            Assert.Equal(6, crumbChain.Length);
            Assert.Contains(crumbRoot, crumbChain);
            Assert.Contains(crumbB, crumbChain);
            Assert.Contains(crumbB_A, crumbChain);
            Assert.Contains(crumbB_B, crumbChain);
            Assert.Contains(crumbB_C, crumbChain);
            Assert.Contains(crumbB_C_A, crumbChain);
        }
Beispiel #2
0
        public void GetBranch_OK_WithNoRoot_AlsoSecondLineInheriting()
        {
            var crumbRoot = new Crumb();
            //B
            var crumbB     = new Crumb();
            var crumbB_A   = new Crumb();
            var crumbB_B   = new Crumb();
            var crumbB_C   = new Crumb();
            var crumbB_C_A = new Crumb();
            //C
            var crumbC = new Crumb();

            crumbRoot.RegisterObserver(crumbB);
            crumbRoot.RegisterObserver(crumbC);

            crumbB.RegisterObserver(crumbB_A);
            crumbB.RegisterObserver(crumbB_B);

            crumbB_C.RegisterObserver(crumbB_C_A);
            crumbB.RegisterObserver(crumbB_C);

            //act
            var crumbBBranch = crumbB.GetBranch().ToArray();
            var crumbCBranch = crumbC.GetBranch().ToArray();

            Assert.Equal(5, crumbBBranch.Length);
            Assert.Contains(crumbB, crumbBBranch);
            Assert.Contains(crumbB_A, crumbBBranch);
            Assert.Contains(crumbB_B, crumbBBranch);
            Assert.Contains(crumbB_C, crumbBBranch);
            Assert.Contains(crumbB_C_A, crumbBBranch);

            Assert.Single(crumbCBranch);
            Assert.Contains(crumbC, crumbCBranch);
        }
Beispiel #3
0
    public static Crumb GetCrumb()
    {
        Crumb result = new Crumb();

        result.pos = new Vector3(pos.x, pos.y, pos.z);
        return(result);
    }
        static async Task <Crumb> GetCrumb(HttpClient httpClient)
        {
            string endPoint = string.Format(GET_CRUMB_URI);

            HttpResponseMessage response = await httpClient.GetAsync(endPoint);

            if (!response.IsSuccessStatusCode)
            {
                return(null);
            }

            string responseContents = await response.Content.ReadAsStringAsync();

            if (string.IsNullOrEmpty(responseContents))
            {
                return(null);
            }

            Crumb crumb = new Crumb();

            crumb.FieldName = XmlNodeLoader.LoadValue(
                responseContents, "/defaultCrumbIssuer/crumbRequestField");
            crumb.Value = XmlNodeLoader.LoadValue(
                responseContents, "/defaultCrumbIssuer/crumb");

            return(crumb);
        }
Beispiel #5
0
        /// <summary>
        /// Returns true if DefaultCrumbIssuer instances are equal
        /// </summary>
        /// <param name="other">Instance of DefaultCrumbIssuer to be compared</param>
        /// <returns>Boolean</returns>
        public bool Equals(DefaultCrumbIssuer other)
        {
            if (other is null)
            {
                return(false);
            }
            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return
                ((
                     Class == other.Class ||
                     Class != null &&
                     Class.Equals(other.Class)
                     ) &&
                 (
                     Crumb == other.Crumb ||
                     Crumb != null &&
                     Crumb.Equals(other.Crumb)
                 ) &&
                 (
                     CrumbRequestField == other.CrumbRequestField ||
                     CrumbRequestField != null &&
                     CrumbRequestField.Equals(other.CrumbRequestField)
                 ));
        }
Beispiel #6
0
        private List <Crumb> GetCrumbs()
        {
            var crumbs = new List <Crumb>();

            var homeCrumb = new Crumb
            {
                IsHome         = true,
                Label          = Dictionary.Home,
                ControllerName = "Home",
                ActionName     = "Index",
            };

            homeCrumb.IsActive = IsCrumbActive(homeCrumb);
            crumbs.Add(homeCrumb);
            crumbs.AddRange(_crumbs);

            if (!crumbs.Any(c => c.IsActive))
            {
                var activeCrumb = new Crumb
                {
                    Label          = _viewContext.ViewBag.SubTitle ?? _viewContext.ViewBag.Title,
                    ControllerName = GetActiveControllerName(),
                    ActionName     = GetActiveActionName(),
                    IsActive       = true
                };
                crumbs.Add(activeCrumb);
            }
            return(crumbs);
        }
Beispiel #7
0
        public void GetBranch_OK_WithNoRoot_OnlyFirstLineInheriting()
        {
            var crumbRoot = new Crumb();
            //A
            var crumbA   = new Crumb();
            var crumbA_A = new Crumb();
            var crumbA_B = new Crumb();
            //C
            var crumbC = new Crumb();

            crumbRoot.RegisterObserver(crumbA);
            crumbRoot.RegisterObserver(crumbC);

            crumbA.RegisterObserver(crumbA_A);
            crumbA.RegisterObserver(crumbA_B);

            //act
            var crumbABranch = crumbA.GetBranch().ToArray();
            var crumbCBranch = crumbC.GetBranch().ToArray();

            Assert.Equal(3, crumbABranch.Length);
            Assert.Contains(crumbA, crumbABranch);
            Assert.Contains(crumbA_A, crumbABranch);
            Assert.Contains(crumbA_B, crumbABranch);

            Assert.Single(crumbCBranch);
            Assert.Contains(crumbC, crumbCBranch);
        }
Beispiel #8
0
        public void Assign_Observer()
        {
            var observerCrumb = new Crumb();
            var broadcaster   = new Crumb();

            //act
            Assert.Empty(broadcaster.Observers);
            broadcaster.RegisterObserver(observerCrumb);

            Assert.Single(broadcaster.Observers);
        }
Beispiel #9
0
 public static Crumb NextCrum(Crumb c)
 {
     if (crumbs.Contains(c))
     {
         int i = crumbs.IndexOf(c);
         if (i < (crumbs.Count - 1))
         {
             return(crumbs[i + 1]);
         }
     }
     return(GetCrumb());
 }
        public void ItReturnsBreadcrumbs()
        {
            // Arrange
            const string slug        = "unit-test-showcase-crumbs";
            var          crumb       = new Crumb("title", "slug", "type");
            var          collection  = new ContentfulCollection <ContentfulShowcase>();
            var          rawShowcase = new ContentfulShowcaseBuilder().Slug(slug)
                                       .Breadcrumbs(new List <ContentfulReference>()
            {
                new ContentfulReference()
                {
                    Title = crumb.Title, Slug = crumb.Title, Sys = new SystemProperties()
                    {
                        Type = "Entry"
                    }
                },
            })
                                       .Build();

            collection.Items = new List <ContentfulShowcase> {
                rawShowcase
            };

            var builder = new QueryBuilder <ContentfulShowcase>().ContentTypeIs("showcase").FieldEquals("fields.slug", slug).Include(3);

            _contentfulClient.Setup(o => o.GetEntries(It.Is <QueryBuilder <ContentfulShowcase> >(q => q.Build() == builder.Build()), It.IsAny <CancellationToken>()))
            .ReturnsAsync(collection);

            _crumbFactory.Setup(o => o.ToModel(It.IsAny <ContentfulReference>())).Returns(crumb);

            var rawEvent = new ContentfulEventBuilder().Slug(slug).EventDate(new DateTime(2017, 4, 1)).Build();
            var events   = new List <ContentfulEvent> {
                rawEvent
            };

            _cacheWrapper.Setup(o => o.GetFromCacheOrDirectlyAsync(It.Is <string>(s => s == "event-all"), It.IsAny <Func <Task <IList <ContentfulEvent> > > >(), It.Is <int>(s => s == 60))).ReturnsAsync(events);
            var modelledEvent = new Event("title", "event-slug", "", "", "", "", "", "", DateTime.MaxValue, "", "", 1, EventFrequency.None, null, "", null, new List <string>(), null, false, "", DateTime.MinValue, new List <string>(), null, null, new List <EventCategory> {
                new EventCategory("event", "slug", "icon")
            }, null, null, null, null);

            _eventFactory.Setup(e => e.ToModel(It.IsAny <ContentfulEvent>())).Returns(modelledEvent);

            // Act
            var response = AsyncTestHelper.Resolve(_repository.GetShowcases(slug));

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.OK);
            var showcase = response.Get <Showcase>();

            showcase.Breadcrumbs.First().Should().Be(crumb);
        }
Beispiel #11
0
        public void AssignedObserver_IntoCrumb_Broadcast_Call_Receive()
        {
            var observerMock = new Mock <ICrumb>();

            observerMock.Setup(o => o.Receive());

            var broadcaster = new Crumb();

            broadcaster.RegisterObserver(observerMock.Object);
            //act
            broadcaster.Broadcast();

            observerMock.Verify(o => o.Receive(), Times.Once);
        }
Beispiel #12
0
        protected void Page_Load(object sender, EventArgs e)
        {
            this.CurrentPath = Page.AppRelativeVirtualPath.Substring(1).Split('?')[0];

            Crumb CurrentCrumb = Crumbs.Find(c => c.Page.Equals(CurrentPath));

            this.CurrentCrumbs.Add(CurrentCrumb);
            while (CurrentCrumb.Previous != null)
            {
                CurrentCrumb = CurrentCrumb.Previous;
                this.CurrentCrumbs.Add(CurrentCrumb);
            }

            this.CurrentCrumbs.Reverse();
        }
        public int AddCrumb(string title, ICrumbViewContent content)
        {
            if (title == null)
            {
                throw new ArgumentNullException("Title");
            }

            if (content == null)
            {
                throw new ArgumentNullException("Content");
            }

            ICrumb crumb = new Crumb(title, content);

            return(AddCrumb(crumb));
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            if (crumbList.Count > 0)
            {
                int uiOverheadLeft  = 3;
                int uiOverheadRight = 13;
                int uiOverhead      = uiOverheadLeft + uiOverheadRight;

                // Calc Control length
                int controlWidth = 0;

                for (int i = 0; i < crumbList.Count; i++)
                {
                    int   crumbIndex = crumbList.Count - 1 - i;
                    Crumb crumb      = crumbList[crumbIndex];
                    int   textWidth  = (int)e.Graphics.MeasureString(crumb.Text, Font).Width;
                    controlWidth += textWidth + uiOverhead;                 //Vorne und hinten
                }

                int controlWidthUsed = controlWidth - uiOverheadRight;             //Damit das erste Element bei X:0 gezeichnet wird

                for (int i = 0; i < crumbList.Count; i++)
                {
                    int   crumbIndex = crumbList.Count - 1 - i;
                    Crumb crumb      = crumbList[crumbIndex];
                    int   textWidth  = (int)e.Graphics.MeasureString(crumb.Text, Font).Width;

                    if (crumbIndex == 0)
                    {
                        controlWidthUsed -= textWidth + uiOverhead;
                        DrawControl(e, crumbIndex, controlWidthUsed + uiOverheadRight, textWidth + uiOverhead, crumb.Clicked, crumb.Hovered);
                        DrawText(e, controlWidthUsed + uiOverhead, crumb.Text);
                    }
                    else
                    {
                        controlWidthUsed -= textWidth + uiOverhead;
                        DrawControl(e, crumbIndex, controlWidthUsed, textWidth + uiOverhead + uiOverheadRight, crumb.Clicked, crumb.Hovered);
                        DrawText(e, controlWidthUsed + uiOverhead, crumb.Text);
                    }
                }
            }

            base.OnPaint(e);
        }
Beispiel #15
0
 public override string ToString()
 {
     if (mTransitionHistory != null)
     {
         StringBuilder stringBuilder = new StringBuilder();
         for (int i = 0; i < mTransitionHistory.Count; i++)
         {
             Crumb      crumb = mTransitionHistory[i];
             Transition obj   = null;
             if (crumb.mSignal != null)
             {
                 obj = crumb.mSignal.Transition;
             }
             stringBuilder.Append($"[{crumb.mTime}sec] state traverser '{mTraverser.GetSafeName()}' transitioning '{crumb.mStartState.GetSafeName()}'->'{crumb.mEndState.GetSafeName()}' using signal '{crumb.mSignal.GetSafeName()}' and transition '{obj.GetSafeName()}'\n");
         }
         return(stringBuilder.ToString());
     }
     return(string.Empty);
 }
Beispiel #16
0
 /// <summary>
 /// Gets the hash code
 /// </summary>
 /// <returns>Hash code</returns>
 public override int GetHashCode()
 {
     unchecked // Overflow is fine, just wrap
     {
         var hashCode = 41;
         // Suitable nullity checks etc, of course :)
         if (Class != null)
         {
             hashCode = hashCode * 59 + Class.GetHashCode();
         }
         if (Crumb != null)
         {
             hashCode = hashCode * 59 + Crumb.GetHashCode();
         }
         if (CrumbRequestField != null)
         {
             hashCode = hashCode * 59 + CrumbRequestField.GetHashCode();
         }
         return(hashCode);
     }
 }
Beispiel #17
0
        public void GetWholeChain_ReturnCrumbsRelatedTo_Selected_WithNoSideOnes()
        {
            var crumbRoot = new Crumb()
            {
                Name = "root"
            };
            //B
            var crumbB = new Crumb()
            {
                Name = "B"
            };
            var crumbB_A = new Crumb()
            {
                Name = "B_A"
            };
            var crumbB_B   = new Crumb();
            var crumbB_C   = new Crumb();
            var crumbB_C_A = new Crumb();
            //C
            var crumbC = new Crumb();

            crumbRoot.RegisterObserver(crumbB);
            crumbRoot.RegisterObserver(crumbC);

            crumbB.RegisterObserver(crumbB_A);
            crumbB.RegisterObserver(crumbB_B);

            crumbB_C.RegisterObserver(crumbB_C_A);
            crumbB.RegisterObserver(crumbB_C);

            //act
            var crumbChain = crumbB_A.GetWholeChain().ToArray();

            Assert.Equal(3, crumbChain.Length);
            Assert.Contains(crumbRoot, crumbChain);
            Assert.Contains(crumbB, crumbChain);
            Assert.Contains(crumbB_A, crumbChain);
        }
        private static void CreatePropertySetterDelegate(Builder builder, PropertyBuilderInfo member, Method propertySetter)
        {
            // If we don't have a backing field and we don't have a setter and getter
            // don't bother creating a setter delegate
            if (member.Property.BackingField == null && propertySetter == null)
            {
                return;
            }

            if (member.Property.BackingField == null && member.Property.Getter != null && member.Property.Setter != null)
            {
                var getter = member.Property.Getter.Copy();
                var setter = member.Property.Setter.Copy();

                CreateSetterDelegate(builder, propertySetter, member.Property.ReturnType,
                                     x => x.Call(getter.IsStatic ? null : Crumb.This, getter),
                                     (coder, value) => coder.Call(setter.IsStatic ? null : Crumb.This, setter, value()));
            }
            else if (member.Property.BackingField != null && !member.Property.BackingField.FieldType.IsGenericType)
            {
                CreateSetterDelegate(builder, propertySetter, member.Property.BackingField.FieldType,
                                     x => x.Load(member.Property.BackingField) as ICode,
                                     (coder, value) => coder.Assign(member.Property.BackingField).Set(value()));
            }
            else if (member.Property.BackingField == null && member.Property.Setter != null)
            {
                var methodSetter = member.Property.Setter.Copy();
                propertySetter.NewCode().Call(methodSetter.IsStatic ? null : Crumb.This, methodSetter, Crumb.GetParameter(0)).Return().Replace();
            }
            else if (member.Property.BackingField == null && member.Property.Getter != null)
            {
                // This shouldn't be a thing
            }
            else
            {
                propertySetter.NewCode().Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)).Return().Replace();
            }
        }
Beispiel #19
0
        public void ShouldCreateAGroupFromAContentfulGroup()
        {
            // Arrange
            var crumb          = new Crumb("Stockport Local", string.Empty, "groups");
            var category       = new GroupCategory("name", "slug", "icon", "imageUrl");
            var administrators = new GroupAdministrators
            {
                Items = new List <GroupAdministratorItems>
                {
                    new GroupAdministratorItems
                    {
                        Name       = "Name",
                        Email      = "Email",
                        Permission = "admin"
                    }
                }
            };
            var mapPosition = new MapPosition
            {
                Lat = 39,
                Lon = 2
            };
            var subCategories = new List <GroupSubCategory>
            {
                new GroupSubCategory("name", "slug")
            };
            var organisation = new Organisation
            {
                Title = "Org"
            };
            var suitableFor = new List <string>
            {
                "people"
            };
            var document = new DocumentBuilder().Build();

            _documentFactory.Setup(_ => _.ToModel(It.IsAny <Asset>())).Returns(document);
            _contentfulGroupCategoryFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulGroupCategory>()))
            .Returns(category);
            _contentfulGroupSubCategoryFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulGroupSubCategory>()))
            .Returns(subCategories.First());
            _contentfulOrganisationFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulOrganisation>()))
            .Returns(organisation);

            // Act
            var result = _groupContentfulFactory.ToModel(_contentfulGroup);

            // Assert
            result.AbilityLevel.Should().Be("");
            result.AccessibleTransportLink.Should().Be("link");
            result.AdditionalDocuments.Count.Should().Be(1);
            result.AdditionalDocuments.First().Should().BeEquivalentTo(document);
            result.AdditionalInformation.Should().Be("info");
            result.Address.Should().Be("_address");

            result.AgeRange.Count.Should().Be(1);
            result.AgeRange.First().Should().BeEquivalentTo("15-20");

            result.Breadcrumbs.Count.Should().Be(1);
            result.Breadcrumbs.First().Should().BeEquivalentTo(crumb);

            result.CategoriesReference.Count.Should().Be(1);
            result.CategoriesReference.First().Should().BeEquivalentTo(category);

            result.Cost.Count.Should().Be(1);
            result.CostText.Should().Be("");

            result.DateHiddenFrom.Should().Be(DateTime.MinValue);
            result.DateHiddenTo.Should().Be(DateTime.MinValue);
            result.DateLastModified.Should().Be(DateTime.MinValue);

            result.Email.Should().Be("_email");
            result.Description.Should().Be("_description");
            result.Donations.Should().BeFalse();
            result.DonationsText.Should().Be("donText");
            result.DonationsUrl.Should().Be("donUrl");
            result.ImageUrl.Should().Be("image-url.jpg");
            result.GroupAdministrators.Should().BeEquivalentTo(administrators);
            result.MapPosition.Should().BeEquivalentTo(mapPosition);
            result.Name.Should().Be("_name");
            result.Slug.Should().Be("_slug");
            result.PhoneNumber.Should().Be("_phoneNumber");
            result.Website.Should().Be("_website");
            result.Twitter.Should().Be("_twitter");
            result.Facebook.Should().Be("_facebook");
            result.Volunteering.Should().Be(true);
            result.VolunteeringText.Should().Be("text");
            result.SubCategories.Should().BeEquivalentTo(subCategories);
            result.Status.Should().Be("Published");
            result.Organisation.Should().BeEquivalentTo(organisation);
            result.SuitableFor.Should().BeEquivalentTo(suitableFor);
            result.MetaDescription.Should().Be("_metaDescription");
        }
        private void InterceptConstructors(Builder builder, IEnumerable <BuilderType> attributes)
        {
            if (!attributes.Any())
            {
                return;
            }

            using (new StopwatchLog(this, "constructor"))
            {
                var iConstructorInterceptor = new __IConstructorInterceptor();
                var syncRoot  = new __ISyncRoot();
                var exception = new __Exception();

                var constructors = builder
                                   .FindMethodsByAttributes(attributes)
                                   .Where(x => !x.Method.OriginType.IsInterface)
                                   .GroupBy(x => new MethodKey(x.Method, null))
                                   .Select(x => new MethodBuilderInfo <MethodBuilderInfoItem <__IConstructorInterceptor> >(x.Key, x.Select(y => new MethodBuilderInfoItem <__IConstructorInterceptor>(y, iConstructorInterceptor))))
                                   .ToArray();

                foreach (var constructor in constructors)
                {
                    this.Log($"Implementing constructors in method {constructor.Key.Method}");

                    if (constructor.Item == null || constructor.Item.Length == 0)
                    {
                        continue;
                    }

                    var targetedConstrutor = constructor.Key.Method;

                    if (constructor.RequiresSyncRootField)
                    {
                        this.Log(LogTypes.Warning, targetedConstrutor, $"An interceptor applied to the constructor has implemented ISyncRoot. This is not supported. The interceptor may not work correctly.");
                    }

                    Crumb parametersArray = null;
                    var   localVariables  = new LocalVariable[constructor.Item.Length];
                    var   interceptorInit = new Action <ICode, bool>((contextCoder, isBeforeInit) =>
                    {
                        parametersArray = contextCoder.GetParametersArray();

                        for (int i = 0; i < constructor.Item.Length; i++)
                        {
                            var item          = constructor.Item[i];
                            localVariables[i] = contextCoder.CreateVariable(item.Attribute.Attribute.Type);

                            contextCoder.Assign(localVariables[i]).NewObj(item.Attribute);

                            ImplementAssignMethodAttribute(builder, item.AssignMethodAttributeInfos, localVariables[i], contextCoder, isBeforeInit);

                            contextCoder.Load(localVariables[i]).As(item.Interface.ToBuilderType)
                            .Call(item.Interface.OnBeforeInitialization, targetedConstrutor.OriginType, targetedConstrutor, parametersArray);

                            item.Attribute.Remove();
                        }
                    });

                    if (targetedConstrutor.IsCtor)
                    {
                        targetedConstrutor.NewCode()
                        .Context(x => interceptorInit(x, true))
                        .Insert(InsertionPosition.CtorBeforeInit);
                    }

                    targetedConstrutor.NewCode()
                    .Context(x =>
                    {
                        if (targetedConstrutor.IsCCtor)
                        {
                            interceptorInit(x, false);
                        }
                    })
                    .Try(x =>
                    {
                        for (int i = 0; i < constructor.Item.Length; i++)
                        {
                            var item = constructor.Item[i];
                            x.Load(localVariables[i]).As(item.Interface.ToBuilderType)
                            .Call(item.Interface.OnEnter, targetedConstrutor.OriginType, Crumb.This, targetedConstrutor, parametersArray);
                        }

                        x.OriginalBody();
                    })
                    .Catch(exception.ToBuilderType, x =>
                    {
                        if (constructor.Key.AsyncMethod == null)
                        {
                            for (int i = 0; i < constructor.Item.Length; i++)
                            {
                                x.Load(localVariables[i]).As(constructor.Item[i].Interface.ToBuilderType).Call(constructor.Item[i].Interface.OnException, x.Exception);
                            }
                        }

                        x.Rethrow();
                    })
                    .Finally(x =>
                    {
                        for (int i = 0; i < constructor.Item.Length; i++)
                        {
                            x.Load(localVariables[i]).As(constructor.Item[i].Interface.ToBuilderType).Call(constructor.Item[i].Interface.OnExit);
                        }
                    })
                    .EndTry()
                    .Return()
                    .Replace();
                }
            }
        }
Beispiel #21
0
 private void SetCrumb()
 {
     crumbing=false;
     pvis = true;
     crumb = PlayerCharacter.GetCrumb();
 }
 private string ToInactiveHtmlElement(Crumb crumb) => String.Format(_template, crumb.Url, crumb.Name);
        public void ShouldCreateATopicFromAContentfulTopic()
        {
            //Arrange
            var crumb = new Crumb("title", "slug", "type");

            _crumbFactory.Setup(_ => _.ToModel(_contentfulTopic.Breadcrumbs.First())).Returns(crumb);

            var subItem = new SubItem("slug1", "title", "teaser", "icon", "type", DateTime.MinValue, DateTime.MaxValue, "image", new List <SubItem>());

            _subItemFactory.Setup(_ => _.ToModel(_contentfulTopic.SubItems.First())).Returns(subItem);

            var secondaryItem = new SubItem("slug2", "title", "teaser", "icon", "type", DateTime.MinValue, DateTime.MaxValue, "image", new List <SubItem>());

            _subItemFactory.Setup(_ => _.ToModel(_contentfulTopic.SecondaryItems.First())).Returns(secondaryItem);

            var tertiaryItem = new SubItem("slug3", "title", "teaser", "icon", "type", DateTime.MinValue, DateTime.MaxValue, "image", new List <SubItem>());

            _subItemFactory.Setup(_ => _.ToModel(_contentfulTopic.TertiaryItems.First())).Returns(tertiaryItem);

            var eventBanner = new EventBanner("Title", "Teaser", "Icon", "Link");

            _eventBannerFactory.Setup(_ => _.ToModel(_contentfulTopic.EventBanner)).Returns(eventBanner);

            var alert = new Alert("title", "subheading", "body", "test", new DateTime(2017, 01, 01), new DateTime(2017, 04, 10), string.Empty, false);

            _alertFactory.Setup(_ => _.ToModel(_contentfulTopic.Alerts.First())).Returns(alert);

            var expandingLinkBox = new ExpandingLinkBox("title", new List <SubItem>());

            _expandingLinkBoxFactory.Setup(_ => _.ToModel(It.IsAny <ContentfulExpandingLinkBox>()))
            .Returns(expandingLinkBox);

            //Act
            var result = _topicContentfulFactory.ToModel(_contentfulTopic);

            //Assert
            result.SubItems.Count().Should().Be(1);
            result.SubItems.First().Should().BeEquivalentTo(subItem);
            result.SecondaryItems.Count().Should().Be(1);
            result.SecondaryItems.First().Should().BeEquivalentTo(secondaryItem);
            result.TertiaryItems.Count().Should().Be(1);
            result.TertiaryItems.First().Should().BeEquivalentTo(tertiaryItem);
            result.EventBanner.Should().BeEquivalentTo(eventBanner);
            result.Alerts.Count().Should().Be(1);
            result.Alerts.First().Should().BeEquivalentTo(alert);
            result.BackgroundImage.Should().BeEquivalentTo("background-image-url.jpg");
            result.Breadcrumbs.Count().Should().Be(1);
            result.Breadcrumbs.First().Should().BeEquivalentTo(crumb);
            result.EmailAlerts.Should().Be(false);
            result.EmailAlertsTopicId.Should().BeEquivalentTo("id");
            result.ExpandingLinkBoxes.Count().Should().Be(1);
            result.ExpandingLinkBoxes.First().Should().BeEquivalentTo(expandingLinkBox);
            result.ExpandingLinkTitle.Should().BeEquivalentTo("expandingLinkTitle");
            result.Icon.Should().BeEquivalentTo("icon");
            result.Image.Should().BeEquivalentTo("background-image-url.jpg");
            result.Slug.Should().BeEquivalentTo("slug");
            result.Name.Should().BeEquivalentTo("name");
            result.Summary.Should().BeEquivalentTo("summary");
            result.SunriseDate.Should().Be(DateTime.MinValue);
            result.SunsetDate.Should().Be(DateTime.MaxValue);
            result.Teaser.Should().BeEquivalentTo("teaser");
            result.MetaDescription.Should().BeEquivalentTo("metaDescription");
            result.DisplayContactUs.Should().Be(false);
        }
        private static void CreateSetterDelegate(Builder builder, Method setterDelegateMethod, BuilderType propertyType,
                                                 Func <ICode, ICode> loadValue, Func <ICode, Func <object>, ICode> setValue)
        {
            var extensions = new __Extensions();
            var iList      = new __IList();
            var setterCode = setterDelegateMethod.NewCode();

            if (propertyType.ParameterlessContructor != null && propertyType.ParameterlessContructor.IsPublic)
            {
                loadValue(setterCode).IsNull().Then(y => setValue(y, () => setterCode.NewCode().NewObj(propertyType.ParameterlessContructor)));
            }

            // Only this if the property implements idisposable
            if (propertyType.Implements(typeof(IDisposable)))
            {
                setterCode.Call(extensions.TryDisposeInternal, loadValue(setterCode.NewCode()));
            }

            setterCode.Load(Crumb.GetParameter(0)).IsNull().Then(x =>
            {
                // Just clear if its clearable
                if (propertyType.Implements(__IList.Type.Fullname))
                {
                    loadValue(x).Callvirt(iList.Clear).Return();
                }
                // Otherwise if the property is not a value type and nullable
                else if (!propertyType.IsValueType || propertyType.IsNullable || propertyType.IsArray)
                {
                    setValue(x, () => null).Return();
                }
                else // otherwise... throw an exception
                {
                    x.ThrowNew(typeof(NotSupportedException), "Value types does not accept null values.");
                }
            });

            if (propertyType.IsArray)
            {
                setterCode.Load(Crumb.GetParameter(0)).Is(typeof(IEnumerable))
                .Then(x => setValue(x, () => Crumb.GetParameter(0)).Return())
                .ThrowNew(typeof(NotSupportedException), "Value does not inherits from IEnumerable");
            }
            else if (propertyType.Implements(__IList.Type.Fullname) && propertyType.ParameterlessContructor != null)
            {
                var addRange = propertyType.GetMethod("AddRange", 1, false);
                if (addRange == null)
                {
                    var add   = propertyType.GetMethod("Add", 1);
                    var array = setterCode.CreateVariable(propertyType.ChildType.MakeArray());
                    setterCode.Assign(array).Set(Crumb.GetParameter(0));
                    setterCode.For(array, (x, item) => loadValue(x).Callvirt(add, item));
                    if (!add.ReturnType.IsVoid)
                    {
                        setterCode.Pop();
                    }
                }
                else
                {
                    loadValue(setterCode).Callvirt(addRange, Crumb.GetParameter(0));
                }
            }
            else if (propertyType.IsEnum)
            {
                // Enums requires special threatment
                setterCode.Load(Crumb.GetParameter(0)).Is(typeof(string)).Then(x =>
                {
                    var stringVariable = setterCode.CreateVariable(typeof(string));
                    setterCode.Assign(stringVariable).Set(Crumb.GetParameter(0));
                    setValue(setterCode, () => stringVariable).Return();
                });

                setValue(setterCode, () => Crumb.GetParameter(0));
            }
            else
            {
                setValue(setterCode, () => Crumb.GetParameter(0));
            }

            setterCode.Return().Replace();
        }
        private static void AddPropertySetterInterception(Builder builder, __PropertyInterceptionInfo propertyInterceptionInfo, PropertyBuilderInfo member, Field propertyField, Method actionObjectCtor, Method propertySetter, Dictionary <string, Field> interceptorFields)
        {
            var syncRoot = new __ISyncRoot();
            var legalSetterInterceptors = member.InterceptorInfos.Where(x => x.InterfaceSetter != null).ToArray();

            member.Property.Setter
            .NewCode()
            .Context(x =>
            {
                if (member.HasInitializer)
                {
                    return;
                }

                for (int i = 0; i < legalSetterInterceptors.Length; i++)
                {
                    var item  = legalSetterInterceptors[i];
                    var field = interceptorFields[item.Attribute.Identification];
                    x.Load(field).IsNull().Then(y =>
                    {
                        y.Assign(field).NewObj(item.Attribute);

                        if (item.HasSyncRootInterface)
                        {
                            y.Load(field).As(syncRoot.ToBuilderType.Import()).Call(syncRoot.SyncRoot, member.SyncRoot);
                        }

                        ImplementAssignMethodAttribute(builder, legalSetterInterceptors[i].AssignMethodAttributeInfos, field, y, false);
                    });
                    item.Attribute.Remove();
                }

                x.Load(propertyField).IsNull().Then(y =>
                                                    y.Assign(propertyField)
                                                    .NewObj(propertyInterceptionInfo.Ctor,
                                                            member.Property.Getter,
                                                            member.Property.Setter,
                                                            member.Property.Name,
                                                            member.Property.ReturnType,
                                                            Crumb.This,
                                                            member.Property.ReturnType.IsArray || member.Property.ReturnType.Implements(typeof(IEnumerable)) ? member.Property.ReturnType.ChildType : null,
                                                            propertySetter == null ? null : y.NewCode().NewObj(actionObjectCtor, propertySetter)));
            })
            .Try(x =>
            {
                if (member.Property.BackingField == null)
                {
                    var oldvalue = member.Property.Getter == null ? null : x.CreateVariable(member.Property.ReturnType);

                    if (oldvalue != null)
                    {
                        var getter = member.Property.Getter.Copy();
                        x.Call(getter.IsStatic ? null : Crumb.This, getter).StoreLocal(oldvalue);
                    }

                    for (int i = 0; i < legalSetterInterceptors.Length; i++)
                    {
                        var item  = legalSetterInterceptors[i];
                        var field = interceptorFields[item.Attribute.Identification];
                        x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(item.InterfaceSetter.OnSet, propertyField, oldvalue, Crumb.GetParameter(0));

                        x.IsFalse().Then(y => y.OriginalBodyNewMethod());
                    }
                }
                else
                {
                    for (int i = 0; i < legalSetterInterceptors.Length; i++)
                    {
                        var item  = legalSetterInterceptors[i];
                        var field = interceptorFields[item.Attribute.Identification];
                        x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(item.InterfaceSetter.OnSet, propertyField, member.Property.BackingField, Crumb.GetParameter(0));

                        x.IsFalse().Then(y => y.OriginalBody());
                    }
                }
            })
            .Catch(typeof(Exception), x =>
            {
                for (int i = 0; i < legalSetterInterceptors.Length; i++)
                {
                    var item  = legalSetterInterceptors[i];
                    var field = interceptorFields[item.Attribute.Identification];
                    x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(legalSetterInterceptors[i].InterfaceSetter.OnException, x.Exception);
                }

                x.Rethrow();
            })
            .Finally(x =>
            {
                for (int i = 0; i < legalSetterInterceptors.Length; i++)
                {
                    var item  = legalSetterInterceptors[i];
                    var field = interceptorFields[item.Attribute.Identification];
                    x.Load(field).As(legalSetterInterceptors[i].InterfaceSetter.ToBuilderType).Call(legalSetterInterceptors[i].InterfaceSetter.OnExit);
                }
            })
            .EndTry()
            .Return()
            .Replace();
        }
Beispiel #26
0
        public BreadCrumb()
        {
            Crumb home = new Crumb
            {
                Title = "home",
                Page  = "/Pages/Home.aspx"
            };

            this.Crumbs.Add(new Crumb
            {
                Title    = "students",
                Page     = "/Pages/Students.aspx",
                Previous = home
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "projects",
                Page     = "/Pages/Projects.aspx",
                Previous = home
            });

            Crumb login = new Crumb
            {
                Title    = "login",
                Page     = "/Pages/Login.aspx",
                Previous = home
            };

            this.Crumbs.Add(login);
            this.Crumbs.Add(new Crumb
            {
                Title    = "logout",
                Page     = "/Pages/Logout.aspx",
                Previous = home
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "register",
                Page     = "/Pages/Register.aspx",
                Previous = login
            });

            Crumb settings = new Crumb
            {
                Title    = "settings",
                Page     = "/Pages/Settings.aspx",
                Previous = home
            };

            this.Crumbs.Add(settings);

            this.Crumbs.Add(new Crumb()
            {
                Title    = "publicize student",
                Page     = "/Pages/Controls/Mentor/PublicizeStudent.aspx",
                Previous = settings
            });

            Crumb viewSuggestions = (new Crumb()
            {
                Title = "view suggestions",
                Page = "/Pages/Controls/Mentor/ViewSuggestions.aspx",
                Previous = settings
            });

            this.Crumbs.Add(viewSuggestions);
            this.Crumbs.Add(new Crumb()
            {
                Title    = "update suggestions",
                Page     = "/Pages/Controls/Mentor/UpdateSuggestions.aspx",
                Previous = viewSuggestions
            });

            Crumb viewMessages = (new Crumb()
            {
                Title = "view messages",
                Page = "/Pages/Controls/Mentor/ViewMessages.aspx",
                Previous = settings
            });

            this.Crumbs.Add(viewMessages);
            this.Crumbs.Add(new Crumb()
            {
                Title    = "view message",
                Page     = "/Pages/Controls/Mentor/ViewMessage.aspx",
                Previous = viewMessages
            });

            this.Crumbs.Add(new Crumb()
            {
                Title    = "search students",
                Page     = "/Pages/Controls/Mentor/SearchStudents.aspx",
                Previous = settings
            });

            this.Crumbs.Add(new Crumb()
            {
                Title    = "change password",
                Page     = "/Pages/Controls/Mentor/ChangePassword.aspx",
                Previous = settings
            });

            this.Crumbs.Add(new Crumb
            {
                Title    = "view skillset",
                Page     = "/Pages/Controls/Admin/ViewSkillset.aspx",
                Previous = settings
            });

            this.Crumbs.Add(new Crumb
            {
                Title    = "create account",
                Page     = "/Pages/Controls/Admin/CreateAccount.aspx",
                Previous = settings
            });

            this.Crumbs.Add(new Crumb
            {
                Title    = "view student",
                Page     = "/Pages/Controls/Admin/ViewStudent.aspx",
                Previous = settings
            });

            this.Crumbs.Add(new Crumb
            {
                Title    = "view request",
                Page     = "/Pages/Controls/Admin/ViewRequest.aspx",
                Previous = settings
            });

            this.Crumbs.Add(new Crumb
            {
                Title    = "update profile",
                Page     = "/Pages/Controls/Student/UpdateProfile.aspx",
                Previous = settings
            });

            Crumb viewSkillsets = new Crumb
            {
                Title    = "view skillsets",
                Page     = "/Pages/Controls/Admin/ViewSkillset.aspx",
                Previous = settings
            };

            this.Crumbs.Add(viewSkillsets);
            this.Crumbs.Add(new Crumb
            {
                Title    = "update skillset",
                Page     = "/Pages/Controls/Admin/UpdateSkillset.aspx",
                Previous = viewSkillsets
            });

            this.Crumbs.Add(new Crumb
            {
                Title    = "create skillset",
                Page     = "/Pages/Controls/Admin/CreateSkillset.aspx",
                Previous = viewSkillsets
            });

            Crumb viewStudent = new Crumb
            {
                Title    = "view students",
                Page     = "/Pages/Controls/Admin/ViewStudent.aspx",
                Previous = settings
            };

            this.Crumbs.Add(viewStudent);
            this.Crumbs.Add(new Crumb
            {
                Title    = "update profile",
                Page     = "/Pages/Controls/Admin/UpdateProfile.aspx",
                Previous = viewStudent
            });

            Crumb updateProjects = new Crumb
            {
                Title    = "update projects",
                Page     = "/Pages/Controls/Student/UpdateProjects.aspx",
                Previous = settings
            };

            this.Crumbs.Add(updateProjects);
            this.Crumbs.Add(new Crumb
            {
                Title    = "create project",
                Page     = "/Pages/Controls/Student/CreateProject.aspx",
                Previous = updateProjects
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "edit project",
                Page     = "/Pages/Controls/Student/UpdateProject.aspx",
                Previous = updateProjects
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "edit reflections",
                Page     = "/Pages/Controls/Student/UpdateProjectReflections.aspx",
                Previous = updateProjects
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "view suggestions",
                Page     = "/Pages/Controls/Student/ViewSuggestions.aspx",
                Previous = settings
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "send request",
                Page     = "/Pages/Controls/Parent/SendRequest.aspx",
                Previous = settings
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "send message",
                Page     = "/Pages/Controls/Parent/Selection.aspx",
                Previous = settings
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "send message",
                Page     = "/Pages/Controls/Parent/Messages.aspx",
                Previous = settings
            });
            this.Crumbs.Add(new Crumb
            {
                Title    = "reply message",
                Page     = "/Pages/Controls/Parent/Reply.aspx",
                Previous = settings
            });
        }
Beispiel #27
0
        private static void AddValidDateFromCrumbToList(List <DateTime?> crumbsDates, Crumb crumb)
        {
            var parsedDateTime = crumb.CreatedDtm.ParseDateTimeNull();

            if (parsedDateTime != null)
            {
                crumbsDates.Add(parsedDateTime);
            }
        }
Beispiel #28
0
    void FixedUpdate()
    {
        if (active){
            if (tracking){
                // Track crumb
                Vector3 dir = crumb.pos;
                dir.y = transform.position.y;
                dir = dir-transform.position;
                float angle = Vector3.Angle(transform.forward,dir);
                // Rate is per 180 degrees
                transform.forward = Vector3.SmoothDamp(transform.forward,dir.normalized,ref rRate, rotRate*angle/180);

                if (!paused){
                    // Check approach distance
                    if (pvis){
                        if (dir.magnitude > 1.2f){
                            transform.position += transform.forward*speed*Time.fixedDeltaTime;
                        } else {
                            // Bounce!
                            transform.position -= transform.forward*speed*Time.fixedDeltaTime;
                        }
                    } else {
                        if (dir.magnitude > 0.5f){
                            transform.position += transform.forward*speed*Time.fixedDeltaTime;
                        } else {
                            // Get next crumb
                            if (crumbing){
                                crumb = PlayerCharacter.NextCrum(crumb);
                            } else {
                                // Get nearest player crumb
                                float minSM = 999;
                                foreach (Crumb c in PlayerCharacter.crumbs){
                                    Vector3 dp = c.pos - transform.position;
                                    // Check if nearer than current
                                    float dps = dp.sqrMagnitude;
                                    if (dps < minSM){
                                        crumb = c;
                                        minSM = dps;
                                    }
                                }
                                if (crumb != null){
                                    // Check LoS
                                    // Start at index of current crumb and work backwards
                                    for (int i=PlayerCharacter.crumbs.IndexOf(crumb); i>=0; --i){										RaycastHit hit;
                                        if (Physics.Linecast(transform.position,
                                                             PlayerCharacter.crumbs[i].pos,
                                                             out hit)){
                                            // Obstructed
                                            if (PlayerCharacter.CheckCollider(hit.collider)){
                                                // By player, so set new crumb
                                                SetCrumb();
                                            }
                                        } else {
                                            // No obstruction
                                            crumb = PlayerCharacter.crumbs[i];
                                            break;
                                        }
                                    }
                                    crumbing = true;
                                }
                            }
                        }
                    }
                }
            } else {
                // Rotate towards player so AI doesn't run in wrong dir when visible
                float angle = Vector3.Angle(transform.forward,(PlayerCharacter.pos-transform.position));
                Vector3 target = (PlayerCharacter.pos-transform.position).normalized;
                // Rate is per 180 degrees
                transform.forward = Vector3.SmoothDamp(transform.forward,target,ref rRate, rotRate*angle/180);
            }

            // Evasion
            if (tracking){
                RaycastHit[] temp = Physics.SphereCastAll(transform.position,avoidRange,transform.forward,0,avoidLayers.value);
                if (temp.Length > 0){
                    Vector3 dir = new Vector3();
                    foreach (RaycastHit h in temp){
                        dir += (h.point - transform.position).normalized;
                    }
                    Debug.DrawLine(transform.position,transform.position-dir,Color.blue,Time.fixedDeltaTime);
                    dir /= temp.Length;
                    GetComponent<Rigidbody>().AddForce(avoidForce*dir.normalized*Time.fixedDeltaTime);
                }
            }
        }
    }
        private static void CreatePropertySetterDelegate(Builder builder, PropertyBuilderInfo member, Method propertySetter)
        {
            var iList      = new __IList(builder);
            var setterCode = propertySetter.NewCode();

            if (!member.Property.BackingField.FieldType.IsGenericType)
            {
                var extensions = new __Extensions(builder);

                if (member.Property.BackingField.FieldType.ParameterlessContructor != null && member.Property.BackingField.FieldType.ParameterlessContructor.IsPublic)
                {
                    setterCode.Load(member.Property.BackingField).IsNull().Then(y =>
                                                                                y.Assign(member.Property.BackingField).Set(propertySetter.NewCode()
                                                                                                                           .NewObj(member.Property.BackingField.FieldType.ParameterlessContructor)));
                }

                // Only this if the property implements idisposable
                if (member.Property.BackingField.FieldType.Implements(typeof(IDisposable)))
                {
                    setterCode.Call(extensions.TryDisposeInternal, member.Property.BackingField);
                }

                setterCode.Load(Crumb.GetParameter(0)).IsNull().Then(x =>
                {
                    // Just clear if its clearable
                    if (member.Property.BackingField.FieldType.Implements(iList.Type.Fullname))
                    {
                        x.Load(member.Property.BackingField).Callvirt(iList.Clear).Return();
                    }
                    // Otherwise if the property is not a value type and nullable
                    else if (!member.Property.BackingField.FieldType.IsValueType || member.Property.BackingField.FieldType.IsNullable || member.Property.BackingField.FieldType.IsArray)
                    {
                        x.Assign(member.Property.BackingField).Set(null).Return();
                    }
                    else // otherwise... throw an exception
                    {
                        x.ThrowNew(typeof(NotSupportedException), "Value types does not accept null values.");
                    }
                });

                if (member.Property.BackingField.FieldType.IsArray)
                {
                    setterCode.Load(Crumb.GetParameter(0)).Is(typeof(IEnumerable))
                    .Then(x => x.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0)).Return())
                    .ThrowNew(typeof(NotSupportedException), "Value does not inherits from IEnumerable");
                }
                else if (member.Property.BackingField.FieldType.Implements(iList.Type.Fullname) && member.Property.BackingField.FieldType.ParameterlessContructor != null)
                {
                    var addRange = member.Property.BackingField.FieldType.GetMethod("AddRange", 1, false);
                    if (addRange == null)
                    {
                        var add   = member.Property.BackingField.FieldType.GetMethod("Add", 1);
                        var array = setterCode.CreateVariable(member.Property.BackingField.FieldType.ChildType.MakeArray());
                        setterCode.Assign(array).Set(Crumb.GetParameter(0));
                        setterCode.For(array, (x, item) => x.Load(member.Property.BackingField).Callvirt(add, item));
                        if (!add.ReturnType.IsVoid)
                        {
                            setterCode.Pop();
                        }
                    }
                    else
                    {
                        setterCode.Load(member.Property.BackingField).Callvirt(addRange, Crumb.GetParameter(0));
                    }
                }
                else if (member.Property.BackingField.FieldType.IsEnum)
                {
                    // Enums requires special threatment
                    setterCode.Load(Crumb.GetParameter(0)).Is(typeof(string)).Then(x =>
                    {
                        var stringVariable = setterCode.CreateVariable(typeof(string));
                        setterCode.Assign(stringVariable).Set(Crumb.GetParameter(0));
                        setterCode.Assign(member.Property.BackingField).Set(stringVariable).Return();
                    });

                    setterCode.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0));
                }
                else
                {
                    setterCode.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0));
                }
            }
            else
            {
                setterCode.Assign(member.Property.BackingField).Set(Crumb.GetParameter(0));
            }

            setterCode.Return().Replace();
        }
        private void CreateComponentCache(Builder builder, BuilderType cauldron)
        {
            var componentAttribute            = __ComponentAttribute.Instance;
            var componentConstructorAttribute = __ComponentConstructorAttribute.Type;
            var factory = __Factory.Instance;

            // Before we start let us find all factoryextensions and add a component attribute to them
            var factoryResolverInterface = __IFactoryResolver.Type;

            this.AddComponentAttribute(builder, builder.FindTypesByInterface(factoryResolverInterface), x => factoryResolverInterface.Fullname);
            // Also the same to all types that inherits from Factory<>
            var factoryGeneric = __Factory_1.Type;

            this.AddComponentAttribute(builder, builder.FindTypesByBaseClass(factoryGeneric), type =>
            {
                var factoryBase = type.BaseClasses.FirstOrDefault(x => x.Fullname.StartsWith("Cauldron.Activator.Factory"));
                if (factoryBase == null)
                {
                    return(type.Fullname);
                }

                return(factoryBase.GetGenericArgument(0).Fullname);
            });

            int counter     = 0;
            var arrayAvatar = builder.GetType("System.Array").New(x => new
            {
                Length = x.GetMethod("get_Length")
            });
            var extensionAvatar = builder.GetType("Cauldron.ExtensionsReflection").New(x => new
            {
                CreateInstance = x.GetMethod("CreateInstance", 2)
            });
            var factoryCacheInterface         = builder.GetType("Cauldron.Activator.IFactoryCache");
            var factoryTypeInfoInterface      = builder.GetType("Cauldron.Activator.IFactoryTypeInfo");
            var createInstanceInterfaceMethod = factoryTypeInfoInterface.GetMethod("CreateInstance", 1);

            // Get all Components
            var components     = builder.FindTypesByAttribute(componentAttribute.ToBuilderType);
            var componentTypes = new List <BuilderType>();

            // Create types with the components properties
            foreach (var component in components)
            {
                this.Log("Hardcoding component factory .ctor: " + component.Type.Fullname);

                var componentType           = builder.CreateType("", TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit, $"<>f__IFactoryTypeInfo_{component.Type.Name}_{counter++}");
                var componentAttributeField = componentType.CreateField(Modifiers.Private, componentAttribute.ToBuilderType, "componentAttribute");
                componentType.AddInterface(factoryTypeInfoInterface);
                componentTypes.Add(componentType);

                // Create ctor
                componentType
                .CreateConstructor()
                .NewCode()
                .Context(x =>
                {
                    x.Load(Crumb.This).Call(builder.GetType(typeof(object)).Import().ParameterlessContructor.Import());
                    x.Assign(componentAttributeField).NewObj(component);
                })
                .Return()
                .Replace();

                // Implement the methods
                componentType.CreateMethod(Modifiers.Public | Modifiers.Overrrides, createInstanceInterfaceMethod.ReturnType, createInstanceInterfaceMethod.Name, createInstanceInterfaceMethod.Parameters)
                .NewCode()
                .Context(x =>
                {
                    var localVariable = x.GetReturnVariable();
                    // Find any method with a componentcontructor attribute
                    var ctors = component.Type.GetMethods(y =>
                    {
                        if (y.Name == ".cctor")
                        {
                            return(true);
                        }

                        if (!y.Resolve().IsPublic || !y.Resolve().IsAssembly)
                        {
                            return(false);
                        }

                        if (y.Name == ".ctor" && y.DeclaringType.FullName.GetHashCode() != component.Type.Fullname.GetHashCode() && y.DeclaringType.FullName != component.Type.Fullname)
                        {
                            return(false);
                        }

                        if (y.Name.StartsWith("set_"))
                        {
                            return(false);
                        }

                        return(true);
                    })
                                .Where(y => y.CustomAttributes.HasAttribute(componentConstructorAttribute))
                                .Concat(
                        component.Type.GetAllProperties().Where(y => y.CustomAttributes.HasAttribute(componentConstructorAttribute))
                        .Select(y =>
                    {
                        y.CustomAttributes.Remove(componentConstructorAttribute);
                        y.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never);

                        return(y.Getter);
                    })
                        )
                                .OrderBy(y => y.Parameters.Length)
                                .ToArray();

                    if (ctors.Length > 0)
                    {
                        bool parameterlessCtorAlreadyHandled = false;

                        for (int index = 0; index < ctors.Length; index++)
                        {
                            this.Log("- " + ctors[index].Fullname);

                            var ctor = ctors[index];
                            // add a EditorBrowsable attribute
                            ctor.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never);
                            var ctorParameters = ctor.Parameters;

                            if (ctorParameters.Length > 0)
                            {
                                // In this case we have to find a parameterless constructor first
                                if (component.Type.ParameterlessContructor != null && !parameterlessCtorAlreadyHandled && component.Type.ParameterlessContructor.IsPublicOrInternal)
                                {
                                    x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                    x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                    parameterlessCtorAlreadyHandled = true;
                                }

                                var code = x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(ctorParameters.Length);

                                for (int i = 0; i < ctorParameters.Length; i++)
                                {
                                    code.And.Load(Crumb.GetParameter(0).UnPacked(i)).Is(ctorParameters[i]);
                                }

                                if (ctor.Name == ".ctor")
                                {
                                    code.Then(y => y.NewObj(ctor, Crumb.GetParameter(0).UnPacked()).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                }
                                else
                                {
                                    code.Then(y => y.Call(ctor, Crumb.GetParameter(0).UnPacked()).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                }
                            }
                            else
                            {
                                if (ctor.Name == ".ctor")
                                {
                                    x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.NewObj(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                    x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.NewObj(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                }
                                else
                                {
                                    x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.Call(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                    x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.Call(ctor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                                }

                                parameterlessCtorAlreadyHandled = true;
                            }
                        }
                    }
                    else
                    {
                        // In case we don't have constructor with ComponentConstructor Attribute,
                        // then we should look for a parameterless Ctor
                        if (component.Type.ParameterlessContructor == null)
                        {
                            this.Log(LogTypes.Error, component.Type, $"The component '{component.Type.Fullname}' has no ComponentConstructor attribute or the constructor is not public");
                        }
                        else if (component.Type.ParameterlessContructor.IsPublicOrInternal)
                        {
                            x.Load(Crumb.GetParameter(0)).IsNull().Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());
                            x.Load(Crumb.GetParameter(0)).Call(arrayAvatar.Length).EqualTo(0).Then(y => y.NewObj(component.Type.ParameterlessContructor).Dup().Call(factory.OnObjectCreation, Crumb.This).Return());

                            this.Log($"The component '{component.Type.Fullname}' has no ComponentConstructor attribute. A parameterless ctor was found and will be used.");
                        }
                    }
                })
                .Context(x => x.Call(extensionAvatar.CreateInstance, component.Type, Crumb.GetParameter(0)).Dup().Call(factory.OnObjectCreation, Crumb.This).Return())
                .Return()
                .Replace();

                // Implement the properties
                foreach (var property in factoryTypeInfoInterface.Properties)
                {
                    var propertyResult = componentType.CreateProperty(Modifiers.Public | Modifiers.Overrrides, property.ReturnType, property.Name, true);
                    propertyResult.BackingField.Remove();

                    switch (property.Name)
                    {
                    case "ContractName":
                        propertyResult.Getter.NewCode().Call(componentAttributeField, componentAttribute.ContractName).Return().Replace();
                        break;

                    case "CreationPolicy":
                        propertyResult.Getter.NewCode().Call(componentAttributeField, componentAttribute.Policy).Return().Replace();
                        break;

                    case "Priority":
                        propertyResult.Getter.NewCode().Call(componentAttributeField, componentAttribute.Priority).Return().Replace();
                        break;

                    case "Type":
                        propertyResult.Getter.NewCode().Load(component.Type).Return().Replace();
                        break;
                    }
                }

                componentType.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never);
                // Also remove the component attribute
                component.Attribute.Remove();
            }

            this.Log("Adding component IFactoryCache Interface");
            cauldron.AddInterface(factoryCacheInterface);
            var factoryCacheInterfaceAvatar = factoryCacheInterface.New(x => new
            {
                Components = x.GetMethod("GetComponents")
            });
            var ctorCoder = cauldron.ParameterlessContructor.NewCode();

            cauldron.CreateMethod(Modifiers.Public | Modifiers.Overrrides, factoryCacheInterfaceAvatar.Components.ReturnType, factoryCacheInterfaceAvatar.Components.Name)
            .NewCode()
            .Context(x =>
            {
                var resultValue = x.GetReturnVariable();
                x.Newarr(factoryTypeInfoInterface, componentTypes.Count).StoreLocal(resultValue);

                for (int i = 0; i < componentTypes.Count; i++)
                {
                    var field = cauldron.CreateField(Modifiers.Private, factoryTypeInfoInterface, "<FactoryType>f__" + i);
                    x.Load(resultValue);
                    x.StoreElement(factoryTypeInfoInterface, field, i);
                    // x.StoreElement(factoryTypeInfoInterface,
                    // x.NewCode().NewObj(componentTypes[i].ParameterlessContructor), i);
                    ctorCoder.Assign(field).NewObj(componentTypes[i].ParameterlessContructor);
                }
            })
            .Return()
            .Replace();

            ctorCoder.Insert(InsertionPosition.End);
        }
Beispiel #31
0
        private Method CreateAssigningMethod(BuilderType anonSource, BuilderType anonTarget, BuilderType anonTargetInterface, Method method)
        {
            var name         = $"<{counter++}>f__Anon_Assign";
            var assignMethod = method.OriginType.CreateMethod(Modifiers.PrivateStatic, anonTarget, name, anonSource);

            assignMethod.NewCode()
            .Context(x =>
            {
                var resultVar = x.GetReturnVariable();
                x.Assign(resultVar).Set(x.NewCode().NewObj(anonTarget.ParameterlessContructor));

                foreach (var property in anonSource.Properties)
                {
                    try
                    {
                        var targetProperty = anonTarget.GetProperty(property.Name);
                        if (property.ReturnType.Fullname != targetProperty.ReturnType.Fullname)
                        {
                            this.Log(LogTypes.Error, property, $"The property '{property.Name}' does not have the expected return type. Is: {property.ReturnType.Fullname} Expected: {targetProperty.ReturnType.Fullname}");
                            continue;
                        }
                        x.Load(resultVar).Callvirt(targetProperty.Setter, x.NewCode().Load(Crumb.GetParameter(0)).Callvirt(property.Getter));
                    }
                    catch (MethodNotFoundException)
                    {
                        this.Log(LogTypes.Warning, anonTarget, $"The property '{property.Name}' does not exist in '{anonTarget.Name}'");
                    }
                }

                x.Load(resultVar).Return();
            })
            .Replace();

            assignMethod.CustomAttributes.AddEditorBrowsableAttribute(EditorBrowsableState.Never);

            return(assignMethod);
        }
 public static Crumb <THelper> SetActive <THelper>(this Crumb <THelper> crumb, bool active = true)
     where THelper : BootstrapHelper <THelper>
 {
     crumb.Active = active;
     return(crumb);
 }