Пример #1
0
        public void TestFilterStringKey()
        {
            ActODataService(args =>
            {
                var класс    = new КлассСоСтроковымКлючом();
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                var objs = new DataObject[] { класс, медв };
                args.DataService.UpdateObjects(ref objs);
                string requestUrl;
                requestUrl = $"http://localhost/odata/КлассСоСтроковымКлючомs?$filter=__PrimaryKey eq '{класс.__PrimaryKey}'";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }
            });
        }
Пример #2
0
        public void UpdateOtherAgregatorInstanceTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Шаг 1. Создание экземпляра класса А хотя бы с одним детейлом класса В.
                var берлога = new Берлога {
                    Наименование = "У потапыча"
                };
                var потапыч = new Медведь {
                    ПорядковыйНомер = 5
                };
                потапыч.Берлога.Add(берлога);
                dataService.UpdateObject(потапыч);

                // Шаг 2. Создание другого экземпляра класса А с установкой первичного ключа первого экземпляра.
                var pk      = (KeyGuid)потапыч.__PrimaryKey;
                var берёзыч = new Медведь {
                    ПорядковыйНомер = 6
                };
                берёзыч.SetExistObjectPrimaryKey(pk);

                // Шаг 3. Допустимо пропустить.

                // Шаг 4. Создание экземпляра класса С с установкой в качестве мастера второго экземпляра класса А.
                var блоха = new Блоха {
                    Кличка = "Попрыгушка", МедведьОбитания = берёзыч
                };

                // Шаг 5. Обновление экземпляра класса С в базу данных.
                dataService.UpdateObject(блоха);

                Assert.Equal(1, потапыч.Берлога.Count);
            }
        }
Пример #3
0
        public void GetObjectIndexesWithPksTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds           = dataService as SQLDataService;
                var            createdBear1 = new Медведь();
                createdBear1.ЦветГлаз = "Косолапый Мишка 1";
                ds.UpdateObject(createdBear1);

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL);

                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                Function findFunction = langDef.GetFunction(langDef.funcLike,
                                                            new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.ЦветГлаз)),
                                                            createdBear1.ЦветГлаз);

                // Act.
                IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, 101);

                // Assert.
                Assert.Equal(1, result.Count);
                Assert.True(result[1].IndexOf("{") > -1);

                Console.WriteLine(result[1]);
            }
        }
        public void LoadingObjectLoadObjectsTest()
        {
            // TODO: Обработать после выполнения задачи 4009

            var dataService = new MSSQLDataService();

            dataService.CustomizationString = ConfigurationManager.ConnectionStrings["TestAppNormal"]
                                              .ConnectionString;

            // Создание тестовой записи.
            var тестовыйМедведь = new Медведь()
            {
                ПорядковыйНомер = 15, Вес = 39
            };

            dataService.UpdateObject(тестовыйМедведь);

            var view = new View {
                DefineClassType = typeof(Медведь)
            };

            view.AddProperties(
                new string[1]
            {
                "ВычислимоеПоле"
            });

            // Загрузка объектов.
            IQueryable <Медведь> dataМедведи =
                dataService.Query <Медведь>(view).Where(w => w.__PrimaryKey == тестовыйМедведь.__PrimaryKey);


            var lcs = LinqToLcs.GetLcs(dataМедведи.Expression, view);

            lcs.View         = view;
            lcs.LoadingTypes = new[] { typeof(Медведь) };
            lcs.ReturnType   = LcsReturnType.Objects;

            // Загрузка данных без создания объктов.
            var медведи = dataService.LoadObjects(lcs);

            Assert.True(1 == медведи.Length, "Запись должна быть одна.");
            foreach (var stringDataView in медведи)
            {
                int fieldSum = ((Медведь)stringDataView).ВычислимоеПоле;
                Assert.True(54 == fieldSum, "ВычислимоеПоле");
            }

            Assert.True(1 == dataМедведи.Count(), "Запись должна быть одна.");
            foreach (var медведь in dataМедведи)
            {
                Assert.True(1 == медведь.ВычислимоеПоле, "ВычислимоеПоле");
            }

            // Удаление тестовой записи.
            тестовыйМедведь.SetStatus(ObjectStatus.Deleted);
            dataService.UpdateObject(тестовыйМедведь);
        }
        public void LoadingObjectLoadStringedObjectViewTest()
        {
            // TODO: Обработать после выполнения задачи 4009

            var dataService = new MSSQLDataService();

            dataService.CustomizationString = "SERVER=rtc-storm;Trusted_connection=yes;DATABASE=dochitka_test;";

            // Cоздание тестовой записи.
            var тестовыйМедведь = new Медведь()
            {
                ПорядковыйНомер = 15, Вес = 39
            };

            dataService.UpdateObject(тестовыйМедведь);

            var view = new View {
                DefineClassType = typeof(Медведь)
            };

            view.AddProperties(
                new string[1]
            {
                "ВычислимоеПоле"
            });

            // Загрузка объектов.
            IQueryable <Медведь> dataМедведи =
                dataService.Query <Медведь>(view).Where(w => w.__PrimaryKey == тестовыйМедведь.__PrimaryKey);


            var lcs = LinqToLcs.GetLcs(dataМедведи.Expression, view);

            lcs.View         = view;
            lcs.LoadingTypes = new[] { typeof(Медведь) };
            lcs.ReturnType   = LcsReturnType.Objects;

            // Загрузка данных без создания объктов.
            var медведи = dataService.LoadStringedObjectView('\t', lcs);

            Assert.True(1 == медведи.Length, "Запись должна быть одна.");
            foreach (var stringDataView in медведи)
            {
                int fieldSum = Int32.Parse(stringDataView.ObjectedData[0].ToString());
                Assert.True(54 == fieldSum, "ВычислимоеПоле");
            }

            Assert.True(1 == dataМедведи.Count(), "Запись должна быть одна.");
            foreach (var медведь in dataМедведи)
            {
                Assert.True(54 == медведь.ВычислимоеПоле, "ВычислимоеПоле");
            }

            // Удаление тестовой записи.
            тестовыйМедведь.SetStatus(ObjectStatus.Deleted);
            dataService.UpdateObject(тестовыйМедведь);
        }
        public void LoadObjectsWithTop()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = (SQLDataService)dataService;

                try
                {
                    // Arrange.
                    // Сначала создаём структуру данных, требуемую для теста.
                    int top    = 2;
                    var forest = new Лес();
                    var bear1  = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 2
                    };
                    var bear2 = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 5
                    };
                    var bear3 = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 8
                    };
                    var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };

                    ds.UpdateObjects(ref updateObjectsArray);

                    var view = Медведь.Views.МедведьL;
                    var lcs  = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                    lcs.ReturnTop = top;

                    // Выведем в консоль запрос, который генерируется данной операцией.
                    ds.AfterGenerateSQLSelectQuery -= ds_AfterGenerateSQLSelectQuery;
                    ds.AfterGenerateSQLSelectQuery += ds_AfterGenerateSQLSelectQuery;

                    // Act.
                    var dataObjects = ds.LoadObjects(lcs);

                    // Assert.
                    Assert.Equal(top, dataObjects.Length);
                }
                catch (Exception)
                {
                    Debug.WriteLine("Тест запущен");
                    Debug.WriteLine(dataService.GetType().Name);
                    Debug.WriteLine(dataService.CustomizationString);
                    throw;
                }
                finally
                {
                    ds.AfterGenerateSQLSelectQuery -= ds_AfterGenerateSQLSelectQuery;
                }
            }
        }
        public void TestSelectExpandFunctionEntity()
        {
            ActODataService(args =>
            {
                RegisterODataUserFunctions(args.Token.Functions, args.DataService);

                Медведь медв = new Медведь {
                    Вес = 48
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                var objs = new DataObject[] { медв, берлога2, берлога1, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                var expectedResult = (args.DataService as SQLDataService).Query <Медведь>(Медведь.Views.МедведьE).ToArray();
                int intParam       = 0;

                // Формируем URL запроса к OData-сервису.
                string requestUrl = $"http://localhost/odata/FunctionSelectExpandEntity(intParam={intParam})?$expand=Берлога($select=Наименование)";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(expectedResult[intParam].Вес, receivedDict["Вес"]);

                    for (int i = 0; i < expectedResult[intParam].Берлога.Count; i++)
                    {
                        Assert.Equal(expectedResult[intParam].Берлога[i].Наименование, ((receivedDict["Берлога"] as ArrayList)[i] as Dictionary <string, object>)["Наименование"] as string);
                        Assert.Equal(1, ((receivedDict["Берлога"] as ArrayList)[i] as Dictionary <string, object>).Count);
                    }
                }
            });
        }
Пример #8
0
        public void LoadTest3()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds = (SQLDataService)dataService;

                var view = Медведь.Views.LoadTestView;

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs.ColumnsSort = new[]
                {
                    new ColumnsSortDef(Information.ExtractPropertyPath <Медведь>(x => x.__PrimaryKey),
                                       _random.Next(10) > 5 ? SortOrder.Asc : SortOrder.Desc)
                };

                lcs.InitDataCopy = true;

                // Чтобы медведь в БД точно был, создадим его.
                var createdBear = new Медведь();
                ds.UpdateObject(createdBear);

                var dataObjects = ds.LoadObjects(lcs);

                Assert.True(dataObjects.Length > 0);

                var медведь = (Медведь)dataObjects[0];
                if (медведь.Берлога.Count == 0)
                {
                    медведь.Берлога.Add(new Берлога
                    {
                        Наименование = "Некий лес"
                    });
                    ds.UpdateObject(медведь);
                }

                var alteredPropertyNames = медведь.GetAlteredPropertyNames();
                var loadedProperties     = медведь.GetLoadedProperties();

                Assert.NotNull(alteredPropertyNames);
                Assert.Equal(0, alteredPropertyNames.Length);
                Assert.NotNull(loadedProperties);
                Assert.Equal(4, loadedProperties.Length);

                string s = "Подосиновая";
                медведь.Берлога[0].Наименование = s;
                ds.LoadObject(медведь, false, false);

                Assert.Equal(s, медведь.Берлога[0].Наименование);
                Assert.Equal(1, медведь.Берлога[0].GetAlteredPropertyNames(true).Length);
            }

            #endregion
        }
