feat: diff parser with multiple outputs in one case

This commit is contained in:
张泊明518370910136 2024-09-11 07:06:11 -04:00
parent eac7a62ebe
commit 52491478a4
GPG Key ID: D47306D7062CDA9D
5 changed files with 32 additions and 33 deletions

@ -1 +1 @@
Subproject commit 2593e79505a93042d308c5fc355dba671dd4fdba Subproject commit 4e5fab93e5a0ce67c8f40fef1e8f4cab7018fc5d

@ -1 +1 @@
Subproject commit 638e9f661092d39daaf6e1ffc8ba5998fc56c96a Subproject commit 1512cb5f20473a598d7504a08dacff3d6406b983

@ -1 +1 @@
Subproject commit d8d66fb5b47b5e79e08532da31d397a5d461f087 Subproject commit af990327ab095c22a383448ad70d915f8d10490b

@ -1 +1 @@
Subproject commit fc774118794a5c5ec0b88863ba6c8492e5b13f89 Subproject commit ac7a2fc912fb51af156cd4babb7e72148ebe1c14

View File

@ -20,9 +20,12 @@ const (
type Conf struct { type Conf struct {
Cases []struct { Cases []struct {
Score int Outputs []struct {
StdoutPath string Score int
IgnoreWhitespace bool FileName string
AnswerPath string
IgnoreWhitespace bool
}
} }
} }
@ -43,35 +46,31 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) (
for i, caseConf := range conf.Cases { for i, caseConf := range conf.Cases {
result := results[i] result := results[i]
score := 0 score := 0
var comment string comment := ""
for _, output := range caseConf.Outputs {
answer, err := os.ReadFile(output.AnswerPath)
if err != nil {
return nil, true, err
}
stdout, err := os.ReadFile(caseConf.StdoutPath) // If no difference, assign score
if err != nil { if compareChars(string(answer), result.Files[output.FileName], output.IgnoreWhitespace) {
return nil, true, err score += output.Score
} } else {
// Convert answer to string and split by lines
stdoutLines := strings.Split(string(answer), "\n")
resultLines := strings.Split(result.Files[output.FileName], "\n")
comment = fmt.Sprintf( // Generate Myers diff
"executor status: run time: %d ns, memory: %d bytes\n", diffOps := myersDiff(stdoutLines, resultLines)
result.RunTime, result.Memory,
)
// If no difference, assign score // Generate diff block with surrounding context
if compareChars(string(stdout), result.Files["stdout"], caseConf.IgnoreWhitespace) { diffOutput := generateDiffWithContext(stdoutLines, resultLines, diffOps)
score = caseConf.Score comment += fmt.Sprintf(
} else { "difference found in %s:\n```diff\n%s```\n",
// Convert stdout to string and split by lines output.FileName, diffOutput,
stdoutLines := strings.Split(string(stdout), "\n") )
resultLines := strings.Split(result.Files["stdout"], "\n") }
// Generate Myers diff
diffOps := myersDiff(stdoutLines, resultLines)
// Generate diff block with surrounding context
diffOutput := generateDiffWithContext(stdoutLines, resultLines, diffOps)
comment += fmt.Sprintf(
"difference found:\n```diff\n%s```",
diffOutput,
)
} }
res = append(res, stage.ParserResult{ res = append(res, stage.ParserResult{