public void Complex_current_value_can_be_set_and_the_actual_complex_object_is_set()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);
                var entity      = (FakeWithProps)entityEntry.Entity;

                var complexObject = new FakeWithProps
                {
                    ValueTypeProp = -2,
                    ComplexProp   = new FakeWithProps
                    {
                        ValueTypeProp = -3
                    }
                };

                propEntry.CurrentValue = complexObject;

                Assert.Same(entity.ComplexProp, complexObject);
                Assert.Equal(-2, entity.ComplexProp.ValueTypeProp);
                Assert.Equal(-3, entity.ComplexProp.ComplexProp.ValueTypeProp);

                Assert.Equal(11, entityEntry.CurrentValues["ValueTypeProp"]);
                Assert.Equal(-2, ((InternalPropertyValues)entityEntry.CurrentValues["ComplexProp"])["ValueTypeProp"]);
                Assert.Equal(
                    -3,
                    ((InternalPropertyValues)((InternalPropertyValues)entityEntry.CurrentValues["ComplexProp"])["ComplexProp"])[
                        "ValueTypeProp"]);
            }
            public void IsModified_returns_false_if_property_is_not_in_modified_list()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                Assert.False(propEntry.IsModified);
            }
            public void IsModified_returns_true_if_property_is_in_modified_list()
            {
                // Note that CreateMockInternalEntry sets ValueTypeProp as modified
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ValueTypePropertyMetadata);

                Assert.True(propEntry.IsModified);
            }
            public void Generic_DbPropertyEntry_Name_returns_name_of_property_from_internal_entry()
            {
                var internalEntry = new InternalEntityPropertyEntry(
                    new Mock <InternalEntityEntryForMock <FakeEntity> >().Object,
                    FakeEntity.FakeNamedFooPropertyMetadata);

                Assert.Equal("Foo", internalEntry.Name);
            }
            public void Scalar_original_value_can_be_set()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ValueTypePropertyMetadata);

                propEntry.OriginalValue = -1;

                Assert.Equal(-1, entityEntry.OriginalValues["ValueTypeProp"]);
            }
            public void Scalar_original_value_can_be_read()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ValueTypePropertyMetadata);

                var value = propEntry.OriginalValue;

                Assert.Equal(21, value);
            }
            public void Scalar_original_value_can_be_set_to_null()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                propEntry.OriginalValue = null;

                Assert.Null(entityEntry.OriginalValues["RefTypeProp"]);
            }
        private static void SetWrongComplexTypeTest(Action<InternalEntityPropertyEntry> setValue)
        {
            var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
            var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

            Assert.Equal(
                Strings.DbPropertyValues_AttemptToSetValuesFromWrongObject(typeof(Random).Name, typeof(FakeWithProps).Name),
                Assert.Throws<ArgumentException>(() => setValue(propEntry)).Message);
        }
            public void Current_value_for_complex_property_cannot_be_set_to_null()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                Assert.Equal(
                    Strings.DbPropertyValues_ComplexObjectCannotBeNull("ComplexProp", "FakeWithProps"),
                    Assert.Throws <InvalidOperationException>(() => propEntry.CurrentValue = null).Message);
            }
            public void Scalar_original_value_can_be_set()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ValueTypePropertyMetadata);

                propEntry.OriginalValue = -1;

                Assert.Equal(-1, entityEntry.OriginalValues["ValueTypeProp"]);
            }
        private static void SetWrongComplexTypeTest(Action <InternalEntityPropertyEntry> setValue)
        {
            var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
            var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

            Assert.Equal(
                Strings.DbPropertyValues_AttemptToSetValuesFromWrongObject(typeof(Random).Name, typeof(FakeWithProps).Name),
                Assert.Throws <ArgumentException>(() => setValue(propEntry)).Message);
        }
            public void Scalar_original_value_can_be_read()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ValueTypePropertyMetadata);

                var value = propEntry.OriginalValue;

                Assert.Equal(21, value);
            }
            public void Scalar_original_value_can_be_set_to_null()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                propEntry.OriginalValue = null;

                Assert.Null(entityEntry.OriginalValues["RefTypeProp"]);
            }
            public void Original_value_returned_for_complex_property_is_object_instance()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                var value = (FakeWithProps)propEntry.OriginalValue;

                Assert.Equal(22, value.ValueTypeProp);
                Assert.Equal(23, value.ComplexProp.ValueTypeProp);
            }
        private static void SetWrongTypeTest(Action <InternalEntityPropertyEntry> setValue)
        {
            var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
            var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

            Assert.Equal(
                Strings.DbPropertyValues_WrongTypeForAssignment(
                    typeof(Random).Name, "RefTypeProp", typeof(string).Name, typeof(FakeWithProps).Name),
                Assert.Throws <InvalidOperationException>(() => setValue(propEntry)).Message);
        }
        private static void SetWrongTypeTest(Action<InternalEntityPropertyEntry> setValue)
        {
            var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
            var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

            Assert.Equal(
                Strings.DbPropertyValues_WrongTypeForAssignment(
                    typeof(Random).Name, "RefTypeProp", typeof(string).Name, typeof(FakeWithProps).Name),
                Assert.Throws<InvalidOperationException>(() => setValue(propEntry)).Message);
        }
            public void Scalar_original_value_can_be_read_when_when_it_is_null()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                propEntry.OriginalValue = null;
                var value = propEntry.OriginalValue;

                Assert.Null(value);
            }
            public void Scalar_original_value_can_be_read_when_when_it_is_null()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                propEntry.OriginalValue = null;
                var value = propEntry.OriginalValue;

                Assert.Null(value);
            }
            public void IsModified_can_be_set_to_false_when_it_is_currently_false()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                Assert.False(propEntry.IsModified);

                propEntry.IsModified = false;

                Assert.False(propEntry.IsModified);
            }
            public void Current_value_returned_for_complex_property_is_actual_complex_object_instance()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);
                var entity      = (FakeWithProps)entityEntry.Entity;

                var value = (FakeWithProps)propEntry.CurrentValue;

                Assert.Same(entity.ComplexProp, value);
                Assert.Equal(12, value.ValueTypeProp);
                Assert.Equal(13, value.ComplexProp.ValueTypeProp);
            }
            public void IsModified_can_be_set_to_true_when_it_is_currently_false()
            {
                var entityEntry    = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry      = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);
                var mockStateEntry = Mock.Get(entityEntry.ObjectStateEntry);

                Assert.False(propEntry.IsModified);

                propEntry.IsModified = true;

                Assert.True(propEntry.IsModified);
                mockStateEntry.Verify(e => e.SetModifiedProperty("RefTypeProp"));
            }
            public void Current_value_returned_for_complex_property_can_be_null()
            {
                var properties = new Dictionary <string, object>
                {
                    { "ComplexProp", null }
                };
                var currentValues = new TestInternalPropertyValues <FakeWithProps>(properties, new[] { "ComplexProp" });
                var entityEntry   = FakeWithProps.CreateMockInternalEntityEntry(currentValues).Object;
                var propEntry     = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                var value = propEntry.CurrentValue;

                Assert.Null(value);
            }
            public void Current_value_for_complex_property_cannot_be_set_to_null_even_if_it_is_already_null()
            {
                var properties = new Dictionary <string, object>
                {
                    { "ComplexProp", null }
                };
                var currentValues = new TestInternalPropertyValues <FakeWithProps>(properties, new[] { "ComplexProp" });
                var entityEntry   = FakeWithProps.CreateMockInternalEntityEntry(currentValues).Object;
                var propEntry     = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                Assert.Equal(
                    Strings.DbPropertyValues_ComplexObjectCannotBeNull("ComplexProp", "FakeWithProps"),
                    Assert.Throws <InvalidOperationException>(() => propEntry.CurrentValue = null).Message);
            }
            public void Current_value_for_complex_property_cannot_be_set_to_instance_with_nested_null_complex_property()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                var complexObject = new FakeWithProps
                {
                    ValueTypeProp = -2,
                    ComplexProp   = null
                };

                Assert.Equal(
                    Strings.DbPropertyValues_ComplexObjectCannotBeNull("ComplexProp", typeof(FakeWithProps).Name),
                    Assert.Throws <InvalidOperationException>(() => propEntry.CurrentValue = complexObject).Message);
            }
            public void Complex_original_value_can_be_set()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry   = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                propEntry.OriginalValue = new FakeWithProps
                {
                    ValueTypeProp = -2,
                    ComplexProp   = new FakeWithProps
                    {
                        ValueTypeProp = -3
                    }
                };

                Assert.Equal(21, entityEntry.OriginalValues["ValueTypeProp"]);
                Assert.Equal(-2, ((InternalPropertyValues)entityEntry.OriginalValues["ComplexProp"])["ValueTypeProp"]);
                Assert.Equal(
                    -3,
                    ((InternalPropertyValues)((InternalPropertyValues)entityEntry.OriginalValues["ComplexProp"])["ComplexProp"])[
                        "ValueTypeProp"]);
            }
            public void Current_value_returned_for_complex_property_is_actual_complex_object_instance()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);
                var entity = (FakeWithProps)entityEntry.Entity;

                var value = (FakeWithProps)propEntry.CurrentValue;

                Assert.Same(entity.ComplexProp, value);
                Assert.Equal(12, value.ValueTypeProp);
                Assert.Equal(13, value.ComplexProp.ValueTypeProp);
            }
            public void Current_value_for_complex_property_cannot_be_set_to_null()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                Assert.Equal(
                    Strings.DbPropertyValues_ComplexObjectCannotBeNull("ComplexProp", "FakeWithProps"),
                    Assert.Throws<InvalidOperationException>(() => propEntry.CurrentValue = null).Message);
            }
            public void IsModified_can_be_set_to_false_when_it_is_currently_false()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                Assert.False(propEntry.IsModified);

                propEntry.IsModified = false;

                Assert.False(propEntry.IsModified);
            }
            public void Generic_DbPropertyEntry_Name_returns_name_of_property_from_internal_entry()
            {
                var internalEntry = new InternalEntityPropertyEntry(
                    new Mock<InternalEntityEntryForMock<FakeEntity>>().Object,
                    FakeEntity.FakeNamedFooPropertyMetadata);

                Assert.Equal("Foo", internalEntry.Name);
            }
            public void IsModified_can_be_set_to_true_when_it_is_currently_false()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);
                var mockStateEntry = Mock.Get(entityEntry.ObjectStateEntry);

                Assert.False(propEntry.IsModified);

                propEntry.IsModified = true;

                Assert.True(propEntry.IsModified);
                mockStateEntry.Verify(e => e.SetModifiedProperty("RefTypeProp"));
            }
            public void Current_value_returned_for_complex_property_can_be_null()
            {
                var properties = new Dictionary<string, object>
                                     {
                                         { "ComplexProp", null }
                                     };
                var currentValues = new TestInternalPropertyValues<FakeWithProps>(properties, new[] { "ComplexProp" });
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry(currentValues).Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                var value = propEntry.CurrentValue;

                Assert.Null(value);
            }
            public void IsModified_returns_false_if_property_is_not_in_modified_list()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.RefTypePropertyMetadata);

                Assert.False(propEntry.IsModified);
            }
            public void IsModified_returns_true_if_property_is_in_modified_list()
            {
                // Note that CreateMockInternalEntry sets ValueTypeProp as modified
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ValueTypePropertyMetadata);

                Assert.True(propEntry.IsModified);
            }
            public void Current_value_for_complex_property_cannot_be_set_to_instance_with_nested_null_complex_property()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                var complexObject = new FakeWithProps
                                        {
                                            ValueTypeProp = -2,
                                            ComplexProp = null
                                        };

                Assert.Equal(
                    Strings.DbPropertyValues_ComplexObjectCannotBeNull("ComplexProp", typeof(FakeWithProps).Name),
                    Assert.Throws<InvalidOperationException>(() => propEntry.CurrentValue = complexObject).Message);
            }
            public void Current_value_for_complex_property_cannot_be_set_to_null_even_if_it_is_already_null()
            {
                var properties = new Dictionary<string, object>
                                     {
                                         { "ComplexProp", null }
                                     };
                var currentValues = new TestInternalPropertyValues<FakeWithProps>(properties, new[] { "ComplexProp" });
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry(currentValues).Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                Assert.Equal(
                    Strings.DbPropertyValues_ComplexObjectCannotBeNull("ComplexProp", "FakeWithProps"),
                    Assert.Throws<InvalidOperationException>(() => propEntry.CurrentValue = null).Message);
            }
            public void Complex_current_value_can_be_set_and_the_actual_complex_object_is_set()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);
                var entity = (FakeWithProps)entityEntry.Entity;

                var complexObject = new FakeWithProps
                                        {
                                            ValueTypeProp = -2,
                                            ComplexProp = new FakeWithProps
                                                              {
                                                                  ValueTypeProp = -3
                                                              }
                                        };
                propEntry.CurrentValue = complexObject;

                Assert.Same(entity.ComplexProp, complexObject);
                Assert.Equal(-2, entity.ComplexProp.ValueTypeProp);
                Assert.Equal(-3, entity.ComplexProp.ComplexProp.ValueTypeProp);

                Assert.Equal(11, entityEntry.CurrentValues["ValueTypeProp"]);
                Assert.Equal(-2, ((InternalPropertyValues)entityEntry.CurrentValues["ComplexProp"])["ValueTypeProp"]);
                Assert.Equal(
                    -3,
                    ((InternalPropertyValues)((InternalPropertyValues)entityEntry.CurrentValues["ComplexProp"])["ComplexProp"])[
                        "ValueTypeProp"]);
            }
            public void Original_value_returned_for_complex_property_is_object_instance()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                var value = (FakeWithProps)propEntry.OriginalValue;

                Assert.Equal(22, value.ValueTypeProp);
                Assert.Equal(23, value.ComplexProp.ValueTypeProp);
            }
            public void Complex_original_value_can_be_set()
            {
                var entityEntry = FakeWithProps.CreateMockInternalEntityEntry().Object;
                var propEntry = new InternalEntityPropertyEntry(entityEntry, FakeWithProps.ComplexPropertyMetadata);

                propEntry.OriginalValue = new FakeWithProps
                                              {
                                                  ValueTypeProp = -2,
                                                  ComplexProp = new FakeWithProps
                                                                    {
                                                                        ValueTypeProp = -3
                                                                    }
                                              };

                Assert.Equal(21, entityEntry.OriginalValues["ValueTypeProp"]);
                Assert.Equal(-2, ((InternalPropertyValues)entityEntry.OriginalValues["ComplexProp"])["ValueTypeProp"]);
                Assert.Equal(
                    -3,
                    ((InternalPropertyValues)((InternalPropertyValues)entityEntry.OriginalValues["ComplexProp"])["ComplexProp"])[
                        "ValueTypeProp"]);
            }