CamposDefinidos.vb

  1. ' CamposDefinidos.vb — ProInf.net — feb-2012
  2. '
  3. ' Campos definidos por el usuario:
  4. ' - CampoCodigo
  5. ' - CampoLista
  6. ' - CampoRango
  7. ' - CampoMoneda
  8. ' - CampoFecha
  9. ' - CampoHora
  10. ' - CampoLogico
  11.  
  12. Public Class CampoCodigo
  13. Inherits CampoDefinido
  14.  
  15. 'TODO: ¡¡¡¡¡Tener en cuenta el formato!!!!!!????
  16.  
  17. Public Property Longitud As Integer
  18. Public Property Caracteres As String
  19. Public Property Formato As String
  20.  
  21. Public Sub New(Optional ByVal texto As String = "")
  22. MyBase.New(texto)
  23. End Sub
  24.  
  25. Public Overrides Function Aleatorio() As String
  26. Return Azar.Simbolos(Longitud, Caracteres)
  27. End Function
  28.  
  29. Public Overrides Function ToString() As String
  30. Return String.Format(ObtenerFormateo(),
  31. Nombre, Longitud, Caracteres, Formato)
  32. End Function
  33.  
  34. Private Function ObtenerFormateo() As String
  35. If Formato Is Nothing OrElse Formato = "" Then
  36. Return "Codigo {0} = {1} de {2} "
  37. Else
  38. Return "Codigo {0} = {1} de {2} formato {3}"
  39. End If
  40. End Function
  41.  
  42. 'Ej: "Codigo Clave = 5 de ABCEFG"
  43. Public Overrides Sub Analizar(ByVal texto As String)
  44. Dim analisis As New Analisis(texto)
  45. Nombre = analisis.Nombre
  46. Dim items = Split(analisis.Parametros, " ")
  47. If items.Length >= 3 Then
  48. Longitud = Utilidades.ObtenerEntero(items(0))
  49. Caracteres = items(2)
  50. End If
  51. If items.Length >= 5 Then
  52. Formato = items(4)
  53. End If
  54. End Sub
  55.  
  56. End Class
  57.  
  58. Public Class CampoLista
  59. Inherits CampoDefinido
  60.  
  61. Private _elementos As String()
  62. Public Property Elementos() As String()
  63. Get
  64. Return _elementos
  65. End Get
  66. Set(ByVal value As String())
  67. _elementos = value
  68. RecortarEspacios()
  69. End Set
  70. End Property
  71.  
  72. Public Sub New(Optional ByVal texto As String = "")
  73. MyBase.New(texto)
  74. End Sub
  75.  
  76. Public Overrides Function Aleatorio() As String
  77. Dim indice = Azar.Entre(0, Elementos.Length - 1)
  78. Return Elementos(indice)
  79. End Function
  80.  
  81. Public Overrides Function ToString() As String
  82. Return String.Format("Lista {0} = {1}", Nombre, Join(Elementos, ", "))
  83. End Function
  84.  
  85. 'Ej: "Lista Zona = Norte, Este, Sur, Oeste"
  86. Public Overrides Sub Analizar(ByVal texto As String)
  87. Dim analisis = New Analisis(texto)
  88. Nombre = analisis.Nombre
  89. Elementos = Split(analisis.Parametros.Trim(), ",")
  90. End Sub
  91.  
  92. Private Sub RecortarEspacios()
  93. If _elementos IsNot Nothing Then
  94. For i = 0 To _elementos.Length - 1
  95. _elementos(i) = Trim(_elementos(i))
  96. Next
  97. End If
  98. End Sub
  99.  
  100. End Class
  101.  
  102. Public Class CampoRango
  103. Inherits CampoDefinido
  104.  
  105. Public Property Minimo As Integer
  106. Public Property Maximo As Integer
  107. Public Property Numeral As Numerales
  108.  
  109. Public Sub New(Optional ByVal texto As String = "")
  110. MyBase.New(texto)
  111. End Sub
  112.  
  113. Public Overrides Function Tipo() As TipoCampo
  114. If Recursos.numerales.EsNumerico(Numeral) Then
  115. Tipo = TipoCampo.Entero
  116. Else
  117. Tipo = TipoCampo.Texto
  118. End If
  119. End Function
  120.  
  121. Public Overrides Function Aleatorio() As String
  122. Dim numero = Azar.Entre(Minimo, Maximo)
  123. Dim resultado = Recursos.numerales(Numeral).Secuenciar(numero)
  124. Return resultado
  125. End Function
  126.  
  127. Public Overrides Function ToString() As String
  128. Return String.Format(ObtenerFormateo(), Nombre, Minimo, Maximo, Numeral)
  129. End Function
  130.  
  131. Private Function ObtenerFormateo() As String
  132. If Recursos.numerales.EsNumerico(Numeral) Then
  133. Return "Rango {0} = entre {1} y {2}"
  134. Else
  135. Return "Rango {0} = entre {1} y {2} numeral {3}"
  136. End If
  137. End Function
  138.  
  139. 'Ej: "Rango Importe = entre 50 y 300"
  140. Public Overrides Sub Analizar(ByVal texto As String)
  141. Dim analisis As New Analisis(texto)
  142. Nombre = analisis.Nombre
  143. Numeral = Numerales.Numeración_Arábiga
  144. Dim items = Split(analisis.Parametros, " ")
  145. If items.Length >= 4 Then
  146. Minimo = Utilidades.ObtenerEntero(items(1))
  147. Maximo = Utilidades.ObtenerEntero(items(3))
  148. End If
  149. If items.Length >= 6 Then
  150. Numeral = [Enum].Parse(GetType(Numerales), items(5))
  151. End If
  152. End Sub
  153.  
  154. End Class
  155.  
  156. Public Class CampoMoneda
  157. Inherits CampoDefinido
  158.  
  159. Public Shared unidades() As Decimal = {
  160. 0.01, 0.02, 0.05,
  161. 0.1, 0.2, 0.5,
  162. 1, 2, 5,
  163. 10, 20, 50,
  164. 100, 200, 500,
  165. 1000, 2000, 5000}
  166.  
  167. Public Property Minimo() As Decimal
  168. Public Property Maximo() As Decimal
  169. Public Property Unidad() As Decimal
  170.  
  171. Public Property IndiceUnidad() As Integer
  172. Get
  173. Return Array.IndexOf(unidades, Unidad)
  174. End Get
  175. Set(ByVal value As Integer)
  176. Unidad = unidades(value)
  177. End Set
  178. End Property
  179.  
  180. Public Sub New(Optional ByVal texto As String = "")
  181. MyBase.New(texto)
  182. End Sub
  183.  
  184. Public Overrides Function Tipo() As TipoCampo
  185. Return TipoCampo.Numero
  186. End Function
  187.  
  188. Public Overrides Function Aleatorio() As String
  189. Dim moneda As Decimal = Unidad * Azar.Entre(Minimo / Unidad, Maximo / Unidad)
  190. Return NormalizarDecimal(moneda)
  191. End Function
  192.  
  193. Public Overrides Function ToString() As String
  194. Return String.Format("Moneda {0} = entre {1} y {2} unidad {3}",
  195. Nombre, Minimo, Maximo, Unidad)
  196. End Function
  197.  
  198. 'Ej: "Moneda Importe = entre 1000 y 5000 unidad 0,5"
  199. Public Overrides Sub Analizar(ByVal texto As String)
  200. Dim analisis = New Analisis(texto)
  201. Nombre = analisis.Nombre
  202. Dim items = Split(analisis.Parametros, " ")
  203. If items.Count >= 6 Then
  204. Minimo = Utilidades.ObtenerEntero(items(1))
  205. Maximo = Utilidades.ObtenerEntero(items(3))
  206. Unidad = Utilidades.ObtenerDecimal(items(5))
  207. End If
  208. End Sub
  209.  
  210. Public Shared Function NormalizarDecimal(ByVal numero As Decimal) As String
  211. Return numero.ToString("0.00").Replace(",", ".")
  212. End Function
  213.  
  214. End Class
  215.  
  216. Public Class CampoFecha
  217. Inherits CampoDefinido
  218.  
  219. Public Property Minimo As Date
  220. Public Property Maximo As Date
  221. Public Property Semana As String 'LMXJVSD
  222.  
  223. Public Property DiasSemana As Integer()
  224. Get
  225. Dim lista As New List(Of Integer)
  226. For Each caracter In Semana
  227. Dim indice = "LMXJVSD".IndexOf(caracter)
  228. If indice >= 0 Then lista.Add(indice)
  229. Next
  230. Return lista.ToArray()
  231. End Get
  232. Set(ByVal value As Integer())
  233. Dim dias As New List(Of Char)
  234. For Each indice In value
  235. If indice >= 0 And indice <= 6 Then
  236. dias.Add("LMXJVSD"(indice))
  237. End If
  238. Next
  239. Semana = New String(dias.ToArray())
  240. End Set
  241. End Property
  242.  
  243. Public Sub New(Optional ByVal texto As String = "")
  244. MyBase.New(texto)
  245. End Sub
  246.  
  247. Public Overrides Function Tipo() As TipoCampo
  248. Return TipoCampo.Fecha
  249. End Function
  250.  
  251. Public Overrides Function Aleatorio() As String
  252. Dim dias As TimeSpan = Maximo.Subtract(Minimo)
  253. Dim fortuna As Integer = Azar.Entre(0, dias.Days)
  254. Dim fecha As Date = Minimo.AddDays(fortuna)
  255. If Semana <> "" Then fecha = ObtenerDiaSemana(fecha)
  256. Return fecha.ToString("yyyy-MM-dd")
  257. End Function
  258.  
  259. Private Function ObtenerDiaSemana(ByVal fecha As Date) As Date
  260. For i = 1 To 7
  261. If EsDiaSemana(fecha) Then Exit For
  262. fecha = fecha.AddDays(1)
  263. Next
  264. Return fecha
  265. End Function
  266.  
  267. Private Function EsDiaSemana(ByVal fecha As Date) As Boolean
  268. If Semana = "" Then Return True
  269. For Each caracter In Semana
  270. Dim diaSemana = "DLMXJVS".IndexOf(caracter)
  271. If diaSemana < 0 Or diaSemana = fecha.DayOfWeek Then Return True
  272. Next
  273. Return False
  274. End Function
  275.  
  276. Public Overrides Function ToString() As String
  277. Return String.Format(ObtenerFormateo(), Nombre,
  278. Minimo.ToString("yyyy-MM-dd"),
  279. Maximo.ToString("yyyy-MM-dd"),
  280. Semana.ToUpper())
  281. End Function
  282.  
  283. Private Function ObtenerFormateo() As String
  284. If Semana = "" Then
  285. Return "Fecha {0} = entre {1} y {2}"
  286. Else
  287. Return "Fecha {0} = entre {1} y {2} semana {3}"
  288. End If
  289. End Function
  290.  
  291. 'Ej: "Fecha Alta = entre 2012-01-01 y 2012-01-31"
  292. Public Overrides Sub Analizar(ByVal texto As String)
  293. Dim analisis = New Analisis(texto)
  294. Nombre = analisis.Nombre
  295. Semana = ""
  296. Dim items = analisis.Parametros.Split(" ")
  297. If items.Length >= 4 Then
  298. Minimo = Date.Parse(items(1))
  299. Maximo = Date.Parse(items(3))
  300. End If
  301. If items.Length >= 6 Then
  302. Semana = items(5)
  303. End If
  304. End Sub
  305. End Class
  306.  
  307. Public Class CampoHora
  308. Inherits CampoDefinido
  309.  
  310. Public Property Minimo() As Date
  311. Public Property Maximo() As Date
  312.  
  313. Public Sub New(Optional ByVal texto As String = "")
  314. MyBase.New(texto)
  315. End Sub
  316.  
  317. Public Overrides Function Tipo() As TipoCampo
  318. Return TipoCampo.Hora
  319. End Function
  320.  
  321. Public Overrides Function Aleatorio() As String
  322. Dim tiempo As TimeSpan = Maximo.Subtract(Minimo)
  323. Dim segundos = (tiempo.Hours * 60 + tiempo.Minutes) * 60 + tiempo.Seconds
  324. Dim fortuna As Integer = Azar.Entre(0, segundos)
  325. Dim fecha As Date = Minimo.AddSeconds(fortuna)
  326. Return fecha.ToString("HH:mm")
  327. End Function
  328.  
  329. Public Overrides Function ToString() As String
  330. Return String.Format("Hora {0} = entre {1} y {2}", Nombre,
  331. Minimo.ToString("HH:mm"),
  332. Maximo.ToString("HH:mm"))
  333. End Function
  334.  
  335. 'Ej: "Hora Entrada = entre 09:00 y 13:30"
  336. Public Overrides Sub Analizar(ByVal texto As String)
  337. Dim analisis = New Analisis(texto)
  338. Nombre = analisis.Nombre
  339. Dim items = analisis.Parametros.Split(" ")
  340. If items.Length >= 4 Then
  341. Minimo = Date.Parse(items(1))
  342. Maximo = Date.Parse(items(3))
  343. End If
  344. End Sub
  345. End Class
  346.  
  347. Public Class CampoLogico
  348. Inherits CampoDefinido
  349.  
  350. Public Sub New(Optional ByVal texto As String = "")
  351. MyBase.New(texto)
  352. End Sub
  353.  
  354. Public Overrides Function Tipo() As TipoCampo
  355. Return TipoCampo.Logico
  356. End Function
  357.  
  358. Public Overrides Function Aleatorio() As String
  359. Return {"False", "True"}(Azar.Entre(0, 1))
  360. End Function
  361.  
  362. Public Overrides Function ToString() As String
  363. Return String.Format("Logico {0} = False, True", Nombre)
  364. End Function
  365.  
  366. Public Overrides Sub Analizar(ByVal texto As String)
  367. Dim analisis = New Analisis(texto)
  368. Nombre = analisis.Nombre
  369. End Sub
  370.  
  371. End Class
  372.  
  373. Public Class CampoTexto
  374. Inherits CampoDefinido
  375.  
  376. Public Property Minimo As Integer
  377. Public Property Maximo As Integer
  378.  
  379. Public Sub New(Optional ByVal texto As String = "")
  380. MyBase.New(texto)
  381. End Sub
  382.  
  383. Public Overrides Function Aleatorio() As String
  384. Dim totalPalabras = Azar.Entre(Minimo, Maximo)
  385. Dim contadorPalabras = 0
  386. Dim sb As New System.Text.StringBuilder()
  387. Do Until contadorPalabras >= totalPalabras
  388. Dim numeroPalabrasFrase = Azar.Entre(5, 30)
  389. Dim quedanPalabras = totalPalabras - contadorPalabras
  390. If quedanPalabras <= 10 Or numeroPalabrasFrase > quedanPalabras Then
  391. numeroPalabrasFrase = quedanPalabras
  392. End If
  393. contadorPalabras += numeroPalabrasFrase
  394. Dim frase = Recursos.palabrasComunes.FraseAleatoria(numeroPalabrasFrase)
  395. sb.Append(frase)
  396. sb.Append(" ")
  397. Loop
  398. Return sb.ToString()
  399. End Function
  400.  
  401. Public Overrides Function ToString() As String
  402. Return String.Format("Texto {0} = entre {1} y {2} palabras", Nombre, Minimo, Maximo)
  403. End Function
  404.  
  405. Public Overrides Sub Analizar(ByVal texto As String)
  406. Dim analisis = New Analisis(texto)
  407. Nombre = analisis.Nombre
  408. Dim items = Split(analisis.Parametros, " ")
  409. If items.Length >= 4 Then
  410. Minimo = Utilidades.ObtenerEntero(items(1))
  411. Maximo = Utilidades.ObtenerEntero(items(3))
  412. End If
  413. End Sub
  414.  
  415. End Class
  416.  
  417. Public Class CampoContador
  418. Inherits CampoDefinido
  419. Implements IReiniciable
  420.  
  421. Private _contador As Decimal = 1
  422.  
  423. Public Property Inicio As Decimal
  424. Public Property Incremento As Decimal
  425. Public Property Numeral As Numerales
  426. Public Property Palabra As String
  427. Public Property Femenina As Boolean
  428.  
  429. Public Sub New(Optional ByVal texto As String = "")
  430. MyBase.New(texto)
  431. End Sub
  432.  
  433. Public Overrides Function Tipo() As TipoCampo
  434. If Recursos.numerales.EsNumerico(Numeral) Then
  435. Tipo = TipoCampo.Entero
  436. Else
  437. Tipo = TipoCampo.Texto
  438. End If
  439. End Function
  440.  
  441. Public Overrides Function Aleatorio() As String
  442. Dim numeracion As INumeral = Recursos.numerales(Numeral)
  443. Dim esApalabrado = TypeOf numeracion Is IApalabrado
  444. If esApalabrado Then DirectCast(numeracion, IApalabrado).Apalabrar(Palabra, Femenina)
  445. Dim valor = numeracion.Secuenciar(_contador)
  446. AumentarContador()
  447. Return If(esApalabrado, valor, Palabra & valor)
  448. End Function
  449.  
  450. Private Sub AumentarContador()
  451. Try
  452. _contador += Incremento
  453. Catch ex As OverflowException
  454. _contador = 1
  455. End Try
  456. End Sub
  457.  
  458. Public Overrides Function ToString() As String
  459. Dim genero = If(Femenina, "F", "M")
  460. Return String.Format(ObtenerFormateo(),
  461. Nombre, Inicio, Incremento, Numeral, Palabra, genero)
  462. End Function
  463.  
  464. Private Function ObtenerFormateo() As String
  465. If Palabra Is Nothing OrElse Palabra.Trim() = "" Then
  466. If Numeral = Numerales.Numeración_Arábiga Then
  467. Return "Contador {0} = desde {1} sumando {2}"
  468. Else
  469. Return "Contador {0} = desde {1} sumando {2} numeral {3}"
  470. End If
  471. Else
  472. Return "Contador {0} = desde {1} sumando {2} numeral {3} palabra '{4}' {5}"
  473. End If
  474. End Function
  475.  
  476. 'Ej: "Contador cuenta = desde 1 sumando 5 numeral Griego"
  477. Public Overrides Sub Analizar(ByVal texto As String)
  478. Dim analisis = New Analisis(texto)
  479. Nombre = analisis.Nombre
  480. Numeral = Numerales.Numeración_Arábiga
  481. Palabra = ""
  482. Dim items = Split(analisis.Parametros, " ")
  483. If items.Length >= 4 Then
  484. Inicio = Utilidades.ObtenerEntero(items(1))
  485. Incremento = Utilidades.ObtenerEntero(items(3))
  486. End If
  487. If items.Length >= 6 Then Numeral = [Enum].Parse(GetType(Numerales), items(5))
  488. If items.Length >= 8 Then Palabra = Utilidades.RecortarComillas(items(7))
  489. If items.Length >= 9 Then Femenina = (items(8) = "F")
  490.  
  491. End Sub
  492.  
  493. Public Sub Reiniciar() Implements IReiniciable.Reiniciar
  494. _contador = Inicio
  495. End Sub
  496.  
  497. End Class
  498.  

Proinf.net