cases.go 84 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421
  1. package main
  2. import (
  3. "math"
  4. "time"
  5. cases "github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/go"
  6. other_package "github.com/envoyproxy/protoc-gen-validate/tests/harness/cases/other_package/go"
  7. "google.golang.org/protobuf/proto"
  8. "google.golang.org/protobuf/types/known/anypb"
  9. "google.golang.org/protobuf/types/known/durationpb"
  10. "google.golang.org/protobuf/types/known/timestamppb"
  11. "google.golang.org/protobuf/types/known/wrapperspb"
  12. )
  13. type TestCase struct {
  14. Name string
  15. Message proto.Message
  16. Failures int // expected number of failed validation errors
  17. }
  18. type TestResult struct {
  19. OK, Skipped bool
  20. }
  21. var TestCases []TestCase
  22. func init() {
  23. sets := [][]TestCase{
  24. floatCases,
  25. doubleCases,
  26. int32Cases,
  27. int64Cases,
  28. uint32Cases,
  29. uint64Cases,
  30. sint32Cases,
  31. sint64Cases,
  32. fixed32Cases,
  33. fixed64Cases,
  34. sfixed32Cases,
  35. sfixed64Cases,
  36. boolCases,
  37. stringCases,
  38. bytesCases,
  39. enumCases,
  40. messageCases,
  41. repeatedCases,
  42. mapCases,
  43. oneofCases,
  44. wrapperCases,
  45. durationCases,
  46. timestampCases,
  47. anyCases,
  48. kitchenSink,
  49. }
  50. for _, set := range sets {
  51. TestCases = append(TestCases, set...)
  52. }
  53. }
  54. var floatCases = []TestCase{
  55. {"float - none - valid", &cases.FloatNone{Val: -1.23456}, 0},
  56. {"float - const - valid", &cases.FloatConst{Val: 1.23}, 0},
  57. {"float - const - invalid", &cases.FloatConst{Val: 4.56}, 1},
  58. {"float - in - valid", &cases.FloatIn{Val: 7.89}, 0},
  59. {"float - in - invalid", &cases.FloatIn{Val: 10.11}, 1},
  60. {"float - not in - valid", &cases.FloatNotIn{Val: 1}, 0},
  61. {"float - not in - invalid", &cases.FloatNotIn{Val: 0}, 1},
  62. {"float - lt - valid", &cases.FloatLT{Val: -1}, 0},
  63. {"float - lt - invalid (equal)", &cases.FloatLT{Val: 0}, 1},
  64. {"float - lt - invalid", &cases.FloatLT{Val: 1}, 1},
  65. {"float - lte - valid", &cases.FloatLTE{Val: 63}, 0},
  66. {"float - lte - valid (equal)", &cases.FloatLTE{Val: 64}, 0},
  67. {"float - lte - invalid", &cases.FloatLTE{Val: 65}, 1},
  68. {"float - gt - valid", &cases.FloatGT{Val: 17}, 0},
  69. {"float - gt - invalid (equal)", &cases.FloatGT{Val: 16}, 1},
  70. {"float - gt - invalid", &cases.FloatGT{Val: 15}, 1},
  71. {"float - gte - valid", &cases.FloatGTE{Val: 9}, 0},
  72. {"float - gte - valid (equal)", &cases.FloatGTE{Val: 8}, 0},
  73. {"float - gte - invalid", &cases.FloatGTE{Val: 7}, 1},
  74. {"float - gt & lt - valid", &cases.FloatGTLT{Val: 5}, 0},
  75. {"float - gt & lt - invalid (above)", &cases.FloatGTLT{Val: 11}, 1},
  76. {"float - gt & lt - invalid (below)", &cases.FloatGTLT{Val: -1}, 1},
  77. {"float - gt & lt - invalid (max)", &cases.FloatGTLT{Val: 10}, 1},
  78. {"float - gt & lt - invalid (min)", &cases.FloatGTLT{Val: 0}, 1},
  79. {"float - exclusive gt & lt - valid (above)", &cases.FloatExLTGT{Val: 11}, 0},
  80. {"float - exclusive gt & lt - valid (below)", &cases.FloatExLTGT{Val: -1}, 0},
  81. {"float - exclusive gt & lt - invalid", &cases.FloatExLTGT{Val: 5}, 1},
  82. {"float - exclusive gt & lt - invalid (max)", &cases.FloatExLTGT{Val: 10}, 1},
  83. {"float - exclusive gt & lt - invalid (min)", &cases.FloatExLTGT{Val: 0}, 1},
  84. {"float - gte & lte - valid", &cases.FloatGTELTE{Val: 200}, 0},
  85. {"float - gte & lte - valid (max)", &cases.FloatGTELTE{Val: 256}, 0},
  86. {"float - gte & lte - valid (min)", &cases.FloatGTELTE{Val: 128}, 0},
  87. {"float - gte & lte - invalid (above)", &cases.FloatGTELTE{Val: 300}, 1},
  88. {"float - gte & lte - invalid (below)", &cases.FloatGTELTE{Val: 100}, 1},
  89. {"float - exclusive gte & lte - valid (above)", &cases.FloatExGTELTE{Val: 300}, 0},
  90. {"float - exclusive gte & lte - valid (below)", &cases.FloatExGTELTE{Val: 100}, 0},
  91. {"float - exclusive gte & lte - valid (max)", &cases.FloatExGTELTE{Val: 256}, 0},
  92. {"float - exclusive gte & lte - valid (min)", &cases.FloatExGTELTE{Val: 128}, 0},
  93. {"float - exclusive gte & lte - invalid", &cases.FloatExGTELTE{Val: 200}, 1},
  94. {"float - ignore_empty gte & lte - valid", &cases.FloatIgnore{Val: 0}, 0},
  95. }
  96. var doubleCases = []TestCase{
  97. {"double - none - valid", &cases.DoubleNone{Val: -1.23456}, 0},
  98. {"double - const - valid", &cases.DoubleConst{Val: 1.23}, 0},
  99. {"double - const - invalid", &cases.DoubleConst{Val: 4.56}, 1},
  100. {"double - in - valid", &cases.DoubleIn{Val: 7.89}, 0},
  101. {"double - in - invalid", &cases.DoubleIn{Val: 10.11}, 1},
  102. {"double - not in - valid", &cases.DoubleNotIn{Val: 1}, 0},
  103. {"double - not in - invalid", &cases.DoubleNotIn{Val: 0}, 1},
  104. {"double - lt - valid", &cases.DoubleLT{Val: -1}, 0},
  105. {"double - lt - invalid (equal)", &cases.DoubleLT{Val: 0}, 1},
  106. {"double - lt - invalid", &cases.DoubleLT{Val: 1}, 1},
  107. {"double - lte - valid", &cases.DoubleLTE{Val: 63}, 0},
  108. {"double - lte - valid (equal)", &cases.DoubleLTE{Val: 64}, 0},
  109. {"double - lte - invalid", &cases.DoubleLTE{Val: 65}, 1},
  110. {"double - gt - valid", &cases.DoubleGT{Val: 17}, 0},
  111. {"double - gt - invalid (equal)", &cases.DoubleGT{Val: 16}, 1},
  112. {"double - gt - invalid", &cases.DoubleGT{Val: 15}, 1},
  113. {"double - gte - valid", &cases.DoubleGTE{Val: 9}, 0},
  114. {"double - gte - valid (equal)", &cases.DoubleGTE{Val: 8}, 0},
  115. {"double - gte - invalid", &cases.DoubleGTE{Val: 7}, 1},
  116. {"double - gt & lt - valid", &cases.DoubleGTLT{Val: 5}, 0},
  117. {"double - gt & lt - invalid (above)", &cases.DoubleGTLT{Val: 11}, 1},
  118. {"double - gt & lt - invalid (below)", &cases.DoubleGTLT{Val: -1}, 1},
  119. {"double - gt & lt - invalid (max)", &cases.DoubleGTLT{Val: 10}, 1},
  120. {"double - gt & lt - invalid (min)", &cases.DoubleGTLT{Val: 0}, 1},
  121. {"double - exclusive gt & lt - valid (above)", &cases.DoubleExLTGT{Val: 11}, 0},
  122. {"double - exclusive gt & lt - valid (below)", &cases.DoubleExLTGT{Val: -1}, 0},
  123. {"double - exclusive gt & lt - invalid", &cases.DoubleExLTGT{Val: 5}, 1},
  124. {"double - exclusive gt & lt - invalid (max)", &cases.DoubleExLTGT{Val: 10}, 1},
  125. {"double - exclusive gt & lt - invalid (min)", &cases.DoubleExLTGT{Val: 0}, 1},
  126. {"double - gte & lte - valid", &cases.DoubleGTELTE{Val: 200}, 0},
  127. {"double - gte & lte - valid (max)", &cases.DoubleGTELTE{Val: 256}, 0},
  128. {"double - gte & lte - valid (min)", &cases.DoubleGTELTE{Val: 128}, 0},
  129. {"double - gte & lte - invalid (above)", &cases.DoubleGTELTE{Val: 300}, 1},
  130. {"double - gte & lte - invalid (below)", &cases.DoubleGTELTE{Val: 100}, 1},
  131. {"double - exclusive gte & lte - valid (above)", &cases.DoubleExGTELTE{Val: 300}, 0},
  132. {"double - exclusive gte & lte - valid (below)", &cases.DoubleExGTELTE{Val: 100}, 0},
  133. {"double - exclusive gte & lte - valid (max)", &cases.DoubleExGTELTE{Val: 256}, 0},
  134. {"double - exclusive gte & lte - valid (min)", &cases.DoubleExGTELTE{Val: 128}, 0},
  135. {"double - exclusive gte & lte - invalid", &cases.DoubleExGTELTE{Val: 200}, 1},
  136. {"double - ignore_empty gte & lte - valid", &cases.DoubleIgnore{Val: 0}, 0},
  137. }
  138. var int32Cases = []TestCase{
  139. {"int32 - none - valid", &cases.Int32None{Val: 123}, 0},
  140. {"int32 - const - valid", &cases.Int32Const{Val: 1}, 0},
  141. {"int32 - const - invalid", &cases.Int32Const{Val: 2}, 1},
  142. {"int32 - in - valid", &cases.Int32In{Val: 3}, 0},
  143. {"int32 - in - invalid", &cases.Int32In{Val: 5}, 1},
  144. {"int32 - not in - valid", &cases.Int32NotIn{Val: 1}, 0},
  145. {"int32 - not in - invalid", &cases.Int32NotIn{Val: 0}, 1},
  146. {"int32 - lt - valid", &cases.Int32LT{Val: -1}, 0},
  147. {"int32 - lt - invalid (equal)", &cases.Int32LT{Val: 0}, 1},
  148. {"int32 - lt - invalid", &cases.Int32LT{Val: 1}, 1},
  149. {"int32 - lte - valid", &cases.Int32LTE{Val: 63}, 0},
  150. {"int32 - lte - valid (equal)", &cases.Int32LTE{Val: 64}, 0},
  151. {"int32 - lte - invalid", &cases.Int32LTE{Val: 65}, 1},
  152. {"int32 - gt - valid", &cases.Int32GT{Val: 17}, 0},
  153. {"int32 - gt - invalid (equal)", &cases.Int32GT{Val: 16}, 1},
  154. {"int32 - gt - invalid", &cases.Int32GT{Val: 15}, 1},
  155. {"int32 - gte - valid", &cases.Int32GTE{Val: 9}, 0},
  156. {"int32 - gte - valid (equal)", &cases.Int32GTE{Val: 8}, 0},
  157. {"int32 - gte - invalid", &cases.Int32GTE{Val: 7}, 1},
  158. {"int32 - gt & lt - valid", &cases.Int32GTLT{Val: 5}, 0},
  159. {"int32 - gt & lt - invalid (above)", &cases.Int32GTLT{Val: 11}, 1},
  160. {"int32 - gt & lt - invalid (below)", &cases.Int32GTLT{Val: -1}, 1},
  161. {"int32 - gt & lt - invalid (max)", &cases.Int32GTLT{Val: 10}, 1},
  162. {"int32 - gt & lt - invalid (min)", &cases.Int32GTLT{Val: 0}, 1},
  163. {"int32 - exclusive gt & lt - valid (above)", &cases.Int32ExLTGT{Val: 11}, 0},
  164. {"int32 - exclusive gt & lt - valid (below)", &cases.Int32ExLTGT{Val: -1}, 0},
  165. {"int32 - exclusive gt & lt - invalid", &cases.Int32ExLTGT{Val: 5}, 1},
  166. {"int32 - exclusive gt & lt - invalid (max)", &cases.Int32ExLTGT{Val: 10}, 1},
  167. {"int32 - exclusive gt & lt - invalid (min)", &cases.Int32ExLTGT{Val: 0}, 1},
  168. {"int32 - gte & lte - valid", &cases.Int32GTELTE{Val: 200}, 0},
  169. {"int32 - gte & lte - valid (max)", &cases.Int32GTELTE{Val: 256}, 0},
  170. {"int32 - gte & lte - valid (min)", &cases.Int32GTELTE{Val: 128}, 0},
  171. {"int32 - gte & lte - invalid (above)", &cases.Int32GTELTE{Val: 300}, 1},
  172. {"int32 - gte & lte - invalid (below)", &cases.Int32GTELTE{Val: 100}, 1},
  173. {"int32 - exclusive gte & lte - valid (above)", &cases.Int32ExGTELTE{Val: 300}, 0},
  174. {"int32 - exclusive gte & lte - valid (below)", &cases.Int32ExGTELTE{Val: 100}, 0},
  175. {"int32 - exclusive gte & lte - valid (max)", &cases.Int32ExGTELTE{Val: 256}, 0},
  176. {"int32 - exclusive gte & lte - valid (min)", &cases.Int32ExGTELTE{Val: 128}, 0},
  177. {"int32 - exclusive gte & lte - invalid", &cases.Int32ExGTELTE{Val: 200}, 1},
  178. {"int32 - ignore_empty gte & lte - valid", &cases.Int32Ignore{Val: 0}, 0},
  179. }
  180. var int64Cases = []TestCase{
  181. {"int64 - none - valid", &cases.Int64None{Val: 123}, 0},
  182. {"int64 - const - valid", &cases.Int64Const{Val: 1}, 0},
  183. {"int64 - const - invalid", &cases.Int64Const{Val: 2}, 1},
  184. {"int64 - in - valid", &cases.Int64In{Val: 3}, 0},
  185. {"int64 - in - invalid", &cases.Int64In{Val: 5}, 1},
  186. {"int64 - not in - valid", &cases.Int64NotIn{Val: 1}, 0},
  187. {"int64 - not in - invalid", &cases.Int64NotIn{Val: 0}, 1},
  188. {"int64 - lt - valid", &cases.Int64LT{Val: -1}, 0},
  189. {"int64 - lt - invalid (equal)", &cases.Int64LT{Val: 0}, 1},
  190. {"int64 - lt - invalid", &cases.Int64LT{Val: 1}, 1},
  191. {"int64 - lte - valid", &cases.Int64LTE{Val: 63}, 0},
  192. {"int64 - lte - valid (equal)", &cases.Int64LTE{Val: 64}, 0},
  193. {"int64 - lte - invalid", &cases.Int64LTE{Val: 65}, 1},
  194. {"int64 - gt - valid", &cases.Int64GT{Val: 17}, 0},
  195. {"int64 - gt - invalid (equal)", &cases.Int64GT{Val: 16}, 1},
  196. {"int64 - gt - invalid", &cases.Int64GT{Val: 15}, 1},
  197. {"int64 - gte - valid", &cases.Int64GTE{Val: 9}, 0},
  198. {"int64 - gte - valid (equal)", &cases.Int64GTE{Val: 8}, 0},
  199. {"int64 - gte - invalid", &cases.Int64GTE{Val: 7}, 1},
  200. {"int64 - gt & lt - valid", &cases.Int64GTLT{Val: 5}, 0},
  201. {"int64 - gt & lt - invalid (above)", &cases.Int64GTLT{Val: 11}, 1},
  202. {"int64 - gt & lt - invalid (below)", &cases.Int64GTLT{Val: -1}, 1},
  203. {"int64 - gt & lt - invalid (max)", &cases.Int64GTLT{Val: 10}, 1},
  204. {"int64 - gt & lt - invalid (min)", &cases.Int64GTLT{Val: 0}, 1},
  205. {"int64 - exclusive gt & lt - valid (above)", &cases.Int64ExLTGT{Val: 11}, 0},
  206. {"int64 - exclusive gt & lt - valid (below)", &cases.Int64ExLTGT{Val: -1}, 0},
  207. {"int64 - exclusive gt & lt - invalid", &cases.Int64ExLTGT{Val: 5}, 1},
  208. {"int64 - exclusive gt & lt - invalid (max)", &cases.Int64ExLTGT{Val: 10}, 1},
  209. {"int64 - exclusive gt & lt - invalid (min)", &cases.Int64ExLTGT{Val: 0}, 1},
  210. {"int64 - gte & lte - valid", &cases.Int64GTELTE{Val: 200}, 0},
  211. {"int64 - gte & lte - valid (max)", &cases.Int64GTELTE{Val: 256}, 0},
  212. {"int64 - gte & lte - valid (min)", &cases.Int64GTELTE{Val: 128}, 0},
  213. {"int64 - gte & lte - invalid (above)", &cases.Int64GTELTE{Val: 300}, 1},
  214. {"int64 - gte & lte - invalid (below)", &cases.Int64GTELTE{Val: 100}, 1},
  215. {"int64 - exclusive gte & lte - valid (above)", &cases.Int64ExGTELTE{Val: 300}, 0},
  216. {"int64 - exclusive gte & lte - valid (below)", &cases.Int64ExGTELTE{Val: 100}, 0},
  217. {"int64 - exclusive gte & lte - valid (max)", &cases.Int64ExGTELTE{Val: 256}, 0},
  218. {"int64 - exclusive gte & lte - valid (min)", &cases.Int64ExGTELTE{Val: 128}, 0},
  219. {"int64 - exclusive gte & lte - invalid", &cases.Int64ExGTELTE{Val: 200}, 1},
  220. {"int64 - ignore_empty gte & lte - valid", &cases.Int64Ignore{Val: 0}, 0},
  221. }
  222. var uint32Cases = []TestCase{
  223. {"uint32 - none - valid", &cases.UInt32None{Val: 123}, 0},
  224. {"uint32 - const - valid", &cases.UInt32Const{Val: 1}, 0},
  225. {"uint32 - const - invalid", &cases.UInt32Const{Val: 2}, 1},
  226. {"uint32 - in - valid", &cases.UInt32In{Val: 3}, 0},
  227. {"uint32 - in - invalid", &cases.UInt32In{Val: 5}, 1},
  228. {"uint32 - not in - valid", &cases.UInt32NotIn{Val: 1}, 0},
  229. {"uint32 - not in - invalid", &cases.UInt32NotIn{Val: 0}, 1},
  230. {"uint32 - lt - valid", &cases.UInt32LT{Val: 4}, 0},
  231. {"uint32 - lt - invalid (equal)", &cases.UInt32LT{Val: 5}, 1},
  232. {"uint32 - lt - invalid", &cases.UInt32LT{Val: 6}, 1},
  233. {"uint32 - lte - valid", &cases.UInt32LTE{Val: 63}, 0},
  234. {"uint32 - lte - valid (equal)", &cases.UInt32LTE{Val: 64}, 0},
  235. {"uint32 - lte - invalid", &cases.UInt32LTE{Val: 65}, 1},
  236. {"uint32 - gt - valid", &cases.UInt32GT{Val: 17}, 0},
  237. {"uint32 - gt - invalid (equal)", &cases.UInt32GT{Val: 16}, 1},
  238. {"uint32 - gt - invalid", &cases.UInt32GT{Val: 15}, 1},
  239. {"uint32 - gte - valid", &cases.UInt32GTE{Val: 9}, 0},
  240. {"uint32 - gte - valid (equal)", &cases.UInt32GTE{Val: 8}, 0},
  241. {"uint32 - gte - invalid", &cases.UInt32GTE{Val: 7}, 1},
  242. {"uint32 - gt & lt - valid", &cases.UInt32GTLT{Val: 7}, 0},
  243. {"uint32 - gt & lt - invalid (above)", &cases.UInt32GTLT{Val: 11}, 1},
  244. {"uint32 - gt & lt - invalid (below)", &cases.UInt32GTLT{Val: 1}, 1},
  245. {"uint32 - gt & lt - invalid (max)", &cases.UInt32GTLT{Val: 10}, 1},
  246. {"uint32 - gt & lt - invalid (min)", &cases.UInt32GTLT{Val: 5}, 1},
  247. {"uint32 - exclusive gt & lt - valid (above)", &cases.UInt32ExLTGT{Val: 11}, 0},
  248. {"uint32 - exclusive gt & lt - valid (below)", &cases.UInt32ExLTGT{Val: 4}, 0},
  249. {"uint32 - exclusive gt & lt - invalid", &cases.UInt32ExLTGT{Val: 7}, 1},
  250. {"uint32 - exclusive gt & lt - invalid (max)", &cases.UInt32ExLTGT{Val: 10}, 1},
  251. {"uint32 - exclusive gt & lt - invalid (min)", &cases.UInt32ExLTGT{Val: 5}, 1},
  252. {"uint32 - gte & lte - valid", &cases.UInt32GTELTE{Val: 200}, 0},
  253. {"uint32 - gte & lte - valid (max)", &cases.UInt32GTELTE{Val: 256}, 0},
  254. {"uint32 - gte & lte - valid (min)", &cases.UInt32GTELTE{Val: 128}, 0},
  255. {"uint32 - gte & lte - invalid (above)", &cases.UInt32GTELTE{Val: 300}, 1},
  256. {"uint32 - gte & lte - invalid (below)", &cases.UInt32GTELTE{Val: 100}, 1},
  257. {"uint32 - exclusive gte & lte - valid (above)", &cases.UInt32ExGTELTE{Val: 300}, 0},
  258. {"uint32 - exclusive gte & lte - valid (below)", &cases.UInt32ExGTELTE{Val: 100}, 0},
  259. {"uint32 - exclusive gte & lte - valid (max)", &cases.UInt32ExGTELTE{Val: 256}, 0},
  260. {"uint32 - exclusive gte & lte - valid (min)", &cases.UInt32ExGTELTE{Val: 128}, 0},
  261. {"uint32 - exclusive gte & lte - invalid", &cases.UInt32ExGTELTE{Val: 200}, 1},
  262. {"uint32 - ignore_empty gte & lte - valid", &cases.UInt32Ignore{Val: 0}, 0},
  263. }
  264. var uint64Cases = []TestCase{
  265. {"uint64 - none - valid", &cases.UInt64None{Val: 123}, 0},
  266. {"uint64 - const - valid", &cases.UInt64Const{Val: 1}, 0},
  267. {"uint64 - const - invalid", &cases.UInt64Const{Val: 2}, 1},
  268. {"uint64 - in - valid", &cases.UInt64In{Val: 3}, 0},
  269. {"uint64 - in - invalid", &cases.UInt64In{Val: 5}, 1},
  270. {"uint64 - not in - valid", &cases.UInt64NotIn{Val: 1}, 0},
  271. {"uint64 - not in - invalid", &cases.UInt64NotIn{Val: 0}, 1},
  272. {"uint64 - lt - valid", &cases.UInt64LT{Val: 4}, 0},
  273. {"uint64 - lt - invalid (equal)", &cases.UInt64LT{Val: 5}, 1},
  274. {"uint64 - lt - invalid", &cases.UInt64LT{Val: 6}, 1},
  275. {"uint64 - lte - valid", &cases.UInt64LTE{Val: 63}, 0},
  276. {"uint64 - lte - valid (equal)", &cases.UInt64LTE{Val: 64}, 0},
  277. {"uint64 - lte - invalid", &cases.UInt64LTE{Val: 65}, 1},
  278. {"uint64 - gt - valid", &cases.UInt64GT{Val: 17}, 0},
  279. {"uint64 - gt - invalid (equal)", &cases.UInt64GT{Val: 16}, 1},
  280. {"uint64 - gt - invalid", &cases.UInt64GT{Val: 15}, 1},
  281. {"uint64 - gte - valid", &cases.UInt64GTE{Val: 9}, 0},
  282. {"uint64 - gte - valid (equal)", &cases.UInt64GTE{Val: 8}, 0},
  283. {"uint64 - gte - invalid", &cases.UInt64GTE{Val: 7}, 1},
  284. {"uint64 - gt & lt - valid", &cases.UInt64GTLT{Val: 7}, 0},
  285. {"uint64 - gt & lt - invalid (above)", &cases.UInt64GTLT{Val: 11}, 1},
  286. {"uint64 - gt & lt - invalid (below)", &cases.UInt64GTLT{Val: 1}, 1},
  287. {"uint64 - gt & lt - invalid (max)", &cases.UInt64GTLT{Val: 10}, 1},
  288. {"uint64 - gt & lt - invalid (min)", &cases.UInt64GTLT{Val: 5}, 1},
  289. {"uint64 - exclusive gt & lt - valid (above)", &cases.UInt64ExLTGT{Val: 11}, 0},
  290. {"uint64 - exclusive gt & lt - valid (below)", &cases.UInt64ExLTGT{Val: 4}, 0},
  291. {"uint64 - exclusive gt & lt - invalid", &cases.UInt64ExLTGT{Val: 7}, 1},
  292. {"uint64 - exclusive gt & lt - invalid (max)", &cases.UInt64ExLTGT{Val: 10}, 1},
  293. {"uint64 - exclusive gt & lt - invalid (min)", &cases.UInt64ExLTGT{Val: 5}, 1},
  294. {"uint64 - gte & lte - valid", &cases.UInt64GTELTE{Val: 200}, 0},
  295. {"uint64 - gte & lte - valid (max)", &cases.UInt64GTELTE{Val: 256}, 0},
  296. {"uint64 - gte & lte - valid (min)", &cases.UInt64GTELTE{Val: 128}, 0},
  297. {"uint64 - gte & lte - invalid (above)", &cases.UInt64GTELTE{Val: 300}, 1},
  298. {"uint64 - gte & lte - invalid (below)", &cases.UInt64GTELTE{Val: 100}, 1},
  299. {"uint64 - exclusive gte & lte - valid (above)", &cases.UInt64ExGTELTE{Val: 300}, 0},
  300. {"uint64 - exclusive gte & lte - valid (below)", &cases.UInt64ExGTELTE{Val: 100}, 0},
  301. {"uint64 - exclusive gte & lte - valid (max)", &cases.UInt64ExGTELTE{Val: 256}, 0},
  302. {"uint64 - exclusive gte & lte - valid (min)", &cases.UInt64ExGTELTE{Val: 128}, 0},
  303. {"uint64 - exclusive gte & lte - invalid", &cases.UInt64ExGTELTE{Val: 200}, 1},
  304. {"uint64 - ignore_empty gte & lte - valid", &cases.UInt64Ignore{Val: 0}, 0},
  305. }
  306. var sint32Cases = []TestCase{
  307. {"sint32 - none - valid", &cases.SInt32None{Val: 123}, 0},
  308. {"sint32 - const - valid", &cases.SInt32Const{Val: 1}, 0},
  309. {"sint32 - const - invalid", &cases.SInt32Const{Val: 2}, 1},
  310. {"sint32 - in - valid", &cases.SInt32In{Val: 3}, 0},
  311. {"sint32 - in - invalid", &cases.SInt32In{Val: 5}, 1},
  312. {"sint32 - not in - valid", &cases.SInt32NotIn{Val: 1}, 0},
  313. {"sint32 - not in - invalid", &cases.SInt32NotIn{Val: 0}, 1},
  314. {"sint32 - lt - valid", &cases.SInt32LT{Val: -1}, 0},
  315. {"sint32 - lt - invalid (equal)", &cases.SInt32LT{Val: 0}, 1},
  316. {"sint32 - lt - invalid", &cases.SInt32LT{Val: 1}, 1},
  317. {"sint32 - lte - valid", &cases.SInt32LTE{Val: 63}, 0},
  318. {"sint32 - lte - valid (equal)", &cases.SInt32LTE{Val: 64}, 0},
  319. {"sint32 - lte - invalid", &cases.SInt32LTE{Val: 65}, 1},
  320. {"sint32 - gt - valid", &cases.SInt32GT{Val: 17}, 0},
  321. {"sint32 - gt - invalid (equal)", &cases.SInt32GT{Val: 16}, 1},
  322. {"sint32 - gt - invalid", &cases.SInt32GT{Val: 15}, 1},
  323. {"sint32 - gte - valid", &cases.SInt32GTE{Val: 9}, 0},
  324. {"sint32 - gte - valid (equal)", &cases.SInt32GTE{Val: 8}, 0},
  325. {"sint32 - gte - invalid", &cases.SInt32GTE{Val: 7}, 1},
  326. {"sint32 - gt & lt - valid", &cases.SInt32GTLT{Val: 5}, 0},
  327. {"sint32 - gt & lt - invalid (above)", &cases.SInt32GTLT{Val: 11}, 1},
  328. {"sint32 - gt & lt - invalid (below)", &cases.SInt32GTLT{Val: -1}, 1},
  329. {"sint32 - gt & lt - invalid (max)", &cases.SInt32GTLT{Val: 10}, 1},
  330. {"sint32 - gt & lt - invalid (min)", &cases.SInt32GTLT{Val: 0}, 1},
  331. {"sint32 - exclusive gt & lt - valid (above)", &cases.SInt32ExLTGT{Val: 11}, 0},
  332. {"sint32 - exclusive gt & lt - valid (below)", &cases.SInt32ExLTGT{Val: -1}, 0},
  333. {"sint32 - exclusive gt & lt - invalid", &cases.SInt32ExLTGT{Val: 5}, 1},
  334. {"sint32 - exclusive gt & lt - invalid (max)", &cases.SInt32ExLTGT{Val: 10}, 1},
  335. {"sint32 - exclusive gt & lt - invalid (min)", &cases.SInt32ExLTGT{Val: 0}, 1},
  336. {"sint32 - gte & lte - valid", &cases.SInt32GTELTE{Val: 200}, 0},
  337. {"sint32 - gte & lte - valid (max)", &cases.SInt32GTELTE{Val: 256}, 0},
  338. {"sint32 - gte & lte - valid (min)", &cases.SInt32GTELTE{Val: 128}, 0},
  339. {"sint32 - gte & lte - invalid (above)", &cases.SInt32GTELTE{Val: 300}, 1},
  340. {"sint32 - gte & lte - invalid (below)", &cases.SInt32GTELTE{Val: 100}, 1},
  341. {"sint32 - exclusive gte & lte - valid (above)", &cases.SInt32ExGTELTE{Val: 300}, 0},
  342. {"sint32 - exclusive gte & lte - valid (below)", &cases.SInt32ExGTELTE{Val: 100}, 0},
  343. {"sint32 - exclusive gte & lte - valid (max)", &cases.SInt32ExGTELTE{Val: 256}, 0},
  344. {"sint32 - exclusive gte & lte - valid (min)", &cases.SInt32ExGTELTE{Val: 128}, 0},
  345. {"sint32 - exclusive gte & lte - invalid", &cases.SInt32ExGTELTE{Val: 200}, 1},
  346. {"sint32 - ignore_empty gte & lte - valid", &cases.SInt32Ignore{Val: 0}, 0},
  347. }
  348. var sint64Cases = []TestCase{
  349. {"sint64 - none - valid", &cases.SInt64None{Val: 123}, 0},
  350. {"sint64 - const - valid", &cases.SInt64Const{Val: 1}, 0},
  351. {"sint64 - const - invalid", &cases.SInt64Const{Val: 2}, 1},
  352. {"sint64 - in - valid", &cases.SInt64In{Val: 3}, 0},
  353. {"sint64 - in - invalid", &cases.SInt64In{Val: 5}, 1},
  354. {"sint64 - not in - valid", &cases.SInt64NotIn{Val: 1}, 0},
  355. {"sint64 - not in - invalid", &cases.SInt64NotIn{Val: 0}, 1},
  356. {"sint64 - lt - valid", &cases.SInt64LT{Val: -1}, 0},
  357. {"sint64 - lt - invalid (equal)", &cases.SInt64LT{Val: 0}, 1},
  358. {"sint64 - lt - invalid", &cases.SInt64LT{Val: 1}, 1},
  359. {"sint64 - lte - valid", &cases.SInt64LTE{Val: 63}, 0},
  360. {"sint64 - lte - valid (equal)", &cases.SInt64LTE{Val: 64}, 0},
  361. {"sint64 - lte - invalid", &cases.SInt64LTE{Val: 65}, 1},
  362. {"sint64 - gt - valid", &cases.SInt64GT{Val: 17}, 0},
  363. {"sint64 - gt - invalid (equal)", &cases.SInt64GT{Val: 16}, 1},
  364. {"sint64 - gt - invalid", &cases.SInt64GT{Val: 15}, 1},
  365. {"sint64 - gte - valid", &cases.SInt64GTE{Val: 9}, 0},
  366. {"sint64 - gte - valid (equal)", &cases.SInt64GTE{Val: 8}, 0},
  367. {"sint64 - gte - invalid", &cases.SInt64GTE{Val: 7}, 1},
  368. {"sint64 - gt & lt - valid", &cases.SInt64GTLT{Val: 5}, 0},
  369. {"sint64 - gt & lt - invalid (above)", &cases.SInt64GTLT{Val: 11}, 1},
  370. {"sint64 - gt & lt - invalid (below)", &cases.SInt64GTLT{Val: -1}, 1},
  371. {"sint64 - gt & lt - invalid (max)", &cases.SInt64GTLT{Val: 10}, 1},
  372. {"sint64 - gt & lt - invalid (min)", &cases.SInt64GTLT{Val: 0}, 1},
  373. {"sint64 - exclusive gt & lt - valid (above)", &cases.SInt64ExLTGT{Val: 11}, 0},
  374. {"sint64 - exclusive gt & lt - valid (below)", &cases.SInt64ExLTGT{Val: -1}, 0},
  375. {"sint64 - exclusive gt & lt - invalid", &cases.SInt64ExLTGT{Val: 5}, 1},
  376. {"sint64 - exclusive gt & lt - invalid (max)", &cases.SInt64ExLTGT{Val: 10}, 1},
  377. {"sint64 - exclusive gt & lt - invalid (min)", &cases.SInt64ExLTGT{Val: 0}, 1},
  378. {"sint64 - gte & lte - valid", &cases.SInt64GTELTE{Val: 200}, 0},
  379. {"sint64 - gte & lte - valid (max)", &cases.SInt64GTELTE{Val: 256}, 0},
  380. {"sint64 - gte & lte - valid (min)", &cases.SInt64GTELTE{Val: 128}, 0},
  381. {"sint64 - gte & lte - invalid (above)", &cases.SInt64GTELTE{Val: 300}, 1},
  382. {"sint64 - gte & lte - invalid (below)", &cases.SInt64GTELTE{Val: 100}, 1},
  383. {"sint64 - exclusive gte & lte - valid (above)", &cases.SInt64ExGTELTE{Val: 300}, 0},
  384. {"sint64 - exclusive gte & lte - valid (below)", &cases.SInt64ExGTELTE{Val: 100}, 0},
  385. {"sint64 - exclusive gte & lte - valid (max)", &cases.SInt64ExGTELTE{Val: 256}, 0},
  386. {"sint64 - exclusive gte & lte - valid (min)", &cases.SInt64ExGTELTE{Val: 128}, 0},
  387. {"sint64 - exclusive gte & lte - invalid", &cases.SInt64ExGTELTE{Val: 200}, 1},
  388. {"sint64 - ignore_empty gte & lte - valid", &cases.SInt64Ignore{Val: 0}, 0},
  389. }
  390. var fixed32Cases = []TestCase{
  391. {"fixed32 - none - valid", &cases.Fixed32None{Val: 123}, 0},
  392. {"fixed32 - const - valid", &cases.Fixed32Const{Val: 1}, 0},
  393. {"fixed32 - const - invalid", &cases.Fixed32Const{Val: 2}, 1},
  394. {"fixed32 - in - valid", &cases.Fixed32In{Val: 3}, 0},
  395. {"fixed32 - in - invalid", &cases.Fixed32In{Val: 5}, 1},
  396. {"fixed32 - not in - valid", &cases.Fixed32NotIn{Val: 1}, 0},
  397. {"fixed32 - not in - invalid", &cases.Fixed32NotIn{Val: 0}, 1},
  398. {"fixed32 - lt - valid", &cases.Fixed32LT{Val: 4}, 0},
  399. {"fixed32 - lt - invalid (equal)", &cases.Fixed32LT{Val: 5}, 1},
  400. {"fixed32 - lt - invalid", &cases.Fixed32LT{Val: 6}, 1},
  401. {"fixed32 - lte - valid", &cases.Fixed32LTE{Val: 63}, 0},
  402. {"fixed32 - lte - valid (equal)", &cases.Fixed32LTE{Val: 64}, 0},
  403. {"fixed32 - lte - invalid", &cases.Fixed32LTE{Val: 65}, 1},
  404. {"fixed32 - gt - valid", &cases.Fixed32GT{Val: 17}, 0},
  405. {"fixed32 - gt - invalid (equal)", &cases.Fixed32GT{Val: 16}, 1},
  406. {"fixed32 - gt - invalid", &cases.Fixed32GT{Val: 15}, 1},
  407. {"fixed32 - gte - valid", &cases.Fixed32GTE{Val: 9}, 0},
  408. {"fixed32 - gte - valid (equal)", &cases.Fixed32GTE{Val: 8}, 0},
  409. {"fixed32 - gte - invalid", &cases.Fixed32GTE{Val: 7}, 1},
  410. {"fixed32 - gt & lt - valid", &cases.Fixed32GTLT{Val: 7}, 0},
  411. {"fixed32 - gt & lt - invalid (above)", &cases.Fixed32GTLT{Val: 11}, 1},
  412. {"fixed32 - gt & lt - invalid (below)", &cases.Fixed32GTLT{Val: 1}, 1},
  413. {"fixed32 - gt & lt - invalid (max)", &cases.Fixed32GTLT{Val: 10}, 1},
  414. {"fixed32 - gt & lt - invalid (min)", &cases.Fixed32GTLT{Val: 5}, 1},
  415. {"fixed32 - exclusive gt & lt - valid (above)", &cases.Fixed32ExLTGT{Val: 11}, 0},
  416. {"fixed32 - exclusive gt & lt - valid (below)", &cases.Fixed32ExLTGT{Val: 4}, 0},
  417. {"fixed32 - exclusive gt & lt - invalid", &cases.Fixed32ExLTGT{Val: 7}, 1},
  418. {"fixed32 - exclusive gt & lt - invalid (max)", &cases.Fixed32ExLTGT{Val: 10}, 1},
  419. {"fixed32 - exclusive gt & lt - invalid (min)", &cases.Fixed32ExLTGT{Val: 5}, 1},
  420. {"fixed32 - gte & lte - valid", &cases.Fixed32GTELTE{Val: 200}, 0},
  421. {"fixed32 - gte & lte - valid (max)", &cases.Fixed32GTELTE{Val: 256}, 0},
  422. {"fixed32 - gte & lte - valid (min)", &cases.Fixed32GTELTE{Val: 128}, 0},
  423. {"fixed32 - gte & lte - invalid (above)", &cases.Fixed32GTELTE{Val: 300}, 1},
  424. {"fixed32 - gte & lte - invalid (below)", &cases.Fixed32GTELTE{Val: 100}, 1},
  425. {"fixed32 - exclusive gte & lte - valid (above)", &cases.Fixed32ExGTELTE{Val: 300}, 0},
  426. {"fixed32 - exclusive gte & lte - valid (below)", &cases.Fixed32ExGTELTE{Val: 100}, 0},
  427. {"fixed32 - exclusive gte & lte - valid (max)", &cases.Fixed32ExGTELTE{Val: 256}, 0},
  428. {"fixed32 - exclusive gte & lte - valid (min)", &cases.Fixed32ExGTELTE{Val: 128}, 0},
  429. {"fixed32 - exclusive gte & lte - invalid", &cases.Fixed32ExGTELTE{Val: 200}, 1},
  430. {"fixed32 - ignore_empty gte & lte - valid", &cases.Fixed32Ignore{Val: 0}, 0},
  431. }
  432. var fixed64Cases = []TestCase{
  433. {"fixed64 - none - valid", &cases.Fixed64None{Val: 123}, 0},
  434. {"fixed64 - const - valid", &cases.Fixed64Const{Val: 1}, 0},
  435. {"fixed64 - const - invalid", &cases.Fixed64Const{Val: 2}, 1},
  436. {"fixed64 - in - valid", &cases.Fixed64In{Val: 3}, 0},
  437. {"fixed64 - in - invalid", &cases.Fixed64In{Val: 5}, 1},
  438. {"fixed64 - not in - valid", &cases.Fixed64NotIn{Val: 1}, 0},
  439. {"fixed64 - not in - invalid", &cases.Fixed64NotIn{Val: 0}, 1},
  440. {"fixed64 - lt - valid", &cases.Fixed64LT{Val: 4}, 0},
  441. {"fixed64 - lt - invalid (equal)", &cases.Fixed64LT{Val: 5}, 1},
  442. {"fixed64 - lt - invalid", &cases.Fixed64LT{Val: 6}, 1},
  443. {"fixed64 - lte - valid", &cases.Fixed64LTE{Val: 63}, 0},
  444. {"fixed64 - lte - valid (equal)", &cases.Fixed64LTE{Val: 64}, 0},
  445. {"fixed64 - lte - invalid", &cases.Fixed64LTE{Val: 65}, 1},
  446. {"fixed64 - gt - valid", &cases.Fixed64GT{Val: 17}, 0},
  447. {"fixed64 - gt - invalid (equal)", &cases.Fixed64GT{Val: 16}, 1},
  448. {"fixed64 - gt - invalid", &cases.Fixed64GT{Val: 15}, 1},
  449. {"fixed64 - gte - valid", &cases.Fixed64GTE{Val: 9}, 0},
  450. {"fixed64 - gte - valid (equal)", &cases.Fixed64GTE{Val: 8}, 0},
  451. {"fixed64 - gte - invalid", &cases.Fixed64GTE{Val: 7}, 1},
  452. {"fixed64 - gt & lt - valid", &cases.Fixed64GTLT{Val: 7}, 0},
  453. {"fixed64 - gt & lt - invalid (above)", &cases.Fixed64GTLT{Val: 11}, 1},
  454. {"fixed64 - gt & lt - invalid (below)", &cases.Fixed64GTLT{Val: 1}, 1},
  455. {"fixed64 - gt & lt - invalid (max)", &cases.Fixed64GTLT{Val: 10}, 1},
  456. {"fixed64 - gt & lt - invalid (min)", &cases.Fixed64GTLT{Val: 5}, 1},
  457. {"fixed64 - exclusive gt & lt - valid (above)", &cases.Fixed64ExLTGT{Val: 11}, 0},
  458. {"fixed64 - exclusive gt & lt - valid (below)", &cases.Fixed64ExLTGT{Val: 4}, 0},
  459. {"fixed64 - exclusive gt & lt - invalid", &cases.Fixed64ExLTGT{Val: 7}, 1},
  460. {"fixed64 - exclusive gt & lt - invalid (max)", &cases.Fixed64ExLTGT{Val: 10}, 1},
  461. {"fixed64 - exclusive gt & lt - invalid (min)", &cases.Fixed64ExLTGT{Val: 5}, 1},
  462. {"fixed64 - gte & lte - valid", &cases.Fixed64GTELTE{Val: 200}, 0},
  463. {"fixed64 - gte & lte - valid (max)", &cases.Fixed64GTELTE{Val: 256}, 0},
  464. {"fixed64 - gte & lte - valid (min)", &cases.Fixed64GTELTE{Val: 128}, 0},
  465. {"fixed64 - gte & lte - invalid (above)", &cases.Fixed64GTELTE{Val: 300}, 1},
  466. {"fixed64 - gte & lte - invalid (below)", &cases.Fixed64GTELTE{Val: 100}, 1},
  467. {"fixed64 - exclusive gte & lte - valid (above)", &cases.Fixed64ExGTELTE{Val: 300}, 0},
  468. {"fixed64 - exclusive gte & lte - valid (below)", &cases.Fixed64ExGTELTE{Val: 100}, 0},
  469. {"fixed64 - exclusive gte & lte - valid (max)", &cases.Fixed64ExGTELTE{Val: 256}, 0},
  470. {"fixed64 - exclusive gte & lte - valid (min)", &cases.Fixed64ExGTELTE{Val: 128}, 0},
  471. {"fixed64 - exclusive gte & lte - invalid", &cases.Fixed64ExGTELTE{Val: 200}, 1},
  472. {"fixed64 - ignore_empty gte & lte - valid", &cases.Fixed64Ignore{Val: 0}, 0},
  473. }
  474. var sfixed32Cases = []TestCase{
  475. {"sfixed32 - none - valid", &cases.SFixed32None{Val: 123}, 0},
  476. {"sfixed32 - const - valid", &cases.SFixed32Const{Val: 1}, 0},
  477. {"sfixed32 - const - invalid", &cases.SFixed32Const{Val: 2}, 1},
  478. {"sfixed32 - in - valid", &cases.SFixed32In{Val: 3}, 0},
  479. {"sfixed32 - in - invalid", &cases.SFixed32In{Val: 5}, 1},
  480. {"sfixed32 - not in - valid", &cases.SFixed32NotIn{Val: 1}, 0},
  481. {"sfixed32 - not in - invalid", &cases.SFixed32NotIn{Val: 0}, 1},
  482. {"sfixed32 - lt - valid", &cases.SFixed32LT{Val: -1}, 0},
  483. {"sfixed32 - lt - invalid (equal)", &cases.SFixed32LT{Val: 0}, 1},
  484. {"sfixed32 - lt - invalid", &cases.SFixed32LT{Val: 1}, 1},
  485. {"sfixed32 - lte - valid", &cases.SFixed32LTE{Val: 63}, 0},
  486. {"sfixed32 - lte - valid (equal)", &cases.SFixed32LTE{Val: 64}, 0},
  487. {"sfixed32 - lte - invalid", &cases.SFixed32LTE{Val: 65}, 1},
  488. {"sfixed32 - gt - valid", &cases.SFixed32GT{Val: 17}, 0},
  489. {"sfixed32 - gt - invalid (equal)", &cases.SFixed32GT{Val: 16}, 1},
  490. {"sfixed32 - gt - invalid", &cases.SFixed32GT{Val: 15}, 1},
  491. {"sfixed32 - gte - valid", &cases.SFixed32GTE{Val: 9}, 0},
  492. {"sfixed32 - gte - valid (equal)", &cases.SFixed32GTE{Val: 8}, 0},
  493. {"sfixed32 - gte - invalid", &cases.SFixed32GTE{Val: 7}, 1},
  494. {"sfixed32 - gt & lt - valid", &cases.SFixed32GTLT{Val: 5}, 0},
  495. {"sfixed32 - gt & lt - invalid (above)", &cases.SFixed32GTLT{Val: 11}, 1},
  496. {"sfixed32 - gt & lt - invalid (below)", &cases.SFixed32GTLT{Val: -1}, 1},
  497. {"sfixed32 - gt & lt - invalid (max)", &cases.SFixed32GTLT{Val: 10}, 1},
  498. {"sfixed32 - gt & lt - invalid (min)", &cases.SFixed32GTLT{Val: 0}, 1},
  499. {"sfixed32 - exclusive gt & lt - valid (above)", &cases.SFixed32ExLTGT{Val: 11}, 0},
  500. {"sfixed32 - exclusive gt & lt - valid (below)", &cases.SFixed32ExLTGT{Val: -1}, 0},
  501. {"sfixed32 - exclusive gt & lt - invalid", &cases.SFixed32ExLTGT{Val: 5}, 1},
  502. {"sfixed32 - exclusive gt & lt - invalid (max)", &cases.SFixed32ExLTGT{Val: 10}, 1},
  503. {"sfixed32 - exclusive gt & lt - invalid (min)", &cases.SFixed32ExLTGT{Val: 0}, 1},
  504. {"sfixed32 - gte & lte - valid", &cases.SFixed32GTELTE{Val: 200}, 0},
  505. {"sfixed32 - gte & lte - valid (max)", &cases.SFixed32GTELTE{Val: 256}, 0},
  506. {"sfixed32 - gte & lte - valid (min)", &cases.SFixed32GTELTE{Val: 128}, 0},
  507. {"sfixed32 - gte & lte - invalid (above)", &cases.SFixed32GTELTE{Val: 300}, 1},
  508. {"sfixed32 - gte & lte - invalid (below)", &cases.SFixed32GTELTE{Val: 100}, 1},
  509. {"sfixed32 - exclusive gte & lte - valid (above)", &cases.SFixed32ExGTELTE{Val: 300}, 0},
  510. {"sfixed32 - exclusive gte & lte - valid (below)", &cases.SFixed32ExGTELTE{Val: 100}, 0},
  511. {"sfixed32 - exclusive gte & lte - valid (max)", &cases.SFixed32ExGTELTE{Val: 256}, 0},
  512. {"sfixed32 - exclusive gte & lte - valid (min)", &cases.SFixed32ExGTELTE{Val: 128}, 0},
  513. {"sfixed32 - exclusive gte & lte - invalid", &cases.SFixed32ExGTELTE{Val: 200}, 1},
  514. {"sfixed32 - ignore_empty gte & lte - valid", &cases.SFixed32Ignore{Val: 0}, 0},
  515. }
  516. var sfixed64Cases = []TestCase{
  517. {"sfixed64 - none - valid", &cases.SFixed64None{Val: 123}, 0},
  518. {"sfixed64 - const - valid", &cases.SFixed64Const{Val: 1}, 0},
  519. {"sfixed64 - const - invalid", &cases.SFixed64Const{Val: 2}, 1},
  520. {"sfixed64 - in - valid", &cases.SFixed64In{Val: 3}, 0},
  521. {"sfixed64 - in - invalid", &cases.SFixed64In{Val: 5}, 1},
  522. {"sfixed64 - not in - valid", &cases.SFixed64NotIn{Val: 1}, 0},
  523. {"sfixed64 - not in - invalid", &cases.SFixed64NotIn{Val: 0}, 1},
  524. {"sfixed64 - lt - valid", &cases.SFixed64LT{Val: -1}, 0},
  525. {"sfixed64 - lt - invalid (equal)", &cases.SFixed64LT{Val: 0}, 1},
  526. {"sfixed64 - lt - invalid", &cases.SFixed64LT{Val: 1}, 1},
  527. {"sfixed64 - lte - valid", &cases.SFixed64LTE{Val: 63}, 0},
  528. {"sfixed64 - lte - valid (equal)", &cases.SFixed64LTE{Val: 64}, 0},
  529. {"sfixed64 - lte - invalid", &cases.SFixed64LTE{Val: 65}, 1},
  530. {"sfixed64 - gt - valid", &cases.SFixed64GT{Val: 17}, 0},
  531. {"sfixed64 - gt - invalid (equal)", &cases.SFixed64GT{Val: 16}, 1},
  532. {"sfixed64 - gt - invalid", &cases.SFixed64GT{Val: 15}, 1},
  533. {"sfixed64 - gte - valid", &cases.SFixed64GTE{Val: 9}, 0},
  534. {"sfixed64 - gte - valid (equal)", &cases.SFixed64GTE{Val: 8}, 0},
  535. {"sfixed64 - gte - invalid", &cases.SFixed64GTE{Val: 7}, 1},
  536. {"sfixed64 - gt & lt - valid", &cases.SFixed64GTLT{Val: 5}, 0},
  537. {"sfixed64 - gt & lt - invalid (above)", &cases.SFixed64GTLT{Val: 11}, 1},
  538. {"sfixed64 - gt & lt - invalid (below)", &cases.SFixed64GTLT{Val: -1}, 1},
  539. {"sfixed64 - gt & lt - invalid (max)", &cases.SFixed64GTLT{Val: 10}, 1},
  540. {"sfixed64 - gt & lt - invalid (min)", &cases.SFixed64GTLT{Val: 0}, 1},
  541. {"sfixed64 - exclusive gt & lt - valid (above)", &cases.SFixed64ExLTGT{Val: 11}, 0},
  542. {"sfixed64 - exclusive gt & lt - valid (below)", &cases.SFixed64ExLTGT{Val: -1}, 0},
  543. {"sfixed64 - exclusive gt & lt - invalid", &cases.SFixed64ExLTGT{Val: 5}, 1},
  544. {"sfixed64 - exclusive gt & lt - invalid (max)", &cases.SFixed64ExLTGT{Val: 10}, 1},
  545. {"sfixed64 - exclusive gt & lt - invalid (min)", &cases.SFixed64ExLTGT{Val: 0}, 1},
  546. {"sfixed64 - gte & lte - valid", &cases.SFixed64GTELTE{Val: 200}, 0},
  547. {"sfixed64 - gte & lte - valid (max)", &cases.SFixed64GTELTE{Val: 256}, 0},
  548. {"sfixed64 - gte & lte - valid (min)", &cases.SFixed64GTELTE{Val: 128}, 0},
  549. {"sfixed64 - gte & lte - invalid (above)", &cases.SFixed64GTELTE{Val: 300}, 1},
  550. {"sfixed64 - gte & lte - invalid (below)", &cases.SFixed64GTELTE{Val: 100}, 1},
  551. {"sfixed64 - exclusive gte & lte - valid (above)", &cases.SFixed64ExGTELTE{Val: 300}, 0},
  552. {"sfixed64 - exclusive gte & lte - valid (below)", &cases.SFixed64ExGTELTE{Val: 100}, 0},
  553. {"sfixed64 - exclusive gte & lte - valid (max)", &cases.SFixed64ExGTELTE{Val: 256}, 0},
  554. {"sfixed64 - exclusive gte & lte - valid (min)", &cases.SFixed64ExGTELTE{Val: 128}, 0},
  555. {"sfixed64 - exclusive gte & lte - invalid", &cases.SFixed64ExGTELTE{Val: 200}, 1},
  556. {"sfixed64 - ignore_empty gte & lte - valid", &cases.SFixed64Ignore{Val: 0}, 0},
  557. }
  558. var boolCases = []TestCase{
  559. {"bool - none - valid", &cases.BoolNone{Val: true}, 0},
  560. {"bool - const (true) - valid", &cases.BoolConstTrue{Val: true}, 0},
  561. {"bool - const (true) - invalid", &cases.BoolConstTrue{Val: false}, 1},
  562. {"bool - const (false) - valid", &cases.BoolConstFalse{Val: false}, 0},
  563. {"bool - const (false) - invalid", &cases.BoolConstFalse{Val: true}, 1},
  564. }
  565. var stringCases = []TestCase{
  566. {"string - none - valid", &cases.StringNone{Val: "quux"}, 0},
  567. {"string - const - valid", &cases.StringConst{Val: "foo"}, 0},
  568. {"string - const - invalid", &cases.StringConst{Val: "bar"}, 1},
  569. {"string - in - valid", &cases.StringIn{Val: "bar"}, 0},
  570. {"string - in - invalid", &cases.StringIn{Val: "quux"}, 1},
  571. {"string - not in - valid", &cases.StringNotIn{Val: "quux"}, 0},
  572. {"string - not in - invalid", &cases.StringNotIn{Val: "fizz"}, 1},
  573. {"string - len - valid", &cases.StringLen{Val: "baz"}, 0},
  574. {"string - len - valid (multibyte)", &cases.StringLen{Val: "你好吖"}, 0},
  575. {"string - len - invalid (lt)", &cases.StringLen{Val: "go"}, 1},
  576. {"string - len - invalid (gt)", &cases.StringLen{Val: "fizz"}, 1},
  577. {"string - len - invalid (multibyte)", &cases.StringLen{Val: "你好"}, 1},
  578. {"string - min len - valid", &cases.StringMinLen{Val: "protoc"}, 0},
  579. {"string - min len - valid (min)", &cases.StringMinLen{Val: "baz"}, 0},
  580. {"string - min len - invalid", &cases.StringMinLen{Val: "go"}, 1},
  581. {"string - min len - invalid (multibyte)", &cases.StringMinLen{Val: "你好"}, 1},
  582. {"string - max len - valid", &cases.StringMaxLen{Val: "foo"}, 0},
  583. {"string - max len - valid (max)", &cases.StringMaxLen{Val: "proto"}, 0},
  584. {"string - max len - valid (multibyte)", &cases.StringMaxLen{Val: "你好你好"}, 0},
  585. {"string - max len - invalid", &cases.StringMaxLen{Val: "1234567890"}, 1},
  586. {"string - min/max len - valid", &cases.StringMinMaxLen{Val: "quux"}, 0},
  587. {"string - min/max len - valid (min)", &cases.StringMinMaxLen{Val: "foo"}, 0},
  588. {"string - min/max len - valid (max)", &cases.StringMinMaxLen{Val: "proto"}, 0},
  589. {"string - min/max len - valid (multibyte)", &cases.StringMinMaxLen{Val: "你好你好"}, 0},
  590. {"string - min/max len - invalid (below)", &cases.StringMinMaxLen{Val: "go"}, 1},
  591. {"string - min/max len - invalid (above)", &cases.StringMinMaxLen{Val: "validate"}, 1},
  592. {"string - equal min/max len - valid", &cases.StringEqualMinMaxLen{Val: "proto"}, 0},
  593. {"string - equal min/max len - invalid", &cases.StringEqualMinMaxLen{Val: "validate"}, 1},
  594. {"string - len bytes - valid", &cases.StringLenBytes{Val: "pace"}, 0},
  595. {"string - len bytes - invalid (lt)", &cases.StringLenBytes{Val: "val"}, 1},
  596. {"string - len bytes - invalid (gt)", &cases.StringLenBytes{Val: "world"}, 1},
  597. {"string - len bytes - invalid (multibyte)", &cases.StringLenBytes{Val: "世界和平"}, 1},
  598. {"string - min bytes - valid", &cases.StringMinBytes{Val: "proto"}, 0},
  599. {"string - min bytes - valid (min)", &cases.StringMinBytes{Val: "quux"}, 0},
  600. {"string - min bytes - valid (multibyte)", &cases.StringMinBytes{Val: "你好"}, 0},
  601. {"string - min bytes - invalid", &cases.StringMinBytes{Val: ""}, 1},
  602. {"string - max bytes - valid", &cases.StringMaxBytes{Val: "foo"}, 0},
  603. {"string - max bytes - valid (max)", &cases.StringMaxBytes{Val: "12345678"}, 0},
  604. {"string - max bytes - invalid", &cases.StringMaxBytes{Val: "123456789"}, 1},
  605. {"string - max bytes - invalid (multibyte)", &cases.StringMaxBytes{Val: "你好你好你好"}, 1},
  606. {"string - min/max bytes - valid", &cases.StringMinMaxBytes{Val: "protoc"}, 0},
  607. {"string - min/max bytes - valid (min)", &cases.StringMinMaxBytes{Val: "quux"}, 0},
  608. {"string - min/max bytes - valid (max)", &cases.StringMinMaxBytes{Val: "fizzbuzz"}, 0},
  609. {"string - min/max bytes - valid (multibyte)", &cases.StringMinMaxBytes{Val: "你好"}, 0},
  610. {"string - min/max bytes - invalid (below)", &cases.StringMinMaxBytes{Val: "foo"}, 1},
  611. {"string - min/max bytes - invalid (above)", &cases.StringMinMaxBytes{Val: "你好你好你"}, 1},
  612. {"string - equal min/max bytes - valid", &cases.StringEqualMinMaxBytes{Val: "protoc"}, 0},
  613. {"string - equal min/max bytes - invalid", &cases.StringEqualMinMaxBytes{Val: "foo"}, 1},
  614. {"string - pattern - valid", &cases.StringPattern{Val: "Foo123"}, 0},
  615. {"string - pattern - invalid", &cases.StringPattern{Val: "!@#$%^&*()"}, 1},
  616. {"string - pattern - invalid (empty)", &cases.StringPattern{Val: ""}, 1},
  617. {"string - pattern - invalid (null)", &cases.StringPattern{Val: "a\000"}, 1},
  618. {"string - pattern (escapes) - valid", &cases.StringPatternEscapes{Val: "* \\ x"}, 0},
  619. {"string - pattern (escapes) - invalid", &cases.StringPatternEscapes{Val: "invalid"}, 1},
  620. {"string - pattern (escapes) - invalid (empty)", &cases.StringPatternEscapes{Val: ""}, 1},
  621. {"string - prefix - valid", &cases.StringPrefix{Val: "foobar"}, 0},
  622. {"string - prefix - valid (only)", &cases.StringPrefix{Val: "foo"}, 0},
  623. {"string - prefix - invalid", &cases.StringPrefix{Val: "bar"}, 1},
  624. {"string - prefix - invalid (case-sensitive)", &cases.StringPrefix{Val: "Foobar"}, 1},
  625. {"string - contains - valid", &cases.StringContains{Val: "candy bars"}, 0},
  626. {"string - contains - valid (only)", &cases.StringContains{Val: "bar"}, 0},
  627. {"string - contains - invalid", &cases.StringContains{Val: "candy bazs"}, 1},
  628. {"string - contains - invalid (case-sensitive)", &cases.StringContains{Val: "Candy Bars"}, 1},
  629. {"string - not contains - valid", &cases.StringNotContains{Val: "candy bazs"}, 0},
  630. {"string - not contains - valid (case-sensitive)", &cases.StringNotContains{Val: "Candy Bars"}, 0},
  631. {"string - not contains - invalid", &cases.StringNotContains{Val: "candy bars"}, 1},
  632. {"string - not contains - invalid (equal)", &cases.StringNotContains{Val: "bar"}, 1},
  633. {"string - suffix - valid", &cases.StringSuffix{Val: "foobaz"}, 0},
  634. {"string - suffix - valid (only)", &cases.StringSuffix{Val: "baz"}, 0},
  635. {"string - suffix - invalid", &cases.StringSuffix{Val: "foobar"}, 1},
  636. {"string - suffix - invalid (case-sensitive)", &cases.StringSuffix{Val: "FooBaz"}, 1},
  637. {"string - email - valid", &cases.StringEmail{Val: "foo@bar.com"}, 0},
  638. {"string - email - valid (name)", &cases.StringEmail{Val: "John Smith <foo@bar.com>"}, 0},
  639. {"string - email - invalid", &cases.StringEmail{Val: "foobar"}, 1},
  640. {"string - email - invalid (local segment too long)", &cases.StringEmail{Val: "x0123456789012345678901234567890123456789012345678901234567890123456789@example.com"}, 1},
  641. {"string - email - invalid (hostname too long)", &cases.StringEmail{Val: "foo@x0123456789012345678901234567890123456789012345678901234567890123456789.com"}, 1},
  642. {"string - email - invalid (bad hostname)", &cases.StringEmail{Val: "foo@-bar.com"}, 1},
  643. {"string - email - empty", &cases.StringEmail{Val: ""}, 1},
  644. {"string - address - valid hostname", &cases.StringAddress{Val: "example.com"}, 0},
  645. {"string - address - valid hostname (uppercase)", &cases.StringAddress{Val: "ASD.example.com"}, 0},
  646. {"string - address - valid hostname (hyphens)", &cases.StringAddress{Val: "foo-bar.com"}, 0},
  647. {"string - address - valid hostname (trailing dot)", &cases.StringAddress{Val: "example.com."}, 0},
  648. {"string - address - invalid hostname", &cases.StringAddress{Val: "!@#$%^&"}, 1},
  649. {"string - address - invalid hostname (underscore)", &cases.StringAddress{Val: "foo_bar.com"}, 1},
  650. {"string - address - invalid hostname (too long)", &cases.StringAddress{Val: "x0123456789012345678901234567890123456789012345678901234567890123456789.com"}, 1},
  651. {"string - address - invalid hostname (trailing hyphens)", &cases.StringAddress{Val: "foo-bar-.com"}, 1},
  652. {"string - address - invalid hostname (leading hyphens)", &cases.StringAddress{Val: "foo-bar.-com"}, 1},
  653. {"string - address - invalid hostname (empty)", &cases.StringAddress{Val: "asd..asd.com"}, 1},
  654. {"string - address - invalid hostname (IDNs)", &cases.StringAddress{Val: "你好.com"}, 1},
  655. {"string - address - valid ip (v4)", &cases.StringAddress{Val: "192.168.0.1"}, 0},
  656. {"string - address - valid ip (v6)", &cases.StringAddress{Val: "3e::99"}, 0},
  657. {"string - address - invalid ip", &cases.StringAddress{Val: "ff::fff::0b"}, 1},
  658. {"string - hostname - valid", &cases.StringHostname{Val: "example.com"}, 0},
  659. {"string - hostname - valid (uppercase)", &cases.StringHostname{Val: "ASD.example.com"}, 0},
  660. {"string - hostname - valid (hyphens)", &cases.StringHostname{Val: "foo-bar.com"}, 0},
  661. {"string - hostname - valid (trailing dot)", &cases.StringHostname{Val: "example.com."}, 0},
  662. {"string - hostname - invalid", &cases.StringHostname{Val: "!@#$%^&"}, 1},
  663. {"string - hostname - invalid (underscore)", &cases.StringHostname{Val: "foo_bar.com"}, 1},
  664. {"string - hostname - invalid (too long)", &cases.StringHostname{Val: "x0123456789012345678901234567890123456789012345678901234567890123456789.com"}, 1},
  665. {"string - hostname - invalid (trailing hyphens)", &cases.StringHostname{Val: "foo-bar-.com"}, 1},
  666. {"string - hostname - invalid (leading hyphens)", &cases.StringHostname{Val: "foo-bar.-com"}, 1},
  667. {"string - hostname - invalid (empty)", &cases.StringHostname{Val: "asd..asd.com"}, 1},
  668. {"string - hostname - invalid (IDNs)", &cases.StringHostname{Val: "你好.com"}, 1},
  669. {"string - IP - valid (v4)", &cases.StringIP{Val: "192.168.0.1"}, 0},
  670. {"string - IP - valid (v6)", &cases.StringIP{Val: "3e::99"}, 0},
  671. {"string - IP - invalid", &cases.StringIP{Val: "foobar"}, 1},
  672. {"string - IPv4 - valid", &cases.StringIPv4{Val: "192.168.0.1"}, 0},
  673. {"string - IPv4 - invalid", &cases.StringIPv4{Val: "foobar"}, 1},
  674. {"string - IPv4 - invalid (erroneous)", &cases.StringIPv4{Val: "256.0.0.0"}, 1},
  675. {"string - IPv4 - invalid (v6)", &cases.StringIPv4{Val: "3e::99"}, 1},
  676. {"string - IPv6 - valid", &cases.StringIPv6{Val: "2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, 0},
  677. {"string - IPv6 - valid (collapsed)", &cases.StringIPv6{Val: "2001:db8:85a3::8a2e:370:7334"}, 0},
  678. {"string - IPv6 - invalid", &cases.StringIPv6{Val: "foobar"}, 1},
  679. {"string - IPv6 - invalid (v4)", &cases.StringIPv6{Val: "192.168.0.1"}, 1},
  680. {"string - IPv6 - invalid (erroneous)", &cases.StringIPv6{Val: "ff::fff::0b"}, 1},
  681. {"string - URI - valid", &cases.StringURI{Val: "http://example.com/foo/bar?baz=quux"}, 0},
  682. {"string - URI - invalid", &cases.StringURI{Val: "!@#$%^&*%$#"}, 1},
  683. {"string - URI - invalid (relative)", &cases.StringURI{Val: "/foo/bar?baz=quux"}, 1},
  684. {"string - URI - valid", &cases.StringURIRef{Val: "http://example.com/foo/bar?baz=quux"}, 0},
  685. {"string - URI - valid (relative)", &cases.StringURIRef{Val: "/foo/bar?baz=quux"}, 0},
  686. {"string - URI - invalid", &cases.StringURIRef{Val: "!@#$%^&*%$#"}, 1},
  687. {"string - UUID - valid (nil)", &cases.StringUUID{Val: "00000000-0000-0000-0000-000000000000"}, 0},
  688. {"string - UUID - valid (v1)", &cases.StringUUID{Val: "b45c0c80-8880-11e9-a5b1-000000000000"}, 0},
  689. {"string - UUID - valid (v1 - case-insensitive)", &cases.StringUUID{Val: "B45C0C80-8880-11E9-A5B1-000000000000"}, 0},
  690. {"string - UUID - valid (v2)", &cases.StringUUID{Val: "b45c0c80-8880-21e9-a5b1-000000000000"}, 0},
  691. {"string - UUID - valid (v2 - case-insensitive)", &cases.StringUUID{Val: "B45C0C80-8880-21E9-A5B1-000000000000"}, 0},
  692. {"string - UUID - valid (v3)", &cases.StringUUID{Val: "a3bb189e-8bf9-3888-9912-ace4e6543002"}, 0},
  693. {"string - UUID - valid (v3 - case-insensitive)", &cases.StringUUID{Val: "A3BB189E-8BF9-3888-9912-ACE4E6543002"}, 0},
  694. {"string - UUID - valid (v4)", &cases.StringUUID{Val: "8b208305-00e8-4460-a440-5e0dcd83bb0a"}, 0},
  695. {"string - UUID - valid (v4 - case-insensitive)", &cases.StringUUID{Val: "8B208305-00E8-4460-A440-5E0DCD83BB0A"}, 0},
  696. {"string - UUID - valid (v5)", &cases.StringUUID{Val: "a6edc906-2f9f-5fb2-a373-efac406f0ef2"}, 0},
  697. {"string - UUID - valid (v5 - case-insensitive)", &cases.StringUUID{Val: "A6EDC906-2F9F-5FB2-A373-EFAC406F0EF2"}, 0},
  698. {"string - UUID - invalid", &cases.StringUUID{Val: "foobar"}, 1},
  699. {"string - UUID - invalid (bad UUID)", &cases.StringUUID{Val: "ffffffff-ffff-ffff-ffff-fffffffffffff"}, 1},
  700. {"string - UUID - valid (ignore_empty)", &cases.StringUUIDIgnore{Val: ""}, 0},
  701. {"string - http header name - valid", &cases.StringHttpHeaderName{Val: "clustername"}, 0},
  702. {"string - http header name - valid", &cases.StringHttpHeaderName{Val: ":path"}, 0},
  703. {"string - http header name - valid (nums)", &cases.StringHttpHeaderName{Val: "cluster-123"}, 0},
  704. {"string - http header name - valid (special token)", &cases.StringHttpHeaderName{Val: "!+#&.%"}, 0},
  705. {"string - http header name - valid (period)", &cases.StringHttpHeaderName{Val: "CLUSTER.NAME"}, 0},
  706. {"string - http header name - invalid", &cases.StringHttpHeaderName{Val: ":"}, 1},
  707. {"string - http header name - invalid", &cases.StringHttpHeaderName{Val: ":path:"}, 1},
  708. {"string - http header name - invalid (space)", &cases.StringHttpHeaderName{Val: "cluster name"}, 1},
  709. {"string - http header name - invalid (return)", &cases.StringHttpHeaderName{Val: "example\r"}, 1},
  710. {"string - http header name - invalid (tab)", &cases.StringHttpHeaderName{Val: "example\t"}, 1},
  711. {"string - http header name - invalid (slash)", &cases.StringHttpHeaderName{Val: "/test/long/url"}, 1},
  712. {"string - http header value - valid", &cases.StringHttpHeaderValue{Val: "cluster.name.123"}, 0},
  713. {"string - http header value - valid (uppercase)", &cases.StringHttpHeaderValue{Val: "/TEST/LONG/URL"}, 0},
  714. {"string - http header value - valid (spaces)", &cases.StringHttpHeaderValue{Val: "cluster name"}, 0},
  715. {"string - http header value - valid (tab)", &cases.StringHttpHeaderValue{Val: "example\t"}, 0},
  716. {"string - http header value - valid (special token)", &cases.StringHttpHeaderValue{Val: "!#%&./+"}, 0},
  717. {"string - http header value - invalid (NUL)", &cases.StringHttpHeaderValue{Val: "foo\u0000bar"}, 1},
  718. {"string - http header value - invalid (DEL)", &cases.StringHttpHeaderValue{Val: "\u007f"}, 1},
  719. {"string - http header value - invalid", &cases.StringHttpHeaderValue{Val: "example\r"}, 1},
  720. {"string - non-strict valid header - valid", &cases.StringValidHeader{Val: "cluster.name.123"}, 0},
  721. {"string - non-strict valid header - valid (uppercase)", &cases.StringValidHeader{Val: "/TEST/LONG/URL"}, 0},
  722. {"string - non-strict valid header - valid (spaces)", &cases.StringValidHeader{Val: "cluster name"}, 0},
  723. {"string - non-strict valid header - valid (tab)", &cases.StringValidHeader{Val: "example\t"}, 0},
  724. {"string - non-strict valid header - valid (DEL)", &cases.StringValidHeader{Val: "\u007f"}, 0},
  725. {"string - non-strict valid header - invalid (NUL)", &cases.StringValidHeader{Val: "foo\u0000bar"}, 1},
  726. {"string - non-strict valid header - invalid (CR)", &cases.StringValidHeader{Val: "example\r"}, 1},
  727. {"string - non-strict valid header - invalid (NL)", &cases.StringValidHeader{Val: "exa\u000Ample"}, 1},
  728. }
  729. var bytesCases = []TestCase{
  730. {"bytes - none - valid", &cases.BytesNone{Val: []byte("quux")}, 0},
  731. {"bytes - const - valid", &cases.BytesConst{Val: []byte("foo")}, 0},
  732. {"bytes - const - invalid", &cases.BytesConst{Val: []byte("bar")}, 1},
  733. {"bytes - in - valid", &cases.BytesIn{Val: []byte("bar")}, 0},
  734. {"bytes - in - invalid", &cases.BytesIn{Val: []byte("quux")}, 1},
  735. {"bytes - not in - valid", &cases.BytesNotIn{Val: []byte("quux")}, 0},
  736. {"bytes - not in - invalid", &cases.BytesNotIn{Val: []byte("fizz")}, 1},
  737. {"bytes - len - valid", &cases.BytesLen{Val: []byte("baz")}, 0},
  738. {"bytes - len - invalid (lt)", &cases.BytesLen{Val: []byte("go")}, 1},
  739. {"bytes - len - invalid (gt)", &cases.BytesLen{Val: []byte("fizz")}, 1},
  740. {"bytes - min len - valid", &cases.BytesMinLen{Val: []byte("fizz")}, 0},
  741. {"bytes - min len - valid (min)", &cases.BytesMinLen{Val: []byte("baz")}, 0},
  742. {"bytes - min len - invalid", &cases.BytesMinLen{Val: []byte("go")}, 1},
  743. {"bytes - max len - valid", &cases.BytesMaxLen{Val: []byte("foo")}, 0},
  744. {"bytes - max len - valid (max)", &cases.BytesMaxLen{Val: []byte("proto")}, 0},
  745. {"bytes - max len - invalid", &cases.BytesMaxLen{Val: []byte("1234567890")}, 1},
  746. {"bytes - min/max len - valid", &cases.BytesMinMaxLen{Val: []byte("quux")}, 0},
  747. {"bytes - min/max len - valid (min)", &cases.BytesMinMaxLen{Val: []byte("foo")}, 0},
  748. {"bytes - min/max len - valid (max)", &cases.BytesMinMaxLen{Val: []byte("proto")}, 0},
  749. {"bytes - min/max len - invalid (below)", &cases.BytesMinMaxLen{Val: []byte("go")}, 1},
  750. {"bytes - min/max len - invalid (above)", &cases.BytesMinMaxLen{Val: []byte("validate")}, 1},
  751. {"bytes - equal min/max len - valid", &cases.BytesEqualMinMaxLen{Val: []byte("proto")}, 0},
  752. {"bytes - equal min/max len - invalid", &cases.BytesEqualMinMaxLen{Val: []byte("validate")}, 1},
  753. {"bytes - pattern - valid", &cases.BytesPattern{Val: []byte("Foo123")}, 0},
  754. {"bytes - pattern - invalid", &cases.BytesPattern{Val: []byte("你好你好")}, 1},
  755. {"bytes - pattern - invalid (empty)", &cases.BytesPattern{Val: []byte("")}, 1},
  756. {"bytes - prefix - valid", &cases.BytesPrefix{Val: []byte{0x99, 0x9f, 0x08}}, 0},
  757. {"bytes - prefix - valid (only)", &cases.BytesPrefix{Val: []byte{0x99}}, 0},
  758. {"bytes - prefix - invalid", &cases.BytesPrefix{Val: []byte("bar")}, 1},
  759. {"bytes - contains - valid", &cases.BytesContains{Val: []byte("candy bars")}, 0},
  760. {"bytes - contains - valid (only)", &cases.BytesContains{Val: []byte("bar")}, 0},
  761. {"bytes - contains - invalid", &cases.BytesContains{Val: []byte("candy bazs")}, 1},
  762. {"bytes - suffix - valid", &cases.BytesSuffix{Val: []byte{0x62, 0x75, 0x7A, 0x7A}}, 0},
  763. {"bytes - suffix - valid (only)", &cases.BytesSuffix{Val: []byte("\x62\x75\x7A\x7A")}, 0},
  764. {"bytes - suffix - invalid", &cases.BytesSuffix{Val: []byte("foobar")}, 1},
  765. {"bytes - suffix - invalid (case-sensitive)", &cases.BytesSuffix{Val: []byte("FooBaz")}, 1},
  766. {"bytes - IP - valid (v4)", &cases.BytesIP{Val: []byte{0xC0, 0xA8, 0x00, 0x01}}, 0},
  767. {"bytes - IP - valid (v6)", &cases.BytesIP{Val: []byte("\x20\x01\x0D\xB8\x85\xA3\x00\x00\x00\x00\x8A\x2E\x03\x70\x73\x34")}, 0},
  768. {"bytes - IP - invalid", &cases.BytesIP{Val: []byte("foobar")}, 1},
  769. {"bytes - IPv4 - valid", &cases.BytesIPv4{Val: []byte{0xC0, 0xA8, 0x00, 0x01}}, 0},
  770. {"bytes - IPv4 - invalid", &cases.BytesIPv4{Val: []byte("foobar")}, 1},
  771. {"bytes - IPv4 - invalid (v6)", &cases.BytesIPv4{Val: []byte("\x20\x01\x0D\xB8\x85\xA3\x00\x00\x00\x00\x8A\x2E\x03\x70\x73\x34")}, 1},
  772. {"bytes - IPv6 - valid", &cases.BytesIPv6{Val: []byte("\x20\x01\x0D\xB8\x85\xA3\x00\x00\x00\x00\x8A\x2E\x03\x70\x73\x34")}, 0},
  773. {"bytes - IPv6 - invalid", &cases.BytesIPv6{Val: []byte("fooar")}, 1},
  774. {"bytes - IPv6 - invalid (v4)", &cases.BytesIPv6{Val: []byte{0xC0, 0xA8, 0x00, 0x01}}, 1},
  775. {"bytes - IPv6 - valid (ignore_empty)", &cases.BytesIPv6Ignore{Val: nil}, 0},
  776. }
  777. var enumCases = []TestCase{
  778. {"enum - none - valid", &cases.EnumNone{Val: cases.TestEnum_ONE}, 0},
  779. {"enum - const - valid", &cases.EnumConst{Val: cases.TestEnum_TWO}, 0},
  780. {"enum - const - invalid", &cases.EnumConst{Val: cases.TestEnum_ONE}, 1},
  781. {"enum alias - const - valid", &cases.EnumAliasConst{Val: cases.TestEnumAlias_C}, 0},
  782. {"enum alias - const - valid (alias)", &cases.EnumAliasConst{Val: cases.TestEnumAlias_GAMMA}, 0},
  783. {"enum alias - const - invalid", &cases.EnumAliasConst{Val: cases.TestEnumAlias_ALPHA}, 1},
  784. {"enum - defined_only - valid", &cases.EnumDefined{Val: 0}, 0},
  785. {"enum - defined_only - invalid", &cases.EnumDefined{Val: math.MaxInt32}, 1},
  786. {"enum alias - defined_only - valid", &cases.EnumAliasDefined{Val: 1}, 0},
  787. {"enum alias - defined_only - invalid", &cases.EnumAliasDefined{Val: math.MaxInt32}, 1},
  788. {"enum - in - valid", &cases.EnumIn{Val: cases.TestEnum_TWO}, 0},
  789. {"enum - in - invalid", &cases.EnumIn{Val: cases.TestEnum_ONE}, 1},
  790. {"enum alias - in - valid", &cases.EnumAliasIn{Val: cases.TestEnumAlias_A}, 0},
  791. {"enum alias - in - valid (alias)", &cases.EnumAliasIn{Val: cases.TestEnumAlias_ALPHA}, 0},
  792. {"enum alias - in - invalid", &cases.EnumAliasIn{Val: cases.TestEnumAlias_BETA}, 1},
  793. {"enum - not in - valid", &cases.EnumNotIn{Val: cases.TestEnum_ZERO}, 0},
  794. {"enum - not in - valid (undefined)", &cases.EnumNotIn{Val: math.MaxInt32}, 0},
  795. {"enum - not in - invalid", &cases.EnumNotIn{Val: cases.TestEnum_ONE}, 1},
  796. {"enum alias - not in - valid", &cases.EnumAliasNotIn{Val: cases.TestEnumAlias_ALPHA}, 0},
  797. {"enum alias - not in - invalid", &cases.EnumAliasNotIn{Val: cases.TestEnumAlias_B}, 1},
  798. {"enum alias - not in - invalid (alias)", &cases.EnumAliasNotIn{Val: cases.TestEnumAlias_BETA}, 1},
  799. {"enum external - defined_only - valid", &cases.EnumExternal{Val: other_package.Embed_VALUE}, 0},
  800. {"enum external - defined_only - invalid", &cases.EnumExternal{Val: math.MaxInt32}, 1},
  801. {"enum repeated - defined_only - valid", &cases.RepeatedEnumDefined{Val: []cases.TestEnum{cases.TestEnum_ONE, cases.TestEnum_TWO}}, 0},
  802. {"enum repeated - defined_only - invalid", &cases.RepeatedEnumDefined{Val: []cases.TestEnum{cases.TestEnum_ONE, math.MaxInt32}}, 1},
  803. {"enum repeated (external) - defined_only - valid", &cases.RepeatedExternalEnumDefined{Val: []other_package.Embed_Enumerated{other_package.Embed_VALUE}}, 0},
  804. {"enum repeated (external) - defined_only - invalid", &cases.RepeatedExternalEnumDefined{Val: []other_package.Embed_Enumerated{math.MaxInt32}}, 1},
  805. {"enum map - defined_only - valid", &cases.MapEnumDefined{Val: map[string]cases.TestEnum{"foo": cases.TestEnum_TWO}}, 0},
  806. {"enum map - defined_only - invalid", &cases.MapEnumDefined{Val: map[string]cases.TestEnum{"foo": math.MaxInt32}}, 1},
  807. {"enum map (external) - defined_only - valid", &cases.MapExternalEnumDefined{Val: map[string]other_package.Embed_Enumerated{"foo": other_package.Embed_VALUE}}, 0},
  808. {"enum map (external) - defined_only - invalid", &cases.MapExternalEnumDefined{Val: map[string]other_package.Embed_Enumerated{"foo": math.MaxInt32}}, 1},
  809. }
  810. var messageCases = []TestCase{
  811. {"message - none - valid", &cases.MessageNone{Val: &cases.MessageNone_NoneMsg{}}, 0},
  812. {"message - none - valid (unset)", &cases.MessageNone{}, 0},
  813. {"message - disabled - valid", &cases.MessageDisabled{Val: 456}, 0},
  814. {"message - disabled - valid (invalid field)", &cases.MessageDisabled{Val: 0}, 0},
  815. {"message - ignored - valid", &cases.MessageIgnored{Val: 456}, 0},
  816. {"message - ignored - valid (invalid field)", &cases.MessageIgnored{Val: 0}, 0},
  817. {"message - field - valid", &cases.Message{Val: &cases.TestMsg{Const: "foo"}}, 0},
  818. {"message - field - valid (unset)", &cases.Message{}, 0},
  819. {"message - field - invalid", &cases.Message{Val: &cases.TestMsg{}}, 1},
  820. {"message - field - invalid (transitive)", &cases.Message{Val: &cases.TestMsg{Const: "foo", Nested: &cases.TestMsg{}}}, 1},
  821. {"message - skip - valid", &cases.MessageSkip{Val: &cases.TestMsg{}}, 0},
  822. {"message - required - valid", &cases.MessageRequired{Val: &cases.TestMsg{Const: "foo"}}, 0},
  823. {"message - required - valid (oneof)", &cases.MessageRequiredOneof{One: &cases.MessageRequiredOneof_Val{&cases.TestMsg{Const: "foo"}}}, 0},
  824. {"message - required - invalid", &cases.MessageRequired{}, 1},
  825. {"message - required - invalid (oneof)", &cases.MessageRequiredOneof{}, 1},
  826. {"message - cross-package embed none - valid", &cases.MessageCrossPackage{Val: &other_package.Embed{Val: 1}}, 0},
  827. {"message - cross-package embed none - valid (nil)", &cases.MessageCrossPackage{}, 0},
  828. {"message - cross-package embed none - valid (empty)", &cases.MessageCrossPackage{Val: &other_package.Embed{}}, 1},
  829. {"message - cross-package embed none - invalid", &cases.MessageCrossPackage{Val: &other_package.Embed{Val: -1}}, 1},
  830. }
  831. var repeatedCases = []TestCase{
  832. {"repeated - none - valid", &cases.RepeatedNone{Val: []int64{1, 2, 3}}, 0},
  833. {"repeated - embed none - valid", &cases.RepeatedEmbedNone{Val: []*cases.Embed{{Val: 1}}}, 0},
  834. {"repeated - embed none - valid (nil)", &cases.RepeatedEmbedNone{}, 0},
  835. {"repeated - embed none - valid (empty)", &cases.RepeatedEmbedNone{Val: []*cases.Embed{}}, 0},
  836. {"repeated - embed none - invalid", &cases.RepeatedEmbedNone{Val: []*cases.Embed{{Val: -1}}}, 1},
  837. {"repeated - cross-package embed none - valid", &cases.RepeatedEmbedCrossPackageNone{Val: []*other_package.Embed{{Val: 1}}}, 0},
  838. {"repeated - cross-package embed none - valid (nil)", &cases.RepeatedEmbedCrossPackageNone{}, 0},
  839. {"repeated - cross-package embed none - valid (empty)", &cases.RepeatedEmbedCrossPackageNone{Val: []*other_package.Embed{}}, 0},
  840. {"repeated - cross-package embed none - invalid", &cases.RepeatedEmbedCrossPackageNone{Val: []*other_package.Embed{{Val: -1}}}, 1},
  841. {"repeated - min - valid", &cases.RepeatedMin{Val: []*cases.Embed{{Val: 1}, {Val: 2}, {Val: 3}}}, 0},
  842. {"repeated - min - valid (equal)", &cases.RepeatedMin{Val: []*cases.Embed{{Val: 1}, {Val: 2}}}, 0},
  843. {"repeated - min - invalid", &cases.RepeatedMin{Val: []*cases.Embed{{Val: 1}}}, 1},
  844. {"repeated - min - invalid (element)", &cases.RepeatedMin{Val: []*cases.Embed{{Val: 1}, {Val: -1}}}, 1},
  845. {"repeated - max - valid", &cases.RepeatedMax{Val: []float64{1, 2}}, 0},
  846. {"repeated - max - valid (equal)", &cases.RepeatedMax{Val: []float64{1, 2, 3}}, 0},
  847. {"repeated - max - invalid", &cases.RepeatedMax{Val: []float64{1, 2, 3, 4}}, 1},
  848. {"repeated - min/max - valid", &cases.RepeatedMinMax{Val: []int32{1, 2, 3}}, 0},
  849. {"repeated - min/max - valid (min)", &cases.RepeatedMinMax{Val: []int32{1, 2}}, 0},
  850. {"repeated - min/max - valid (max)", &cases.RepeatedMinMax{Val: []int32{1, 2, 3, 4}}, 0},
  851. {"repeated - min/max - invalid (below)", &cases.RepeatedMinMax{Val: []int32{}}, 1},
  852. {"repeated - min/max - invalid (above)", &cases.RepeatedMinMax{Val: []int32{1, 2, 3, 4, 5}}, 1},
  853. {"repeated - exact - valid", &cases.RepeatedExact{Val: []uint32{1, 2, 3}}, 0},
  854. {"repeated - exact - invalid (below)", &cases.RepeatedExact{Val: []uint32{1, 2}}, 1},
  855. {"repeated - exact - invalid (above)", &cases.RepeatedExact{Val: []uint32{1, 2, 3, 4}}, 1},
  856. {"repeated - unique - valid", &cases.RepeatedUnique{Val: []string{"foo", "bar", "baz"}}, 0},
  857. {"repeated - unique - valid (empty)", &cases.RepeatedUnique{}, 0},
  858. {"repeated - unique - valid (case sensitivity)", &cases.RepeatedUnique{Val: []string{"foo", "Foo"}}, 0},
  859. {"repeated - unique - invalid", &cases.RepeatedUnique{Val: []string{"foo", "bar", "foo", "baz"}}, 1},
  860. {"repeated - items - valid", &cases.RepeatedItemRule{Val: []float32{1, 2, 3}}, 0},
  861. {"repeated - items - valid (empty)", &cases.RepeatedItemRule{Val: []float32{}}, 0},
  862. {"repeated - items - valid (pattern)", &cases.RepeatedItemPattern{Val: []string{"Alpha", "Beta123"}}, 0},
  863. {"repeated - items - invalid", &cases.RepeatedItemRule{Val: []float32{1, -2, 3}}, 1},
  864. {"repeated - items - invalid (pattern)", &cases.RepeatedItemPattern{Val: []string{"Alpha", "!@#$%^&*()"}}, 1},
  865. {"repeated - items - invalid (in)", &cases.RepeatedItemIn{Val: []string{"baz"}}, 1},
  866. {"repeated - items - valid (in)", &cases.RepeatedItemIn{Val: []string{"foo"}}, 0},
  867. {"repeated - items - invalid (not_in)", &cases.RepeatedItemNotIn{Val: []string{"foo"}}, 1},
  868. {"repeated - items - valid (not_in)", &cases.RepeatedItemNotIn{Val: []string{"baz"}}, 0},
  869. {"repeated - items - invalid (enum in)", &cases.RepeatedEnumIn{Val: []cases.AnEnum{1}}, 1},
  870. {"repeated - items - valid (enum in)", &cases.RepeatedEnumIn{Val: []cases.AnEnum{0}}, 0},
  871. {"repeated - items - invalid (enum not_in)", &cases.RepeatedEnumNotIn{Val: []cases.AnEnum{0}}, 1},
  872. {"repeated - items - valid (enum not_in)", &cases.RepeatedEnumNotIn{Val: []cases.AnEnum{1}}, 0},
  873. {"repeated - items - invalid (embedded enum in)", &cases.RepeatedEmbeddedEnumIn{Val: []cases.RepeatedEmbeddedEnumIn_AnotherInEnum{1}}, 1},
  874. {"repeated - items - valid (embedded enum in)", &cases.RepeatedEmbeddedEnumIn{Val: []cases.RepeatedEmbeddedEnumIn_AnotherInEnum{0}}, 0},
  875. {"repeated - items - invalid (embedded enum not_in)", &cases.RepeatedEmbeddedEnumNotIn{Val: []cases.RepeatedEmbeddedEnumNotIn_AnotherNotInEnum{0}}, 1},
  876. {"repeated - items - valid (embedded enum not_in)", &cases.RepeatedEmbeddedEnumNotIn{Val: []cases.RepeatedEmbeddedEnumNotIn_AnotherNotInEnum{1}}, 0},
  877. {"repeated - embed skip - valid", &cases.RepeatedEmbedSkip{Val: []*cases.Embed{{Val: 1}}}, 0},
  878. {"repeated - embed skip - valid (invalid element)", &cases.RepeatedEmbedSkip{Val: []*cases.Embed{{Val: -1}}}, 0},
  879. {"repeated - min and items len - valid", &cases.RepeatedMinAndItemLen{Val: []string{"aaa", "bbb"}}, 0},
  880. {"repeated - min and items len - invalid (min)", &cases.RepeatedMinAndItemLen{Val: []string{}}, 1},
  881. {"repeated - min and items len - invalid (len)", &cases.RepeatedMinAndItemLen{Val: []string{"x"}}, 1},
  882. {"repeated - min and max items len - valid", &cases.RepeatedMinAndMaxItemLen{Val: []string{"aaa", "bbb"}}, 0},
  883. {"repeated - min and max items len - invalid (min_len)", &cases.RepeatedMinAndMaxItemLen{}, 1},
  884. {"repeated - min and max items len - invalid (max_len)", &cases.RepeatedMinAndMaxItemLen{Val: []string{"aaa", "bbb", "ccc", "ddd"}}, 1},
  885. {"repeated - duration - gte - valid", &cases.RepeatedDuration{Val: []*durationpb.Duration{{Seconds: 3}}}, 0},
  886. {"repeated - duration - gte - valid (empty)", &cases.RepeatedDuration{}, 0},
  887. {"repeated - duration - gte - valid (equal)", &cases.RepeatedDuration{Val: []*durationpb.Duration{{Nanos: 1000000}}}, 0},
  888. {"repeated - duration - gte - invalid", &cases.RepeatedDuration{Val: []*durationpb.Duration{{Seconds: -1}}}, 1},
  889. {"repeated - exact - valid (ignore_empty)", &cases.RepeatedExactIgnore{Val: nil}, 0},
  890. }
  891. var mapCases = []TestCase{
  892. {"map - none - valid", &cases.MapNone{Val: map[uint32]bool{123: true, 456: false}}, 0},
  893. {"map - min pairs - valid", &cases.MapMin{Val: map[int32]float32{1: 2, 3: 4, 5: 6}}, 0},
  894. {"map - min pairs - valid (equal)", &cases.MapMin{Val: map[int32]float32{1: 2, 3: 4}}, 0},
  895. {"map - min pairs - invalid", &cases.MapMin{Val: map[int32]float32{1: 2}}, 1},
  896. {"map - max pairs - valid", &cases.MapMax{Val: map[int64]float64{1: 2, 3: 4}}, 0},
  897. {"map - max pairs - valid (equal)", &cases.MapMax{Val: map[int64]float64{1: 2, 3: 4, 5: 6}}, 0},
  898. {"map - max pairs - invalid", &cases.MapMax{Val: map[int64]float64{1: 2, 3: 4, 5: 6, 7: 8}}, 1},
  899. {"map - min/max - valid", &cases.MapMinMax{Val: map[string]bool{"a": true, "b": false, "c": true}}, 0},
  900. {"map - min/max - valid (min)", &cases.MapMinMax{Val: map[string]bool{"a": true, "b": false}}, 0},
  901. {"map - min/max - valid (max)", &cases.MapMinMax{Val: map[string]bool{"a": true, "b": false, "c": true, "d": false}}, 0},
  902. {"map - min/max - invalid (below)", &cases.MapMinMax{Val: map[string]bool{}}, 1},
  903. {"map - min/max - invalid (above)", &cases.MapMinMax{Val: map[string]bool{"a": true, "b": false, "c": true, "d": false, "e": true}}, 1},
  904. {"map - exact - valid", &cases.MapExact{Val: map[uint64]string{1: "a", 2: "b", 3: "c"}}, 0},
  905. {"map - exact - invalid (below)", &cases.MapExact{Val: map[uint64]string{1: "a", 2: "b"}}, 1},
  906. {"map - exact - invalid (above)", &cases.MapExact{Val: map[uint64]string{1: "a", 2: "b", 3: "c", 4: "d"}}, 1},
  907. {"map - no sparse - valid", &cases.MapNoSparse{Val: map[uint32]*cases.MapNoSparse_Msg{1: {}, 2: {}}}, 0},
  908. {"map - no sparse - valid (empty)", &cases.MapNoSparse{Val: map[uint32]*cases.MapNoSparse_Msg{}}, 0},
  909. // sparse maps are no longer supported, so this case is no longer possible
  910. //{"map - no sparse - invalid", &cases.MapNoSparse{Val: map[uint32]*cases.MapNoSparse_Msg{1: {}, 2: nil}}, 1},
  911. {"map - keys - valid", &cases.MapKeys{Val: map[int64]string{-1: "a", -2: "b"}}, 0},
  912. {"map - keys - valid (empty)", &cases.MapKeys{Val: map[int64]string{}}, 0},
  913. {"map - keys - valid (pattern)", &cases.MapKeysPattern{Val: map[string]string{"A": "a"}}, 0},
  914. {"map - keys - invalid", &cases.MapKeys{Val: map[int64]string{1: "a"}}, 1},
  915. {"map - keys - invalid (pattern)", &cases.MapKeysPattern{Val: map[string]string{"A": "a", "!@#$%^&*()": "b"}}, 1},
  916. {"map - values - valid", &cases.MapValues{Val: map[string]string{"a": "Alpha", "b": "Beta"}}, 0},
  917. {"map - values - valid (empty)", &cases.MapValues{Val: map[string]string{}}, 0},
  918. {"map - values - valid (pattern)", &cases.MapValuesPattern{Val: map[string]string{"a": "A"}}, 0},
  919. {"map - values - invalid", &cases.MapValues{Val: map[string]string{"a": "A", "b": "B"}}, 2},
  920. {"map - values - invalid (pattern)", &cases.MapValuesPattern{Val: map[string]string{"a": "A", "b": "!@#$%^&*()"}}, 1},
  921. {"map - recursive - valid", &cases.MapRecursive{Val: map[uint32]*cases.MapRecursive_Msg{1: {Val: "abc"}}}, 0},
  922. {"map - recursive - invalid", &cases.MapRecursive{Val: map[uint32]*cases.MapRecursive_Msg{1: {}}}, 1},
  923. {"map - exact - valid (ignore_empty)", &cases.MapExactIgnore{Val: nil}, 0},
  924. }
  925. var oneofCases = []TestCase{
  926. {"oneof - none - valid", &cases.OneOfNone{O: &cases.OneOfNone_X{X: "foo"}}, 0},
  927. {"oneof - none - valid (empty)", &cases.OneOfNone{}, 0},
  928. {"oneof - field - valid (X)", &cases.OneOf{O: &cases.OneOf_X{X: "foobar"}}, 0},
  929. {"oneof - field - valid (Y)", &cases.OneOf{O: &cases.OneOf_Y{Y: 123}}, 0},
  930. {"oneof - field - valid (Z)", &cases.OneOf{O: &cases.OneOf_Z{Z: &cases.TestOneOfMsg{Val: true}}}, 0},
  931. {"oneof - field - valid (empty)", &cases.OneOf{}, 0},
  932. {"oneof - field - invalid (X)", &cases.OneOf{O: &cases.OneOf_X{X: "fizzbuzz"}}, 1},
  933. {"oneof - field - invalid (Y)", &cases.OneOf{O: &cases.OneOf_Y{Y: -1}}, 1},
  934. {"oneof - filed - invalid (Z)", &cases.OneOf{O: &cases.OneOf_Z{Z: &cases.TestOneOfMsg{}}}, 1},
  935. {"oneof - required - valid", &cases.OneOfRequired{O: &cases.OneOfRequired_X{X: ""}}, 0},
  936. {"oneof - require - invalid", &cases.OneOfRequired{}, 1},
  937. }
  938. var wrapperCases = []TestCase{
  939. {"wrapper - none - valid", &cases.WrapperNone{Val: &wrapperspb.Int32Value{Value: 123}}, 0},
  940. {"wrapper - none - valid (empty)", &cases.WrapperNone{Val: nil}, 0},
  941. {"wrapper - float - valid", &cases.WrapperFloat{Val: &wrapperspb.FloatValue{Value: 1}}, 0},
  942. {"wrapper - float - valid (empty)", &cases.WrapperFloat{Val: nil}, 0},
  943. {"wrapper - float - invalid", &cases.WrapperFloat{Val: &wrapperspb.FloatValue{Value: 0}}, 1},
  944. {"wrapper - double - valid", &cases.WrapperDouble{Val: &wrapperspb.DoubleValue{Value: 1}}, 0},
  945. {"wrapper - double - valid (empty)", &cases.WrapperDouble{Val: nil}, 0},
  946. {"wrapper - double - invalid", &cases.WrapperDouble{Val: &wrapperspb.DoubleValue{Value: 0}}, 1},
  947. {"wrapper - int64 - valid", &cases.WrapperInt64{Val: &wrapperspb.Int64Value{Value: 1}}, 0},
  948. {"wrapper - int64 - valid (empty)", &cases.WrapperInt64{Val: nil}, 0},
  949. {"wrapper - int64 - invalid", &cases.WrapperInt64{Val: &wrapperspb.Int64Value{Value: 0}}, 1},
  950. {"wrapper - int32 - valid", &cases.WrapperInt32{Val: &wrapperspb.Int32Value{Value: 1}}, 0},
  951. {"wrapper - int32 - valid (empty)", &cases.WrapperInt32{Val: nil}, 0},
  952. {"wrapper - int32 - invalid", &cases.WrapperInt32{Val: &wrapperspb.Int32Value{Value: 0}}, 1},
  953. {"wrapper - uint64 - valid", &cases.WrapperUInt64{Val: &wrapperspb.UInt64Value{Value: 1}}, 0},
  954. {"wrapper - uint64 - valid (empty)", &cases.WrapperUInt64{Val: nil}, 0},
  955. {"wrapper - uint64 - invalid", &cases.WrapperUInt64{Val: &wrapperspb.UInt64Value{Value: 0}}, 1},
  956. {"wrapper - uint32 - valid", &cases.WrapperUInt32{Val: &wrapperspb.UInt32Value{Value: 1}}, 0},
  957. {"wrapper - uint32 - valid (empty)", &cases.WrapperUInt32{Val: nil}, 0},
  958. {"wrapper - uint32 - invalid", &cases.WrapperUInt32{Val: &wrapperspb.UInt32Value{Value: 0}}, 1},
  959. {"wrapper - bool - valid", &cases.WrapperBool{Val: &wrapperspb.BoolValue{Value: true}}, 0},
  960. {"wrapper - bool - valid (empty)", &cases.WrapperBool{Val: nil}, 0},
  961. {"wrapper - bool - invalid", &cases.WrapperBool{Val: &wrapperspb.BoolValue{Value: false}}, 1},
  962. {"wrapper - string - valid", &cases.WrapperString{Val: &wrapperspb.StringValue{Value: "foobar"}}, 0},
  963. {"wrapper - string - valid (empty)", &cases.WrapperString{Val: nil}, 0},
  964. {"wrapper - string - invalid", &cases.WrapperString{Val: &wrapperspb.StringValue{Value: "fizzbuzz"}}, 1},
  965. {"wrapper - bytes - valid", &cases.WrapperBytes{Val: &wrapperspb.BytesValue{Value: []byte("foo")}}, 0},
  966. {"wrapper - bytes - valid (empty)", &cases.WrapperBytes{Val: nil}, 0},
  967. {"wrapper - bytes - invalid", &cases.WrapperBytes{Val: &wrapperspb.BytesValue{Value: []byte("x")}}, 1},
  968. {"wrapper - required - string - valid", &cases.WrapperRequiredString{Val: &wrapperspb.StringValue{Value: "bar"}}, 0},
  969. {"wrapper - required - string - invalid", &cases.WrapperRequiredString{Val: &wrapperspb.StringValue{Value: "foo"}}, 1},
  970. {"wrapper - required - string - invalid (empty)", &cases.WrapperRequiredString{}, 1},
  971. {"wrapper - required - string (empty) - valid", &cases.WrapperRequiredEmptyString{Val: &wrapperspb.StringValue{Value: ""}}, 0},
  972. {"wrapper - required - string (empty) - invalid", &cases.WrapperRequiredEmptyString{Val: &wrapperspb.StringValue{Value: "foo"}}, 1},
  973. {"wrapper - required - string (empty) - invalid (empty)", &cases.WrapperRequiredEmptyString{}, 1},
  974. {"wrapper - optional - string (uuid) - valid", &cases.WrapperOptionalUuidString{Val: &wrapperspb.StringValue{Value: "8b72987b-024a-43b3-b4cf-647a1f925c5d"}}, 0},
  975. {"wrapper - optional - string (uuid) - valid (empty)", &cases.WrapperOptionalUuidString{}, 0},
  976. {"wrapper - optional - string (uuid) - invalid", &cases.WrapperOptionalUuidString{Val: &wrapperspb.StringValue{Value: "foo"}}, 1},
  977. {"wrapper - required - float - valid", &cases.WrapperRequiredFloat{Val: &wrapperspb.FloatValue{Value: 1}}, 0},
  978. {"wrapper - required - float - invalid", &cases.WrapperRequiredFloat{Val: &wrapperspb.FloatValue{Value: -5}}, 1},
  979. {"wrapper - required - float - invalid (empty)", &cases.WrapperRequiredFloat{}, 1},
  980. }
  981. var durationCases = []TestCase{
  982. {"duration - none - valid", &cases.DurationNone{Val: &durationpb.Duration{Seconds: 123}}, 0},
  983. {"duration - required - valid", &cases.DurationRequired{Val: &durationpb.Duration{}}, 0},
  984. {"duration - required - invalid", &cases.DurationRequired{Val: nil}, 1},
  985. {"duration - const - valid", &cases.DurationConst{Val: &durationpb.Duration{Seconds: 3}}, 0},
  986. {"duration - const - valid (empty)", &cases.DurationConst{}, 0},
  987. {"duration - const - invalid", &cases.DurationConst{Val: &durationpb.Duration{Nanos: 3}}, 1},
  988. {"duration - in - valid", &cases.DurationIn{Val: &durationpb.Duration{Seconds: 1}}, 0},
  989. {"duration - in - valid (empty)", &cases.DurationIn{}, 0},
  990. {"duration - in - invalid", &cases.DurationIn{Val: &durationpb.Duration{}}, 1},
  991. {"duration - not in - valid", &cases.DurationNotIn{Val: &durationpb.Duration{Nanos: 1}}, 0},
  992. {"duration - not in - valid (empty)", &cases.DurationNotIn{}, 0},
  993. {"duration - not in - invalid", &cases.DurationNotIn{Val: &durationpb.Duration{}}, 1},
  994. {"duration - lt - valid", &cases.DurationLT{Val: &durationpb.Duration{Nanos: -1}}, 0},
  995. {"duration - lt - valid (empty)", &cases.DurationLT{}, 0},
  996. {"duration - lt - invalid (equal)", &cases.DurationLT{Val: &durationpb.Duration{}}, 1},
  997. {"duration - lt - invalid", &cases.DurationLT{Val: &durationpb.Duration{Seconds: 1}}, 1},
  998. {"duration - lte - valid", &cases.DurationLTE{Val: &durationpb.Duration{}}, 0},
  999. {"duration - lte - valid (empty)", &cases.DurationLTE{}, 0},
  1000. {"duration - lte - valid (equal)", &cases.DurationLTE{Val: &durationpb.Duration{Seconds: 1}}, 0},
  1001. {"duration - lte - invalid", &cases.DurationLTE{Val: &durationpb.Duration{Seconds: 1, Nanos: 1}}, 1},
  1002. {"duration - gt - valid", &cases.DurationGT{Val: &durationpb.Duration{Seconds: 1}}, 0},
  1003. {"duration - gt - valid (empty)", &cases.DurationGT{}, 0},
  1004. {"duration - gt - invalid (equal)", &cases.DurationGT{Val: &durationpb.Duration{Nanos: 1000}}, 1},
  1005. {"duration - gt - invalid", &cases.DurationGT{Val: &durationpb.Duration{}}, 1},
  1006. {"duration - gte - valid", &cases.DurationGTE{Val: &durationpb.Duration{Seconds: 3}}, 0},
  1007. {"duration - gte - valid (empty)", &cases.DurationGTE{}, 0},
  1008. {"duration - gte - valid (equal)", &cases.DurationGTE{Val: &durationpb.Duration{Nanos: 1000000}}, 0},
  1009. {"duration - gte - invalid", &cases.DurationGTE{Val: &durationpb.Duration{Seconds: -1}}, 1},
  1010. {"duration - gt & lt - valid", &cases.DurationGTLT{Val: &durationpb.Duration{Nanos: 1000}}, 0},
  1011. {"duration - gt & lt - valid (empty)", &cases.DurationGTLT{}, 0},
  1012. {"duration - gt & lt - invalid (above)", &cases.DurationGTLT{Val: &durationpb.Duration{Seconds: 1000}}, 1},
  1013. {"duration - gt & lt - invalid (below)", &cases.DurationGTLT{Val: &durationpb.Duration{Nanos: -1000}}, 1},
  1014. {"duration - gt & lt - invalid (max)", &cases.DurationGTLT{Val: &durationpb.Duration{Seconds: 1}}, 1},
  1015. {"duration - gt & lt - invalid (min)", &cases.DurationGTLT{Val: &durationpb.Duration{}}, 1},
  1016. {"duration - exclusive gt & lt - valid (empty)", &cases.DurationExLTGT{}, 0},
  1017. {"duration - exclusive gt & lt - valid (above)", &cases.DurationExLTGT{Val: &durationpb.Duration{Seconds: 2}}, 0},
  1018. {"duration - exclusive gt & lt - valid (below)", &cases.DurationExLTGT{Val: &durationpb.Duration{Nanos: -1}}, 0},
  1019. {"duration - exclusive gt & lt - invalid", &cases.DurationExLTGT{Val: &durationpb.Duration{Nanos: 1000}}, 1},
  1020. {"duration - exclusive gt & lt - invalid (max)", &cases.DurationExLTGT{Val: &durationpb.Duration{Seconds: 1}}, 1},
  1021. {"duration - exclusive gt & lt - invalid (min)", &cases.DurationExLTGT{Val: &durationpb.Duration{}}, 1},
  1022. {"duration - gte & lte - valid", &cases.DurationGTELTE{Val: &durationpb.Duration{Seconds: 60, Nanos: 1}}, 0},
  1023. {"duration - gte & lte - valid (empty)", &cases.DurationGTELTE{}, 0},
  1024. {"duration - gte & lte - valid (max)", &cases.DurationGTELTE{Val: &durationpb.Duration{Seconds: 3600}}, 0},
  1025. {"duration - gte & lte - valid (min)", &cases.DurationGTELTE{Val: &durationpb.Duration{Seconds: 60}}, 0},
  1026. {"duration - gte & lte - invalid (above)", &cases.DurationGTELTE{Val: &durationpb.Duration{Seconds: 3600, Nanos: 1}}, 1},
  1027. {"duration - gte & lte - invalid (below)", &cases.DurationGTELTE{Val: &durationpb.Duration{Seconds: 59}}, 1},
  1028. {"duration - gte & lte - valid (empty)", &cases.DurationExGTELTE{}, 0},
  1029. {"duration - exclusive gte & lte - valid (above)", &cases.DurationExGTELTE{Val: &durationpb.Duration{Seconds: 3601}}, 0},
  1030. {"duration - exclusive gte & lte - valid (below)", &cases.DurationExGTELTE{Val: &durationpb.Duration{}}, 0},
  1031. {"duration - exclusive gte & lte - valid (max)", &cases.DurationExGTELTE{Val: &durationpb.Duration{Seconds: 3600}}, 0},
  1032. {"duration - exclusive gte & lte - valid (min)", &cases.DurationExGTELTE{Val: &durationpb.Duration{Seconds: 60}}, 0},
  1033. {"duration - exclusive gte & lte - invalid", &cases.DurationExGTELTE{Val: &durationpb.Duration{Seconds: 61}}, 1},
  1034. {"duration - fields with other fields - invalid other field", &cases.DurationFieldWithOtherFields{DurationVal: nil, IntVal: 12}, 1},
  1035. }
  1036. var timestampCases = []TestCase{
  1037. {"timestamp - none - valid", &cases.TimestampNone{Val: &timestamppb.Timestamp{Seconds: 123}}, 0},
  1038. {"timestamp - required - valid", &cases.TimestampRequired{Val: &timestamppb.Timestamp{}}, 0},
  1039. {"timestamp - required - invalid", &cases.TimestampRequired{Val: nil}, 1},
  1040. {"timestamp - const - valid", &cases.TimestampConst{Val: &timestamppb.Timestamp{Seconds: 3}}, 0},
  1041. {"timestamp - const - valid (empty)", &cases.TimestampConst{}, 0},
  1042. {"timestamp - const - invalid", &cases.TimestampConst{Val: &timestamppb.Timestamp{Nanos: 3}}, 1},
  1043. {"timestamp - lt - valid", &cases.TimestampLT{Val: &timestamppb.Timestamp{Seconds: -1}}, 0},
  1044. {"timestamp - lt - valid (empty)", &cases.TimestampLT{}, 0},
  1045. {"timestamp - lt - invalid (equal)", &cases.TimestampLT{Val: &timestamppb.Timestamp{}}, 1},
  1046. {"timestamp - lt - invalid", &cases.TimestampLT{Val: &timestamppb.Timestamp{Seconds: 1}}, 1},
  1047. {"timestamp - lte - valid", &cases.TimestampLTE{Val: &timestamppb.Timestamp{}}, 0},
  1048. {"timestamp - lte - valid (empty)", &cases.TimestampLTE{}, 0},
  1049. {"timestamp - lte - valid (equal)", &cases.TimestampLTE{Val: &timestamppb.Timestamp{Seconds: 1}}, 0},
  1050. {"timestamp - lte - invalid", &cases.TimestampLTE{Val: &timestamppb.Timestamp{Seconds: 1, Nanos: 1}}, 1},
  1051. {"timestamp - gt - valid", &cases.TimestampGT{Val: &timestamppb.Timestamp{Seconds: 1}}, 0},
  1052. {"timestamp - gt - valid (empty)", &cases.TimestampGT{}, 0},
  1053. {"timestamp - gt - invalid (equal)", &cases.TimestampGT{Val: &timestamppb.Timestamp{Nanos: 1000}}, 1},
  1054. {"timestamp - gt - invalid", &cases.TimestampGT{Val: &timestamppb.Timestamp{}}, 1},
  1055. {"timestamp - gte - valid", &cases.TimestampGTE{Val: &timestamppb.Timestamp{Seconds: 3}}, 0},
  1056. {"timestamp - gte - valid (empty)", &cases.TimestampGTE{}, 0},
  1057. {"timestamp - gte - valid (equal)", &cases.TimestampGTE{Val: &timestamppb.Timestamp{Nanos: 1000000}}, 0},
  1058. {"timestamp - gte - invalid", &cases.TimestampGTE{Val: &timestamppb.Timestamp{Seconds: -1}}, 1},
  1059. {"timestamp - gt & lt - valid", &cases.TimestampGTLT{Val: &timestamppb.Timestamp{Nanos: 1000}}, 0},
  1060. {"timestamp - gt & lt - valid (empty)", &cases.TimestampGTLT{}, 0},
  1061. {"timestamp - gt & lt - invalid (above)", &cases.TimestampGTLT{Val: &timestamppb.Timestamp{Seconds: 1000}}, 1},
  1062. {"timestamp - gt & lt - invalid (below)", &cases.TimestampGTLT{Val: &timestamppb.Timestamp{Seconds: -1000}}, 1},
  1063. {"timestamp - gt & lt - invalid (max)", &cases.TimestampGTLT{Val: &timestamppb.Timestamp{Seconds: 1}}, 1},
  1064. {"timestamp - gt & lt - invalid (min)", &cases.TimestampGTLT{Val: &timestamppb.Timestamp{}}, 1},
  1065. {"timestamp - exclusive gt & lt - valid (empty)", &cases.TimestampExLTGT{}, 0},
  1066. {"timestamp - exclusive gt & lt - valid (above)", &cases.TimestampExLTGT{Val: &timestamppb.Timestamp{Seconds: 2}}, 0},
  1067. {"timestamp - exclusive gt & lt - valid (below)", &cases.TimestampExLTGT{Val: &timestamppb.Timestamp{Seconds: -1}}, 0},
  1068. {"timestamp - exclusive gt & lt - invalid", &cases.TimestampExLTGT{Val: &timestamppb.Timestamp{Nanos: 1000}}, 1},
  1069. {"timestamp - exclusive gt & lt - invalid (max)", &cases.TimestampExLTGT{Val: &timestamppb.Timestamp{Seconds: 1}}, 1},
  1070. {"timestamp - exclusive gt & lt - invalid (min)", &cases.TimestampExLTGT{Val: &timestamppb.Timestamp{}}, 1},
  1071. {"timestamp - gte & lte - valid", &cases.TimestampGTELTE{Val: &timestamppb.Timestamp{Seconds: 60, Nanos: 1}}, 0},
  1072. {"timestamp - gte & lte - valid (empty)", &cases.TimestampGTELTE{}, 0},
  1073. {"timestamp - gte & lte - valid (max)", &cases.TimestampGTELTE{Val: &timestamppb.Timestamp{Seconds: 3600}}, 0},
  1074. {"timestamp - gte & lte - valid (min)", &cases.TimestampGTELTE{Val: &timestamppb.Timestamp{Seconds: 60}}, 0},
  1075. {"timestamp - gte & lte - invalid (above)", &cases.TimestampGTELTE{Val: &timestamppb.Timestamp{Seconds: 3600, Nanos: 1}}, 1},
  1076. {"timestamp - gte & lte - invalid (below)", &cases.TimestampGTELTE{Val: &timestamppb.Timestamp{Seconds: 59}}, 1},
  1077. {"timestamp - gte & lte - valid (empty)", &cases.TimestampExGTELTE{}, 0},
  1078. {"timestamp - exclusive gte & lte - valid (above)", &cases.TimestampExGTELTE{Val: &timestamppb.Timestamp{Seconds: 3601}}, 0},
  1079. {"timestamp - exclusive gte & lte - valid (below)", &cases.TimestampExGTELTE{Val: &timestamppb.Timestamp{}}, 0},
  1080. {"timestamp - exclusive gte & lte - valid (max)", &cases.TimestampExGTELTE{Val: &timestamppb.Timestamp{Seconds: 3600}}, 0},
  1081. {"timestamp - exclusive gte & lte - valid (min)", &cases.TimestampExGTELTE{Val: &timestamppb.Timestamp{Seconds: 60}}, 0},
  1082. {"timestamp - exclusive gte & lte - invalid", &cases.TimestampExGTELTE{Val: &timestamppb.Timestamp{Seconds: 61}}, 1},
  1083. {"timestamp - lt now - valid", &cases.TimestampLTNow{Val: &timestamppb.Timestamp{}}, 0},
  1084. {"timestamp - lt now - valid (empty)", &cases.TimestampLTNow{}, 0},
  1085. {"timestamp - lt now - invalid", &cases.TimestampLTNow{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() + 7200}}, 1},
  1086. {"timestamp - gt now - valid", &cases.TimestampGTNow{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() + 7200}}, 0},
  1087. {"timestamp - gt now - valid (empty)", &cases.TimestampGTNow{}, 0},
  1088. {"timestamp - gt now - invalid", &cases.TimestampGTNow{Val: &timestamppb.Timestamp{}}, 1},
  1089. {"timestamp - within - valid", &cases.TimestampWithin{Val: timestamppb.Now()}, 0},
  1090. {"timestamp - within - valid (empty)", &cases.TimestampWithin{}, 0},
  1091. {"timestamp - within - invalid (below)", &cases.TimestampWithin{Val: &timestamppb.Timestamp{}}, 1},
  1092. {"timestamp - within - invalid (above)", &cases.TimestampWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() + 7200}}, 1},
  1093. {"timestamp - lt now within - valid", &cases.TimestampLTNowWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() - 1800}}, 0},
  1094. {"timestamp - lt now within - valid (empty)", &cases.TimestampLTNowWithin{}, 0},
  1095. {"timestamp - lt now within - invalid (lt)", &cases.TimestampLTNowWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() + 1800}}, 1},
  1096. {"timestamp - lt now within - invalid (within)", &cases.TimestampLTNowWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() - 7200}}, 1},
  1097. {"timestamp - gt now within - valid", &cases.TimestampGTNowWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() + 1800}}, 0},
  1098. {"timestamp - gt now within - valid (empty)", &cases.TimestampGTNowWithin{}, 0},
  1099. {"timestamp - gt now within - invalid (gt)", &cases.TimestampGTNowWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() - 1800}}, 1},
  1100. {"timestamp - gt now within - invalid (within)", &cases.TimestampGTNowWithin{Val: &timestamppb.Timestamp{Seconds: time.Now().Unix() + 7200}}, 1},
  1101. }
  1102. var anyCases = []TestCase{
  1103. {"any - none - valid", &cases.AnyNone{Val: &anypb.Any{}}, 0},
  1104. {"any - required - valid", &cases.AnyRequired{Val: &anypb.Any{}}, 0},
  1105. {"any - required - invalid", &cases.AnyRequired{Val: nil}, 1},
  1106. {"any - in - valid", &cases.AnyIn{Val: &anypb.Any{TypeUrl: "type.googleapis.com/google.protobuf.Duration"}}, 0},
  1107. {"any - in - valid (empty)", &cases.AnyIn{}, 0},
  1108. {"any - in - invalid", &cases.AnyIn{Val: &anypb.Any{TypeUrl: "type.googleapis.com/google.protobuf.Timestamp"}}, 1},
  1109. {"any - not in - valid", &cases.AnyNotIn{Val: &anypb.Any{TypeUrl: "type.googleapis.com/google.protobuf.Duration"}}, 0},
  1110. {"any - not in - valid (empty)", &cases.AnyNotIn{}, 0},
  1111. {"any - not in - invalid", &cases.AnyNotIn{Val: &anypb.Any{TypeUrl: "type.googleapis.com/google.protobuf.Timestamp"}}, 1},
  1112. }
  1113. var kitchenSink = []TestCase{
  1114. {"kitchensink - field - valid", &cases.KitchenSinkMessage{Val: &cases.ComplexTestMsg{Const: "abcd", IntConst: 5, BoolConst: false, FloatVal: &wrapperspb.FloatValue{Value: 1}, DurVal: &durationpb.Duration{Seconds: 3}, TsVal: &timestamppb.Timestamp{Seconds: 17}, FloatConst: 7, DoubleIn: 123, EnumConst: cases.ComplexTestEnum_ComplexTWO, AnyVal: &anypb.Any{TypeUrl: "type.googleapis.com/google.protobuf.Duration"}, RepTsVal: []*timestamppb.Timestamp{{Seconds: 3}}, MapVal: map[int32]string{-1: "a", -2: "b"}, BytesVal: []byte("\x00\x99"), O: &cases.ComplexTestMsg_X{X: "foobar"}}}, 0},
  1115. {"kitchensink - valid (unset)", &cases.KitchenSinkMessage{}, 0},
  1116. {"kitchensink - field - invalid", &cases.KitchenSinkMessage{Val: &cases.ComplexTestMsg{}}, 7},
  1117. {"kitchensink - field - embedded - invalid", &cases.KitchenSinkMessage{Val: &cases.ComplexTestMsg{Another: &cases.ComplexTestMsg{}}}, 14},
  1118. {"kitchensink - field - invalid (transitive)", &cases.KitchenSinkMessage{Val: &cases.ComplexTestMsg{Const: "abcd", BoolConst: true, Nested: &cases.ComplexTestMsg{}}}, 14},
  1119. {"kitchensink - many - all non-message fields invalid", &cases.KitchenSinkMessage{Val: &cases.ComplexTestMsg{BoolConst: true, FloatVal: &wrapperspb.FloatValue{}, TsVal: &timestamppb.Timestamp{}, FloatConst: 8, AnyVal: &anypb.Any{TypeUrl: "asdf"}, RepTsVal: []*timestamppb.Timestamp{{Nanos: 1}}}}, 13},
  1120. }