package programchecker

import (
	"strings"
	"testing"
)

func TestDiagnosticsReportErrorStateAndSummary(t *testing.T) {
	diags := Diagnostics{
		{Code: "metadata_program.future_hint", Severity: SeverityWarning, Reference: "optional"},
		{Code: "metadata_program.missing_field", Severity: SeverityError, Reference: "ProgramNode.Title"},
		{Severity: SeverityError, Message: "assignment type mismatch"},
	}

	if !diags.HasErrors() {
		t.Fatal("HasErrors = false, want true")
	}
	errors := diags.ErrorDiagnostics()
	if len(errors) != 2 {
		t.Fatalf("ErrorDiagnostics len = %d, want 2", len(errors))
	}
	got := diags.Error()
	for _, want := range []string{"metadata_program.missing_field", "ProgramNode.Title", "1 more"} {
		if !strings.Contains(got, want) {
			t.Fatalf("Error() = %q, want substring %q", got, want)
		}
	}
}

func TestDiagnosticsWithoutErrorsDoNotImplementSpuriousError(t *testing.T) {
	diags := Diagnostics{{Code: "metadata_program.future_hint", Severity: SeverityWarning}}

	if diags.HasErrors() {
		t.Fatal("HasErrors = true, want false")
	}
	if got := diags.Error(); got != "" {
		t.Fatalf("Error() = %q, want empty", got)
	}
}

func TestDiagnosticsHasReaderErrors(t *testing.T) {
	if (Diagnostics{{Code: "metadata_program.missing_field"}}).HasReaderErrors() {
		t.Fatal("authored metadata diagnostic classified as a reader failure")
	}
	if !(Diagnostics{{Code: DiagnosticCodeReaderError}}).HasReaderErrors() {
		t.Fatal("reader failure was not classified as operational")
	}
}
