public ExpressionTest()
        {
            _db = new AppDb();

            // initialize simple data types
            _simple = new DataTypesSimple
            {
                TypeDateTime = new DateTime(2017, 1, 1, 0, 0, 0),
                TypeDouble   = 3.1415,
                TypeDoubleN  = -3.1415
            };
            _db.DataTypesSimple.Add(_simple);

            // initialize simple data types
            _simple2 = new DataTypesSimple
            {
                TypeDouble  = 1,
                TypeDoubleN = -1
            };
            _db.DataTypesSimple.Add(_simple2);

            // initialize variable data types
            _variable            = DataTypesVariable.CreateEmpty();
            _variable.TypeString = "EntityFramework";

            _db.DataTypesVariable.Add(_variable);
            _db.SaveChanges();
        }
        private void TestValue(DataTypesSimple valueDb)
        {
            // bool
            Assert.Equal(true, valueDb.TypeBool);

            // nullable bool
            Assert.Equal(true, valueDb.TypeBoolN);

            // integers
            Assert.Equal(short.MinValue, valueDb.TypeShort);
            Assert.Equal(int.MinValue, valueDb.TypeInt);
            Assert.Equal(long.MinValue, valueDb.TypeLong);
            // nullable integers
            Assert.Equal(short.MinValue, valueDb.TypeShortN);
            Assert.Equal(int.MinValue, valueDb.TypeIntN);
            Assert.Equal(long.MinValue, valueDb.TypeLongN);

            // decimals
            Assert.Equal(26768.124M, valueDb.TypeDecimal);
            Assert.Equal(double.MaxValue, valueDb.TypeDouble);
            Assert.InRange(valueDb.TypeFloat, TestFloat * (1 - 7e-1), TestFloat * (1 + 7e-1)); // floats have 7 digits of precision
            // nullable decimals
            Assert.Equal(3.1416M, valueDb.TypeDecimalN);
            Assert.Equal(double.MaxValue, valueDb.TypeDoubleN);
            Assert.InRange(valueDb.TypeFloatN.GetValueOrDefault(), TestFloat * (1 - 7e-1), TestFloat * (1 + 7e-1)); // floats have 7 digits of precision

            // byte
            Assert.Equal(TestSbyte, valueDb.TypeSbyte);
            Assert.Equal(TestByte, valueDb.TypeByte);
            Assert.Equal(TestChar, valueDb.TypeChar);
            // nullable byte
            Assert.Equal(TestSbyte, valueDb.TypeSbyte);
            Assert.Equal(TestByte, valueDb.TypeByteN);
            Assert.Equal(TestChar, valueDb.TypeCharN);

            // DateTime
            Assert.Equal(_dateTime, valueDb.TypeDateTime);
            //Assert.Equal(dateTimeOffset, valueDb.TypeDateTimeOffset);
            //Assert.Equal(timeSpan, valueDb.TypeTimeSpan);
            // nullable DateTime
            Assert.Equal(_dateTime, valueDb.TypeDateTimeN);
            //Assert.Equal(dateTimeOffset, valueDb.TypeDateTimeOffsetN);
            //Assert.Equal(timeSpan, valueDb.TypeTimeSpanN);

            // Enum
            Assert.Equal(TestEnum, valueDb.TypeEnum);
            Assert.Equal(TestEnumByte, valueDb.TypeEnumByte);
            // nullable Enum
            Assert.Equal(TestEnum, valueDb.TypeEnumN);
            Assert.Equal(TestEnumByte, valueDb.TypeEnumByteN);

            // guid
            //Assert.Equal(_guid, valueDb.TypeGuid);
            // nullable guid
            //Assert.Equal(_guid, valueDb.TypeGuidN);
        }
        private static void TestEmpty(DataTypesSimple emptyDb)
        {
            // bool
            Assert.Equal(default(bool), emptyDb.TypeBool);
            // nullable bool
            // Assert.Equal(null, emptyDb.TypeBoolN);

            // integers
            Assert.Equal(default(short), emptyDb.TypeShort);
            Assert.Equal(default(int), emptyDb.TypeInt);
            Assert.Equal(default(long), emptyDb.TypeLong);
            // nullable integers
            Assert.Equal(null, emptyDb.TypeShortN);
            Assert.Equal(null, emptyDb.TypeIntN);
            Assert.Equal(null, emptyDb.TypeLongN);

            // decimals
            Assert.Equal(default(decimal), emptyDb.TypeDecimal);
            Assert.Equal(default(double), emptyDb.TypeDouble);
            Assert.Equal(default(float), emptyDb.TypeFloat);
            // nullable decimals
            Assert.Equal(null, emptyDb.TypeDecimalN);
            Assert.Equal(null, emptyDb.TypeDoubleN);
            Assert.Equal(null, emptyDb.TypeFloatN);

            // byte
            Assert.Equal(default(sbyte), emptyDb.TypeSbyte);
            Assert.Equal(default(byte), emptyDb.TypeByte);
            Assert.Equal(default(char), emptyDb.TypeChar);
            // nullable byte
            Assert.Equal(null, emptyDb.TypeSbyteN);
            Assert.Equal(null, emptyDb.TypeByteN);
            Assert.Equal(null, emptyDb.TypeCharN);

            // DateTime
            Assert.Equal(default(DateTime), emptyDb.TypeDateTime);
            //Assert.Equal(default(DateTimeOffset), emptyDb.TypeDateTimeOffset);
            //Assert.Equal(default(TimeSpan), emptyDb.TypeTimeSpan);
            // nullable DateTime
            //Assert.Equal(null, emptyDb.TypeDateTimeN);
            //Assert.Equal(null, emptyDb.TypeDateTimeOffsetN);
            //Assert.Equal(null, emptyDb.TypeTimeSpanN);

            // Enum
            Assert.Equal(default(TestEnum), emptyDb.TypeEnum);
            Assert.Equal(default(TestEnumByte), emptyDb.TypeEnumByte);
            // nullableEnum
            Assert.Equal(null, emptyDb.TypeEnumN);
            Assert.Equal(null, emptyDb.TypeEnumByteN);

            // guid
            //Assert.Equal(default(Guid), emptyDb.TypeGuid);
            // nullable guid
            //Assert.Equal(null, emptyDb.TypeGuidN);
        }
        public void TestSimpleTypesEmpty()
        {
            // Create test data objects
            var emptyMemSync = new DataTypesSimple();

            // Save them to the database
            using (var db = new AppDb())
            {
                db.DataTypesSimple.Add(emptyMemSync);
                db.SaveChanges();
            }

            // Load them from the database and run tests
            using (var db = new AppDb())
            {
                var item = db.DataTypesSimple.FirstOrDefault(x => x.Id == emptyMemSync.Id);
                TestEmpty(item);
            }
        }
        public async Task TestSimpleTypesEmptyAsync()
        {
            // Create test data objects
            var emptyMemAsync = new DataTypesSimple();

            // Save them to the database
            using (var db = new AppDb())
            {
                db.DataTypesSimple.Add(emptyMemAsync);
                await db.SaveChangesAsync();
            }

            // Load them from the database and run tests
            using (var db = new AppDb())
            {
                // ReSharper disable once AccessToDisposedClosure
                async Task <DataTypesSimple> FromDbAsync(DataTypesSimple dt) => await db.DataTypesSimple.FirstOrDefaultAsync(m => m.Id == dt.Id);

                TestEmpty(await FromDbAsync(emptyMemAsync));
            }
        }
