Inheritance: MonoBehaviour
Ejemplo n.º 1
0
        public void Generate_Category_Specific_Dish_Count()
        {
            //Arrange
            Mock <IDishRepository> mock = new Mock <IDishRepository>();

            mock.Setup(m => m.Dishes).Returns(new List <Dish>
            {
                new Dish {
                    DishId = 1, Name = "Dish1", Category = "Drink"
                },
                new Dish {
                    DishId = 2, Name = "Dish2", Category = "Food"
                },
                new Dish {
                    DishId = 3, Name = "Dish3", Category = "Food"
                },
                new Dish {
                    DishId = 4, Name = "Dish4", Category = "Drink"
                },
                new Dish {
                    DishId = 5, Name = "Dish5", Category = "Food"
                }
            });
            DishController controler = new DishController(mock.Object);

            //Act
            int res1   = ((DishesListViewModel)controler.List("Drink").Model).PagingInfo.TotalItems;
            int res2   = ((DishesListViewModel)controler.List("Food").Model).PagingInfo.TotalItems;
            int resAll = ((DishesListViewModel)controler.List(null).Model).PagingInfo.TotalItems;

            //Assert
            Assert.AreEqual(res1, 2);
            Assert.AreEqual(res2, 3);
            Assert.AreEqual(resAll, 5);
        }
Ejemplo n.º 2
0
        public void Start()
        {
            if (RotationTrasform != null && RotationTransform == null)
            {
                RotationTransform = RotationTrasform;
            }
            rotTransform = gameObject.transform.FindRecursive(RotationTransform);
            elTransform  = gameObject.transform.FindRecursive(ElevationTransform);

            if (rotTransform == null)
            {
                Log.Normal("DishAnimate: Rotations Transform not found");
                Destroy(this);
            }

            if (elTransform == null)
            {
                Log.Normal("DishAnimate: Elevation Transform not found");
                Destroy(this);
            }

            if (!float.TryParse(MaxSpeed, out speedMax))
            {
                Log.UserWarning("Cannot parse MaxSpeed: " + MaxSpeed);
            }

            if (!float.TryParse(FakeTimeWarp, out timeWarpFake))
            {
                Log.UserWarning("Cannot parse FakeTimeWarp: " + FakeTimeWarp);
            }

            if (!float.TryParse(MaxElevation, out maxElevation))
            {
                Log.UserWarning("Cannot parse MaxElevation: " + MaxElevation);
            }

            if (!float.TryParse(MinElevation, out minElevation))
            {
                Log.UserWarning("Cannot parse MinElevation: " + MinElevation);
            }


            dish = new DishController.Dish();

            dish.elevationTransform = elTransform;
            //dish.elevationInit = new Quaternion();
            dish.rotationTransform = rotTransform;
            //dish.rotationInit = new Quaternion();


            controller         = gameObject.AddComponent <DishController>();
            controller.dishes  = new DishController.Dish[] { dish };
            controller.enabled = true;

            controller.fakeTimeWarp = timeWarpFake;
            controller.maxSpeed     = speedMax;

            controller.maxElevation = maxElevation;
            controller.minElevation = minElevation;
        }
Ejemplo n.º 3
0
        public async Task Details_ReturnsDishDetail()
        {
            // Arrange
            var dishId = 1;

            var mockLogger            = new Mock <ILogger <DishController> >();
            var mockIngredientService = new IngredientService(_context);
            var mockDishService       = new DishService(_context);

            var controller = new DishController(_context, mockLogger.Object, mockIngredientService, mockDishService);

            // Act
            var result = await controller.Details(dishId);

            // Assert
            var viewResult = Assert.IsType <ViewResult>(result);

            Assert.Null(viewResult.ViewName);

            Assert.NotNull(viewResult.ViewData);
            var viewModel = Assert.IsType <Dish>(viewResult.ViewData.Model);

            Assert.NotNull(viewModel.Category);
            var category = _context.Categories.SingleOrDefault(g => g.CategoryId == viewModel.CategoryId);

            Assert.NotNull(category);
        }
