コード例 #1
0
        /// <summary>
        /// Validate config
        /// </summary>
        /// <param name="filePath">Path to file</param>
        /// <returns>Result of validation, has state and messages <see cref="ValidationResult"/></returns>
        public ValidationResult Validate(string filePath)
        {
            var fileName = filePath.Split('\\').Last();

            CrozzleLogger.InitLog(fileName, false);
            Reset();
            var result = new ValidationResult();

            try
            {
                LoadFile(filePath);
            }
            catch (Exception ex)
            {
                CrozzleLogger.Log(ex.Message);
                result.AddCriticalError(ex.Message);
                return(result);
            }

            foreach (var @string in file)
            {
                if (!_groupsLimitSet)
                {
                    var regEx       = new Regex(Patterns.GROUPS_LIMIT_PATTERN);
                    var resultMatch = regEx.Match(@string);
                    if (!resultMatch.Success)
                    {
                        CrozzleLogger.Log(GROUPS_LIMIT_ERROR_MSG);
                        result.AddConfigError(GROUPS_LIMIT_ERROR_MSG);
                    }
                    _groupsLimitSet = true;
                    continue;
                }

                if (!_pointPerWordSet)
                {
                    var regEx       = new Regex(Patterns.POINTS_PER_WORD_PATTERN);
                    var resultMatch = regEx.Match(@string);
                    if (!resultMatch.Success)
                    {
                        CrozzleLogger.Log(POINT_PER_WORD_ERROR_MSG);
                        result.AddConfigError(POINT_PER_WORD_ERROR_MSG);
                    }
                    _pointPerWordSet = true;
                    continue;
                }

                if (!_intersectingSet)
                {
                    var regEx       = new Regex(Patterns.INTERSECTING_POINT_PATTERN);
                    var resultMatch = regEx.Match(@string);
                    if (!resultMatch.Success)
                    {
                        _letterIndex++;
                        var message =
                            $"ERROR on configuration file validation: INTERSECTING is not match to pattern INTERSECTING:[A-Z]=x where x is positive number, row index is {_letterIndex}";
                        CrozzleLogger.Log(message);
                        result.AddConfigError(message);
                    }
                    else
                    {
                        _letterIndex++;
                    }
                    if (_letterIndex == _letters.Count)
                    {
                        _intersectingSet = true;
                        _letterIndex     = 0;
                        continue;
                    }
                }

                if (!_nonintersectingSet && _intersectingSet)
                {
                    var regEx       = new Regex(Patterns.NONINTERSECTING_POINT_PATTERN);
                    var resultMatch = regEx.Match(@string);
                    if (!resultMatch.Success)
                    {
                        _letterIndex++;
                        var message =
                            $"ERROR on configuration file validation: NONINTERSECTING is not match to pattern NONINTERSECTING:[A-Z]=x where x is positive number, row index is {_letterIndex}";
                        CrozzleLogger.Log(message);
                        result.AddConfigError(message);
                    }
                    else
                    {
                        _letterIndex++;
                    }
                    if (_letterIndex == _letters.Count)
                    {
                        _nonintersectingSet = true;
                        _letterIndex        = 0;
                    }
                }
            }
            CrozzleLogger.EndLog(fileName, false, result.IsValid);
            return(result);
        }