Пример #9
0
        public void TestBeforeGet()
        {
            ActODataService(args =>
            {
                args.Token.Events.CallbackBeforeGet = BeforeGet;

                DateTime date               = new DateTimeOffset(DateTime.Now).UtcDateTime;
                string prevDate             = $"{date.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                string nextDate             = $"{date.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                КлассСМножествомТипов класс = new КлассСМножествомТипов()
                {
                    PropertyEnum = Цифра.Семь, PropertyDateTime = date
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new DataObject[] { класс, медв, медв2, берлога2, берлога1, берлога3, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                this.lcs       = null;
                var requestUrl = "http://localhost/odata/Медведьs";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                    Assert.NotNull(this.lcs);
                }
            });
        }
Пример #10
0
        public void DeleteAgregatorWithoutDetailsThroughUpdateObjectsOrderedMethodTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = dataService as SQLDataService;

                // Создаем агрегатор без детейлов (медведя без берлог), но с бизнес-сервером привязанным к детейлам (к берлогам привязан бизнес-сервер).
                Медведь bear = new Медведь {
                    ЦветГлаз = "Карие", Вес = 50
                };
                DataObject[] dataObjectsForUpdate = new DataObject[]
                {
                    bear
                };

                // Сохраняем созданный агрегатор без детейлов.
                ds.UpdateObjects(ref dataObjectsForUpdate);

                // Помечаем сохраненный агрегатор на удаление.
                bear.SetStatus(ObjectStatus.Deleted);

                Exception updateException = null;
                try
                {
                    // Пытаемся удалить агрегатор через метод UpdateObjectsOrdered.
                    ds.UpdateObjectsOrdered(ref dataObjectsForUpdate);
                }
                catch (Exception ex)
                {
                    updateException = ex;
                }

                // Проверяем, что при удалении не возникло исключений.
                Assert.True(updateException == null, "При удалении через UpdateObjectsOrdered не возникло исключений");

                // Пытаемся загрузить удаленный объект из БД.
                Exception loadException = null;
                try
                {
                    Медведь loadedBear = new Медведь();
                    loadedBear.SetExistObjectPrimaryKey(bear.__PrimaryKey);
                    ds.LoadObject(loadedBear);
                }
                catch (Exception ex)
                {
                    loadException = ex;
                }

                // Проверяем, что удаленный объект действительно удалился.
                Assert.True(loadException is CantFindDataObjectException, "Объект удаленный через UpdateObjectsOrdered действительно больше не существует");
            }
        }
        public void UpdateMasterPropertyTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                string названиеЛеса      = "Шишкин лес";
                string новоеНазваниеЛеса = "Лисицын лес";
                var    лес = new Лес {
                    Название = названиеЛеса
                };
                var потапыч = new Медведь {
                    ПорядковыйНомер = 5, ЛесОбитания = лес
                };
                dataService.UpdateObject(потапыч);

                View view = new View
                {
                    DefineClassType = typeof(Медведь),
                    Properties      = new[]
                    {
                        new PropertyInView(nameof(Медведь.ЛесОбитания), string.Empty, true, string.Empty)
                    }
                };

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                var dataObjects = dataService.LoadObjects(lcs);

                Assert.Equal(1, dataObjects.Length);

                Медведь медведь = (Медведь)dataObjects[0];

                // Assert.AreEqual(названиеЛеса, медведь.ЛесОбитания.Название);

                // Act.
                медведь.ЛесОбитания.Название = новоеНазваниеЛеса;
                dataService.UpdateObject(медведь.ЛесОбитания);

                // Assert.
                view.AddProperty(Information.ExtractPropertyPath <Медведь>(м => м.ЛесОбитания.Название));
                dataObjects = dataService.LoadObjects(lcs);

                Assert.Equal(1, dataObjects.Length);

                медведь = (Медведь)dataObjects[0];
                Assert.Equal(названиеЛеса, медведь.ЛесОбитания.Название);
            }
        }
        public void InsertSelectUpdateDeleteSpeedTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds = (SQLDataService)dataService;

                var createdBear1 = new Медведь();
                createdBear1.ЦветГлаз = "Косолапый Мишка 1";
                ds.UpdateObject(createdBear1);

                Random random = new Random();

                Stopwatch stopwatch = new Stopwatch();

                int i = 0;

                stopwatch.Start();

                do
                {
                    // Чтобы медведь в БД точно был, создадим его.
                    var createdBear = new Медведь();
                    createdBear.ЦветГлаз = "Косолапый Мишка " + random.Next(101);
                    ds.UpdateObject(createdBear);

                    // Теперь грузим его из БД.
                    var медведь = new Медведь();
                    медведь.SetExistObjectPrimaryKey(createdBear.__PrimaryKey);
                    ds.LoadObject(медведь, false, false);

                    медведь.ЦветГлаз = "Топтыгин " + random.Next(101);

                    ds.UpdateObject(медведь);

                    медведь.SetStatus(ObjectStatus.Deleted);
                    ds.UpdateObject(медведь);
                    i++;
                } while (stopwatch.ElapsedMilliseconds < 1000);

                stopwatch.Stop();
                Console.WriteLine(i + " instances.");
            }
        }
