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); } }
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()); }
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')."); } } }
/// <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 }); }
/// <summary> /// Initializes an instance of <see cref="ExcludeNone"/>. /// </summary> public ExcludeNone() { Specification = new MatchAll<Type>(); }