public void MatchAllFailsWithPartialCredit()
        {
            using (var context = new GradingContext())
            {
                var problemContext = context.MockProblemContext(100,
                                                                new TokenSpec {
                    Label = "1", Percent = 60, Value = "THREE|TWO|ONE"
                },
                                                                new TokenSpec {
                    Label = "2", Percent = 40, Value = "SIX|FIVE|FOUR"
                }
                                                                );

                var problemFlag = new ProblemFlag
                {
                    Id           = Guid.NewGuid().ToString(),
                    SubmissionId = Guid.NewGuid().ToString(),
                    Tokens       = new string[] { "one is smaller than two is smaller than three", "four is less than five is less than seven" }
                };

                var match = new MatchAll(context.Options, context.Logger, problemContext);

                var grade = match.GradeTokens(problemFlag);

                Assert.False(grade.Success);

                Assert.Equal(60, grade.CorrectPercent);
            }
        }
        public void MatchAllFailsWithIncorrectValues()
        {
            using (var context = new GradingContext())
            {
                var problemContext = context.MockProblemContext(100,
                                                                new TokenSpec {
                    Label = "1", Percent = 50, Value = "THREE|TWO|ONE"
                },
                                                                new TokenSpec {
                    Label = "2", Percent = 50, Value = "SIX|FIVE|FOUR"
                }
                                                                );

                var problemFlag = new ProblemFlag
                {
                    Id           = Guid.NewGuid().ToString(),
                    SubmissionId = Guid.NewGuid().ToString(),
                    Tokens       = new string[] { "one, two, four", "three five six" }
                };

                var match = new MatchAll(context.Options, context.Logger, problemContext);

                var grade = match.GradeTokens(problemFlag);

                Assert.False(grade.Success);
            }
        }
示例#3
0
        public override string ToString()
        {
            StringBuilder parameters = new StringBuilder();

            if (Types.IsAny())
            {
                parameters.Append("Types:");
                parameters.Append(string.Join(",", Types.Select(c => c.ToString()).ToArray())).Append(";");
            }
            parameters.Append("PageNumber:").Append(PageNumber).Append(";");
            parameters.Append("Limit:").Append(Limit).Append(";");
            parameters.Append("MatchAll:").Append(MatchAll.ToString()).Append(";");
            //parameters.Append("UserID:").Append(UserID).Append(";");
            //parameters.Append("StartDate:").Append(StartDate).Append(";");
            //parameters.Append("EndDate:").Append(EndDate).Append(";");
            parameters.Append("AutocompleteFieldName:").Append(AutoCompleteFieldName).Append(";");
            parameters.Append("IndexName:").Append(IndexName).Append(";");
            return(parameters.ToString());
        }
示例#4
0
        private void ValidateString <T>(JToken node, ICollection <string> errorMessages) where T : KongObject
        {
            var value = (string)node;

            if (OneOf.Any())
            {
                var options = OneOf.Select(x => x.Value <string>()).ToArray();
                if (!options.Contains(value))
                {
                    errorMessages.Add($"{Violation<T>()} (field '{node.Path}' should be one of '{string.Join(", ", options)}').");
                }
            }
            if (StartsWith != null)
            {
                if (value == null || !value.StartsWith(StartsWith))
                {
                    errorMessages.Add($"{Violation<T>()} (field '{node.Path}' should start with '{StartsWith}').");
                }
            }
            if (Match != null)
            {
                if (!LuaPattern.IsMatch(value, Match))
                {
                    errorMessages.Add($"{Violation<T>()} (field '{node.Path}' should match lua pattern '{Match}').");
                }
            }
            if (MatchAny != null)
            {
                if (MatchAny.Patterns.All(x => !LuaPattern.IsMatch(value, x)))
                {
                    errorMessages.Add($"{Violation<T>()} (field '{node.Path}' {MatchAny.Error}).");
                }
            }
            if (MatchNone.Any())
            {
                foreach (var fieldCheck in MatchNone)
                {
                    if (LuaPattern.IsMatch(value, fieldCheck.Pattern))
                    {
                        errorMessages.Add($"{Violation<T>()} (field '{node.Path}' {fieldCheck.Error}).");
                    }
                }
            }
            if (MatchAll.Any())
            {
                foreach (var fieldCheck in MatchAll)
                {
                    if (!LuaPattern.IsMatch(value, fieldCheck.Pattern))
                    {
                        errorMessages.Add($"{Violation<T>()} (field '{node.Path}' {fieldCheck.Error}).");
                    }
                }
            }
            if (LenMin.HasValue)
            {
                var len = value?.Length;
                if (len < LenMin)
                {
                    errorMessages.Add($"{Violation<T>()} (field '{node.Path}' should have min length '{LenMin.Value}').");
                }
            }
            if (Uuid)
            {
                if (!Guid.TryParse(value, out _))
                {
                    errorMessages.Add($"{Violation<T>()} (field '{node.Path}' should be a 'uuid').");
                }
            }
        }