Пример #13
0
        public void LoadTest1()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds = (SQLDataService)dataService;

                // Чтобы медведь в БД точно был, создадим его.
                var createdBear = new Медведь();
                ds.UpdateObject(createdBear);

                // Теперь грузим его из БД.
                var медведь = new Медведь();
                медведь.SetExistObjectPrimaryKey(createdBear.__PrimaryKey);
                ds.LoadObject(медведь, false, false);

                Assert.NotNull(медведь.Берлога);
                Assert.Equal(0, медведь.Берлога.Count);
            }
        }
Пример #14
0
        public void TestODataAny()
        {
            foreach (IDataService dataService in DataServices)
            {
                ICSSoft.STORMNET.Windows.Forms.ExternalLangDef.LanguageDef.DataService = dataService;
                //if (dataService is MSSQLDataService)
                //    continue;
                Медведь медв = new Медведь {
                    Вес = 48, Пол = Пол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = Пол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new ICSSoft.STORMNET.DataObject[] { медв, медв2, берлога2, берлога1, берлога3, лес1, лес2 };
                var ds   = (SQLDataService)dataService;
                ds.UpdateObjects(ref objs);

                var v  = new View(new ViewAttribute("AllProps", new string[] { "*" }), typeof(Кошка));
                var ob = ds.LoadObjects(v);

                var l = ds.Query <Медведь>(Медведь.Views.МедведьE).Where(
                    x => x.Берлога.Cast <Берлога>().Any(o => o.Наименование == "Для хорошего настроения")).ToList();
            }
        }
Пример #15
0
        public void TestAfterGet()
        {
            ActODataService(args =>
            {
                args.Token.Events.CallbackAfterGet = AfterGet;

                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания  = лес;
                медв2.ЛесОбитания = лес2;
                var берлога       = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                медв.Берлога.Add(берлога);
                медв2.Берлога.Add(берлога2);
                var objs = new DataObject[] { медв, медв2, берлога2, берлога, лес, лес2 };
                args.DataService.UpdateObjects(ref objs);
                Objs = null;
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name);

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                    Assert.NotNull(Objs);
                }
            });
        }
