public void First_WithPredicate()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");
            string name = "Child2";
            dynamic d = new DynamicItem(item);

            //Act
            var child = d.Children.First(Dy.Fc(x => x.Name == "Child2"));

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child2", child.Path);
        }
        public void FirstOrDefault()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var child = d.Children.FirstOrDefault();

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child1", child.Path);
        }
        public void DynamicParent_ReturnsParent()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var parent = d.Parent;
            string path = parent.Path;

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem", path);

        }
        public void DynamicInfo_ReturnsItemInfo()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            string path = d.Path;
            string name = d.Name;

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem/Test", path);
            Assert.AreEqual("Test", name);


        }
        public void DynamicFields_ReturnsFields()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            string dateTime = d.DateTime;

            string text = d.SingleLineText;


            //Assert
            Assert.AreEqual("some awesome dynamic content", text);
            Assert.AreEqual("15/02/2012 02:30:00", dateTime);
        }
        public void DynamicParent_ReturnsChildren()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act

            var children = d.Children;

            //Assert
            Assert.AreEqual(3, children.Count());

            foreach (var child in d.Children)
            {
                string path = child.Path;
                Assert.IsTrue(path.StartsWith("/sitecore/content/DynamicItem/Test/"));
            }
        }
        public void Count()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var count = d.Children.Count();

            //Assert
            Assert.AreEqual(3, count);
        }
        public void ForEach()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var children = d.Children;

            //Assert
            int total = 0;
            foreach (var child in children)
            {
                total++;
                switch (total)
                {
                    case 1:
                        Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child1", child.Path);
                        break;
                    case 2:
                        Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child2", child.Path);
                        break;
                    case 3:
                        Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child3", child.Path);
                        break;
                }
            }

            Assert.AreEqual(3, total);
                
        }
        public void Where_Select_First_DyamicsTypes()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var child = d.Children.Where(Dy.Fc(x=> x.Name == "Child2")).Select(Dy.FcT(x => new { NewPath = x.Path, NewName = x.Name })).First();

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child2", child.NewPath);
            Assert.AreEqual("Child2", child.NewName);

        }
        public void Select_ToDynamic()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var children = d.Children.Select(Dy.FcT(x => new { Name = x.Name })) as IEnumerable<dynamic>;
            var child = children.First();
            //Assert

            Assert.AreEqual("Child1", child.Name);
        }
        public void All()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);
            
            //Act
            var result1 = d.Children.All(Dy.Fc(x => x.Name.StartsWith("Child")));
            var result2 = d.Children.All(Dy.Fc(x => x.Name.StartsWith("Child2")));

            //Assert
            Assert.AreEqual(true, result1);
            Assert.AreEqual(false, result2);

        }
        public void Where()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var child = d.Children.Where(Dy.Fc(x => x.Name == "Child2")).First();

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child2", child.Path);
        }
        public void ElementAt()
        {
            //Assign
            Item item = _db.GetItem("/sitecore/content/DynamicItem/Test");

            dynamic d = new DynamicItem(item);

            //Act
            var child = d.Children.ElementAt(1);

            //Assert
            Assert.AreEqual("/sitecore/content/DynamicItem/Test/Child2", child.Path);
        }
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;

            string name = binder.Name;


            if (_item.Fields[name] != null)
            {
                FieldRenderer render = new FieldRenderer();
                render.FieldName = name;
                render.Item = _item;

                result = render.Render();
                return true;
            }

            SitecoreInfoType infoType;

            if (Enum.TryParse<SitecoreInfoType>(name, out infoType))
            {
                result = SitecoreInfoHandler.GetItemInfo(infoType, _item, null);
                return true;
            }


            switch (name)
            {
                case "Parent":
                    result = new DynamicItem(_item.Parent);
                    break;
                case "Children":
                    result = new DynamicCollection<DynamicItem>(_item.Children.Select(x => new DynamicItem(x)).ToArray());
                    break;
            }
            if (result != null) return true;
            
            throw new NotSupportedException("No field of Sitecore info matches the name {0} for item {1}".Formatted(name, _item.Paths.FullPath));

        }