Ejemplo n.º 4
0
        public DishTests()
        {
            AutoMapperConfiguration.Configure();
            UnityConfig.RegisterComponents();

            var mockDishRepository = new Mock <IDishRepository>();

            mockDishRepository.Setup(x => x.CreateQuery()).Returns(DishData.CreateQuery);
            mockDishRepository.Setup(x => x.Get(1)).Returns(DishData.Get);
            mockDishRepository.Setup(x => x.Update(DishData.Get())).Callback(() => edited = true);

            var mockDishTagRepository = new Mock <IDishTagRepository>();

            var mockTagRepository = new Mock <ITagRepository>();

            mockTagRepository.Setup(m => m.CreateQuery()).Returns(TagData.CreateQuery);

            var mockTagService = new Mock <ITagService>();

            var mockUserRepository = new Mock <IUserRepository>();

            mockUserRepository.Setup(m => m.Get(1)).Returns(new User {
                UserName = "******"
            });

            dishService    = new DishService(mockDishRepository.Object, mockDishTagRepository.Object, mockTagRepository.Object, mockTagService.Object);
            dishController = new DishController(dishService);
        }
Ejemplo n.º 5
0
        public void Can_Retrieve_Image_Data()
        {
            // Arrange
            Dish dish = new Dish
            {
                DishId        = 2,
                Name          = "dish2",
                ImageData     = new byte[] { },
                ImageMimeType = "image/png"
            };

            Mock <IDishRepository> mock = new Mock <IDishRepository>();

            mock.Setup(m => m.Dishes).Returns(new List <Dish>
            {
                new Dish {
                    DishId = 1, Name = "dish1"
                },
                dish,
                new Dish {
                    DishId = 3, Name = "dish2"
                }
            }.AsQueryable());

            DishController controller = new DishController(mock.Object);

            // Act
            ActionResult result = controller.GetImage(2);

            // Asserts
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(FileResult));
            Assert.AreEqual(dish.ImageMimeType, ((FileResult)result).ContentType);
        }
        public DishControllerTest()
        {
            SetAutoMapper();

            _service    = new DishServiceTest(_mapper);
            _controller = new DishController(_service);
            _validator  = new DishValidator();
        }
Ejemplo n.º 7
0
        public void HTTPGet()
        {
            var controller = new DishController(_logger, _irequestDishes);

            var response = controller.Get("morning, 1, 3, 2, 3");

            Assert.AreEqual(1, response.Count());
        }
