Compare commits

..

No commits in common. "c218c9306926547beef90181fc099a88224cb34a" and "1ab6fa4583c2040d5b26b9294957b97094155280" have entirely different histories.

View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
"unicode" "unicode"
"github.com/criyle/go-judge/envexec"
"github.com/joint-online-judge/JOJ3/internal/stage" "github.com/joint-online-judge/JOJ3/internal/stage"
) )
@ -23,13 +24,13 @@ type Conf struct {
PassComment string `default:"🥳Passed!\n"` PassComment string `default:"🥳Passed!\n"`
FailComment string `default:"🧐Failed...\n"` FailComment string `default:"🧐Failed...\n"`
Cases []struct { Cases []struct {
Outputs []struct { IgnoreResultStatus bool
Score int Outputs []struct {
FileName string Score int
AnswerPath string FileName string
CompareSpace bool AnswerPath string
AlwaysHide bool CompareSpace bool
ForceQuitOnDiff bool AlwaysHide bool
} }
} }
} }
@ -53,46 +54,51 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) (
result := results[i] result := results[i]
score := 0 score := 0
comment := "" comment := ""
for _, output := range caseConf.Outputs { if !caseConf.IgnoreResultStatus &&
answer, err := os.ReadFile(output.AnswerPath) result.Status != stage.Status(envexec.StatusAccepted) {
if err != nil { forceQuit = true
return nil, true, err comment += fmt.Sprintf(
} "Unexpected executor status: %s.", result.Status,
slog.Debug("compare", "filename", output.FileName, )
"answer path", output.AnswerPath, } else {
"actual", result.Files[output.FileName], for _, output := range caseConf.Outputs {
"answer", string(answer)) answer, err := os.ReadFile(output.AnswerPath)
// If no difference, assign score if err != nil {
if compareChars(string(answer), result.Files[output.FileName], return nil, true, err
output.CompareSpace) {
score += output.Score
comment += conf.PassComment
} else {
if output.ForceQuitOnDiff {
forceQuit = true
} }
comment += conf.FailComment slog.Debug("compare", "filename", output.FileName,
comment += fmt.Sprintf("Difference found in `%s`.\n", "answer path", output.AnswerPath,
output.FileName) "actual", result.Files[output.FileName],
if !output.AlwaysHide { "answer", string(answer))
// Convert answer to string and split by lines // If no difference, assign score
stdoutLines := strings.Split(string(answer), "\n") if compareChars(string(answer), result.Files[output.FileName],
resultLines := strings.Split( output.CompareSpace) {
result.Files[output.FileName], "\n") score += output.Score
comment += conf.PassComment
// Generate Myers diff
diffOps := myersDiff(stdoutLines, resultLines)
// Generate diff block with surrounding context
diffOutput := generateDiffWithContext(
stdoutLines, resultLines, diffOps)
diffOutput = strings.TrimSuffix(diffOutput, "\n \n")
comment += fmt.Sprintf(
"```diff\n%s\n```\n",
diffOutput,
)
} else { } else {
comment += "(Content hidden.)\n" comment += conf.FailComment
comment += fmt.Sprintf("Difference found in `%s`.\n",
output.FileName)
if !output.AlwaysHide {
// Convert answer to string and split by lines
stdoutLines := strings.Split(string(answer), "\n")
resultLines := strings.Split(
result.Files[output.FileName], "\n")
// Generate Myers diff
diffOps := myersDiff(stdoutLines, resultLines)
// Generate diff block with surrounding context
diffOutput := generateDiffWithContext(
stdoutLines, resultLines, diffOps)
diffOutput = strings.TrimSuffix(diffOutput, "\n \n")
comment += fmt.Sprintf(
"```diff\n%s\n```\n",
diffOutput,
)
} else {
comment += "(Content hidden.)\n"
}
} }
} }
} }