示例#5
0
        /// <summary>
        /// Grades a flag submitted for a problem
        /// </summary>
        /// <param name="flag"></param>
        /// <returns></returns>
        public GradedSubmission Grade(ProblemFlag flag)
        {
            ProblemContext context = null;
            GradingResult  result  = null;

            Logger.LogDebug($"grading {flag.Id}");
            var submissionStatus = SubmissionStatus.Submitted;

            try
            {
                context = Data.LoadContext(flag.Id);

                if (context == null || context.Flag == null)
                {
                    throw new NotFoundException();
                }

                if (context.ProblemState.Status == ProblemStatus.Complete)
                {
                    throw new ProblemCompleteException();
                }

                SaveFlag(context, flag);

                IGradingStrategy strategy = null;

                switch (context.Flag.Type)
                {
                case FlagType.MatchOutput:
                    strategy = new MatchOutput(Options, Logger, context);
                    break;

                case FlagType.MatchAll:
                    strategy = new MatchAll(Options, Logger, context);
                    break;

                case FlagType.MatchAny:
                    strategy = new MatchAny(Options, Logger, context);
                    break;

                case FlagType.Match:
                    strategy = new Match(Options, Logger, context);
                    break;

                case FlagType.MatchAlphaNumeric:
                default:
                    strategy = new MatchAlphaNumeric(Options, Logger, context);
                    break;
                }

                result = strategy.GradeTokens(flag);
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Had a problem with grading");
            }
            finally
            {
                if (context != null && result != null)
                {
                    submissionStatus = result.Success ? SubmissionStatus.Passed : SubmissionStatus.Failed;

                    var check = false;

                    // if max submissions <= 0 then we accept
                    // unlimited submissions if unsuccessful
                    if (context.Problem.Settings.MaxSubmissions > 0)
                    {
                        if (context.Spec.IsMultiStage)
                        {
                            // if multi stage we only consider the
                            // last graded token incorrect count
                            check = result.GradedTokens.Last().Status != TokenStatusType.Correct &&
                                    flag.Count >= context.Problem.Settings.MaxSubmissions;
                        }
                        else
                        {
                            check = flag.Count >= context.Problem.Settings.MaxSubmissions;
                        }
                    }

                    var isFinal = result.Success || check;

                    if (isFinal)
                    {
                        //_ = Mojo.Stop(flag.Id);

                        context.ProblemState.End = DateTime.UtcNow;
                        //context.ProblemState.GamespaceReady = false;
                        context.ProblemState.Status = result.Success ? ProblemStatus.Success : ProblemStatus.Failure;
                    }

                    context.ProblemState.Percent = result.CorrectPercent;

                    // map TokenSpec detail along with correct answers
                    var problemStateTokens = new List <Token>();

                    int index = 0;
                    foreach (var tokenSpec in context.Flag.Tokens)
                    {
                        var correct = result.GradedTokens.SingleOrDefault(t => t.Index == index && t.Status == TokenStatusType.Correct);

                        problemStateTokens.Add(new Token
                        {
                            Index     = index,
                            Label     = tokenSpec.Label,
                            Percent   = context.Flag.Tokens.Length == 1 ? 100 : tokenSpec.Percent,
                            Status    = correct?.Status ?? TokenStatusType.Pending,
                            Timestamp = correct?.Timestamp,
                            Value     = correct?.Value
                        });

                        index++;
                    }

                    context.ProblemState.Tokens = problemStateTokens;

                    Data.SaveContext(context);
                }
            }

            Logger.LogDebug($"returning {flag.Id}");

            return(new GradedSubmission
            {
                ProblemId = flag.Id,
                SubmissionId = flag.SubmissionId,
                Status = submissionStatus,
                State = context?.ProblemState,
                Timestamp = DateTime.UtcNow,
                Tokens = result?.GradedTokens
            });
        }
示例#6
0
 /// <summary>
 /// Initializes an instance of <see cref="ExcludeNone"/>.
 /// </summary>
 public ExcludeNone()
 {
     Specification = new MatchAll<Type>();
 }