// Copyright (c) 2025-2026 Probo Inc . // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. package validator import ( "testing" "time" ) func BenchmarkValidate_SingleField(b *testing.B) { email := "test@example.com" b.ResetTimer() for i := 0; i < b.N; i++ { v := New() v.Check(&email, "email", Required(), NotEmpty()) } } func BenchmarkValidate_MultipleFields(b *testing.B) { email := "test@example.com" password := "password123" age := 25 b.ResetTimer() for i := 0; i < b.N; i++ { v := New() v.Check(&email, "email", Required(), NotEmpty()) v.Check(&password, "password", Required(), MinLen(8)) v.Check(&age, "age", Min(18), Max(120)) } } func BenchmarkValidate_OptionalField(b *testing.B) { var website *string b.ResetTimer() for i := 0; i < b.N; i++ { v := New() v.Check(website, "website", URL()) } } func BenchmarkURL(b *testing.B) { urlStr := "https://example.com" validator := URL() b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&urlStr) } } func BenchmarkMinLen(b *testing.B) { str := "hello world" validator := MinLen(5) b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&str) } } func BenchmarkMin(b *testing.B) { num := 42 validator := Min(18) b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&num) } } func BenchmarkNotEmpty(b *testing.B) { str := "hello world" validator := NotEmpty() b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&str) } } func BenchmarkValidate_WithErrors(b *testing.B) { email := "" b.ResetTimer() for i := 0; i < b.N; i++ { v := New() v.Check(&email, "email", Required(), NotEmpty()) if v.Error() == nil { b.Fatal("expected validation error") } } } func BenchmarkValidate_ComplexForm(b *testing.B) { type Address struct { Street string City string ZipCode string } type User struct { Email string Name string Age int Website *string PhoneNumber *string Price float64 Address Address } website := "https://example.com" user := User{ Email: "user@example.com", Name: "John Doe", Age: 30, Website: &website, PhoneNumber: nil, Price: 99.99, Address: Address{ Street: "123 Main St", City: "New York", ZipCode: "10001", }, } b.ResetTimer() for i := 0; i < b.N; i++ { v := New() v.Check(&user.Email, "email", Required(), NotEmpty()) v.Check(&user.Name, "name", Required(), MinLen(2)) v.Check(&user.Age, "age", Min(18), Max(120)) v.Check(user.Website, "website", URL()) v.Check(user.PhoneNumber, "phoneNumber", MinLen(10)) } } func BenchmarkAfter(b *testing.B) { now := time.Now() future := now.Add(24 * time.Hour) validator := After(now) b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&future) } } func BenchmarkBefore(b *testing.B) { now := time.Now() past := now.Add(-24 * time.Hour) validator := Before(now) b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&past) } } func BenchmarkDomain(b *testing.B) { str := "api.example.com" validator := Domain() b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&str) } } func BenchmarkHTTPSUrl(b *testing.B) { str := "https://api.example.com/v1/users" validator := HTTPSUrl() b.ResetTimer() for i := 0; i < b.N; i++ { _ = validator(&str) } }