Пример #16
0
        static void Main(string[] args)
        {
            try
            {
                Console.Title = "ТАРАКАНИЩЕ";
                Console.WriteLine("               ТАРАКАНИЩЕ\r\n");

                Console.WriteLine("Created by Koleso\nStory by Chykovskiy");
                Console.WriteLine();

                Медведь bears = new Медведь();
                Console.WriteLine(bears);
                bears.Move();
                Console.WriteLine();

                Кот cat = new Кот();
                Console.WriteLine(cat);
                cat.Move();
                Console.WriteLine();

                Комар mosquito = new Комар();
                Console.WriteLine(mosquito);
                mosquito.Move();
                Console.WriteLine();

                ак crayfish = new  ак();
                Console.WriteLine(crayfish);
                crayfish.Speak();
                crayfish.Move();
                Console.WriteLine();

                Волк wolf = new Волк();
                Console.WriteLine(wolf);
                wolf.Move();
                Console.WriteLine();

                Лев lion = new Лев();
                Console.WriteLine(lion);
                lion.Move();
                Console.WriteLine();

                Заяц hare = new Заяц();
                Console.WriteLine(hare);
                hare.Move();
                Console.WriteLine();

                Жаба frog = new Жаба();
                Console.WriteLine(frog);
                frog.Move();
                Console.WriteLine();

                Герои.Smile();
                Герои.Eat();
                Таракан roach = Таракан.Instance;
                Console.WriteLine(roach.Places);
                Console.WriteLine(roach.Types);
                Console.WriteLine(roach);
                roach.Growl();
                roach.Shout();
                roach.Stir();
                roach.Speak();
                Console.WriteLine();

                Герои.frighten();

                Console.WriteLine(frog);
                frog.FrightSpeak();
                Console.WriteLine();

                Console.WriteLine(wolf);
                wolf.FrightSpeak();
                Console.WriteLine();

                Console.WriteLine(crayfish);
                crayfish.FrightSpeak();
                Console.WriteLine();

                Sparrow obj10 = new Sparrow();
                Console.WriteLine();
                Console.WriteLine();

                obj10.Speak();
                obj10.Kill();
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Пример #17
0
        public void BSTest()
        {
            // Объекты для тестирования создания.
            Медведь медв = new Медведь {
                Вес = 48
            };
            Лес лес1 = new Лес {
                Название = "Бор"
            };
            Лес лес2 = new Лес {
                Название = "Березовая роща"
            };

            медв.ЛесОбитания = лес1;
            var берлога1 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };
            var берлога2 = new Берлога {
                Наименование = "Для плохого настроения", ЛесРасположения = лес2
            };

            медв.Берлога.Add(берлога1);
            медв.Берлога.Add(берлога2);

            // Объекты для тестирования создания с обновлением.
            Медведь медвежонок = new Медведь {
                Вес = 12
            };
            var берлога3 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };

            медвежонок.Берлога.Add(берлога3);

            ActODataService(args =>
            {
                // ------------------ Только создания объектов ------------------
                // Подготовка тестовых данных в формате OData.
                var controller = new Controllers.DataObjectController(args.DataService, args.Token.Model, args.Token.Events, args.Token.Functions);
                System.Web.OData.EdmEntityObject edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Медведь)), медв, 1, null);
                var edmЛес1 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес1, 1, null);
                var edmЛес2 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес2, 1, null);
                edmObj.TrySetPropertyValue("ЛесОбитания", edmЛес1);
                var coll = controller.GetEdmCollection(медв.Берлога, typeof(Берлога), 1, null);
                edmObj.TrySetPropertyValue("Берлога", coll);
                System.Web.OData.EdmEntityObject edmБерлога1 = (System.Web.OData.EdmEntityObject)coll[0];
                System.Web.OData.EdmEntityObject edmБерлога2 = (System.Web.OData.EdmEntityObject)coll[1];
                edmБерлога1.TrySetPropertyValue("ЛесРасположения", edmЛес1);
                edmБерлога2.TrySetPropertyValue("ЛесРасположения", edmЛес2);

                // Формируем URL запроса к OData-сервису.
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name);

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                HttpResponseMessage response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                // Получим строку с ответом.
                string receivedJsonObjs = response.Content.ReadAsStringAsync().Result.Beautify();

                // В ответе приходит объект с созданной сущностью.
                // Преобразуем полученный объект в словарь.
                Dictionary <string, object> receivedObjs = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedJsonObjs);
                Assert.Equal("Object created.", receivedObjs["ПолеБС"]);

                // Проверяем что созданы зависимые объекты, вычитав с помощью args.DataService
                var lcs          = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), "БерлогаE");
                lcs.LoadingTypes = new[] { typeof(Берлога) };

                var dobjs = args.DataService.LoadObjects(lcs);
                Assert.Equal(2, dobjs.Length);

                foreach (var obj in dobjs)
                {
                    var berloga = (Берлога)obj;
                    Assert.Equal("Object created.", berloga.ПолеБС);
                }
            });
        }
        public void TestLoadingObjectIndexesWithMaxResultsCount()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds   = (SQLDataService)dataService;
                var ldef = SQLWhereLanguageDef.LanguageDef;

                // Сначала создаём структуру данных, требуемую для теста.
                var forest = new Лес();
                var bear1  = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 2
                };
                var bear2 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 5
                };
                var bear3 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 8
                };
                var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };

                ds.UpdateObjects(ref updateObjectsArray);

                var    view = Медведь.Views.OrderNumberTest;
                string numberPropertyName = Information.ExtractPropertyPath <Медведь>(x => x.ПорядковыйНомер);
                var    lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };

                var      variable = new VariableDef(ldef.NumericType, numberPropertyName);
                Function func     = ldef.GetFunction(
                    ldef.funcAND,
                    ldef.GetFunction(
                        ldef.funcEQ,
                        new VariableDef(ldef.GuidType, Information.ExtractPropertyPath <Медведь>(x => x.ЛесОбитания)),
                        forest.__PrimaryKey),
                    ldef.GetFunction(ldef.funcG, variable, 3));

                // Меньше чем всего результатов.
                IDictionary <int, string> indexes1 = ds.GetObjectIndexesWithPks(lcs, func, 1);

                // Столько же, сколько всего результатов.
                IDictionary <int, string> indexes2 = ds.GetObjectIndexesWithPks(lcs, func, 2);

                // Больше чем число результатов.
                IDictionary <int, string> indexes3 = ds.GetObjectIndexesWithPks(lcs, func, 3);

                Assert.NotNull(indexes1);
                Assert.Equal(1, indexes1.Count);
                Assert.Equal(bear2.__PrimaryKey.ToString(), indexes1[2]);

                Assert.NotNull(indexes2);
                Assert.Equal(2, indexes2.Count);
                Assert.Equal(bear2.__PrimaryKey.ToString(), indexes2[2]);
                Assert.Equal(bear3.__PrimaryKey.ToString(), indexes2[3]);

                Assert.NotNull(indexes3);
                Assert.Equal(2, indexes3.Count);
                Assert.Equal(bear2.__PrimaryKey.ToString(), indexes3[2]);
                Assert.Equal(bear3.__PrimaryKey.ToString(), indexes3[3]);
            }
        }
        public void TestLoadingObjectIndex()
        {
            foreach (IDataService dataService in DataServices)
            {
                var ds   = (SQLDataService)dataService;
                var ldef = SQLWhereLanguageDef.LanguageDef;

                // Сначала создаём структуру данных, требуемую для теста.
                var forest = new Лес();
                var bear1  = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 2
                };
                var bear2 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 5
                };
                var bear3 = new Медведь()
                {
                    ЛесОбитания = forest, ПорядковыйНомер = 8
                };
                var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };
                ds.UpdateObjects(ref updateObjectsArray);

                // Формируем функцию ограничения, что нас интересуют только медведи из текущего леса.
                Function functionCurrentForest = ldef.GetFunction(
                    ldef.funcEQ,
                    new VariableDef(ldef.GuidType, Information.ExtractPropertyPath <Медведь>(x => x.ЛесОбитания)),
                    forest.__PrimaryKey);

                var    view = Медведь.Views.OrderNumberTest;
                string numberPropertyName = Information.ExtractPropertyPath <Медведь>(x => x.ПорядковыйНомер);

                // Проверка индекса первого элемента.
                var lcs1 = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs1.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };

                Function func1 = ldef.GetFunction(
                    ldef.funcAND,
                    functionCurrentForest,
                    ldef.GetFunction(ldef.funcEQ, new VariableDef(ldef.GuidType, SQLWhereLanguageDef.StormMainObjectKey),
                                     bear2.__PrimaryKey));

                int index1 = ds.GetObjectIndex(lcs1, func1);
                Assert.Equal(2, index1);

                // Проверка индекса первого элемента c учетом ограничения на номер записи.
                var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs2.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };
                lcs2.RowNumber   = new RowNumberDef(2, 3);

                Function func2 = ldef.GetFunction(
                    ldef.funcAND,
                    functionCurrentForest,
                    ldef.GetFunction(ldef.funcEQ, new VariableDef(ldef.GuidType, SQLWhereLanguageDef.StormMainObjectKey),
                                     bear2.__PrimaryKey));

                int index2 = ds.GetObjectIndex(lcs2, func2);
                Assert.Equal(1, index2);

                // Проверка индекса нескольких элементов.
                var lcs3 = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                lcs3.ColumnsSort = new[] { new ColumnsSortDef(numberPropertyName, SortOrder.Asc) };

                var variableDef3 = new VariableDef(ldef.NumericType, numberPropertyName);
                var func3        = ldef.GetFunction(ldef.funcG, variableDef3, 3);

                int[] indexes3 = ds.GetObjectIndexes(lcs3, func3);
                Assert.NotNull(indexes3);
                Assert.Equal(indexes3.Length, 2);
                Assert.Equal(indexes3[0], 2);
                Assert.Equal(indexes3[1], 3);

                // Проверка индексов с первичными ключами элементов.
                IDictionary <int, string> indexesWithPk3 = ds.GetObjectIndexesWithPks(lcs3, func3);
                Assert.NotNull(indexesWithPk3);
                Assert.Equal(indexesWithPk3.Count, 2);
                Assert.Equal(indexesWithPk3[2], bear2.__PrimaryKey.ToString());
                Assert.Equal(indexesWithPk3[3], bear3.__PrimaryKey.ToString());
            }
        }
        public void TestSettingAuditFieldsForTypeWithEnabledAudit()
        {
            foreach (var dataService in DataServices)
            {
                var d1 = new Медведь();

                // Audit fields are empty after creating object.
                Assert.Null(d1.CreateTime);
                Assert.Null(d1.Creator);
                Assert.Null(d1.Editor);
                Assert.Null(d1.EditTime);

                var createTime = DateTime.Now.AddDays(new Random().Next(42));
                var creator    = "Bruce the Hunter";
                d1.CreateTime = createTime;
                d1.Creator    = creator;

                dataService.UpdateObject(d1);

                // Audit fields are empty after persisting.
                Assert.Equal(creator, d1.Creator);
                Assert.Equal(createTime, d1.CreateTime);
                Assert.Null(d1.Editor);
                Assert.Null(d1.EditTime);

                var d2 = new Медведь();
                d2.SetExistObjectPrimaryKey(d1.__PrimaryKey);
                dataService.LoadObject(d2);

                // Audit fields are persisted.
                Assert.Equal(creator, d2.Creator);
                Assert.NotNull(d2.CreateTime);
                Assert.Equal(0, (int)(createTime - d2.CreateTime.Value).TotalSeconds);
                Assert.Null(d2.Editor);
                Assert.Null(d2.EditTime);

                d2.ПорядковыйНомер = 42;

                var editTime = createTime.AddDays(new Random().Next(42));
                var editor   = "Mike the Hunter";
                d2.EditTime = editTime;
                d2.Editor   = editor;

                dataService.UpdateObject(d2);

                // Audit fields are empty after persisting.
                Assert.Equal(creator, d2.Creator);
                Assert.NotNull(d2.CreateTime);
                Assert.Equal(0, (int)(createTime - d2.CreateTime.Value).TotalSeconds);
                Assert.Equal(editor, d2.Editor);
                Assert.Equal(editTime, d2.EditTime);

                var d3 = new Медведь();
                d3.SetExistObjectPrimaryKey(d2.__PrimaryKey);
                dataService.LoadObject(d3);

                // Audit fields are persisted.
                Assert.Equal(creator, d3.Creator);
                Assert.NotNull(d3.CreateTime);
                Assert.Equal(0, (int)(createTime - d3.CreateTime.Value).TotalSeconds);
                Assert.Equal(editor, d3.Editor);
                Assert.NotNull(d3.EditTime);
                Assert.Equal(0, (int)(editTime - d3.EditTime.Value).TotalSeconds);
            }
        }