コード例 #2
0
        /// <summary>
        /// Validate file
        /// </summary>
        /// <param name="filePath">Path to file</param>
        /// <returns>Result of validation, has state and messages <see cref="ValidationResult"/></returns>
        public ValidationResult Validate(string filePath)
        {
            var fileName = filePath.Split('\\').Last();

            CrozzleLogger.InitLog(fileName, false);

            Reset();
            var result = new ValidationResult();

            try
            {
                LoadFile(filePath);
            }
            catch (Exception ex)
            {
                result.AddError(ex.Message);
                return(result);
            }

            var maxRows    = 0;
            var maxColumns = 0;

            foreach (var @string in file)
            {
                if (!_headerIsSet)
                {
                    //6 values in string
                    var header = @string.Split(',');
                    var headerDataCountIsOk = header.Length == CROZZLE_HEADER_LENGTH;
                    if (!headerDataCountIsOk)
                    {
                        var message = string.Format(NOT_CORRECT_FORMAT_MSG, "Header(first row)");
                        CrozzleLogger.Log(message);
                        result.AddCriticalError(message);
                        _headerIsSet = true;
                        continue;
                    }

                    //EASY, MEDIUM or HARD
                    var difficulty     = header[0];
                    var difficultyIsOk = difficulty.Equals(EASY_DIFFICULTY_PATTERN) || difficulty.Equals(MEDIUM_DIFFICULTY_PATTERN) ||
                                         difficulty.Equals(HARD_DIFFICULTY_PATTERN);
                    if (!difficultyIsOk)
                    {
                        var message = string.Format(DIFFICULTY_IS_INCORRECT_MSG, EASY_DIFFICULTY_PATTERN, MEDIUM_DIFFICULTY_PATTERN,
                                                    HARD_DIFFICULTY_PATTERN, difficulty);
                        CrozzleLogger.Log(message);
                        result.AddCriticalError(message);
                    }

                    //for all numberics check
                    int tmp;


                    //numerics
                    //number of words
                    var numberOfWords     = header[1];
                    var numberOfWordsIsOk = int.TryParse(numberOfWords, out tmp) && (tmp >= NUMBER_OF_WORDS_MIN || tmp <= NUMBER_OF_WORDS_MAX);
                    if (!numberOfWordsIsOk)
                    {
                        var message = string.Format(NUMBER_IS_INCORRECT_MSG, "words", $"[{NUMBER_OF_WORDS_MIN}..{NUMBER_OF_WORDS_MAX}]", numberOfWords);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    //number of rows
                    var numberOfRows     = header[2];
                    var numberOfRowsIsOk = int.TryParse(numberOfRows, out tmp) && (tmp >= NUMBER_OF_ROWS_MIN || tmp <= NUMBER_OF_ROWS_MAX);
                    maxRows = tmp;
                    if (!numberOfRowsIsOk)
                    {
                        var message = string.Format(NUMBER_IS_INCORRECT_MSG, "rows", $"[{NUMBER_OF_ROWS_MIN}..{NUMBER_OF_ROWS_MAX}]", numberOfRows);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    //number of columns
                    var numberOfColumns     = header[3];
                    var numberOfColumnsIsOk = int.TryParse(numberOfColumns, out tmp) && (tmp >= NUMBER_OF_COLLUMNS_MIN || tmp <= NUMBER_OF_COLLUMNS_MAX);
                    maxColumns = tmp;
                    if (!numberOfColumnsIsOk)
                    {
                        var message = string.Format(NUMBER_IS_INCORRECT_MSG, "columns", $"[{NUMBER_OF_COLLUMNS_MIN}..${NUMBER_OF_COLLUMNS_MAX}]", numberOfColumns);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    //number of horizontal words
                    var numberOfHorizontalWords     = header[4];
                    var numberOfHorizontalWordsIsOk = int.TryParse(numberOfHorizontalWords, out tmp) && tmp > ZERO;
                    if (!numberOfHorizontalWordsIsOk)
                    {
                        var message = string.Format(NUMBER_IS_INCORRECT_MSG2, "horizontal words", numberOfHorizontalWords);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }


                    //number of vertical words
                    var numberOfVerticalWords     = header[5];
                    var numberOfVerticalWordsIsOk = int.TryParse(numberOfVerticalWords, out tmp) && tmp > ZERO;
                    if (!numberOfVerticalWordsIsOk)
                    {
                        var message = string.Format(NUMBER_IS_INCORRECT_MSG2, "vertical words", numberOfVerticalWords);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    _headerIsSet = true;
                    continue;
                }


                if (!_wordsDictionaryIsSet)
                {
                    var wordsList = @string.Split(',');

                    foreach (var word in wordsList)
                    {
                        if (!_words.ContainsKey(word))
                        {
                            _words.Add(word, 0);
                        }
                        _words[word]++;
                    }

                    var allWordsAreUnique = !_words.Any(word => word.Value > 1);
                    if (!allWordsAreUnique)
                    {
                        var notUniqueWordsList = string.Join(",", _words.Where(word => word.Value > 1)
                                                             .Select(word => word.Key));
                        var message = string.Format(NOT_UNIQUE_WORDS_MSG, notUniqueWordsList);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    _wordsDictionaryIsSet = true;
                    continue;
                }

                //check words
                {
                    int tmp;
                    _index++;

                    var wordPreferences     = @string.Split(',');
                    var wordPreferencesIsOk = wordPreferences.Length == ARGUMENT_NUMBER_COUNT;
                    if (!wordPreferencesIsOk)
                    {
                        var message = string.Format(NOT_CORRECT_DATA_MSG, $"one of words preference, row number - {_index}", ARGUMENT_NUMBER_COUNT, wordPreferences.Length);
                        CrozzleLogger.Log(message);
                        result.AddCriticalError(message);
                        continue;
                    }

                    var orientation     = wordPreferences[0];
                    var orientationIsOk = orientation.Equals(HORIZONTAL_ORIENTATION_PATTERN) || orientation.Equals(VERTICAL_ORIENTATION_PATTERN);
                    if (!orientationIsOk)
                    {
                        var message = string.Format(NOT_CORRECT_DATA_MSG, $"orientation preferences, row number - {_index}",
                                                    $"{HORIZONTAL_ORIENTATION_PATTERN} or {VERTICAL_ORIENTATION_PATTERN}", orientation);
                        CrozzleLogger.Log(message);
                        result.AddCriticalError(message);
                    }

                    var rowIndex     = wordPreferences[1];
                    var rowIndexIsOk = int.TryParse(rowIndex, out tmp);
                    var rowInt       = tmp;
                    if (!rowIndexIsOk)
                    {
                        var message = string.Format(NOT_CORRECT_DATA_MSG, $"rows index preferences, row number - {_index}", "integer value", rowIndex);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    if (rowInt > maxRows)
                    {
                        var message = string.Format($"Incorrect data in crozzle preferences, max rows count is {maxRows}, but word index was - {rowInt}");
                        CrozzleLogger.Log(message);
                        result.AddCriticalError(message);
                    }

                    var columnIndex     = wordPreferences[2];
                    var columnIndexIsOk = int.TryParse(columnIndex, out tmp);
                    var columnInt       = tmp;
                    if (!columnIndexIsOk)
                    {
                        var message = string.Format(NOT_CORRECT_DATA_MSG, $"column index preferences, row number - {_index}", "integer value",
                                                    columnIndex);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    if (columnInt > maxColumns)
                    {
                        var message =
                            string.Format($"Incorrect data in crozzle preferences, max columns count is {maxColumns}, but word column index was - {columnInt}");
                        CrozzleLogger.Log(message);
                        result.AddCriticalError(message);
                    }

                    var actualWord     = wordPreferences[3];
                    var regex          = new Regex(WORD_REGEX_PATTERN);
                    var actualWordIsOk = regex.IsMatch(actualWord) && _words.ContainsKey(actualWord);
                    if (!actualWordIsOk)
                    {
                        var message = string.Format(NOT_CORRECT_DATA_MSG, $"words to view, word is not ok, row number - {_index}",
                                                    "word, that contains in dictionary", actualWord);
                        CrozzleLogger.Log(message);
                        result.AddError(message);
                    }

                    if (!_inseredWords.ContainsKey(actualWord))
                    {
                        _inseredWords.Add(actualWord, ZERO);
                    }
                    _inseredWords[actualWord]++;
                }
            }

            if (_inseredWords.Any(word => word.Value > 1))
            {
                var notUniqueWordsList = string.Join(",", _inseredWords.Where(word => word.Value > ISUNIQUE).Select(word => word.Key));
                var message            = string.Format(MULTIPLE_INSERTED_WORDS_MSG, notUniqueWordsList);
                CrozzleLogger.Log(message);
                result.AddError(message);
            }

            CrozzleLogger.EndLog(fileName, false, result.IsValid);

            return(result);
        }