```csharp title="C#" using Kreuzberg; using Xunit; public class CustomValidatorTests { [Fact] public void TestValidatorRegistration() { var validator = new TestValidator(); ValidatorRegistry.Register(validator); var validators = KreuzbergLib.ListValidators(); Assert.Contains("test-validator", validators); } [Fact] public void TestValidatorProcessing() { var result = new ExtractionResult { Content = "Test content with some length", MimeType = "text/plain" }; var config = new ExtractionConfig(); var validator = new TestValidator(); validator.Initialize(); Assert.True(validator.ShouldValidate(result, config)); validator.Validate(result, config); validator.Shutdown(); } } public class TestValidator : IValidator { public string Name => "test-validator"; public string Version => "1.0.0"; public void Initialize() { } public void Shutdown() { } public void Validate(ExtractionResult result, ExtractionConfig config) { if (string.IsNullOrEmpty(result.Content)) { throw new KreuzbergException("Content cannot be empty", 1000); } } public bool ShouldValidate(ExtractionResult result, ExtractionConfig config) { return !string.IsNullOrEmpty(result.Content); } public int Priority() => 50; } ```