Пример #21
0
        public void GetObjectIndexesWithPksOrderingTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }
                // Arrange.
                SQLDataService      ds      = dataService as SQLDataService;
                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                List <DataObject> dataObjects = new List <DataObject>();
                bool isMssql = dataService.GetType() == typeof(MSSQLDataService) || dataService.GetType().IsSubclassOf(typeof(MSSQLDataService));

                // MSSQL в отличие от других хранилищ имеет свой формат сортировки гуидов. Для его поддержки приходится пользоваться специальным типом SqlGuid.
                List <SqlGuid> keysMssqlList    = new List <SqlGuid>();
                List <Guid>    keysPostgresList = new List <Guid>();

                // Создадим 1000 медведей.
                int objectsCount = 1000;
                for (int i = 0; i < objectsCount; i++)
                {
                    // Для простоты анализа проблем с данными, если они возникнут, выдадим ненастоящие последовательные гуиды.
                    byte[] bytes = new byte[16];
                    BitConverter.GetBytes(i).CopyTo(bytes, 0);
                    var pk = new Guid(bytes);
                    if (isMssql)
                    {
                        keysMssqlList.Add(pk);
                    }
                    else
                    {
                        keysPostgresList.Add(pk);
                    }

                    var createdBear = new Медведь
                    {
                        __PrimaryKey = pk,
                        ЦветГлаз     = "Косолапый Мишка " + i,
                        Вес          = i
                    };
                    dataObjects.Add(createdBear);
                }

                DataObject[] dataObjectsForUpdate = dataObjects.ToArray();
                ds.UpdateObjects(ref dataObjectsForUpdate);

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL);

                Function findFunction = langDef.GetFunction(langDef.funcL, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.Вес)), objectsCount);
                if (isMssql)
                {
                    keysMssqlList.Sort();
                }
                else
                {
                    keysPostgresList.Sort();
                }

                // Act.
                IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, null);

                // Assert.
                var values = result.Values.GetEnumerator();
                var keys   = result.Keys.GetEnumerator();

                for (int i = 0; i < objectsCount; i++)
                {
                    Assert.Equal(objectsCount, result.Count);

                    values.MoveNext();
                    keys.MoveNext();
                    string key = isMssql ? ((Guid)keysMssqlList[i]).ToString("B") : keysPostgresList[i].ToString("B");
                    Assert.Equal(key, values.Current);
                    Assert.Equal(i + 1, keys.Current);
                }
            }
        }
Пример #22
0
        public void DeleteAggregatorWithDetailAndHierarhiTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds = dataService as SQLDataService;

                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }

                var masterForest = new Лес {
                    Название = "лес1"
                };
                var detailDen = new Берлога {
                    Наименование = "берлога1", ЛесРасположения = masterForest
                };
                var aggregatorBear = new Медведь {
                    ПорядковыйНомер = 2, ЛесОбитания = masterForest
                };
                aggregatorBear.Берлога.Add(detailDen);

                ds.UpdateObject(aggregatorBear);

                var aggregatorBearMother = new Медведь {
                    ПорядковыйНомер = 2
                };
                aggregatorBear.Мама = aggregatorBearMother;

                ds.UpdateObject(aggregatorBear);

                // Act & Assert.
                LoadingCustomizationStruct lcsBear   = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьE);
                LoadingCustomizationStruct lcsForest = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), Лес.Views.ЛесE);

                DataObject[] dataObjectsBear   = ds.LoadObjects(lcsBear);
                DataObject[] dataObjectsForest = ds.LoadObjects(lcsForest);

                // Act
                int countBearBefore   = ds.GetObjectsCount(lcsBear);
                int countForestBefore = ds.GetObjectsCount(lcsForest);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Медведь медведь in dataObjectsBear)
                {
                    медведь.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(медведь);
                }

                foreach (Лес лес in dataObjectsForest)
                {
                    лес.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(лес);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countBearAfter   = ds.GetObjectsCount(lcsBear);
                int countForestAfter = ds.GetObjectsCount(lcsForest);

                // Assert
                Assert.Equal(2, countBearBefore);
                Assert.Equal(1, countForestBefore);

                Assert.Equal(0, countBearAfter);
                Assert.Equal(0, countForestAfter);
            }
        }
        public void NullableDateTimeOrderByMaster()
        {
            ActODataService(args =>
            {
                ExternalLangDef.LanguageDef.DataService = args.DataService;
                NullableDateTime dt1 = (NullableDateTime) new DateTime(2017, 11, 21);
                NullableDateTime dt2 = (NullableDateTime) new DateTime(2017, 10, 21);
                NullableDateTime dt3 = (NullableDateTime) new DateTime(2017, 09, 21);
                NullableDateTime dt4 = (NullableDateTime) new DateTime(2017, 08, 21);
                Лес лес1             = new Лес {
                    Название = "Еловый", ДатаПоследнегоОсмотра = dt1
                };
                Лес лес2 = new Лес {
                    Название = "Сосновый", ДатаПоследнегоОсмотра = dt2
                };
                Лес лес3 = new Лес {
                    Название = "Смешанный", ДатаПоследнегоОсмотра = dt3
                };
                Лес лес4 = new Лес {
                    Название = "Березовый", ДатаПоследнегоОсмотра = dt4
                };
                Медведь медведь1 = new Медведь {
                    Пол = tПол.Мужской, ЛесОбитания = лес1
                };
                Медведь медведь2 = new Медведь {
                    Пол = tПол.Женский, ЛесОбитания = лес2
                };
                Медведь медведь3 = new Медведь {
                    Пол = tПол.Мужской, ЛесОбитания = лес3
                };
                Медведь медведь4 = new Медведь {
                    Пол = tПол.Женский, ЛесОбитания = лес4
                };

                var objs = new DataObject[] { медведь1, медведь2, медведь3, медведь4 };
                args.DataService.UpdateObjects(ref objs);

                string requestUrl;

                // Проверка использования в фильтрации перечислений.
                requestUrl = "http://localhost/odata/Медведьs?$expand=ЛесОбитания($select=ДатаПоследнегоОсмотра)&$orderby=ЛесОбитания/ДатаПоследнегоОсмотра desc";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(4, ((ArrayList)receivedDict["value"]).Count);

                    NullableDateTime[] expectedValues = { dt1, dt2, dt3, dt4 };

                    for (int i = 0; i < expectedValues.Length; i++)
                    {
                        var медведь = ((ArrayList)receivedDict["value"])[i];
                        var лес     = ((Dictionary <string, object>)медведь)["ЛесОбитания"];
                        Assert.Equal(expectedValues[i], (NullableDateTime) new DateTimeOffset(DateTime.Parse((string)((Dictionary <string, object>)лес)["ДатаПоследнегоОсмотра"])).UtcDateTime);
                    }
                }
            });
        }