Пример #6
0
        public async Task TestDataTypesSimple()
        {
            void TestEmpty(DataTypesSimple emptyDb)
            {
                // bool
                Assert.Equal(default(bool), emptyDb.TypeBool);
                // nullable bool
                Assert.Equal(null, emptyDb.TypeBoolN);

                // integers
                Assert.Equal(default(short), emptyDb.TypeShort);
                Assert.Equal(default(ushort), emptyDb.TypeUshort);
                Assert.Equal(default(int), emptyDb.TypeInt);
                Assert.Equal(default(uint), emptyDb.TypeUint);
                Assert.Equal(default(long), emptyDb.TypeLong);
                Assert.Equal(default(ulong), emptyDb.TypeUlong);
                // nullable integers
                Assert.Equal(null, emptyDb.TypeShortN);
                Assert.Equal(null, emptyDb.TypeUshortN);
                Assert.Equal(null, emptyDb.TypeIntN);
                Assert.Equal(null, emptyDb.TypeUintN);
                Assert.Equal(null, emptyDb.TypeLongN);
                Assert.Equal(null, emptyDb.TypeUlongN);

                // decimals
                Assert.Equal(default(decimal), emptyDb.TypeDecimal);
                Assert.Equal(default(double), emptyDb.TypeDouble);
                Assert.Equal(default(float), emptyDb.TypeFloat);
                // nullable decimals
                Assert.Equal(null, emptyDb.TypeDecimalN);
                Assert.Equal(null, emptyDb.TypeDoubleN);
                Assert.Equal(null, emptyDb.TypeFloatN);

                // byte
                Assert.Equal(default(sbyte), emptyDb.TypeSbyte);
                Assert.Equal(default(byte), emptyDb.TypeByte);
                Assert.Equal(default(char), emptyDb.TypeChar);
                // nullable byte
                Assert.Equal(null, emptyDb.TypeSbyteN);
                Assert.Equal(null, emptyDb.TypeByteN);
                Assert.Equal(null, emptyDb.TypeCharN);

                // DateTime
                Assert.Equal(default(DateTime), emptyDb.TypeDateTime);
                Assert.Equal(default(DateTimeOffset), emptyDb.TypeDateTimeOffset);
                Assert.Equal(default(TimeSpan), emptyDb.TypeTimeSpan);
                // nullable DateTime
                Assert.Equal(null, emptyDb.TypeDateTimeN);
                Assert.Equal(null, emptyDb.TypeDateTimeOffsetN);
                Assert.Equal(null, emptyDb.TypeTimeSpanN);

                // Enum
                Assert.Equal(default(TestEnum), emptyDb.TypeEnum);
                Assert.Equal(default(TestEnumByte), emptyDb.TypeEnumByte);
                // nullableEnum
                Assert.Equal(null, emptyDb.TypeEnumN);
                Assert.Equal(null, emptyDb.TypeEnumByteN);

                // guid
                Assert.Equal(default(Guid), emptyDb.TypeGuid);
                // nullable guid
                Assert.Equal(null, emptyDb.TypeGuidN);
            }

            const sbyte testSbyte = (sbyte)-128;
            const byte  testByte  = (byte)255;
            const char  testChar  = 'a';
            const float testFloat = (float)1.23456789e38;

            var                dateTime       = new DateTime(2016, 10, 11, 1, 2, 3, 456);
            var                dateTimeOffset = dateTime + TimeSpan.FromMilliseconds(123.456);
            var                timeSpan       = new TimeSpan(1, 2, 3, 4, 5);
            const TestEnum     testEnum       = TestEnum.TestOne;
            const TestEnumByte testEnumByte   = TestEnumByte.TestOne;
            var                guid           = Guid.NewGuid();

            // test each data type with a valid value
            // ReSharper disable once ObjectCreationAsStatement
            DataTypesSimple NewValueMem() => new DataTypesSimple
            {
                // bool
                TypeBool = true,
                // nullable bool
                TypeBoolN = true,

                // integers
                TypeShort  = short.MinValue,
                TypeUshort = ushort.MaxValue,
                TypeInt    = int.MinValue,
                TypeUint   = uint.MaxValue,
                TypeLong   = long.MinValue,
                TypeUlong  = ulong.MaxValue,
                // nullable integers
                TypeShortN  = short.MinValue,
                TypeUshortN = ushort.MaxValue,
                TypeIntN    = int.MinValue,
                TypeUintN   = uint.MaxValue,
                TypeLongN   = long.MinValue,
                TypeUlongN  = ulong.MaxValue,

                // decimals
                TypeDecimal = decimal.MaxValue,
                TypeDouble  = double.MaxValue,
                TypeFloat   = testFloat,
                // nullable decimals
                TypeDecimalN = decimal.MaxValue,
                TypeDoubleN  = double.MaxValue,
                TypeFloatN   = testFloat,

                // byte
                TypeSbyte = testSbyte,
                TypeByte  = testByte,
                TypeChar  = testChar,
                // nullable byte
                TypeSbyteN = testSbyte,
                TypeByteN  = testByte,
                TypeCharN  = testChar,

                // DateTime
                TypeDateTime       = dateTime,
                TypeDateTimeOffset = dateTimeOffset,
                TypeTimeSpan       = timeSpan,
                // nullable DateTime
                TypeDateTimeN       = dateTime,
                TypeDateTimeOffsetN = dateTimeOffset,
                TypeTimeSpanN       = timeSpan,

                // Enum
                TypeEnum     = testEnum,
                TypeEnumByte = testEnumByte,
                // nullable Enum
                TypeEnumN     = testEnum,
                TypeEnumByteN = testEnumByte,

                // guid
                TypeGuid = guid,
                // nullable guid
                TypeGuidN = guid,
            };

            void TestValue(DataTypesSimple valueDb)
            {
                // bool
                Assert.Equal(true, valueDb.TypeBool);
                // nullable bool
                Assert.Equal(true, valueDb.TypeBoolN);

                // integers
                Assert.Equal(short.MinValue, valueDb.TypeShort);
                Assert.Equal(ushort.MaxValue, valueDb.TypeUshort);
                Assert.Equal(int.MinValue, valueDb.TypeInt);
                Assert.Equal(uint.MaxValue, valueDb.TypeUint);
                Assert.Equal(long.MinValue, valueDb.TypeLong);
                Assert.Equal(ulong.MaxValue, valueDb.TypeUlong);
                // nullable integers
                Assert.Equal(short.MinValue, valueDb.TypeShortN);
                Assert.Equal(ushort.MaxValue, valueDb.TypeUshortN);
                Assert.Equal(int.MinValue, valueDb.TypeIntN);
                Assert.Equal(uint.MaxValue, valueDb.TypeUintN);
                Assert.Equal(long.MinValue, valueDb.TypeLongN);
                Assert.Equal(ulong.MaxValue, valueDb.TypeUlongN);

                // decimals
                Assert.Equal(decimal.MaxValue, valueDb.TypeDecimal);
                Assert.Equal(double.MaxValue, valueDb.TypeDouble);
                Assert.InRange(valueDb.TypeFloat, testFloat * (1 - 7e-1), testFloat * (1 + 7e-1)); // floats have 7 digits of precision
                // nullable decimals
                Assert.Equal(decimal.MaxValue, valueDb.TypeDecimalN);
                Assert.Equal(double.MaxValue, valueDb.TypeDoubleN);
                Assert.InRange(valueDb.TypeFloatN.GetValueOrDefault(), testFloat * (1 - 7e-1), testFloat * (1 + 7e-1)); // floats have 7 digits of precision

                // byte
                Assert.Equal(testSbyte, valueDb.TypeSbyte);
                Assert.Equal(testByte, valueDb.TypeByte);
                Assert.Equal(testChar, valueDb.TypeChar);
                // nullable byte
                Assert.Equal(testSbyte, valueDb.TypeSbyte);
                Assert.Equal(testByte, valueDb.TypeByteN);
                Assert.Equal(testChar, valueDb.TypeCharN);

                // DateTime
                Assert.Equal(dateTime, valueDb.TypeDateTime);
                Assert.Equal(dateTimeOffset, valueDb.TypeDateTimeOffset);
                Assert.Equal(timeSpan, valueDb.TypeTimeSpan);
                // nullable DateTime
                Assert.Equal(dateTime, valueDb.TypeDateTimeN);
                Assert.Equal(dateTimeOffset, valueDb.TypeDateTimeOffsetN);
                Assert.Equal(timeSpan, valueDb.TypeTimeSpanN);

                // Enum
                Assert.Equal(testEnum, valueDb.TypeEnum);
                Assert.Equal(testEnumByte, valueDb.TypeEnumByte);
                // nullable Enum
                Assert.Equal(testEnum, valueDb.TypeEnumN);
                Assert.Equal(testEnumByte, valueDb.TypeEnumByteN);

                // guid
                Assert.Equal(guid, valueDb.TypeGuid);
                // nullable guid
                Assert.Equal(guid, valueDb.TypeGuidN);
            }

            // create test data objects
            var emptyMemAsync = new DataTypesSimple();
            var emptyMemSync  = new DataTypesSimple();
            var valueMemAsync = NewValueMem();
            var valueMemSync  = NewValueMem();

            // save them to the database
            using (var scope = new AppDbScope())
            {
                var db = scope.AppDb;
                db.DataTypesSimple.Add(emptyMemAsync);
                db.DataTypesSimple.Add(valueMemAsync);
                await db.SaveChangesAsync();

                db.DataTypesSimple.Add(emptyMemSync);
                db.DataTypesSimple.Add(valueMemSync);
                db.SaveChanges();
            }

            // load them from the database and run tests
            using (var scope = new AppDbScope())
            {
                var db = scope.AppDb;
                // ReSharper disable once AccessToDisposedClosure
                async Task <DataTypesSimple> FromDbAsync(DataTypesSimple dt) => await db.DataTypesSimple.FirstOrDefaultAsync(m => m.Id == dt.Id);

                // ReSharper disable once AccessToDisposedClosure
                DataTypesSimple FromDbSync(DataTypesSimple dt) => db.DataTypesSimple.FirstOrDefault(m => m.Id == dt.Id);

                TestEmpty(await FromDbAsync(emptyMemAsync));
                TestEmpty(FromDbSync(emptyMemSync));
                TestValue(await FromDbAsync(valueMemAsync));
                TestValue(FromDbSync(valueMemSync));
            }
        }
