blob: 27029d56e717ff593714c8f339005039f4af3891 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package validate
import (
"regexp"
"testing"
)
type S struct {
A int
B string
C bool
D [1]string
E []string
F map[string]string
G C
H *C
I [1]C
J []C
K [1]*C
L []*C
M map[string]C
N map[string]*C
O *CC
}
type C struct {
B string
}
type CC struct {
CH *C
}
func TestValidator_Validate(t *testing.T) {
v := Validator{}
s := new(S)
v.AddRule("A", &ValidateRule{Min: 1, Max: 2})
err := v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.A = 3
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.A = 1
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.A = 2
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
r, _ := regexp.Compile(`^\d*$`)
v.AddRule("B", &ValidateRule{Min: 1, Max: 2, Regexp: r})
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.B = "111"
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.B = "2"
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.B = "33"
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("D", &ValidateRule{Regexp: r})
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.D = [1]string{"aaa"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.D = [1]string{"1"}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("E", &ValidateRule{Min: 1, Max: 2, Regexp: r})
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.E = []string{"1", "2", "3"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
s.E = []string{"1", "aaa"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.E = []string{"1"}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("F", &ValidateRule{Min: 1, Max: 2, Regexp: r})
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.F = map[string]string{"1": "", "2": "", "3": ""}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
s.F = map[string]string{"1": "", "aaa": ""}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.F = map[string]string{"1": "", "2": "aaa"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.F = map[string]string{"1": ""}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
// sub struct
pr, _ := regexp.Compile(`^[a-z]*$`)
v.AddRule("G", &ValidateRule{Regexp: pr})
v.AddSub("G", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.G = C{B: "111"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.G = C{B: "2"}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.G = C{B: "33"}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
// just check sub
var hv Validator
hv.AddRule("H", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("H", &hv)
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
// also check nil pointer
v.AddRule("H", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("H", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.H = &C{B: "111"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.H = &C{B: "a"}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.H = &C{B: "2"}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.H = &C{B: "33"}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("I", &ValidateRule{Regexp: pr})
v.AddSub("I", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.I = [1]C{{B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.I = [1]C{{B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.I = [1]C{{B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.I = [1]C{{B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("J", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("J", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.J = []C{{B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.J = []C{{B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.J = []C{{B: "2"}, {B: "2"}, {B: "2"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.J = []C{{B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.J = []C{{B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("K", &ValidateRule{Min: 1, Regexp: pr})
v.AddSub("K", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.K = [1]*C{{B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.K = [1]*C{{B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.K = [1]*C{{B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.K = [1]*C{{B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("L", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("L", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.L = []*C{{B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.L = []*C{{B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.L = []*C{{B: "2"}, {B: "2"}, {B: "2"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.L = []*C{{B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.L = []*C{{B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("M", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("M", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.M = map[string]C{"a": {B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.M = map[string]C{"a": {B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.M = map[string]C{"a": {B: "1"}, "b": {B: "1"}, "c": {B: "1"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.M = map[string]C{"a": {B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.M = map[string]C{"a": {B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("N", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("N", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.N = map[string]*C{"a": {B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.N = map[string]*C{"a": {B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.N = map[string]*C{"a": {B: "1"}, "b": {B: "1"}, "c": {B: "1"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.N = map[string]*C{"a": {B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.N = map[string]*C{"a": {B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
v.AddRule("O", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("O", &v)
v.AddRule("CH", &ValidateRule{Min: 1, Max: 2, Regexp: pr})
v.AddSub("CH", &v)
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.O = &CC{CH: &C{B: "111"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.O = &CC{CH: &C{B: "a"}}
err = v.Validate(s)
if err == nil {
t.Fatalf("validate failed")
}
println(err.Error())
s.O = &CC{CH: &C{B: "2"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
s.O = &CC{CH: &C{B: "33"}}
err = v.Validate(s)
if err != nil {
t.Fatalf("validate failed, %s", err.Error())
}
}