public void Constructor_IdExpressionSet()
        {
            IdSameAsParentDataSource<TestModel, System.Guid> source = new IdSameAsParentDataSource<TestModel, System.Guid>((a) => a.Id);

            TestModel model = new TestModel() { Id = System.Guid.NewGuid() };

            Assert.AreEqual(model.Id, source.IdExpression(model), @"
            The expression that is used to find the id property of the parent was not set correctly in the data source object.
            ");
        }
        public void FindParent_IfNotTypeGenerationContextNode_ReturnNull()
        {
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            DummyGenerationContextNode node = new DummyGenerationContextNode();

            Assert.IsNull(source.FindParent(node), @"
            FindParent should return null if the given node is not a TypeGenerationContextNode and it's Parent is null.
            ");
        }
        public void FindParent_IfIsTypeGeneratioNContextNode_AndParentNotType_ReturnNull()
        {
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            TypeGenerationContextNode node = new TypeGenerationContextNode(null, "Test Object as String");

            Assert.IsNull(source.FindParent(node), @"
            FindParent should return null if the given node is a TypeGenerationContextNode but it's Target is not of the given type.
            ");
        }
        public void FindParent_IfIsTypeGenerationContextNode_AndParentIsType_ReturnParent()
        {
            TestModel target = new TestModel();
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            TypeGenerationContextNode node = new TypeGenerationContextNode(null, target);

            Assert.AreEqual(target, source.FindParent(node), @"
            FindParent should return it's Target if the given node is a TypeGenerationContextNode and it's Target is of the
            specified type.
            ");
        }
        public void FindParent_NestedTest()
        {
            TestModel target = new TestModel();
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            DummyGenerationContextNode root = new DummyGenerationContextNode();
            TypeGenerationContextNode targetNode = new TypeGenerationContextNode(root, target);
            DummyGenerationContextNode leafNode = new DummyGenerationContextNode(GenerationTargetTypes.Object, targetNode);

            Assert.AreEqual(target, source.FindParent(leafNode), @"
            Target should have been returned.  A TypeGenerationContextNode with a Target of type TestModel was the parent of the node passed to FindParent.
            ");
        }
        public void Next()
        {
            TestModel target = new TestModel() { Id = System.Guid.NewGuid() };
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            TypeGenerationContextNode node = new TypeGenerationContextNode(null, target);
            Mock<IGenerationContext> contextMock = new Mock<IGenerationContext>();
            contextMock.Setup(a => a.Node).Returns(node);

            Assert.AreEqual(target.Id, source.Next(contextMock.Object), @"
            The result should be the value of the Id property of our target.
            ");
        }
        public void FindParent_NodeIsNull()
        {
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            Assert.IsNull(source.FindParent(null), @"
            The result from FindParent given a null node, should always return null.
            ");
        }
        public void Next_NullParent_ReturnDefault()
        {
            IdSameAsParentDataSource<TestModel, System.Guid> source =
                new IdSameAsParentDataSource<TestModel, System.Guid>(a => a.Id);

            DummyGenerationContextNode node = new DummyGenerationContextNode();
            Mock<IGenerationContext> contextMock = new Mock<IGenerationContext>();
            contextMock.Setup(a => a.Node).Returns(node);

            Assert.AreEqual(default(System.Guid), source.Next(contextMock.Object), @"
            The result of Next should be {0} because the parent was not found.
            ", default(System.Guid));
        }