Ejemplo n.º 8
0
        public void PagingTest()
        {
            // Arrange
            // Макет репозитория
            var mock = new Mock <IRepository <Dish> >();

            mock.Setup(r => r.GetAll())
            .Returns(new List <Dish>
            {
                new Dish {
                    DishId = 1
                },
                new Dish {
                    DishId = 2
                },
                new Dish {
                    DishId = 3
                },
                new Dish {
                    DishId = 4
                },
                new Dish {
                    DishId = 5
                },
            });
            // Создание объекта контроллера
            var controller = new DishController(mock.Object);

            // Макеты для получения HttpContext и HttpRequest
            var request     = new Mock <HttpRequestBase>();
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(h => h.Request).Returns(request.Object);

            // Создание контекста контроллера
            controller.ControllerContext             = new ControllerContext();
            controller.ControllerContext.HttpContext = httpContext.Object;

            NameValueCollection valueCollection = new NameValueCollection();

            valueCollection.Add("X-Requsted-With", "XMLHttpRequest");
            valueCollection.Add("Accept", "application/json");
            // другой вариант: valueCollection.Add("Accept", "HTML");
            request.Setup(r => r.Headers).Returns(valueCollection);

            // Act
            // Вызов метода List
            var view = controller.List(null, 2) as ViewResult;

            // Assert
            Assert.IsNotNull(view, "Представление не получено");
            Assert.IsNotNull(view.Model, "Модель не получена");
            PageListViewModel <Dish> model = view.Model as PageListViewModel <Dish>;

            Assert.AreEqual(2, model.Count);
            Assert.AreEqual(4, model[0].DishId);
            Assert.AreEqual(5, model[1].DishId);
        }
        public void CategoryTest()
        {
            //Arrange
            //Макет репозитория
            var mock = new Mock <IRepository <Dish> >();

            mock.Setup(r => r.GetAll()).Returns(new List <Dish> {
                new Dish {
                    DishID = 1, GroupName = "1"
                },
                new Dish {
                    DishID = 2, GroupName = "2"
                },
                new Dish {
                    DishID = 3, GroupName = "1"
                },
                new Dish {
                    DishID = 4, GroupName = "2"
                },
                new Dish {
                    DishID = 5, GroupName = "2"
                },
            });
            //Создание объекта контроллера
            var controller = new DishController(mock.Object);

            //Макеты для получения HttpContext HttpRequest
            var request     = new Mock <HttpRequestBase>();
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(h => h.Request).Returns(request.Object);

            //Создание контекста контроллера
            controller.ControllerContext             = new ControllerContext();
            controller.ControllerContext.HttpContext = httpContext.Object;

            //Act
            //Вызов метода List
            var view = controller.List("1", 1) as ViewResult;

            //Assert
            Assert.IsNotNull(view, "Представление не получено");
            Assert.IsNotNull(view.Model, "Модель не получена");
            PageListViewModel <Dish> model = view.Model as PageListViewModel <Dish>;

            Assert.AreEqual(2, model.Count);
            Assert.AreEqual(1, model[0].DishID);
            Assert.AreEqual(3, model[1].DishID);
        }
Ejemplo n.º 10
0
        public async Task DishControllerAddAndGetTest()
        {
            //Arrange
            var options = new DbContextOptionsBuilder <MainContext>()
                          .UseInMemoryDatabase(databaseName: "MockDB")
                          .Options;
            var context    = new MainContext(options);
            var repository = new ItemRepository <Dish>(context);
            var controller = new DishController(repository);
            var dish       = new Dish();
            //Act
            await controller.Post(dish);

            var items = await controller.Get();

            //Asert
            //3 seeded in MainContext constructor and 1 I attached here, total 4
            items.Count.Should().Be(4);
        }
        public void Index_ReturnsNewDish_WhenNotDishId([Frozen] IMealService mealService)
        {
            //Arrange

            var mealMock       = Mock.Get(mealService);
            var dishController = new DishController(mealMock.Object);

            //Act

            var sut = dishController.Index(null);

            //Assert

            sut.Should().BeAssignableTo <IActionResult>().And.BeOfType <ViewResult>()
            .Which.Model.Should().NotBeNull().And.BeOfType <Dish>();


            mealMock.Verify();
        }
        public void Save_ReturnsViewWithModelStateError_WhenSaveDishWithoutName([Frozen] IMealService mealService, [Frozen] Dish dish)
        {
            //Arrange
            dish.Name = "";

            var mealMock       = Mock.Get(mealService);
            var dishController = new DishController(mealMock.Object);

            dishController.ModelState.AddModelError("Name", "Required");

            //Act

            var sut = dishController.Save(dish);


            //Assert

            sut.Should().BeAssignableTo <IActionResult>().And.BeOfType <ViewResult>()
            .Which.ViewData.ModelState["Name"].Errors.Should().HaveCount(1);
        }