Пример #24
0
        public void TestODataMasterFieldOrderby()
        {
            foreach (IDataService dataService in DataServices)
            {
                //ICSSoft.STORMNET.Windows.Forms.ExternalLangDef.LanguageDef.DataService = dataService;
                if (dataService is MSSQLDataService)
                {
                    continue;
                }
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = Пол.Мужской, ЛесОбитания = лес1
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = Пол.Мужской, ЛесОбитания = лес1
                };
                Медведь медв3 = new Медведь {
                    Вес = 148, Пол = Пол.Мужской, ЛесОбитания = лес2
                };
                медв.ЛесОбитания = лес1;
                var берлога1 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new ICSSoft.STORMNET.DataObject[] { медв, медв2, медв3, берлога2, берлога1, берлога3, лес1, лес2 };
                var ds   = (SQLDataService)dataService;
                ds.UpdateObjects(ref objs);
                var expr0 = ds.Query <Медведь>(Медведь.Views.МедведьE).Where(
                    x => x.ЛесОбитания.Название == "Бор");

                var expr1 = ds.Query <Медведь>(Медведь.Views.МедведьE).OrderBy(x => x.ЛесОбитания.Название);
                var lcs1  = LinqToLcs.GetLcs(expr1.Expression, Медведь.Views.МедведьE);
                lcs1.View         = Медведь.Views.МедведьE;
                lcs1.LoadingTypes = new Type[] { typeof(Медведь) };
                var l1    = dataService.LoadObjects(lcs1);
                var expr2 = ds.Query <Медведь>(Медведь.Views.МедведьE).OrderByDescending(x => x.ЛесОбитания.Название);
                var lcs2  = LinqToLcs.GetLcs(expr2.Expression, Медведь.Views.МедведьE);
                lcs2.View         = Медведь.Views.МедведьE;
                lcs2.LoadingTypes = new Type[] { typeof(Медведь) };
                var l2 = dataService.LoadObjects(lcs2);

                var lcs3 = new LoadingCustomizationStruct(null);
                lcs3.View         = Медведь.Views.МедведьE;
                lcs3.LoadingTypes = new Type[] { typeof(Медведь) };
                lcs3.ColumnsSort  = new[] { new ColumnsSortDef(Information.ExtractPropertyPath <Медведь>(c => c.ЛесОбитания.Название) /*new ColumnsSortDef("ЛесОбитания.Название"*/, ICSSoft.STORMNET.Business.SortOrder.Asc) };
                var l3 = dataService.LoadObjects(lcs3);


                var lcs4 = new LoadingCustomizationStruct(null);
                lcs4.View         = Медведь.Views.МедведьE;
                lcs4.LoadingTypes = new Type[] { typeof(Медведь) };
                lcs4.ColumnsSort  = new[] { new ColumnsSortDef(Information.ExtractPropertyPath <Медведь>(c => c.ЛесОбитания.Название) /*new ColumnsSortDef("ЛесОбитания.Название"*/, ICSSoft.STORMNET.Business.SortOrder.Desc) };
                var l4 = dataService.LoadObjects(lcs4);
            }
        }
        public void MasterFieldsOrderBy()
        {
            ActODataService(args =>
            {
                ExternalLangDef.LanguageDef.DataService = args.DataService;
                Страна страна1 = new Страна {
                    Название = "Россия"
                };
                Страна страна2 = new Страна {
                    Название = "Белоруссия"
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                Медведь медвПапа1 = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес1, ПорядковыйНомер = 1, Вес = 200, Пол = tПол.Мужской
                };
                медвПапа1.СтранаРождения = страна1;
                Медведь медвПапа2        = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес1, ПорядковыйНомер = 2, Вес = 150, Пол = tПол.Мужской
                };
                Медведь медвМама1 = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес2, ПорядковыйНомер = 3, Вес = 120, Пол = tПол.Женский
                };
                Медведь медвМама2 = new Медведь {
                    СтранаРождения = страна1, ЛесОбитания = лес2, ПорядковыйНомер = 3, Вес = 110, Пол = tПол.Женский
                };
                Медведь медвежонок1 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа1, Мама = медвМама1, Вес = 48, Пол = tПол.Мужской
                };
                Медведь медвежонок2 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа2, Мама = медвМама1, Вес = 22, Пол = tПол.Мужской
                };
                Медведь медвежонок3 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа1, Мама = медвМама2, Вес = 58, Пол = tПол.Мужской
                };
                Медведь медвежонок4 = new Медведь {
                    СтранаРождения = страна2, ЛесОбитания = лес2, Папа = медвПапа2, Мама = медвМама2, Вес = 62, Пол = tПол.Мужской
                };
                var objs = new DataObject[] { страна1, страна2, медвМама1, медвМама2, медвПапа1, медвПапа2, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                objs = new DataObject[] { медвежонок1, медвежонок2, медвежонок3, медвежонок4 };
                args.DataService.UpdateObjects(ref objs);

                string requestUrl;
                // Проверка использования в фильтрации перечислений.
                requestUrl = "http://localhost/odata/Медведьs?$filter=Папа ne null&$expand=Папа,Мама&$orderby=Мама/Вес desc,Папа/Вес desc";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(4, ((ArrayList)receivedDict["value"]).Count);

                    int[] expectedValues = { 48, 22, 58, 62 };

                    for (int i = 0; i < expectedValues.Length; i++)
                    {
                        var медведь = ((ArrayList)receivedDict["value"])[i];
                        Assert.Equal(expectedValues[i], (int)((Dictionary <string, object>)медведь)["Вес"]);
                    }
                }

                requestUrl = "http://localhost/odata/Медведьs?$filter=Папа ne null&$expand=Папа,Мама&$orderby=Мама/Вес desc,Папа/Вес";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(4, ((ArrayList)receivedDict["value"]).Count);

                    int[] expectedValues = { 22, 48, 62, 58 };

                    for (int i = 0; i < expectedValues.Length; i++)
                    {
                        var медведь = ((ArrayList)receivedDict["value"])[i];
                        Assert.Equal(expectedValues[i], (int)((Dictionary <string, object>)медведь)["Вес"]);
                    }
                }
            });
        }
        public void BeforeSaveDeleteObjectTest()
        {
            ActODataService(args =>
            {
                args.Token.Events.CallbackBeforeCreate = BeforeCreate;
                args.Token.Events.CallbackBeforeUpdate = BeforeUpdate;
                args.Token.Events.CallbackBeforeDelete = BeforeDelete;

                // ------------------ Удаление простого объекта -----------------------------
                // Создаем объект данных, который потом будем удалять, и добавляем в базу обычным сервисом данных.
                Медведь медв = new Медведь {
                    Пол = tПол.Мужской, Вес = 80, ПорядковыйНомер = 1
                };
                args.DataService.UpdateObject(медв);

                // Формируем URL запроса к OData-сервису (с идентификатором удаляемой сущности).
                string requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name, ((ICSSoft.STORMNET.KeyGen.KeyGuid)медв.__PrimaryKey).Guid.ToString());

                ParamObj = null;

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.DeleteAsync(requestUrl).Result)
                {
                    Assert.NotNull(ParamObj);

                    // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок удаления).
                    Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);

                    // Проверяем что объект данных был удален из базы.
                    bool exists         = true;
                    Медведь deletedМедв = new Медведь {
                        __PrimaryKey = медв.__PrimaryKey
                    };
                    try
                    {
                        args.DataService.LoadObject(deletedМедв);
                    }
                    catch (Exception ex)
                    {
                        if (ex is CantFindDataObjectException)
                        {
                            exists = false;
                        }
                    }

                    Assert.False(exists);
                }

                // ------------------ Удаление детейла и объекта с детейлами -----------------------------
                // Создаем объект данных, который потом будем удалять, и добавляем в базу обычным сервисом данных.
                медв = new Медведь {
                    Пол = tПол.Мужской, Вес = 80, ПорядковыйНомер = 1
                };
                медв.Берлога.Add(new Берлога {
                    Наименование = "Берлога для хорошего настроения"
                });
                медв.Берлога.Add(new Берлога {
                    Наименование = "Берлога для плохого настроения"
                });
                Берлога delБерлога = new Берлога {
                    Наименование = "Отдельно удаляемая берлога"
                };
                медв.Берлога.Add(delБерлога);
                args.DataService.UpdateObject(медв);

                // Проверяем что до вызова удалений в базе есть все детейлы.
                var ldef = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef;
                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), Берлога.Views.БерлогаE);
                lcs.LoadingTypes = new[] { typeof(Берлога) };
                ICSSoft.STORMNET.DataObject[] dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(3, dobjs.Length);

                // Формируем URL запроса к OData-сервису для удаления объекта-детейла (с идентификатором удаляемой сущности).
                requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(Берлога)).Name, ((ICSSoft.STORMNET.KeyGen.KeyGuid)delБерлога.__PrimaryKey).Guid.ToString());

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.DeleteAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок удаления).
                    Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);

                    // Проверяем что объект-детейл был удален из базы.
                    bool exists            = true;
                    Берлога deletedБерлога = new Берлога {
                        __PrimaryKey = delБерлога.__PrimaryKey
                    };
                    try
                    {
                        args.DataService.LoadObject(deletedБерлога);
                    }
                    catch (Exception ex)
                    {
                        if (ex is CantFindDataObjectException)
                        {
                            exists = false;
                        }
                    }

                    Assert.False(exists);

                    // Проверяем что объект-агрегатор остался в базе.
                    exists = true;
                    Медведь deletedМедв = new Медведь {
                        __PrimaryKey = медв.__PrimaryKey
                    };
                    try
                    {
                        args.DataService.LoadObject(deletedМедв);
                    }
                    catch (Exception ex)
                    {
                        if (ex is CantFindDataObjectException)
                        {
                            exists = false;
                        }
                    }

                    Assert.True(exists);

                    // Проверяем что детейлов объекта в базе осталось на 1 меньше, чем создавали.
                    dobjs = args.DataService.LoadObjects(lcs);

                    Assert.Equal(2, dobjs.Length);
                }

                // Формируем URL запроса к OData-сервису (с идентификатором удаляемой сущности).
                requestUrl = string.Format("http://localhost/odata/{0}({1})", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name, ((ICSSoft.STORMNET.KeyGen.KeyGuid)медв.__PrimaryKey).Guid.ToString());

                // Обращаемся к OData-сервису для удаления объекта с детейлами и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.DeleteAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно (тело ответа д.б. пустым при отсутствии ошибок удаления).
                    Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);

                    // Проверяем что объект данных был удален из базы.
                    bool exists         = true;
                    Медведь deletedМедв = new Медведь {
                        __PrimaryKey = медв.__PrimaryKey
                    };
                    try
                    {
                        args.DataService.LoadObject(deletedМедв);
                    }
                    catch (Exception ex)
                    {
                        if (ex is CantFindDataObjectException)
                        {
                            exists = false;
                        }
                    }

                    Assert.False(exists);

                    // Проверяем что детейлов объекта в базе не осталось.
                    dobjs = args.DataService.LoadObjects(lcs);

                    Assert.Equal(0, dobjs.Length);
                }
            });
        }
        public void TestFilterAnyAll()
        {
            ActODataService(args =>
            {
                ExternalLangDef.LanguageDef.DataService = args.DataService;

                DateTime date = new DateTimeOffset(DateTime.Now).UtcDateTime;
                КлассСМножествомТипов класс = new КлассСМножествомТипов()
                {
                    PropertyEnum = Цифра.Семь, PropertyDateTime = date
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                Блоха блоха = new Блоха()
                {
                    Кличка = "1", МедведьОбитания = медв
                };
                var objs = new DataObject[] { класс, медв, медв2, берлога2, берлога1, берлога3, лес1, лес2, блоха };
                args.DataService.UpdateObjects(ref objs);
                string requestUrl;

                // Проверка использования в фильтрации функции any.
                requestUrl = "http://localhost/odata/Медведьs?$expand=Берлога&$filter=Берлога/any(f:f/Наименование eq 'Для хорошего настроения')";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(2, ((ArrayList)receivedDict["value"]).Count);
                }

                // Проверка использования в фильтрации функции all.
                requestUrl = $"http://localhost/odata/Медведьs?$filter=Берлога/all(f:f/Наименование eq 'Для хорошего настроения')";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }
            });
        }
        public void BeforeSavePostComplexObjectTest()
        {
            // TODO: переписать тест с корректным формированием параметра - передаваемой сущности - для Post.
            // Объекты для тестирования создания.
            Медведь медв = new Медведь {
                Вес = 48
            };
            Лес лес1 = new Лес {
                Название = "Бор"
            };
            Лес лес2 = new Лес {
                Название = "Березовая роща"
            };

            медв.ЛесОбитания = лес1;
            var берлога1 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };
            var берлога2 = new Берлога {
                Наименование = "Для плохого настроения", ЛесРасположения = лес2
            };

            медв.Берлога.Add(берлога1);
            медв.Берлога.Add(берлога2);

            // Объекты для тестирования создания с обновлением.
            Медведь медвежонок = new Медведь {
                Вес = 12
            };
            var берлога3 = new Берлога {
                Наименование = "Для хорошего настроения", ЛесРасположения = лес1
            };

            медвежонок.Берлога.Add(берлога3);

            ActODataService(args =>
            {
                args.Token.Events.CallbackBeforeCreate = BeforeCreate;
                args.Token.Events.CallbackBeforeUpdate = BeforeUpdate;
                args.Token.Events.CallbackBeforeDelete = BeforeDelete;

                // ------------------ Только создания объектов ------------------
                // Подготовка тестовых данных в формате OData.
                var controller = new Controllers.DataObjectController(args.DataService, args.Token.Model, args.Token.Events, args.Token.Functions);
                System.Web.OData.EdmEntityObject edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Медведь)), медв, 1, null);
                var edmЛес1 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес1, 1, null);
                var edmЛес2 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Лес)), лес2, 1, null);
                edmObj.TrySetPropertyValue("ЛесОбитания", edmЛес1);
                var coll = controller.GetEdmCollection(медв.Берлога, typeof(Берлога), 1, null);
                edmObj.TrySetPropertyValue("Берлога", coll);
                System.Web.OData.EdmEntityObject edmБерлога1 = (System.Web.OData.EdmEntityObject)coll[0]; // controller.GetEdmObject(args.ODataService.Model.GetEdmEntityType(typeof(Берлога)), берлога1, 1, null);
                System.Web.OData.EdmEntityObject edmБерлога2 = (System.Web.OData.EdmEntityObject)coll[1]; // controller.GetEdmObject(args.ODataService.Model.GetEdmEntityType(typeof(Берлога)), берлога2, 1, null);
                edmБерлога1.TrySetPropertyValue("ЛесРасположения", edmЛес1);
                edmБерлога2.TrySetPropertyValue("ЛесРасположения", edmЛес2);

                // Формируем URL запроса к OData-сервису.
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Медведь)).Name);

                ParamObj = null;

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                HttpResponseMessage response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;
                Assert.NotNull(ParamObj);

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                // Получим строку с ответом.
                string receivedJsonObjs = response.Content.ReadAsStringAsync().Result.Beautify();

                // В ответе приходит объект с созданной сущностью.
                // Преобразуем полученный объект в словарь.
                Dictionary <string, object> receivedObjs = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedJsonObjs);

                // Проверяем созданный объект, вычитав с помощью DataService
                DataObject createdObj = new Медведь {
                    __PrimaryKey = медв.__PrimaryKey
                };
                args.DataService.LoadObject(createdObj);

                Assert.Equal(ObjectStatus.UnAltered, createdObj.GetStatus());
                Assert.Equal(((Медведь)createdObj).Вес, receivedObjs["Вес"]);

                // Проверяем что созданы все зависимые объекты, вычитав с помощью DataService
                var ldef         = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef;
                var lcs          = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), "ЛесE");
                lcs.LoadingTypes = new[] { typeof(Лес) };
                var dobjs        = args.DataService.LoadObjects(lcs);

                Assert.Equal(2, dobjs.Length);

                lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), "БерлогаE");
                lcs.LoadingTypes = new[] { typeof(Берлога) };

                // lcs.LimitFunction = ldef.GetFunction(ldef.funcEQ, new VariableDef(ldef.GuidType, SQLWhereLanguageDef.StormMainObjectKey), keyValue);
                dobjs = args.DataService.LoadObjects(lcs);
                Assert.Equal(2, dobjs.Length);

                // ------------------ Создание объекта и обновление связанных ------------------
                // Создаем нового медведя: в его мастере ЛесОбитания - лес1, но в нём изменим Название; в детейлы заберем от первого медведя  детейл2, изменив Название в мастере детейла.
                // Подготовка тестовых данных в формате OData.
                edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Медведь)), медвежонок, 1, null);
                edmObj.TrySetPropertyValue("ЛесОбитания", edmЛес1);
                edmЛес1.TrySetPropertyValue("Название", лес1.Название + "(обновл)");
                edmЛес2.TrySetPropertyValue("Название", лес2.Название + "(обновл)");
                медв.Берлога.Remove(берлога2);
                медвежонок.Берлога.Add(берлога2);
                coll = controller.GetEdmCollection(медвежонок.Берлога, typeof(Берлога), 1, null);
                edmObj.TrySetPropertyValue("Берлога", coll);
                edmБерлога1 = (System.Web.OData.EdmEntityObject)coll[0];
                edmБерлога2 = (System.Web.OData.EdmEntityObject)coll[1];
                edmБерлога1.TrySetPropertyValue("ЛесРасположения", edmЛес2);
                edmБерлога2.TrySetPropertyValue("ЛесРасположения", edmЛес1);

                ParamObj = null;

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;
                Assert.NotNull(ParamObj);

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                // Проверяем созданный объект, вычитав с помощью DataService
                createdObj = new Медведь {
                    __PrimaryKey = медвежонок.__PrimaryKey
                };
                args.DataService.LoadObject(createdObj);

                Assert.Equal(ObjectStatus.UnAltered, createdObj.GetStatus());
                Assert.Equal(12, ((Медведь)createdObj).Вес);

                // Проверяем что созданы все зависимые объекты, вычитав с помощью DataService
                ldef              = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef;
                lcs               = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), "ЛесE");
                lcs.LoadingTypes  = new[] { typeof(Лес) };
                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.StormMainObjectKey),
                    лес1.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(1, dobjs.Length);
                Assert.True(((Лес)dobjs[0]).Название.EndsWith("(обновл)"));

                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.StormMainObjectKey),
                    лес2.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(1, dobjs.Length);
                Assert.True(((Лес)dobjs[0]).Название.EndsWith("(обновл)"));

                lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Берлога), "БерлогаE");
                lcs.LoadingTypes  = new[] { typeof(Берлога) };
                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, "Медведь"),
                    медв.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(1, dobjs.Length);

                lcs.LimitFunction = ldef.GetFunction(
                    ldef.funcEQ,
                    new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(ldef.GuidType, "Медведь"),
                    медвежонок.__PrimaryKey);
                dobjs = args.DataService.LoadObjects(lcs);

                Assert.Equal(2, dobjs.Length);

                // Вернем детейл для того, чтобы тест работал со следующими СУБД.
                медвежонок.Берлога.Remove(берлога2);
                медв.Берлога.Add(берлога2);
            });
        }
