Ejemplo n.º 1
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="BuildCapability" /> class.
        /// </summary>
        /// <param name="generator">The generator that provides the build functions.</param>
        /// <exception cref="ArgumentNullException">The <paramref name="generator" /> parameter is <c>null</c>.</exception>
        public BuildCapability(IValueGenerator generator)
        {
            generator = generator ?? throw new ArgumentNullException(nameof(generator));

            ImplementedByType = generator.GetType();
            SupportsCreate    = true;

            _createType      = (strategy, type, args) => generator.Generate(strategy, type);
            _createProperty  = (strategy, propertyInfo, args) => generator.Generate(strategy, propertyInfo);
            _createParameter = (strategy, parameterInfo, args) => generator.Generate(strategy, parameterInfo);
            _populate        = (strategy, instance) =>
                               throw new NotSupportedException(
                                         $"{nameof(IValueGenerator)} types do not support populating an instance.");
        }
Ejemplo n.º 2
0
        public object Create(Type type)
        {
            if (CircleDepend.Where(CircleType => CircleType == type).Count() >= 5)
            {
                Console.WriteLine("Circular Dependency");
                return(GetDefaultValue(type));
            }
            CircleDepend.Push(type);
            Faker            faker   = new Faker(Configuration);
            int              seed    = (int)DateTime.Now.Ticks & 0x0000FFFF;
            GeneratorContext Context = new GeneratorContext(new Random(seed), type, faker);


            IValueGenerator generator = FindGenerator(type);

            if (generator != null)
            {
                CircleDepend.Pop();
                return(generator.Generate(Context));
            }

            var obj = CreateObject(type);

            obj = FillObject(obj);
            CircleDepend.Pop();
            return(obj);
        }
Ejemplo n.º 3
0
        private List <Vector2> GenerateInnerPoints(List <Vector2> initialPoints)
        {
            var points = new List <Vector2>(initialPoints);

            var sa          = _prng.Generate() * 2 * Mathf.PI;
            int citySize    = CityLayer.CitySize;
            var pointAmount = _parameters.CellDensity + (2 * citySize) + (int)((1 + _prng.Generate() * 3) * 2f);

            int cnt = 0;

            for (int i = 0; i < pointAmount * 10; i++)
            {
                var a = sa + Mathf.Sqrt(i) * 5;

                var progress     = (float)cnt / (pointAmount - initialPoints.Count);
                var evaluatedVal = 1 + _parameters.PointDistribution.Evaluate(progress);

                var radius = (evaluatedVal + citySize) * _prng.Generate();

                var xr = radius * Mathf.Cos(a);
                var yr = radius * Mathf.Sin(a);

                var p = new Vector2(xr + points[0].x, yr + points[0].y);

                EvaluatePoint(p);

                if (points.Count >= pointAmount)
                {
                    break;
                }
            }
            return(MapPointsToBoundingBox(points));

            void EvaluatePoint(Vector2 p)
            {
                // Check min neighbor point distance
                var closest = p.FindClosestIn(points);

                if (closest.HasValue && Vector2.Distance(closest.Value, p) >= _parameters.MinPointDistance)
                {
                    points.Add(p);
                    cnt++;
                }
            }
        }
Ejemplo n.º 4
0
        private static List <T> CreateOriginalList <T>(IValueGenerator <int> countGenerator, IValueGenerator <T> valueGenerator)
        {
            var count  = countGenerator.Generate();
            var result = new List <T>();

            for (int i = 0; i < count; i++)
            {
                result.Add(valueGenerator.Generate());
            }
            return(result);
        }
Ejemplo n.º 5
0
        private void ClearTest <T>(int testsCount, IValueGenerator <int> countGenerator, IValueGenerator <T> valueGenerator)
        {
            for (int iTest = 0; iTest < testsCount; iTest++)
            {
                var testList = new CommandedList <T>(CreateCommandDispatcher());
                var count    = countGenerator.Generate();
                for (int i = 0; i < count; i++)
                {
                    testList.Add(valueGenerator.Generate());
                }
                testList.Clear();

                Assert.IsFalse(testList.Any());
            }
        }
