All checks were successful
go-test / go test (push) Successful in 56s
- Add dsl/matcher_test.go covering ExactMatcher, ContainsMatcher,
RegexMatcher, NumericEpsMatcher, AnyOrderMatcher and NoMatcher —
previously 0% — including epsilon, count mismatch, unparsable
numbers, invalid regex, and splitLines edge cases.
- Add dsl/ast_test.go for the new Test.SetInputFile / SetStdin /
SetOutputFile / SetStdout helpers and Pattern.IsDirMode.
- Add dsl/build_string_test.go covering BuildProfile.String,
WarningLevel.String and BuildConfig.MergeFrom (wrapper, defines
into nil map, defines override existing, nil src).
- Add dsl/merge_test.go driving mergeFiles to 100%: legacy build
fields, duplicate toolchain/build/group from include, binary /
sources / normalize_crlf / trim_trailing_ws propagation, local
overrides of timeout and memory_limit.
- Add dsl/parser_features_test.go for parseTest / parseGroup happy
paths that were missing: file/outFile, env, wrapper, per-test
timeout/memory overrides, non-zero exitCode, scoring partial /
all_or_none and unknown scoring.
- Add dsl/parser_errors_test.go, a 54-case table-driven test that
hits every `expect(...)` error branch in parseGroup and parseTest
(missing LPAREN/RPAREN/LBRACE/RBRACE/ASSIGN, wrong token types on
weight/timeout/memory_limit/scoring/env/wrapper/file/outFile, and
unclosed blocks).
- Add dsl/parser_misc_test.go covering parsePattern dir-mode with
args, unknown pattern field, non-ident in pattern, top-level
binary / sources / normalize_crlf / trim_trailing_ws / bare-int
memory_limit, parseBool invalid ident and non-ident, matcher
without an operator, validateBuilds legacy+structured conflict.
- Add dsl/build_parser_test.go covering every BuildConfig field
(sources, includes, sanitize, link, extra, platforms, compilers,
defines), OS overrides on named builds, nested / duplicate OS
override errors, unknown build / profile / warnings / platform,
missing = on assign-string and assign-string-list, define(...)
error cases, and parseToolchainsBlock (duplicate name, missing
platforms, bad name token, unknown field, unknown compiler class,
binary and class propagation).
- Add dsl/lexer_test.go for Token.String, TokenType.String UNKNOWN
branch, line comments, unterminated string and heredoc, unknown
escape sequence, escape decoding, unexpected character, every
K/M/G/KiB/MiB/GiB size suffix, ms/s/m duration suffixes, negative
integer lexing and float literals.
- Extend runner/result_test.go with Status.String and
TestResult.addFailure (both previously 0%).
- Add .gitea/workflows/go-test.yml running `go vet` and
`go test -race -coverprofile=coverage.out ./...` on push,
pull_request and manual dispatch, uploading coverage.out as an
artifact.
Coverage: dsl 60.5% -> 85%+, runner 29.0% -> 30.5%.
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package runner
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestStatusString(t *testing.T) {
|
|
cases := []struct {
|
|
s Status
|
|
want string
|
|
}{
|
|
{StatusPass, "PASS"},
|
|
{StatusFail, "FAIL"},
|
|
{StatusTLE, "TLE"},
|
|
{StatusMLE, "MLE"},
|
|
{StatusBuildError, "BUILD_ERROR"},
|
|
{StatusRuntimeError, "RE"},
|
|
{Status(999), "UNKNOWN"},
|
|
}
|
|
for _, c := range cases {
|
|
if got := c.s.String(); got != c.want {
|
|
t.Errorf("Status(%d).String() = %q, want %q", c.s, got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAddFailureAppends(t *testing.T) {
|
|
r := &TestResult{}
|
|
r.addFailure("first %s", "msg")
|
|
r.addFailure("second %d", 2)
|
|
if len(r.Failures) != 2 {
|
|
t.Fatalf("Failures len = %d, want 2", len(r.Failures))
|
|
}
|
|
if r.Failures[0] != "first msg" {
|
|
t.Errorf("Failures[0] = %q", r.Failures[0])
|
|
}
|
|
if !strings.Contains(r.Failures[1], "second 2") {
|
|
t.Errorf("Failures[1] = %q", r.Failures[1])
|
|
}
|
|
}
|
|
|
|
func TestAggregateScoreEmpty(t *testing.T) {
|
|
r := &SuiteResult{}
|
|
if got := r.AggregateScore(); got != 0 {
|
|
t.Errorf("empty aggregate = %v, want 0", got)
|
|
}
|
|
}
|
|
|
|
func TestAggregateScoreSingleBuild(t *testing.T) {
|
|
r := &SuiteResult{
|
|
Builds: []*BuildRun{{Name: "release", TotalScore: 0.75}},
|
|
}
|
|
if got := r.AggregateScore(); got != 0.75 {
|
|
t.Errorf("single build aggregate = %v, want 0.75", got)
|
|
}
|
|
}
|
|
|
|
func TestAggregateScoreTakesMinimum(t *testing.T) {
|
|
r := &SuiteResult{
|
|
Builds: []*BuildRun{
|
|
{Name: "release", TotalScore: 1.0},
|
|
{Name: "debug", TotalScore: 0.9},
|
|
{Name: "sanitized", TotalScore: 0.95},
|
|
},
|
|
}
|
|
if got := r.AggregateScore(); got != 0.9 {
|
|
t.Errorf("aggregate = %v, want 0.9 (minimum)", got)
|
|
}
|
|
}
|
|
|
|
func TestAggregateScoreIgnoresSkipped(t *testing.T) {
|
|
r := &SuiteResult{
|
|
Builds: []*BuildRun{
|
|
{Name: "release", TotalScore: 1.0},
|
|
{Name: "sanitized", Skipped: true, SkipReason: "platforms=linux"},
|
|
{Name: "debug", TotalScore: 0.8},
|
|
},
|
|
}
|
|
if got := r.AggregateScore(); got != 0.8 {
|
|
t.Errorf("aggregate with skipped = %v, want 0.8", got)
|
|
}
|
|
}
|
|
|
|
func TestAggregateScoreAllSkipped(t *testing.T) {
|
|
r := &SuiteResult{
|
|
Builds: []*BuildRun{
|
|
{Name: "a", Skipped: true},
|
|
{Name: "b", Skipped: true},
|
|
},
|
|
}
|
|
if got := r.AggregateScore(); got != 1.0 {
|
|
t.Errorf("all-skipped aggregate = %v, want 1.0", got)
|
|
}
|
|
}
|