Ejemplo n.º 13
0
        public async Task Returns_correct_dishes()
        {
            //Arrange
            var mockLogger            = new Mock <ILogger <DishController> >();
            var mockIngredientService = new IngredientService(_context);
            var mockDishService       = new DishService(_context);


            var controller = new DishController(_context, mockLogger.Object, mockIngredientService, mockDishService);

            //Act
            var result = await controller.Index();

            //Assert
            var viewResult = Assert.IsType <ViewResult>(result);
            var model      = Assert.IsAssignableFrom <IEnumerable <Dish> >(
                viewResult.ViewData.Model);

            Assert.Equal(3, model.Count());
        }
        public void Save_ReturnsToIndexWithDish_WhenSaveExistingDish([Frozen] IMealService mealService, [Frozen] Dish dish)
        {
            //Arrange

            var mealMock = Mock.Get(mealService);

            mealMock.Setup(m => m.UpdateDish(dish)).Verifiable();
            var dishController = new DishController(mealMock.Object);

            //Act

            var sut = dishController.Save(dish);

            //Assert
            sut.Should().BeOfType <RedirectToActionResult>().Which.ActionName.Should().Be("Index");
            sut.Should().BeAssignableTo <IActionResult>().And.BeOfType <RedirectToActionResult>()
            .Which.RouteValues.Should().NotBeNull().And.ContainValue(dish.Id);


            mealMock.Verify();
        }
        public void Index_ReturnsExistingDish_WhenPassExistingDishId([Frozen] IMealService mealService, [Frozen] Dish dish)
        {
            //Arrange

            var mealMock = Mock.Get(mealService);

            mealMock.Setup(m => m.GetDish(dish.Id)).Returns(dish).Verifiable();
            var dishController = new DishController(mealMock.Object);

            //Act

            var sut = dishController.Index(dish.Id);

            //Assert

            sut.Should().BeAssignableTo <IActionResult>().And.BeOfType <ViewResult>()
            .Which.Model.Should().NotBeNull().And.BeOfType <Dish>()
            .Which.Should().BeSameAs(dish);

            mealMock.Verify();
        }
Ejemplo n.º 16
0
        public void Cannot_Retrieve_Image_Data_For_Invalid_ID()
        {
            // Arrange
            Mock <IDishRepository> mock = new Mock <IDishRepository>();

            mock.Setup(m => m.Dishes).Returns(new List <Dish> {
                new Dish {
                    DishId = 1, Name = "dish1"
                },
                new Dish {
                    DishId = 2, Name = "dish2"
                }
            }.AsQueryable());

            DishController controller = new DishController(mock.Object);

            // Act
            ActionResult result = controller.GetImage(10);

            // Asserts
            Assert.IsNull(result);
        }
Ejemplo n.º 17
0
        public void Can_Send_Pagination_View_Model()
        {
            // Arrange
            Mock <IDishRepository> mock = new Mock <IDishRepository>();

            mock.Setup(m => m.Dishes).Returns(new List <Dish>
            {
                new Dish {
                    DishId = 1, Name = "Dish1"
                },
                new Dish {
                    DishId = 2, Name = "Dish2"
                },
                new Dish {
                    DishId = 3, Name = "Dish3"
                },
                new Dish {
                    DishId = 4, Name = "Dish4"
                },
                new Dish {
                    DishId = 5, Name = "Dish5"
                }
            });
            DishController controller = new DishController(mock.Object);

            controller.pageSize = 3;

            // Act
            DishesListViewModel result = (DishesListViewModel)controller.List(null, 2).Model;

            // Assert
            PagingInfo pageInfo = result.PagingInfo;

            Assert.AreEqual(pageInfo.CurrentPage, 2);
            Assert.AreEqual(pageInfo.ItemsPerPage, 3);
            Assert.AreEqual(pageInfo.TotalItems, 5);
            Assert.AreEqual(pageInfo.TotalPages, 2);
        }
Ejemplo n.º 18
0
        public void Can_Filter_Category()
        {
            //Arrange
            Mock <IDishRepository> mock = new Mock <IDishRepository>();

            mock.Setup(m => m.Dishes).Returns(new List <Dish>
            {
                new Dish {
                    DishId = 1, Name = "Dish1", Category = "Drink"
                },
                new Dish {
                    DishId = 2, Name = "Dish2", Category = "Food"
                },
                new Dish {
                    DishId = 3, Name = "Dish3", Category = "Food"
                },
                new Dish {
                    DishId = 4, Name = "Dish4", Category = "Drink"
                },
                new Dish {
                    DishId = 5, Name = "Dish5", Category = "Food"
                }
            });

            DishController controler = new DishController(mock.Object);

            //Act
            DishesListViewModel result = (DishesListViewModel)controler.List("Drink").Model;

            //Assert
            List <Dish> dishes = result.Dishes.ToList();

            Assert.AreEqual(result.CurrentCategory, "Drink");
            Assert.AreEqual(dishes.Count, 2);
            Assert.IsTrue(dishes[0].Name == "Dish1" && dishes[0].Category == "Drink");
            Assert.IsTrue(dishes[1].Name == "Dish4" && dishes[1].Category == "Drink");
        }