Ejemplo n.º 6
0
        private void AddTest <T>(int testsCount, IValueGenerator <int> countGenerator, IValueGenerator <T> valueGenerator)
        {
            for (int iTest = 0; iTest < testsCount; iTest++)
            {
                var originalList = new List <T>();
                var testList     = new CommandedList <T>(CreateCommandDispatcher());

                var count = countGenerator.Generate();
                for (int i = 0; i < count; i++)
                {
                    var value = valueGenerator.Generate();
                    originalList.Add(value);
                    testList.Add(value);
                    Assert.IsTrue(originalList.SequenceEqual(testList));
                }
            }
        }
Ejemplo n.º 7
0
        // Генерация значения. Если нет подходящего генератора, то генерируется дефолтное значение (0 или null)
        public object GenerateValue(GeneratorContext context)
        {
            IValueGenerator generator = GetGenerator(context.TargetType);
            object          value;

            if (generator != null)
            {
                value = generator.Generate(context);
            }
            else
            {
                value = GetDefaultValue(context.TargetType);
                Console.WriteLine("Dont have generator for " + context.TargetType.Name);
            }

            return(value);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// <para>Заполнить массив значениями</para>
        /// </summary>
        /// <typeparam name="T">Тип элементов массива</typeparam>
        /// <param name="array">Заполняемый массив</param>
        /// <param name="generator">Генератор значений</param>
        /// <param name="start">Первый элемент массива, с которого начинается заполнение</param>
        /// <param name="count">Количество элементов массива, заменяемых новым значением</param>
        /// <remarks>v.2021.04.18</remarks>
        public static void Fill <T>(this T[] array, IValueGenerator <T> generator, long start = 0, long count = 0)
        {
            #region Check arguments
#if CHECK_ARGS
            _ = array ?? throw new ArgumentNullException(nameof(array));
            _ = generator ?? throw new ArgumentNullException(nameof(generator));

            if ((count < 0) || (count > array.Length))
            {
                throw new ArgumentOutOfRangeException(nameof(count));
            }

            if ((start < 0) || ((start + count) > array.Length))
            {
                throw new ArgumentOutOfRangeException(nameof(start));
            }

            /*
             #else
             *
             *          if ((array is null) ||
             *              (generator is null) ||
             *              (count < 0) || (count > array.Length) ||
             *              (start < 0) || ((start + count) > array.Length))
             *          {
             *              Debug.WriteLine("incorrect call {0}<{1}>(array:{2},generator:{3},start:{4},count:{5})",
             *                  "Darkangel.Arrays.ArrayHelper.Fill",
             *                  typeof(T).FullName,
             *                  (array is null) ? "null" : array.Length.ToString(),
             *                  generator.GetType().FullName,
             *                  start,
             *                  count
             *                  );
             *              return;
             *          }
             */
#endif
            #endregion Check arguments

            var end = (count == 0) ? (array.Length) : (start + count);

            for (var i = start; i < end; i++)
            {
                array[i] = generator.Generate(i);
            }
        }
Ejemplo n.º 9
0
        private void ContainsTest <T>(int testsCount, IValueGenerator <int> countGenerator, IValueGenerator <T> valueGenerator)
        {
            for (int iTest = 0; iTest < testsCount; iTest++)
            {
                var originalList = CreateOriginalList(countGenerator, valueGenerator);
                var testList     = CreateTestListByOriginal(originalList);

                foreach (var item in originalList)
                {
                    Assert.IsTrue(originalList.Contains(item) == testList.Contains(item));
                }

                var count = countGenerator.Generate();
                for (int i = 0; i < count; i++)
                {
                    var value = valueGenerator.Generate();
                    Assert.IsTrue(originalList.Contains(value) == testList.Contains(value));
                }
            }
        }