Пример #29
0
        public void TestFilter()
        {
            ActODataService(args =>
            {
                DateTime date               = new DateTimeOffset(DateTime.Now).UtcDateTime;
                string prevDate             = $"{date.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                string nextDate             = $"{date.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ss")}%2B05:00";
                КлассСМножествомТипов класс = new КлассСМножествомТипов()
                {
                    PropertyEnum = Цифра.Семь, PropertyDateTime = date
                };
                Медведь медв = new Медведь {
                    Вес = 48, Пол = tПол.Мужской
                };
                Медведь медв2 = new Медведь {
                    Вес = 148, Пол = tПол.Мужской
                };
                Лес лес1 = new Лес {
                    Название = "Бор"
                };
                Лес лес2 = new Лес {
                    Название = "Березовая роща"
                };
                медв.ЛесОбитания = лес1;
                var берлога1     = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                var берлога2 = new Берлога {
                    Наименование = "Для плохого настроения", ЛесРасположения = лес2
                };
                var берлога3 = new Берлога {
                    Наименование = "Для хорошего настроения", ЛесРасположения = лес1
                };
                медв.Берлога.Add(берлога1);
                медв.Берлога.Add(берлога2);
                медв2.Берлога.Add(берлога3);
                var objs = new DataObject[] { класс, медв, медв2, берлога2, берлога1, берлога3, лес1, лес2 };
                args.DataService.UpdateObjects(ref objs);
                string requestUrl;

                // Проверка использования в фильтрации перечислений.
                requestUrl = "http://localhost/odata/Медведьs?$filter=Пол eq NewPlatform.Flexberry.ORM.ODataService.Tests.tПол'Мужской'";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(2, ((ArrayList)receivedDict["value"]).Count);
                }

                // Проверка использования в фильтрации DateTime.
                requestUrl = $"http://localhost/odata/КлассСМножествомТиповs?$filter=(PropertyDateTime gt {prevDate}) and (PropertyDateTime lt {nextDate})";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }

                // Проверка использования в фильтрации поля __PrimaryKey.
                string strGuid = ((ICSSoft.STORMNET.KeyGen.KeyGuid)медв.__PrimaryKey).Guid.ToString("D");
                requestUrl     = $"http://localhost/odata/Медведьs?$filter=__PrimaryKey eq {strGuid}";

                // Обращаемся к OData-сервису и обрабатываем ответ.
                using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    // Получим строку с ответом.
                    string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify();

                    // Преобразуем полученный объект в словарь.
                    Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedStr);

                    Assert.Equal(1, ((ArrayList)receivedDict["value"]).Count);
                }
            });
        }