Пример #7
0
        public async Task TestDataTypesSimple()
        {
            Action <DataTypesSimple> testEmpty = emptyDb =>
            {
                // integers
                Assert.Equal(default(short), emptyDb.TypeShort);
                Assert.Equal(default(ushort), emptyDb.TypeUshort);
                Assert.Equal(default(int), emptyDb.TypeInt);
                Assert.Equal(default(uint), emptyDb.TypeUint);
                Assert.Equal(default(long), emptyDb.TypeLong);
                Assert.Equal(default(ulong), emptyDb.TypeUlong);
                // nullable integers
                Assert.Equal(null, emptyDb.TypeShortN);
                Assert.Equal(null, emptyDb.TypeUshortN);
                Assert.Equal(null, emptyDb.TypeIntN);
                Assert.Equal(null, emptyDb.TypeUintN);
                Assert.Equal(null, emptyDb.TypeLongN);
                Assert.Equal(null, emptyDb.TypeUlongN);

                // decimals
                Assert.Equal(default(decimal), emptyDb.TypeDecimal);
                Assert.Equal(default(double), emptyDb.TypeDouble);
                Assert.Equal(default(float), emptyDb.TypeFloat);
                // nullable decimals
                Assert.Equal(null, emptyDb.TypeDecimalN);
                Assert.Equal(null, emptyDb.TypeDoubleN);
                Assert.Equal(null, emptyDb.TypeFloatN);

                // byte
                Assert.Equal(default(sbyte), emptyDb.TypeSbyte);
                Assert.Equal(default(byte), emptyDb.TypeByte);
                Assert.Equal(default(char), emptyDb.TypeChar);
                // nullable byte
                Assert.Equal(null, emptyDb.TypeSbyteN);
                Assert.Equal(null, emptyDb.TypeByteN);
                Assert.Equal(null, emptyDb.TypeCharN);

                // DateTime
                Assert.Equal(default(DateTime), emptyDb.TypeDateTime);
                Assert.Equal(default(DateTimeOffset), emptyDb.TypeDateTimeOffset);
                // nullable DateTime
                Assert.Equal(null, emptyDb.TypeDateTimeN);
                Assert.Equal(null, emptyDb.TypeDateTimeOffsetN);

                // guid
                Assert.Equal(default(Guid), emptyDb.TypeGuid);
                // nullable guid
                Assert.Equal(null, emptyDb.TypeGuidN);
            };

            const sbyte testSbyte = (sbyte)-128;
            const byte  testByte  = (byte)255;
            const char  testChar  = 'a';
            const float testFloat = (float)1.23456789e38;

            // by default, we use second granularity on dateTime
            var dateTime = new DateTime(2016, 10, 6, 13, 3, 7);
            // we only support up to millisecond granularity on dateTimeOffset
            var dateTimeOffset = new DateTime(2016, 10, 6) + TimeSpan.FromMilliseconds(123456789);
            var guid           = Guid.NewGuid();

            // test each data type with a valid value
            // ReSharper disable once ObjectCreationAsStatement
            Func <DataTypesSimple> newValueMem = () => new DataTypesSimple {
                // integers
                TypeShort  = short.MinValue,
                TypeUshort = ushort.MaxValue,
                TypeInt    = int.MinValue,
                TypeUint   = uint.MaxValue,
                TypeLong   = long.MinValue,
                TypeUlong  = ulong.MaxValue,
                // nullable integers
                TypeShortN  = short.MinValue,
                TypeUshortN = ushort.MaxValue,
                TypeIntN    = int.MinValue,
                TypeUintN   = uint.MaxValue,
                TypeLongN   = long.MinValue,
                TypeUlongN  = ulong.MaxValue,

                // decimals
                TypeDecimal = decimal.MaxValue,
                TypeDouble  = double.MaxValue,
                TypeFloat   = testFloat,
                // nullable decimals
                TypeDecimalN = decimal.MaxValue,
                TypeDoubleN  = double.MaxValue,
                TypeFloatN   = testFloat,

                // byte
                TypeSbyte = testSbyte,
                TypeByte  = testByte,
                TypeChar  = testChar,
                // nullable byte
                TypeSbyteN = testSbyte,
                TypeByteN  = testByte,
                TypeCharN  = testChar,

                // DateTime
                TypeDateTime       = dateTime,
                TypeDateTimeOffset = dateTimeOffset,
                // nullable DateTime
                TypeDateTimeN       = dateTime,
                TypeDateTimeOffsetN = dateTimeOffset,

                // guid
                TypeGuid = guid,
                // nullable guid
                TypeGuidN = guid,
            };

            Action <DataTypesSimple> testValue = valueDb =>
            {
                // integers
                Assert.Equal(short.MinValue, valueDb.TypeShort);
                Assert.Equal(ushort.MaxValue, valueDb.TypeUshort);
                Assert.Equal(int.MinValue, valueDb.TypeInt);
                Assert.Equal(uint.MaxValue, valueDb.TypeUint);
                Assert.Equal(long.MinValue, valueDb.TypeLong);
                Assert.Equal(ulong.MaxValue, valueDb.TypeUlong);
                // nullable integers
                Assert.Equal(short.MinValue, valueDb.TypeShortN);
                Assert.Equal(ushort.MaxValue, valueDb.TypeUshortN);
                Assert.Equal(int.MinValue, valueDb.TypeIntN);
                Assert.Equal(uint.MaxValue, valueDb.TypeUintN);
                Assert.Equal(long.MinValue, valueDb.TypeLongN);
                Assert.Equal(ulong.MaxValue, valueDb.TypeUlongN);

                // decimals
                Assert.Equal(decimal.MaxValue, valueDb.TypeDecimal);
                Assert.Equal(double.MaxValue, valueDb.TypeDouble);
                Assert.InRange(valueDb.TypeFloat, testFloat * (1 - 7e-1), testFloat * (1 + 7e-1));         // floats have 7 digits of precision
                // nullable decimals
                Assert.Equal(decimal.MaxValue, valueDb.TypeDecimalN);
                Assert.Equal(double.MaxValue, valueDb.TypeDoubleN);
                Assert.InRange(valueDb.TypeFloatN.GetValueOrDefault(), testFloat * (1 - 7e-1), testFloat * (1 + 7e-1));         // floats have 7 digits of precision

                // byte
                Assert.Equal(testSbyte, valueDb.TypeSbyte);
                Assert.Equal(testByte, valueDb.TypeByte);
                Assert.Equal(testChar, valueDb.TypeChar);
                // nullable byte
                Assert.Equal(testSbyte, valueDb.TypeSbyte);
                Assert.Equal(testByte, valueDb.TypeByteN);
                Assert.Equal(testChar, valueDb.TypeCharN);

                // DateTime
                Assert.Equal(dateTime, valueDb.TypeDateTime);
                Assert.Equal(dateTimeOffset, valueDb.TypeDateTimeOffset);
                // nullable DateTime
                Assert.Equal(dateTime, valueDb.TypeDateTimeN);
                Assert.Equal(dateTimeOffset, valueDb.TypeDateTimeOffsetN);

                // guid
                Assert.Equal(guid, valueDb.TypeGuid);
                // nullable guid
                Assert.Equal(guid, valueDb.TypeGuidN);
            };

            // create test data objects
            var emptyMemAsync = new DataTypesSimple();
            var emptyMemSync  = new DataTypesSimple();
            var valueMemAsync = newValueMem();
            var valueMemSync  = newValueMem();

            // save them to the database
            using (var db = new AppDb()){
                db.DataTypesSimple.Add(emptyMemAsync);
                db.DataTypesSimple.Add(valueMemAsync);
                await db.SaveChangesAsync();

                db.DataTypesSimple.Add(emptyMemSync);
                db.DataTypesSimple.Add(valueMemSync);
                db.SaveChanges();
            }

            // load them from the database and run tests
            using (var db = new AppDb())
            {
                // ReSharper disable once AccessToDisposedClosure
                Func <DataTypesSimple, Task <DataTypesSimple> > fromDbAsync =
                    async dt => await db.DataTypesSimple.FirstOrDefaultAsync(m => m.Id == dt.Id);

                // ReSharper disable once AccessToDisposedClosure
                Func <DataTypesSimple, DataTypesSimple> fromDbSync =
                    dt => db.DataTypesSimple.FirstOrDefault(m => m.Id == dt.Id);

                testEmpty(await fromDbAsync(emptyMemAsync));
                testEmpty(fromDbSync(emptyMemSync));
                testValue(await fromDbAsync(valueMemAsync));
                testValue(fromDbSync(valueMemSync));
            }
        }