package seqlog import ( "errors" "testing" ) func TestErrorTypes(t *testing.T) { t.Run("TopicError", func(t *testing.T) { err := NewTopicError("app", "write", ErrNotFound) if err.Error() != "topic app: write: not found" { t.Errorf("unexpected error message: %v", err) } // 测试 Unwrap if !errors.Is(err, ErrNotFound) { t.Error("expected ErrNotFound") } // 测试 errors.As var topicErr *TopicError if !errors.As(err, &topicErr) { t.Error("expected TopicError") } if topicErr.Topic != "app" { t.Errorf("expected topic 'app', got '%s'", topicErr.Topic) } }) t.Run("FileError", func(t *testing.T) { err := NewFileError("/path/to/file", "open", errors.New("permission denied")) if err.Error() != "file /path/to/file: open: permission denied" { t.Errorf("unexpected error message: %v", err) } }) t.Run("IndexError", func(t *testing.T) { err := NewIndexError(100, 50) if err.Error() != "index 100 out of range [0, 50): invalid index or range" { t.Errorf("unexpected error message: %v", err) } // 测试 errors.Is if !errors.Is(err, ErrInvalidRange) { t.Error("expected ErrInvalidRange") } // 测试 IsIndexOutOfRange if !IsIndexOutOfRange(err) { t.Error("expected IsIndexOutOfRange to return true") } }) t.Run("ValidationError", func(t *testing.T) { err := NewValidationError("count", "must be greater than 0", ErrInvalidCount) if err.Error() != "validation error: count: must be greater than 0: count must be greater than 0" { t.Errorf("unexpected error message: %v", err) } // 测试 errors.Is if !errors.Is(err, ErrInvalidCount) { t.Error("expected ErrInvalidCount") } }) t.Run("IsTopicNotFound", func(t *testing.T) { err := NewTopicError("app", "get", ErrNotFound) if !IsTopicNotFound(err) { t.Error("expected IsTopicNotFound to return true") } // 测试其他错误 if IsTopicNotFound(ErrInvalidCount) { t.Error("expected IsTopicNotFound to return false for ErrInvalidCount") } }) t.Run("IsCRCMismatch", func(t *testing.T) { if !IsCRCMismatch(ErrCRCMismatch) { t.Error("expected IsCRCMismatch to return true") } // 测试其他错误 if IsCRCMismatch(ErrNotFound) { t.Error("expected IsCRCMismatch to return false for ErrNotFound") } }) t.Run("SentinelErrors", func(t *testing.T) { // 测试所有哨兵错误都不为 nil sentinelErrors := []error{ ErrNilParameter, ErrInvalidCount, ErrInvalidRange, ErrAlreadyRunning, ErrNotRunning, ErrAlreadyRegistered, ErrNotFound, ErrCRCMismatch, ErrInvalidUUID, ErrInvalidConfig, } for _, err := range sentinelErrors { if err == nil { t.Error("sentinel error should not be nil") } if err.Error() == "" { t.Error("sentinel error should have a message") } } }) }