Ejemplo n.º 19
0
        public void Can_Paginate()
        {
            // Arrange
            Mock <IDishRepository> mock = new Mock <IDishRepository>();

            mock.Setup(m => m.Dishes).Returns(new List <Dish>
            {
                new Dish {
                    DishId = 1, Name = "Dish1"
                },
                new Dish {
                    DishId = 2, Name = "Dish2"
                },
                new Dish {
                    DishId = 3, Name = "Dish3"
                },
                new Dish {
                    DishId = 4, Name = "Dish4"
                },
                new Dish {
                    DishId = 5, Name = "Dish5"
                }
            });
            DishController controller = new DishController(mock.Object);

            controller.pageSize = 3;

            // Act
            DishesListViewModel result = (DishesListViewModel)controller.List(null, 2).Model;

            // Asserts
            List <Dish> dishes = result.Dishes.ToList();

            Assert.IsTrue(dishes.Count == 2);
            Assert.AreEqual(dishes[0].Name, "Dish4");
            Assert.AreEqual(dishes[1].Name, "Dish5");
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Removes some unneeded behaviours from squad models and sets up the Destructibles
        /// </summary>
        internal static void MangleSquadStatic(StaticInstance instance)
        {
            GameObject gameObject = instance.mesh;

            //Log.Normal("Called for:" + instance.gameObject.name);

            foreach (var component in gameObject.GetComponentsInChildren <MonoBehaviour>(true))
            {
                if (behavioursToRemove.Contains(component.GetType()))
                {
                    //Log.Normal("Removed: " + component.GetType().ToString());
                    UnityEngine.Object.DestroyImmediate(component);
                }
            }

            //instance.gameObject.tag = String.Empty;

            //foreach (Transform transform in gameObject.transform.GetComponentsInChildren<Transform>(true))
            //{
            //    //transform.gameObject.tag = String.Empty;
            //    if (transform.name.Equals("wreck", StringComparison.InvariantCultureIgnoreCase))
            //    {
            //        transform.parent = null;
            //        GameObject.Destroy(transform.gameObject);
            //    }

            //    //if (transform.name.Equals("commnetnode", StringComparison.InvariantCultureIgnoreCase))
            //    //{
            //    //    transform.parent = null;
            //    //    GameObject.Destroy(transform.gameObject);
            //    //}
            //}
            int counter = 0;

            foreach (var component in gameObject.GetComponentsInChildren <DestructibleBuilding>(true))
            {
                component.id            = instance.UUID + "_" + counter;
                component.preCompiledId = true;
                instance.destructible   = component;
                //Log.Normal("registering destructible: " + component.id);
                counter++;
            }


            TimeOfDayAnimation dotAnim = gameObject.AddComponent <TimeOfDayAnimation>();

            dotAnim.emissives = new List <TimeOfDayAnimation.MaterialProperty>();
            foreach (var renderer in gameObject.GetComponentsInChildren <Renderer>(true))
            {
                foreach (Material mat in renderer.materials)
                {
                    // Log.Normal("found Material: " + gameObject.name +" " +  mat.name);
                    foreach (string matname in materialPropertyNames)
                    {
                        if (mat.name.Contains(matname))
                        //if (mat.name.Contains(matname) && mat.HasProperty(dotPoperty))
                        {
                            //Log.Normal("added Materialproperty to: " + gameObject.name + " "+ mat.name);

                            TimeOfDayAnimation.MaterialProperty mp = new TimeOfDayAnimation.MaterialProperty();
                            mp.material     = mat;
                            mp.propertyName = dotPoperty;
                            mp.isDirty      = true;
                            dotAnim.emissives.Add(mp);
                            break;
                        }
                    }
                }
            }
            dotAnim.emissiveTgtColor      = dotColor;
            dotAnim.emissiveColorProperty = dotPoperty;
            dotAnim.emissivesCurve        = dotAnimationCurve;
            dotAnim.enabled = true;

            // Lv3 Tracking Dish Animation
            if (instance.model.name == "SQUAD_LV3_Tracking_Dish")
            {
                DishController controller = gameObject.AddComponent <DishController>();

                controller.fakeTimeWarp = 1f;
                controller.maxSpeed     = 2 / instance.ModelScale;
                controller.maxElevation = 90f;
                controller.minElevation = 5f;

                DishController.Dish dish = new DishController.Dish();
                dish.rotationTransform  = gameObject.transform.FindRecursive("Lower Assembly");
                dish.elevationTransform = gameObject.transform.FindRecursive("Satellite Dish");
                controller.dishes       = new DishController.Dish[] { dish };
                controller.enabled      = true;
            }

            if (instance.model.name == "KSC_FuelTank")
            {
                //Log.Normal("Fixing KSC Fuel Tank");
                GameObject oldGameObject = instance.mesh;
                GameObject newBaseObject = new GameObject(instance.model.name);
                oldGameObject.transform.parent           = newBaseObject.transform;
                oldGameObject.transform.localEulerAngles = new Vector3(270, 0, 0);
                instance.mesh = newBaseObject;
            }
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Removes the wreck model from an KSC Object.
        /// </summary>
        internal static void MangleSquadStatic(StaticInstance instance)
        {
            GameObject gameObject = instance.gameObject;

            gameObject.transform.parent = null;
            foreach (var component in gameObject.GetComponentsInChildren <MonoBehaviour>(true))
            {
                if (behavioursToRemove.Contains(component.GetType()))
                {
                    //     Log.Normal("Removed: " + bla.GetType().ToString());
                    UnityEngine.Object.Destroy(component);
                }
            }


            var transforms = gameObject.transform.GetComponentsInChildren <Transform>(true);

            foreach (var transform in transforms)
            {
                if (transform.name.Equals("wreck", StringComparison.InvariantCultureIgnoreCase))
                {
                    transform.parent = null;
                    GameObject.Destroy(transform.gameObject);
                }

                //if (transform.name.Equals("commnetnode", StringComparison.InvariantCultureIgnoreCase))
                //{
                //    transform.parent = null;
                //    GameObject.Destroy(transform.gameObject);
                //}
            }

            TimeOfDayAnimation dotAnim = gameObject.AddComponent <TimeOfDayAnimation>();

            dotAnim.emissives = new List <TimeOfDayAnimation.MaterialProperty>();
            foreach (var renderer in gameObject.GetComponentsInChildren <Renderer>(true))
            {
                foreach (Material mat in renderer.materials)
                {
                    // Log.Normal("found Material: " + gameObject.name +" " +  mat.name);
                    foreach (string matname in materialPropertyNames)
                    {
                        if (mat.name.Contains(matname) && mat.HasProperty(dotPoperty))
                        {
                            //Log.Normal("added Materialproperty to: " + gameObject.name + " "+ mat.name);

                            TimeOfDayAnimation.MaterialProperty mp = new TimeOfDayAnimation.MaterialProperty();
                            mp.material     = mat;
                            mp.propertyName = dotPoperty;
                            mp.isDirty      = true;
                            dotAnim.emissives.Add(mp);
                            break;
                        }
                    }
                }
            }
            dotAnim.emissiveTgtColor      = dotColor;
            dotAnim.emissiveColorProperty = dotPoperty;
            dotAnim.emissivesCurve        = dotAnimationCurve;
            dotAnim.enabled = true;

            // Lv3 Tracking Dish Animation
            if (instance.model.name == "SQUAD_LV3_Tracking_Dish")
            {
                DishController controller = gameObject.AddComponent <DishController>();

                controller.fakeTimeWarp = 1f;
                controller.maxSpeed     = 2 / instance.ModelScale;
                controller.maxElevation = 90f;
                controller.minElevation = 5f;

                DishController.Dish dish = new DishController.Dish();
                dish.rotationTransform  = gameObject.transform.FindRecursive("Lower Assembly");
                dish.elevationTransform = gameObject.transform.FindRecursive("Satellite Dish");
                controller.dishes       = new DishController.Dish[] { dish };
                controller.enabled      = true;
            }


            //if (instance.model.name == "KSC_Runway_level_2")
            //{
            //    SquadStatics.PimpLv2Runway(instance.gameObject);
            //}
        }
Ejemplo n.º 22
0
        public static void MangleTrackingDishes()
        {
            // StrackingStation LV1
            //
            StaticModel model = StaticDatabase.GetModelByName("KSC_TrackingStation_level_1");
            List <DishController.Dish> dishes = new List <DishController.Dish>();

            DishController controller = model.prefab.AddComponent <DishController>();

            controller.fakeTimeWarp = 1f;
            controller.maxSpeed     = 10f;
            controller.maxElevation = 20f;
            controller.minElevation = -70f;

            foreach (Transform dishTransform in model.prefab.transform.FindAllRecursive("TS_dish"))
            {
                Log.Normal("Dish: Found Dish");
                DishController.Dish dish = new DishController.Dish();

                dish.elevationTransform = dishTransform.FindRecursive("dish_antenna");
                //dish.elevationInit = new Quaternion();
                dish.rotationTransform = dishTransform.FindRecursive("dish_support");

                dish.elevationTransform.parent = dish.rotationTransform;

                dishes.Add(dish);
            }
            controller.dishes  = dishes.ToArray();
            controller.enabled = true;


            // StrackingStation LV2
            //
            model = StaticDatabase.GetModelByName("KSC_TrackingStation_level_2");
            dishes.Clear();

            controller = model.prefab.AddComponent <DishController>();

            controller.fakeTimeWarp = 1f;
            controller.maxSpeed     = 10f;
            controller.maxElevation = 20f;
            controller.minElevation = -70f;

            foreach (Transform dishTransform in model.prefab.transform.FindAllRecursive("TS_dish"))
            {
                Log.Normal("Dish: Found Dish");
                DishController.Dish dish = new DishController.Dish();

                dish.elevationTransform = dishTransform.FindRecursive("dish_antenna");
                //dish.elevationInit = new Quaternion();
                dish.rotationTransform = dishTransform.FindRecursive("dish_support");

                dish.elevationTransform.parent = dish.rotationTransform;

                dishes.Add(dish);
            }
            controller.dishes  = dishes.ToArray();
            controller.enabled = true;


            // Extract LV3 Dish as Extra Dish
            model = StaticDatabase.GetModelByName("KSC_TrackingStation_level_3");

            Transform   dishNorth = model.prefab.transform.FindRecursive("dish_north");
            string      modelName = "SQUAD_LV3_Tracking_Dish";
            StaticModel dishModel = new StaticModel();

            dishModel.prefab = dishNorth.gameObject;
            // dishModel.prefab.transform.parent = null;
            dishModel.name         = modelName;
            dishModel.path         = "KerbalKonstructs/" + modelName;
            dishModel.configPath   = model.path + ".cfg";
            dishModel.keepConvex   = true;
            dishModel.title        = "TrackingStation Lv3 Dish";
            dishModel.mesh         = modelName;
            dishModel.category     = "Dish";
            dishModel.author       = "Squad";
            dishModel.manufacturer = "Squad";
            dishModel.description  = "Squad original TrackingStation Lv3 Dish";

            dishModel.isSquad = true;

            StaticDatabase.RegisterModel(dishModel, dishModel.name);
        }