1/*
2** Zabbix
3** Copyright (C) 2001-2021 Zabbix SIA
4**
5** This program is free software; you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation; either version 2 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program; if not, write to the Free Software
17** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18**/
19
20package metric
21
22import "testing"
23
24var (
25	number    = "42"
26	notNumber = "foo"
27)
28
29func TestNumberValidator_Validate(t *testing.T) {
30	type args struct {
31		value *string
32	}
33	tests := []struct {
34		name    string
35		args    args
36		wantErr bool
37	}{
38		{
39			name:    "Must successfully validate a number",
40			args:    args{&number},
41			wantErr: false,
42		},
43		{
44			name:    "Must successfully validate nil",
45			args:    args{nil},
46			wantErr: false,
47		},
48		{
49			name:    "Must fail if a given value is not a number",
50			args:    args{&notNumber},
51			wantErr: true,
52		},
53	}
54	for _, tt := range tests {
55		t.Run(tt.name, func(t *testing.T) {
56			v := NumberValidator{}
57			if err := v.Validate(tt.args.value); (err != nil) != tt.wantErr {
58				t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
59			}
60		})
61	}
62}
63
64var (
65	string1 = "hello123"
66	string2 = "hello world"
67)
68
69func TestPatternValidator_Validate(t *testing.T) {
70	type fields struct {
71		Pattern string
72	}
73	type args struct {
74		value *string
75	}
76	tests := []struct {
77		name    string
78		fields  fields
79		args    args
80		wantErr bool
81	}{
82		{
83			name:    "Must successfully validate a string value",
84			fields:  fields{"^hello[0-9]+$"},
85			args:    args{&string1},
86			wantErr: false,
87		},
88		{
89			name:    "Must successfully validate nil",
90			args:    args{nil},
91			wantErr: false,
92		},
93		{
94			name:    "Must fail if a given value does not match a given pattern",
95			fields:  fields{"^hello[0-9]+$"},
96			args:    args{&string2},
97			wantErr: true,
98		},
99	}
100	for _, tt := range tests {
101		t.Run(tt.name, func(t *testing.T) {
102			v := PatternValidator{
103				Pattern: tt.fields.Pattern,
104			}
105			if err := v.Validate(tt.args.value); (err != nil) != tt.wantErr {
106				t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
107			}
108		})
109	}
110}
111
112var (
113	valInRange    = "50"
114	valNotInRange = "1000"
115)
116
117func TestRangeValidator_Validate(t *testing.T) {
118	type fields struct {
119		Min int
120		Max int
121	}
122	type args struct {
123		value *string
124	}
125	tests := []struct {
126		name    string
127		fields  fields
128		args    args
129		wantErr bool
130	}{
131		{
132			name:    "Must successfully validate a value in a range",
133			fields:  fields{0, 100},
134			args:    args{&valInRange},
135			wantErr: false,
136		},
137		{
138			name:    "Must successfully validate nil",
139			args:    args{nil},
140			wantErr: false,
141		},
142		{
143			name:    "Must fail if a given value is out of a range",
144			fields:  fields{0, 100},
145			args:    args{&valNotInRange},
146			wantErr: true,
147		},
148	}
149	for _, tt := range tests {
150		t.Run(tt.name, func(t *testing.T) {
151			v := RangeValidator{
152				Min: tt.fields.Min,
153				Max: tt.fields.Max,
154			}
155			if err := v.Validate(tt.args.value); (err != nil) != tt.wantErr {
156				t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
157			}
158		})
159	}
160}
161
162func TestSetValidator_Validate(t *testing.T) {
163	type fields struct {
164		Set []string
165	}
166	type args struct {
167		value *string
168	}
169	tests := []struct {
170		name    string
171		fields  fields
172		args    args
173		wantErr bool
174	}{
175		{
176			name:    "Must successfully validate a value in a set",
177			fields:  fields{[]string{"foo", "42", "100500"}},
178			args:    args{&number},
179			wantErr: false,
180		},
181		{
182			name:    "Must successfully validate nil",
183			args:    args{nil},
184			wantErr: false,
185		},
186		{
187			name:    "Must fail if a given value is out of a set",
188			fields:  fields{[]string{"foo", "42", "100500"}},
189			args:    args{&string1},
190			wantErr: true,
191		},
192	}
193	for _, tt := range tests {
194		t.Run(tt.name, func(t *testing.T) {
195			v := SetValidator{
196				Set: tt.fields.Set,
197			}
198			if err := v.Validate(tt.args.value); (err != nil) != tt.wantErr {
199				t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
200			}
201		})
202	}
203}
204